bruce-models 3.2.0 → 3.2.1

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.
Files changed (195) hide show
  1. package/dist/bruce-models.es5.js +2670 -838
  2. package/dist/bruce-models.es5.js.map +1 -1
  3. package/dist/bruce-models.umd.js +2606 -803
  4. package/dist/bruce-models.umd.js.map +1 -1
  5. package/dist/lib/account/account-invite.js +40 -1
  6. package/dist/lib/account/account-invite.js.map +1 -1
  7. package/dist/lib/account/account.js +60 -5
  8. package/dist/lib/account/account.js.map +1 -1
  9. package/dist/lib/ann-document/ann-document.js +36 -3
  10. package/dist/lib/ann-document/ann-document.js.map +1 -1
  11. package/dist/lib/api/abstract-api.js +78 -1
  12. package/dist/lib/api/abstract-api.js.map +1 -1
  13. package/dist/lib/api/api-getters.js +68 -94
  14. package/dist/lib/api/api-getters.js.map +1 -1
  15. package/dist/lib/api/api.js +20 -3
  16. package/dist/lib/api/api.js.map +1 -1
  17. package/dist/lib/api/bruce-api.js +68 -27
  18. package/dist/lib/api/bruce-api.js.map +1 -1
  19. package/dist/lib/api/global-api.js +46 -4
  20. package/dist/lib/api/global-api.js.map +1 -1
  21. package/dist/lib/api/guardian-api.js +42 -1
  22. package/dist/lib/api/guardian-api.js.map +1 -1
  23. package/dist/lib/bruce-models.js +1 -3
  24. package/dist/lib/bruce-models.js.map +1 -1
  25. package/dist/lib/calculator/calculator.js +42 -1
  26. package/dist/lib/calculator/calculator.js.map +1 -1
  27. package/dist/lib/client-file/client-file.js +71 -7
  28. package/dist/lib/client-file/client-file.js.map +1 -1
  29. package/dist/lib/common/bounds.js +1 -1
  30. package/dist/lib/common/bounds.js.map +1 -1
  31. package/dist/lib/common/bruce-event.js +19 -0
  32. package/dist/lib/common/bruce-event.js.map +1 -1
  33. package/dist/lib/common/bruce-variable.js +5 -0
  34. package/dist/lib/common/bruce-variable.js.map +1 -1
  35. package/dist/lib/common/color-css-defaults.js +157 -0
  36. package/dist/lib/common/color-css-defaults.js.map +1 -0
  37. package/dist/lib/common/color.js +18 -4
  38. package/dist/lib/common/color.js.map +1 -1
  39. package/dist/lib/common/delay-queue.js +7 -0
  40. package/dist/lib/common/delay-queue.js.map +1 -1
  41. package/dist/lib/common/geometry.js +5 -0
  42. package/dist/lib/common/geometry.js.map +1 -1
  43. package/dist/lib/common/lru-cache.js +14 -0
  44. package/dist/lib/common/lru-cache.js.map +1 -1
  45. package/dist/lib/custom-form/custom-form.js +49 -7
  46. package/dist/lib/custom-form/custom-form.js.map +1 -1
  47. package/dist/lib/data-lab/data-lab.js +10 -0
  48. package/dist/lib/data-lab/data-lab.js.map +1 -1
  49. package/dist/lib/data-source/data-source.js +41 -0
  50. package/dist/lib/data-source/data-source.js.map +1 -1
  51. package/dist/lib/entity/entity-attachment-type.js +37 -1
  52. package/dist/lib/entity/entity-attachment-type.js.map +1 -1
  53. package/dist/lib/entity/entity-attachment.js +65 -18
  54. package/dist/lib/entity/entity-attachment.js.map +1 -1
  55. package/dist/lib/entity/entity-attribute.js +17 -1
  56. package/dist/lib/entity/entity-attribute.js.map +1 -1
  57. package/dist/lib/entity/entity-comment.js +44 -7
  58. package/dist/lib/entity/entity-comment.js.map +1 -1
  59. package/dist/lib/entity/entity-coords.js +38 -0
  60. package/dist/lib/entity/entity-coords.js.map +1 -1
  61. package/dist/lib/entity/entity-link.js +45 -11
  62. package/dist/lib/entity/entity-link.js.map +1 -1
  63. package/dist/lib/entity/entity-lod-category.js +52 -9
  64. package/dist/lib/entity/entity-lod-category.js.map +1 -1
  65. package/dist/lib/entity/entity-lod.js +78 -16
  66. package/dist/lib/entity/entity-lod.js.map +1 -1
  67. package/dist/lib/entity/entity-relation-type.js +48 -10
  68. package/dist/lib/entity/entity-relation-type.js.map +1 -1
  69. package/dist/lib/entity/entity-relation.js +69 -16
  70. package/dist/lib/entity/entity-relation.js.map +1 -1
  71. package/dist/lib/entity/entity-source.js +56 -15
  72. package/dist/lib/entity/entity-source.js.map +1 -1
  73. package/dist/lib/entity/entity-tag.js +56 -10
  74. package/dist/lib/entity/entity-tag.js.map +1 -1
  75. package/dist/lib/entity/entity-type-visual-settings.js +4 -0
  76. package/dist/lib/entity/entity-type-visual-settings.js.map +1 -1
  77. package/dist/lib/entity/entity-type.js +45 -7
  78. package/dist/lib/entity/entity-type.js.map +1 -1
  79. package/dist/lib/entity/entity.js +122 -18
  80. package/dist/lib/entity/entity.js.map +1 -1
  81. package/dist/lib/environment.js +12 -0
  82. package/dist/lib/environment.js.map +1 -1
  83. package/dist/lib/import/imported-file.js +53 -0
  84. package/dist/lib/import/imported-file.js.map +1 -1
  85. package/dist/lib/internal/uploader.js +8 -0
  86. package/dist/lib/internal/uploader.js.map +1 -1
  87. package/dist/lib/markup/markup.js +1 -1
  88. package/dist/lib/markup/markup.js.map +1 -1
  89. package/dist/lib/plugin/plugin.js +51 -9
  90. package/dist/lib/plugin/plugin.js.map +1 -1
  91. package/dist/lib/program-key/program-key.js +55 -10
  92. package/dist/lib/program-key/program-key.js.map +1 -1
  93. package/dist/lib/project/menu-item.js +22 -0
  94. package/dist/lib/project/menu-item.js.map +1 -1
  95. package/dist/lib/project/project-view-bookmark.js +55 -11
  96. package/dist/lib/project/project-view-bookmark.js.map +1 -1
  97. package/dist/lib/project/project-view-tile.js +9 -0
  98. package/dist/lib/project/project-view-tile.js.map +1 -1
  99. package/dist/lib/project/project-view.js +45 -7
  100. package/dist/lib/project/project-view.js.map +1 -1
  101. package/dist/lib/project/zoom-control.js +7 -0
  102. package/dist/lib/project/zoom-control.js.map +1 -1
  103. package/dist/lib/server/hosting-location.js +30 -9
  104. package/dist/lib/server/hosting-location.js.map +1 -1
  105. package/dist/lib/server/message-broker.js +3 -0
  106. package/dist/lib/server/message-broker.js.map +1 -1
  107. package/dist/lib/server/pending-action.js +25 -4
  108. package/dist/lib/server/pending-action.js.map +1 -1
  109. package/dist/lib/server/task.js +17 -0
  110. package/dist/lib/server/task.js.map +1 -1
  111. package/dist/lib/style/style.js +56 -7
  112. package/dist/lib/style/style.js.map +1 -1
  113. package/dist/lib/tileset/tileset.js +128 -34
  114. package/dist/lib/tileset/tileset.js.map +1 -1
  115. package/dist/lib/user/permission.js +20 -0
  116. package/dist/lib/user/permission.js.map +1 -1
  117. package/dist/lib/user/session.js +46 -1
  118. package/dist/lib/user/session.js.map +1 -1
  119. package/dist/lib/user/user-group.js +49 -19
  120. package/dist/lib/user/user-group.js.map +1 -1
  121. package/dist/lib/user/user.js +134 -37
  122. package/dist/lib/user/user.js.map +1 -1
  123. package/dist/lib/util/path-utils.js +16 -1
  124. package/dist/lib/util/path-utils.js.map +1 -1
  125. package/dist/lib/util/url-utils.js +12 -85
  126. package/dist/lib/util/url-utils.js.map +1 -1
  127. package/dist/types/account/account-invite.d.ts +44 -8
  128. package/dist/types/account/account-settings.d.ts +3 -0
  129. package/dist/types/account/account.d.ts +68 -11
  130. package/dist/types/ann-document/ann-document.d.ts +43 -0
  131. package/dist/types/api/abstract-api.d.ts +76 -1
  132. package/dist/types/api/api-getters.d.ts +62 -24
  133. package/dist/types/api/api.d.ts +19 -4
  134. package/dist/types/api/bruce-api.d.ts +48 -4
  135. package/dist/types/api/global-api.d.ts +46 -8
  136. package/dist/types/api/guardian-api.d.ts +42 -5
  137. package/dist/types/bruce-models.d.ts +1 -3
  138. package/dist/types/calculator/calculator.d.ts +57 -1
  139. package/dist/types/client-file/client-file.d.ts +69 -6
  140. package/dist/types/common/bounds.d.ts +3 -3
  141. package/dist/types/common/bruce-event.d.ts +19 -0
  142. package/dist/types/common/color-css-defaults.d.ts +153 -0
  143. package/dist/types/common/color.d.ts +6 -1
  144. package/dist/types/common/delay-queue.d.ts +7 -0
  145. package/dist/types/common/geometry.d.ts +5 -0
  146. package/dist/types/common/lru-cache.d.ts +14 -0
  147. package/dist/types/custom-form/custom-form-content.d.ts +3 -0
  148. package/dist/types/custom-form/custom-form.d.ts +46 -1
  149. package/dist/types/data-lab/data-lab.d.ts +10 -0
  150. package/dist/types/data-source/data-source.d.ts +41 -0
  151. package/dist/types/entity/entity-attachment-type.d.ts +38 -1
  152. package/dist/types/entity/entity-attachment.d.ts +49 -2
  153. package/dist/types/entity/entity-attribute.d.ts +31 -12
  154. package/dist/types/entity/entity-comment.d.ts +41 -1
  155. package/dist/types/entity/entity-coords.d.ts +54 -1
  156. package/dist/types/entity/entity-link.d.ts +39 -2
  157. package/dist/types/entity/entity-lod-category.d.ts +46 -0
  158. package/dist/types/entity/entity-lod.d.ts +72 -1
  159. package/dist/types/entity/entity-relation-type.d.ts +42 -1
  160. package/dist/types/entity/entity-relation.d.ts +57 -1
  161. package/dist/types/entity/entity-source.d.ts +38 -4
  162. package/dist/types/entity/entity-tag.d.ts +48 -1
  163. package/dist/types/entity/entity-type-visual-settings.d.ts +4 -0
  164. package/dist/types/entity/entity-type.d.ts +45 -4
  165. package/dist/types/entity/entity.d.ts +89 -3
  166. package/dist/types/environment.d.ts +9 -0
  167. package/dist/types/import/imported-file.d.ts +64 -8
  168. package/dist/types/internal/uploader.d.ts +8 -0
  169. package/dist/types/markup/markup.d.ts +7 -1
  170. package/dist/types/plugin/plugin.d.ts +45 -0
  171. package/dist/types/program-key/program-key.d.ts +45 -1
  172. package/dist/types/project/menu-item.d.ts +73 -1
  173. package/dist/types/project/project-view-bookmark.d.ts +64 -2
  174. package/dist/types/project/project-view-tile.d.ts +30 -0
  175. package/dist/types/project/project-view.d.ts +52 -2
  176. package/dist/types/project/zoom-control.d.ts +7 -0
  177. package/dist/types/server/hosting-location.d.ts +24 -0
  178. package/dist/types/server/message-broker.d.ts +3 -0
  179. package/dist/types/server/pending-action.d.ts +28 -1
  180. package/dist/types/server/task.d.ts +20 -0
  181. package/dist/types/style/style.d.ts +69 -2
  182. package/dist/types/tileset/tileset.d.ts +92 -1
  183. package/dist/types/user/permission.d.ts +11 -0
  184. package/dist/types/user/session.d.ts +48 -5
  185. package/dist/types/user/user-group.d.ts +40 -8
  186. package/dist/types/user/user.d.ts +117 -17
  187. package/dist/types/util/path-utils.d.ts +16 -1
  188. package/dist/types/util/url-utils.d.ts +5 -22
  189. package/package.json +1 -1
  190. package/dist/lib/api/cam-api.js +0 -84
  191. package/dist/lib/api/cam-api.js.map +0 -1
  192. package/dist/lib/api/idm-api.js +0 -86
  193. package/dist/lib/api/idm-api.js.map +0 -1
  194. package/dist/types/api/cam-api.d.ts +0 -26
  195. package/dist/types/api/idm-api.d.ts +0 -28
@@ -1 +1 @@
1
- {"version":3,"file":"bruce-models.es5.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/account/account.ts","../src/server/hosting-location.ts","../src/api/bruce-api.ts","../src/api/cam-api.ts","../src/api/global-api.ts","../src/api/idm-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.ts","../src/util/object-utils.ts","../src/util/path-utils.ts","../src/entity/entity.ts","../src/common/bruce-variable.ts","../src/calculator/calculator.ts","../src/common/geometry.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/entity/entity-type.ts","../src/util/math-utils.ts","../src/entity/entity-coords.ts","../src/entity/entity-type-visual-settings.ts","../src/entity/entity-attribute.ts","../src/internal/uploader.ts","../src/client-file/client-file.ts","../src/program-key/program-key.ts","../src/project/zoom-control.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/style/style.ts","../src/user/permission.ts","../src/user/session.ts","../src/user/user-group.ts","../src/user/user.ts","../src/account/account-invite.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\";\r\n\r\n/**\r\n * Contains generic descriptions used for Bruce requests.\r\n */\r\nexport namespace Api {\r\n export enum ECacheKey {\r\n Id = \":\",\r\n Entity = \"entity\",\r\n EntityType = \"entitytype\",\r\n ProjectView = \"projectview\",\r\n ProjectViewBookmark = \"pvbookmark\",\r\n Tileset = \"tileset\",\r\n ClientFile = \"clientfile\",\r\n Session = \"session\",\r\n PendingAction = \"pendingaction\",\r\n EntitySource = \"entitysource\",\r\n DataSource = \"datasource\",\r\n ProgramKey = \"programkey\",\r\n EntityCoords = \"entitycoords\",\r\n Tag = \"tag\",\r\n Attachment = \"attachment\",\r\n Comment = \"comment\",\r\n Link = \"link\",\r\n AnnDocument = \"anndocument\",\r\n AttachmentType = \"attachmenttype\",\r\n Relation = \"relation\",\r\n RelationType = \"relationtype\",\r\n Lod = \"lod\",\r\n LodCategory = \"lodcategory\",\r\n Style = \"style\",\r\n PublishTileset = \"publishtileset\",\r\n TilesetAccess = \"tilesetaccess\",\r\n User = \"user\",\r\n UserSettings = \"usersettings\",\r\n UserEmail = \"useremail\",\r\n AccessToken = \"accesstoken\",\r\n UserGroup = \"usergroup\",\r\n Account = \"account\",\r\n DatabaseRegion = \"databaseregion\",\r\n CustomForm = \"customform\",\r\n ImportedFile = \"importedfile\",\r\n Plugin = \"plugin\"\r\n }\r\n export const DEFAULT_CACHE_DURATION = 60 * 1000; // 1 minute.\r\n export const TEMPLATE_ACCOUNT_ID = \"template\";\r\n export const ACCESS_TOKEN_HEADER = \"X-Access-Token\";\r\n\r\n /**\r\n * Possible environments we host Bruce apps on.\r\n * When these are matched, they should be case-insensitive.\r\n */\r\n export enum EEnv {\r\n DEV = \"DEV\",\r\n STG = \"STG\",\r\n UAT = \"UAT\",\r\n PROD = \"PROD\"\r\n }\r\n export type Env = EEnv | string;\r\n // False = cache is enabled by default for req-params.\r\n export let DEFAULT_NO_CACHE = false;\r\n\r\n /**\r\n * Prepares a string to be included in a url.\r\n * @param str\r\n * @returns\r\n */\r\n export function Encode(str: string): string {\r\n return encodeURIComponent(str.replace(/\\+/g, \"%2B\").replace(/\\./g, \"%2E\"));\r\n }\r\n\r\n export interface IList<T> {\r\n Items: T[];\r\n TotalCount?: number;\r\n }\r\n\r\n export enum ESortOrder {\r\n None = 0,\r\n Asc = 1,\r\n Desc = -1\r\n }\r\n\r\n export enum EEncoding {\r\n UTF8 = \"UTF-8\",\r\n UTF16 = \"UTF-16BE\"\r\n }\r\n\r\n export interface IReqParams {\r\n // Default is Api.DEFAULT_CACHE_STATE.\r\n // If true then local cache check will be skipped.\r\n noCache?: boolean;\r\n // Request headers.\r\n headers?: IDictionary<string>;\r\n }\r\n\r\n export interface IRes {\r\n\r\n }\r\n\r\n /**\r\n * Prepares default settings for a request to Bruce Api.\r\n * Our requests WRONGLY have utf-16 for 95% of them. Please be wary of that.\r\n * @param base\r\n * @returns\r\n */\r\n export function PrepReqParams(base?: Api.IReqParams | IUploadReqParams): IReqParams | IUploadReqParams {\r\n base = {\r\n ...base\r\n };\r\n return base;\r\n }\r\n\r\n export interface IUploadReqParams extends IReqParams {\r\n onProgress?: (e: ProgressEvent) => void;\r\n formData?: IDictionary<string> | FormData;\r\n }\r\n}","type Key = string | number;\ntype Persistence = \"memory\" | \"storage\";\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 // Persistence is currently set to memory until storage is reworked.\n persistence?: Persistence,\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 // Prioritize memory over storage because it's faster to access.\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}","import { CacheControl } from \"../common/cache\";\r\nimport { Api } from \"./api\";\r\n\r\n// TODO: Currently checks for CSV vs json specifically,\r\n// Need to see if our api is generally good at setting content-type headers.\r\n// Make it less specific to CSV.\r\nasync function parseResult(data: Response): Promise<any> {\r\n if (data.status >= 400 || data.status < 200) {\r\n const error = await data.json();\r\n throw(error);\r\n }\r\n\r\n let type = data.headers.get(\"Content-Type\")?.trim().toLowerCase();\r\n let encoding = type?.split(\";\").find((x) => x.startsWith(\"charset=\"))?.split(\"=\")[1].toLowerCase();\r\n if (encoding === \"utf-16\") {\r\n encoding = Api.EEncoding.UTF16;\r\n }\r\n\r\n const text = await (encoding && encoding !== \"utf-8\" \r\n ? new TextDecoder(encoding).decode(await data.arrayBuffer()) \r\n : data.text());\r\n\r\n if (!text?.trim()) {\r\n return null;\r\n }\r\n return type?.includes(\"text/csv\") ? text : JSON.parse(text);\r\n}\r\n\r\n/**\r\n * This is a base class for communication with an arbitrary Bruce Api.\r\n */\r\nexport class AbstractApi {\r\n private ssidHeader: string;\r\n private ssid: string = \"\";\r\n protected baseUrl: string = \"\";\r\n public Cache: CacheControl<any>;\r\n\r\n constructor(params: {\r\n ssidHeader?: string,\r\n cacheId?: string\r\n }) {\r\n this.ssidHeader = params?.ssidHeader;\r\n this.Cache = new CacheControl<any>(params?.cacheId);\r\n }\r\n\r\n public GetBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n public SetBaseUrl(url: string): void {\r\n this.baseUrl = url;\r\n if (!this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl += \"/\";\r\n }\r\n }\r\n\r\n public GetCacheItem(key: string, reqParams?: Api.IReqParams) {\r\n let noCache = reqParams?.noCache;\r\n if (noCache == null) {\r\n noCache = Api.DEFAULT_NO_CACHE;\r\n }\r\n if (noCache) {\r\n return null;\r\n }\r\n return this.Cache.Get(key);\r\n }\r\n\r\n public SetCacheItem(params: {\r\n key: string,\r\n value: any,\r\n duration?: number,\r\n req?: Api.IReqParams\r\n }) {\r\n let {key, value, duration, req} = params;\r\n let noCache = req?.noCache;\r\n if (noCache == null) {\r\n noCache = Api.DEFAULT_NO_CACHE;\r\n }\r\n if (noCache) {\r\n return;\r\n }\r\n if (isNaN(duration)) {\r\n duration = Api.DEFAULT_CACHE_DURATION;\r\n }\r\n this.Cache.Set({\r\n id: key,\r\n data: value,\r\n duration,\r\n persistence: \"memory\"\r\n });\r\n }\r\n\r\n public GetSessionId(): string {\r\n return this.ssid;\r\n }\r\n\r\n public SetSessionId(value: string): void {\r\n this.ssid = value;\r\n }\r\n\r\n public GetSessionHeader(): string {\r\n return this.ssidHeader;\r\n }\r\n\r\n public SetSessionHeader(value: string): void {\r\n this.ssidHeader = value;\r\n }\r\n\r\n public async get(url: string, params?: Api.IReqParams): Promise<any> {\r\n if (!params) {\r\n params = {};\r\n }\r\n params.headers = params.headers || {};\r\n params.headers = {\r\n \"Content-Type\": \"application/json;\",\r\n ...params.headers\r\n };\r\n if (this.ssidHeader && this.ssid) {\r\n params.headers[this.ssidHeader] = this.ssid;\r\n }\r\n const res = await fetch(url, {\r\n headers: params.headers\r\n });\r\n return parseResult(res);\r\n }\r\n\r\n public async delete(url: string, params?: Api.IReqParams): Promise<any> {\r\n if (!params) {\r\n params = {};\r\n }\r\n params.headers = params.headers || {};\r\n params.headers = {\r\n \"Content-Type\": \"application/json;\",\r\n ...params.headers\r\n };\r\n if (this.ssidHeader && this.ssid) {\r\n params.headers[this.ssidHeader] = this.ssid;\r\n }\r\n const res = await fetch(url, {\r\n headers: params.headers,\r\n method: \"DELETE\"\r\n });\r\n return parseResult(res);\r\n }\r\n\r\n public async post(url: string, data: any, params?: Api.IReqParams): Promise<any> {\r\n if (!params) {\r\n params = {};\r\n }\r\n params.headers = params.headers || {};\r\n params.headers = {\r\n \"Content-Type\": \"application/json;\",\r\n ...params.headers\r\n };\r\n if (this.ssidHeader && this.ssid) {\r\n params.headers[this.ssidHeader] = this.ssid;\r\n }\r\n if (!data) {\r\n data = {};\r\n }\r\n if (typeof data != \"string\") {\r\n data = JSON.stringify(data);\r\n }\r\n const res = await fetch(url, {\r\n headers: params.headers,\r\n method: \"POST\",\r\n body: data\r\n });\r\n return parseResult(res);\r\n }\r\n\r\n public async put(url: string, data: any, params?: Api.IReqParams): Promise<any> {\r\n if (!params) {\r\n params = {};\r\n }\r\n params.headers = params.headers || {};\r\n params.headers = {\r\n \"Content-Type\": \"application/json;\",\r\n ...params.headers\r\n };\r\n if (this.ssidHeader && this.ssid) {\r\n params.headers[this.ssidHeader] = this.ssid;\r\n }\r\n if (!data) {\r\n data = {};\r\n }\r\n if (typeof data != \"string\") {\r\n data = JSON.stringify(data);\r\n }\r\n const res = await fetch(url, {\r\n headers: params.headers,\r\n method: \"PUT\",\r\n body: data\r\n });\r\n return parseResult(res);\r\n }\r\n\r\n public async upload(url: string, blob: Blob, params?: Api.IUploadReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n try {\r\n let xhr = new XMLHttpRequest();\r\n const headers = <any>params?.headers;\r\n if (headers) {\r\n const headerKeys = Object.keys(headers);\r\n for (let i = 0; i < headerKeys.length; i++) {\r\n const key = headerKeys[i];\r\n const value = headers[key];\r\n xhr.setRequestHeader(key, value);\r\n }\r\n }\r\n if (params?.onProgress) {\r\n if (xhr.upload) {\r\n xhr.upload.onprogress = params?.onProgress;\r\n }\r\n else {\r\n xhr.addEventListener(\"progress\", params?.onProgress);\r\n }\r\n }\r\n xhr.onreadystatechange = (e) => {\r\n if (xhr.readyState == 4) {\r\n if (xhr.status >= 400 || xhr.status < 200) {\r\n rej(e);\r\n }\r\n else {\r\n try {\r\n res(JSON.parse(xhr.responseText));\r\n }\r\n catch (e) {\r\n console.error(e, xhr.responseText);\r\n res(xhr.responseText);\r\n }\r\n }\r\n }\r\n };\r\n xhr.open(\"POST\", url, true);\r\n if (this.ssidHeader && this.ssid) {\r\n xhr.setRequestHeader(this.ssidHeader, this.ssid);\r\n }\r\n let formData;\r\n if (params?.formData instanceof FormData) {\r\n formData = params?.formData;\r\n }\r\n else {\r\n formData = new FormData();\r\n if (params?.formData) {\r\n for (const key in params.formData) {\r\n formData.append(key, params.formData[key]);\r\n }\r\n }\r\n }\r\n formData.append(\"file\", blob);\r\n xhr.send(formData);\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n }\r\n}","import { Api } from \"../api/api\";\r\n\r\nexport namespace MessageBroker {\r\n export enum EAction {\r\n // Subscribes a client to topic messages on a server side.\r\n SUBSCRIBE = \"subscribe\",\r\n // Subscribes a client to a topic without notifying other clients.\r\n SUBSCRIBE_SHADOW = \"subscribeShadow\",\r\n // Unsubscribes clients from topic messages on a server side\r\n UNSUBSCRIBE = \"unsubscribe\",\r\n // Sends a message to all topic subscribers.\r\n BROADCAST = \"broadcast\",\r\n // Requests topic subscribers without subscribing.\r\n GET_TOPIC_SUBSCRIBERS = \"getTopicSubscribers\"\r\n }\r\n\r\n export type SubscribeType = EAction.SUBSCRIBE | EAction.SUBSCRIBE_SHADOW;\r\n\r\n export interface IMessageBase {\r\n topic: string;\r\n event?: string;\r\n data?: any;\r\n }\r\n\r\n export interface IMessage extends IMessageBase {\r\n // Timestamp of message.\r\n time?: number;\r\n // User id of message sender.\r\n user?: string;\r\n action: EAction;\r\n }\r\n\r\n export interface IBroker {\r\n /**\r\n * Add a subscriber to a topic.\r\n * @param topic \r\n * @param callback \r\n * @param action \r\n */\r\n Subscribe: (topic: string, callback: (msg: IMessage) => void, type?: SubscribeType) => void,\r\n /**\r\n * Remove a subscriber from a topic.\r\n * @param topic \r\n * @param callback \r\n */\r\n Unsubscribe: (topic: string, callback: (msg: IMessage) => void) => void,\r\n /**\r\n * Send message to server.\r\n * @param base \r\n * @returns \r\n */\r\n SendMessage: (base: IMessageBase | IMessage) => void;\r\n SetUserId: (userId: string) => void;\r\n IsConnected: boolean;\r\n }\r\n\r\n /**\r\n * Communicates with a server message broker.\r\n */\r\n export class WebSocketBroker implements IBroker {\r\n private subscriptions = new Map<string, ((msg: IMessage) => void)[]>();\r\n private ws: WebSocket;\r\n private reconnects: number = 0;\r\n private maxReconnects: number = 5;\r\n private userId: string;\r\n private uri: string;\r\n private env: Api.Env;\r\n\r\n public constructor(uri: string, env?: Api.Env) {\r\n this.uri = uri;\r\n this.env = env ? env : Api.EEnv.PROD;\r\n this.connect();\r\n }\r\n\r\n public get IsConnected(): boolean {\r\n return this.ws.readyState === WebSocket.OPEN;\r\n }\r\n\r\n public SetUserId(userId: string): void {\r\n this.userId = this.userId ? this.userId : userId;\r\n }\r\n\r\n private connect() {\r\n try {\r\n if (!WebSocket) {\r\n throw new Error(\"WebSocket is not supported by this browser\");\r\n }\r\n this.ws = new WebSocket(this.formatApiUri(this.uri));\r\n this.ws.onopen = this.onOpen.bind(this);\r\n this.ws.onmessage = this.onMessage.bind(this);\r\n this.ws.onerror = this.onError.bind(this);\r\n this.ws.onclose = this.onClose.bind(this);\r\n } \r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n private formatApiUri(uri: string): string {\r\n const ws = document.location.protocol === \"https:\" ? \"wss\" : \"ws\";\r\n return uri.replace(/^(https|http)/, ws) + \"websocket\";\r\n }\r\n\r\n private onOpen(ev: any): void {\r\n if (this.env === Api.EEnv.DEV) {\r\n console.log(\"MessageBroker connection opened: \", ev);\r\n }\r\n }\r\n\r\n private onClose(ev: any): void {\r\n if (this.env === Api.EEnv.DEV) {\r\n console.log(\"MessageBroker connection closed, trying to reconnect: \", ev);\r\n }\r\n if (this.reconnects < this.maxReconnects) {\r\n this.reconnects += 1;\r\n setTimeout(() => this.connect(), 5000 * this.reconnects);\r\n }\r\n }\r\n\r\n private onMessage(ev: any): void {\r\n const data: IMessage = JSON.parse(ev.data);\r\n this.subscriptions.get(data.topic)?.forEach(cb => cb(data));\r\n }\r\n\r\n private onError(ev: any): void {\r\n console.error(\"MessageBroker connection error: \", ev);\r\n }\r\n\r\n private addSubscriber(topic: string, callback: (msg: IMessage) => void): void {\r\n const subscribers = this.subscriptions.get(topic) || [];\r\n if (subscribers.includes(callback)) {\r\n return;\r\n }\r\n subscribers.push(callback);\r\n this.subscriptions.set(topic, subscribers);\r\n }\r\n\r\n /**\r\n * Send message to server.\r\n * @param base \r\n * @returns \r\n */\r\n public SendMessage(base: IMessageBase | IMessage): void {\r\n if (this.ws.readyState !== WebSocket.OPEN) {\r\n return;\r\n }\r\n try {\r\n const msg = base as IMessage;\r\n if (!msg.event) {\r\n msg.event = EAction.BROADCAST;\r\n }\r\n let message = base.data ? base.data : {};\r\n if (typeof message == \"object\") {\r\n message = JSON.stringify(message);\r\n }\r\n msg.data = message;\r\n\r\n const outgoingMessage: IMessage = { ...msg, user: this.userId, time: Date.now() };\r\n this.ws.send(JSON.stringify(outgoingMessage));\r\n } \r\n catch (e) {\r\n console.warn(e);\r\n }\r\n }\r\n\r\n /**\r\n * Add a subscriber to a topic.\r\n * @param topic \r\n * @param callback \r\n * @param action \r\n */\r\n public Subscribe(topic: string, callback: (msg: IMessage) => void, action?: SubscribeType): void {\r\n if (!action) {\r\n action = EAction.SUBSCRIBE;\r\n }\r\n this.addSubscriber(topic, callback);\r\n this.SendMessage({ topic, action });\r\n }\r\n\r\n /**\r\n * Remove a subscriber from a topic.\r\n * @param topic \r\n * @param callback \r\n */\r\n public Unsubscribe(topic: string, callback: (msg: IMessage) => void): void {\r\n const subscribers = this.subscriptions.get(topic) || [];\r\n this.subscriptions.set(topic, subscribers.filter(fn => fn != callback));\r\n this.SendMessage({ topic, action: EAction.UNSUBSCRIBE });\r\n }\r\n\r\n public RequestTopicUsers(topic: string, callback: (msg: IMessage) => void): void {\r\n this.addSubscriber(topic, callback);\r\n this.SendMessage({ topic, event: EAction.GET_TOPIC_SUBSCRIBERS });\r\n }\r\n }\r\n}","import { AbstractApi } from \"./abstract-api\";\r\nimport { Api as A } from \"./api\";\r\n\r\n/**\r\n * This is the request handler for Cam/Idm Api,\r\n * it should be passed to any method that wants to communicate with this particular api.\r\n */\r\nexport namespace GuardianApi {\r\n export interface IGetter {\r\n // Default settings the getter's app is running on.\r\n env: A.EEnv;\r\n // Should return using app defaults if no params are specified.\r\n getApi: (env?: A.EEnv) => GuardianApi.Api;\r\n }\r\n\r\n export class Api extends AbstractApi {\r\n private env: A.Env;\r\n\r\n constructor(params: {\r\n env?: A.Env\r\n }) {\r\n super({\r\n ssidHeader: \"x-sessionid\",\r\n cacheId: `GUARDIAN_API_${params?.env}_`\r\n });\r\n this.env = params?.env ? params.env : A.EEnv.PROD;\r\n this.setBaseUrl();\r\n }\r\n\r\n private setBaseUrl(): void {\r\n let url = \"https://guardian.nextspace\";\r\n const env = this.env.toUpperCase();\r\n switch (env) {\r\n case A.EEnv.DEV:\r\n url += \"-dev.net/\";\r\n break;\r\n case A.EEnv.STG:\r\n url += \"-stg.net/\";\r\n break;\r\n case A.EEnv.UAT:\r\n url += \"-uat.net/\";\r\n break;\r\n case A.EEnv.PROD:\r\n url += \".host/\";\r\n break;\r\n default:\r\n throw(\"Specified Environment is not valid. SuppliedEnv=\" + env);\r\n }\r\n this.baseUrl = url;\r\n }\r\n\r\n public GetBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n public SetBaseUrl(url: string): void {\r\n this.baseUrl = url;\r\n if (!this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl += \"/\";\r\n }\r\n }\r\n\r\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.get(this.baseUrl + url, params);\r\n }\r\n\r\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.delete(this.baseUrl + url, params);\r\n }\r\n\r\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\r\n return this.post(this.baseUrl + url, data, params);\r\n }\r\n\r\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\r\n return this.upload(this.baseUrl + url, blob, params);\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { CamApi } from \"../api/cam-api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { IdmApi } from \"../api/idm-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { AccountSettings } from \"./account-settings\";\r\n\r\nconst ACCOUNT_EXCLUSIONS = [\"hyperportal\", \"hypeportal\", \"bviewer\"];\r\n\r\n/**\r\n * Describes the \"Client Account\" concept within Bruce.\r\n * A client account is a database instance that holds one or many users.\r\n */\r\nexport namespace Account {\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 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 export function GetDbRegionListCacheKey() {\r\n return Api.ECacheKey.DatabaseRegion;\r\n }\r\n\r\n export enum EAppId {\r\n BruceApi = \"BruceAPI\",\r\n Navigator = \"Navigator\",\r\n }\r\n\r\n export type AppId = EAppId | string;\r\n\r\n export enum EStarterContent {\r\n Default = \"default\",\r\n None = \"none\"\r\n }\r\n\r\n export interface IAccount {\r\n ID?: string;\r\n Name?: string;\r\n \"ClientAccount.ID\"?: string;\r\n \"Application.ID\"?: string;\r\n \"BruceAPI\"?: string;\r\n \"Settings\"?: any;\r\n \"OwnerUser.ID\"?: string;\r\n // This will depend on what \"appSettingsId\" you request for.\r\n \"Application.Settings\"?: AccountSettings.Settings;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: CamApi.Api | GuardianApi.Api,\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 req = await api.GET(`account/${id}`, reqParams);\r\n const resData = {\r\n account: req\r\n };\r\n await api.SetCacheItem({\r\n key: GetCacheKey(id),\r\n value: resData,\r\n req: reqParams\r\n });\r\n return resData;\r\n }\r\n\r\n export async function GetRelatedList(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\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 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 export async function GetAppSettings(params: {\r\n api?: CamApi.Api | GuardianApi.Api,\r\n accountId: string,\r\n appId: AppId,\r\n req?: Api.IReqParams\r\n }): Promise<{\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 * 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?: CamApi.Api | GuardianApi.Api,\r\n accountId: string,\r\n appId: string,\r\n settings: AccountSettings.Settings,\r\n req?: Api.IReqParams\r\n }): Promise<{\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 Bruce 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 accountId: string,\r\n name: string,\r\n hostingLocationKey: string,\r\n starterContent?: EStarterContent,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n account: IAccount\r\n }> {\r\n let { api, accountId: id, name, hostingLocationKey, starterContent, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!id || !name || !hostingLocationKey) {\r\n throw new Error(\"Id, Name and hostingLocationKey are required.\");\r\n }\r\n if (!starterContent) {\r\n starterContent = EStarterContent.None;\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}","import { Account } from \"../account/account\";\r\nimport { AccountSettings } from \"../account/account-settings\";\r\nimport { Api } from \"../api/api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * A hosting location is a record for a possible bruce-api server configuration.\r\n * A hosting location will have one or many database servers as well, this is an additional setting.\r\n */\r\nexport namespace HostingLocation {\r\n export interface ILocation {\r\n // Internal ID.\r\n ID: number;\r\n // External ID.\r\n Key: string;\r\n // Indicates if creation of a new bruce account is allowed in this region.\r\n // This should dictate if the record is visible in UI dropdowns as well for non-super-admins.\r\n IsEnabledForNewAccounts: boolean;\r\n DisplayName?: string;\r\n Description?: string;\r\n // Eg: \"us-west-1\".\r\n AWSRegion?: string;\r\n // Eg: \"Singapore\".\r\n Country?: string;\r\n // Eg: \"Vultr\".\r\n Hoster?: string;\r\n // Eg: \"San Francisco\".\r\n City?: string;\r\n // URL template to the corresponding API instance.\r\n // Eg: \"https://<ACCOUNTID>.api.nextspace-us.host/\".\r\n BruceAPIURL?: string;\r\n // Comma separated list of Api.EEnv.\r\n Environment?: string;\r\n // Arbitrary settings for the particular location.\r\n // For example this may include CDN template URLs.\r\n Settings?: any;\r\n }\r\n\r\n /**\r\n * @Warning: This will not return the Settings property.\r\n * @param params\r\n * @returns\r\n */\r\n export async function GetList(params: {\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n locations: ILocation[]\r\n }> {\r\n let { api, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.GET(\"hostinglocations\", Api.PrepReqParams(req));\r\n return {\r\n locations: res.Items\r\n };\r\n }\r\n\r\n export async function GetById(params: {\r\n id: number,\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n location: ILocation\r\n }> {\r\n let { id, api, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!id) {\r\n throw(\"Invalid id\");\r\n }\r\n const res = await api.GET(`hostinglocation/id/${id}`, Api.PrepReqParams(req));\r\n return {\r\n location: res\r\n };\r\n }\r\n\r\n export async function GetByKey(params: {\r\n key: string,\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n location: ILocation\r\n }> {\r\n let { key, api, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!key) {\r\n throw(\"Invalid key\");\r\n }\r\n const res = await api.GET(`hostinglocation/key/${key}`, Api.PrepReqParams(req));\r\n return {\r\n location: res\r\n };\r\n }\r\n\r\n /**\r\n * Returns hostingLocationKey from given db url.\r\n * Some older accounts don't have this set, so we need to guess it.\r\n * @param params\r\n * @returns\r\n */\r\n export function GuessKey(params: {\r\n // Database connection string.\r\n DBServer?: string\r\n }) {\r\n const { DBServer: databaseUrl } = params;\r\n if (databaseUrl.includes(\"hyperfarm-prod-instance-1\")) {\r\n return \"HYPERFARM\";\r\n }\r\n if (databaseUrl.includes(\"prod-syd1.nextspace.host\")) {\r\n return \"AU-VULTR-FIRST\";\r\n }\r\n else if (databaseUrl.includes(\"prod-nyc1.nextspace.host\")) {\r\n return \"US-VULTR-FIRST\";\r\n }\r\n else if (databaseUrl.includes(\"prod-ams1.nextspace.host\")) {\r\n return \"EU-VULTR-FIRST\";\r\n }\r\n else if (databaseUrl.includes(\"prod-sing1.nextspace.host\")) {\r\n return \"SE-VULTR-FIRST\";\r\n }\r\n else if (databaseUrl.includes(\"dev-first\")) {\r\n return \"DEV-FIRST\";\r\n }\r\n else if (databaseUrl.includes(\".ap-southeast-1.\")) {\r\n return \"SE\";\r\n }\r\n else if (databaseUrl.includes(\".us-west-1.\")) {\r\n return \"US\";\r\n }\r\n else if (databaseUrl.includes(\".eu-west-3.\")) {\r\n return \"EU\";\r\n }\r\n else if (databaseUrl.includes(\"bruce-prod-au\")) {\r\n return \"AU\";\r\n }\r\n else if (databaseUrl.includes(\"bruce-dev\")) {\r\n return \"DEV\";\r\n }\r\n return null;\r\n }\r\n\r\n export async function GetKeyByAccountId(params: {\r\n // Either accountId or apiSettings must be provided.\r\n accountId?: string,\r\n apiSettings?: AccountSettings.IBruceApi,\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n key: string,\r\n // Indicates if the key was inferred by legacy data.\r\n isLegacy?: boolean\r\n }> {\r\n let { accountId, apiSettings, api, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!accountId && !apiSettings) {\r\n throw(\"Invalid accountId or apiSettings\");\r\n }\r\n const settings = apiSettings ? apiSettings : (await Account.GetAppSettings({\r\n api,\r\n accountId,\r\n appId: Account.EAppId.BruceApi\r\n })).settings as AccountSettings.IBruceApi;\r\n let hostingKey = settings[\"HostingLocation.Key\"];\r\n let isLegacy = false;\r\n if (!hostingKey) {\r\n hostingKey = settings.DBLocation;\r\n isLegacy = true;\r\n }\r\n if (!hostingKey) {\r\n hostingKey = GuessKey({\r\n DBServer: settings.DBServer\r\n });\r\n isLegacy = true;\r\n }\r\n return {\r\n key: hostingKey,\r\n isLegacy\r\n };\r\n }\r\n\r\n export async function GetByAccountId(params: {\r\n // Either accountId or apiSettings must be provided.\r\n accountId?: string,\r\n apiSettings?: AccountSettings.IBruceApi,\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n location: ILocation\r\n }> {\r\n let { accountId, apiSettings, api, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const data = await GetKeyByAccountId({\r\n accountId,\r\n apiSettings,\r\n api,\r\n req\r\n });\r\n if (!data?.key) {\r\n return null;\r\n }\r\n const key = await GetByKey({\r\n key: data.key,\r\n api,\r\n req\r\n });\r\n return key;\r\n }\r\n}","import { AbstractApi } from \"./abstract-api\";\r\nimport { Api as A } from \"./api\";\r\nimport { MessageBroker } from \"../server/message-broker\";\r\nimport { GuardianApi } from \"./guardian-api\";\r\nimport { HostingLocation } from \"../server/hosting-location\";\r\n\r\nexport namespace BruceApi {\r\n export interface IGetter {\r\n accountId: string;\r\n // Default settings the getter's app is running on.\r\n env?: A.EEnv;\r\n // Should return using app defaults if no params are specified.\r\n getApi: (accountId?: string, env?: A.EEnv) => BruceApi.Api;\r\n }\r\n\r\n /**\r\n * This is the request handler for Bruce Api,\r\n * it should be passed to any method that wants to communicate with this particular api.\r\n */\r\n export class Api extends AbstractApi {\r\n private accountId: string;\r\n public get AccountId(): string {\r\n return this.accountId;\r\n }\r\n\r\n private env: A.Env;\r\n private loadProm: Promise<void>;\r\n private loadCancelled: boolean = false;\r\n private messageBroker: MessageBroker.IBroker;\r\n public get MessageBroker(): MessageBroker.IBroker {\r\n return this.messageBroker;\r\n }\r\n\r\n // The regional base url for the account.\r\n // When using the CDN base url you MUST include a query param for accountId.\r\n private cdnBaseUrl: string;\r\n\r\n // Used for entity GET list-by-filter requests.\r\n // When set and viaCdn = true when performing an entity request, this will be used in place for base-url.\r\n // Eg: \"https://d3pb232f6pp9if.cloudfront.net/entitiesListForCDN/alex\"\r\n public EntityCdnUrl: string;\r\n // Works only for static/dynamic tilesets.\r\n // When set and viaCdn = true when getting a legacy tileset file, this will be used in place for base-url.\r\n // Eg: \"https://d15gsaz0jz5ika.cloudfront.net/alex/<TILESETID>/file/<FILEPATH>\"\r\n public LegacyTilesetCdnUrl: string;\r\n // Works for all tilesets including older ones.\r\n // Eg: \"https://blah.cloudfront.net/tilesets/<TILESETID>/files/<FILEPATH>?accountId=<ACCOUNT>\"\r\n public TilesetCdnUrl: string;\r\n\r\n // Indicates if the init process has finished loading.\r\n // This means the regional base url has been set and message broker is ready.\r\n public get Loading(): Promise<void> {\r\n return this.loadProm;\r\n }\r\n\r\n /**\r\n * @param params\r\n */\r\n constructor(params: {\r\n // Required client account to connect to.\r\n accountId: string,\r\n // Default is PROD.\r\n env?: A.Env,\r\n // @Deprecated, use loadConfig instead.\r\n loadRegionalBaseUrl?: boolean\r\n // True to load settings for regional base url and CDN.\r\n /// Default = false.\r\n loadConfig?: boolean\r\n // True to load message broker.\r\n // Default = true.\r\n loadWebSocket?: boolean,\r\n // Guardian instance used for regional url loading.\r\n // If not provided then a new instance of the API is made.\r\n guardian?: GuardianApi.Api,\r\n }) {\r\n super({\r\n ssidHeader: \"x-sessionid\",\r\n cacheId: `BRUCE_API_${params?.env}_${params?.accountId}_`\r\n });\r\n let {accountId, env, guardian, loadRegionalBaseUrl, loadConfig, loadWebSocket} = params;\r\n this.accountId = accountId;\r\n this.env = env ?? A.EEnv.PROD;\r\n\r\n if (loadRegionalBaseUrl) {\r\n loadConfig = true;\r\n }\r\n if (!guardian && loadConfig) {\r\n guardian = new GuardianApi.Api({\r\n env: this.env\r\n });\r\n }\r\n this.loadProm = this.init(guardian, loadConfig, loadWebSocket);\r\n }\r\n\r\n /**\r\n * Loads regional base url and sets up message broker.\r\n * @param guardian Required for loading regional base url.\r\n * @param loadConfig\r\n * @returns\r\n */\r\n private async init(\r\n guardian?: GuardianApi.Api,\r\n loadConfig?: boolean,\r\n loadWebSocket?: boolean\r\n ): Promise<void> {\r\n if (!this.accountId) {\r\n throw(\"accountId is required.\");\r\n }\r\n\r\n const env = this.env.toUpperCase();\r\n let domain = \"nextspace.host\";\r\n switch (env) {\r\n case A.EEnv.DEV:\r\n domain = \"nextspace-dev.net\";\r\n break;\r\n case A.EEnv.STG:\r\n domain = \"nextspace-stg.net\";\r\n break;\r\n case A.EEnv.UAT:\r\n domain = \"nextspace-uat.net\";\r\n break;\r\n case A.EEnv.PROD:\r\n domain = \"nextspace.host\";\r\n break;\r\n default:\r\n console.error(\"Specified Environment is not valid. SuppliedEnv=\" + env);\r\n }\r\n\r\n // Set using a stable default.\r\n this.baseUrl = `https://${this.accountId}.api.${domain}/`;\r\n\r\n if (guardian && loadConfig) {\r\n try {\r\n const host = await HostingLocation.GetByAccountId({\r\n accountId: this.accountId,\r\n api: guardian\r\n });\r\n if (host?.location) {\r\n const settings = host.location.Settings;\r\n\r\n // Attempt to load regional base url.\r\n // First try go through settings.\r\n let urlSet = false;\r\n if (settings?.BruceAPIURL) {\r\n let envUrl = settings.BruceAPIURL[env];\r\n if (envUrl) {\r\n envUrl = envUrl\r\n .replace(\"<ACCOUNTID>\", this.accountId)\r\n .replace(\"<ACCOUNT>\", this.accountId)\r\n if (envUrl && envUrl.length > 1) {\r\n this.baseUrl = envUrl;\r\n urlSet = true;\r\n }\r\n }\r\n }\r\n // Try go through host location's base url.\r\n // This may be wrong env which is why it's used as fallback right now.\r\n if (!urlSet && host.location.BruceAPIURL) {\r\n const regionalUrl = host.location.BruceAPIURL\r\n .replace(\"<ACCOUNTID>\", this.accountId)\r\n .replace(\"<ACCOUNT>\", this.accountId)\r\n .replace(\"<DOMAIN>\", domain);\r\n if (regionalUrl && regionalUrl.length > 1) {\r\n this.baseUrl = regionalUrl;\r\n urlSet = true;\r\n }\r\n }\r\n\r\n // Attempt to load CDN settings.\r\n if (settings?.CDN) {\r\n this.EntityCdnUrl = settings.CDN.entityURL?.[env];\r\n // We need to fix our configs.\r\n if (this.EntityCdnUrl) {\r\n if (this.EntityCdnUrl.includes(\"entitiesListForCDN\")) {\r\n this.EntityCdnUrl = this.EntityCdnUrl.replace(\"<ACCOUNT>\", this.accountId);\r\n }\r\n else {\r\n this.EntityCdnUrl = this.EntityCdnUrl.replace(\"<ACCOUNT>\", \"entitiesListForCDN/\" + this.accountId);\r\n }\r\n }\r\n this.LegacyTilesetCdnUrl = settings.CDN.legacyTilesetURL?.[env];\r\n this.TilesetCdnUrl = settings.CDN.tilesetURL?.[env];\r\n if (this.TilesetCdnUrl) {\r\n this.TilesetCdnUrl = this.TilesetCdnUrl.replace(\"<ACCOUNT>\", this.accountId);\r\n }\r\n\r\n // TilesetCdnUrl example: \"https://blah.cloudfront.net/tilesets/<TILESETID>/files/<FILEPATH>?accountId=<ACCOUNT>\".\r\n // Lazy at the moment to go around updating every region we have, I'll interpret the url from tilesetCdnUrl.\r\n if (this.TilesetCdnUrl) {\r\n try {\r\n const url = new URL(this.TilesetCdnUrl);\r\n this.cdnBaseUrl = `${url.protocol}//${url.hostname}/`;\r\n } \r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n \r\n }\r\n }\r\n }\r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n if (loadWebSocket != false) {\r\n try {\r\n this.messageBroker = new MessageBroker.WebSocketBroker(this.baseUrl, this.env);\r\n }\r\n catch (e) {\r\n console.warn(\"BruceApi: Failed to create message broker.\", e);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Warning: This method does not wait for init to finish loading.\r\n * This means the url could be changed once fully initialized.\r\n * The url will be valid either way, but the loaded one may be faster as it is region specific.\r\n * Await the \"Loading\" promise if you care about this.\r\n * @returns\r\n */\r\n public GetBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n /**\r\n * Warning: Wait the \"Loading\" promise before using this url.\r\n * @returns \r\n */\r\n public GetCdnBaseUrl(): string {\r\n return this.cdnBaseUrl;\r\n }\r\n\r\n /**\r\n * Warning: This will cancel the init process.\r\n * The init process loads a region specific endpoint.\r\n * Setting a base url will stop that process from completing.\r\n * @param url\r\n */\r\n public SetBaseUrl(url: string): void {\r\n this.baseUrl = url;\r\n if (!this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl += \"/\";\r\n }\r\n this.loadCancelled = true;\r\n }\r\n\r\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n this.loadProm.then(() => {\r\n this.get(this.baseUrl + url, params).then(res).catch(rej);\r\n }).catch(rej);\r\n });\r\n }\r\n\r\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n this.loadProm.then(() => {\r\n this.delete(this.baseUrl + url, params).then(res).catch(rej);\r\n }).catch(rej);\r\n });\r\n }\r\n\r\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n this.loadProm.then(() => {\r\n this.post(this.baseUrl + url, data, params).then(res).catch(rej);\r\n }).catch(rej);\r\n });\r\n }\r\n\r\n public async PUT(url: string, data: any, params?: A.IReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n this.loadProm.then(() => {\r\n this.put(this.baseUrl + url, data, params).then(res).catch(rej);\r\n }).catch(rej);\r\n });\r\n }\r\n\r\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n this.loadProm.then(() => {\r\n this.upload(this.baseUrl + url, blob, params).then(res).catch(rej);\r\n }).catch(rej);\r\n });\r\n }\r\n }\r\n}","import { AbstractApi } from \"./abstract-api\";\r\nimport { Api as A } from \"./api\";\r\n\r\n/**\r\n * This is the request handler for Cam Api,\r\n * it should be passed to any method that wants to communicate with this particular api.\r\n * @deprecated Please use GuardianApi instead.\r\n */\r\nexport namespace CamApi {\r\n export interface IGetter {\r\n // Default settings the getter's app is running on.\r\n env: A.EEnv;\r\n // Should return using app defaults if no params are specified.\r\n getApi: (env?: A.EEnv) => CamApi.Api;\r\n }\r\n\r\n export class Api extends AbstractApi {\r\n private env: A.Env;\r\n\r\n constructor(params: {\r\n env?: A.Env\r\n }) {\r\n super({\r\n ssidHeader: \"x-sessionid\",\r\n cacheId: `CAM_API_${params?.env}_`\r\n });\r\n this.env = params?.env ? params.env : A.EEnv.PROD;\r\n this.setBaseUrl();\r\n }\r\n\r\n private setBaseUrl(): void {\r\n let url = \"https://guardian.nextspace\";\r\n const env = this.env.toUpperCase();\r\n switch (env) {\r\n case A.EEnv.DEV:\r\n url += \"-dev.net/\";\r\n break;\r\n case A.EEnv.STG:\r\n url += \"-stg.net/\";\r\n break;\r\n case A.EEnv.UAT:\r\n url += \"-uat.net/\";\r\n break;\r\n case A.EEnv.PROD:\r\n url += \".host/\";\r\n break;\r\n default:\r\n throw(\"Specified Environment is not valid. SuppliedEnv=\" + env);\r\n }\r\n this.baseUrl = url;\r\n }\r\n\r\n public GetBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n public SetBaseUrl(url: string): void {\r\n this.baseUrl = url;\r\n if (!this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl += \"/\";\r\n }\r\n }\r\n\r\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.get(this.baseUrl + url, params);\r\n }\r\n\r\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.delete(this.baseUrl + url, params);\r\n }\r\n\r\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\r\n return this.post(this.baseUrl + url, data, params);\r\n }\r\n\r\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\r\n return this.upload(this.baseUrl + url, blob, params);\r\n }\r\n }\r\n}","import { AbstractApi } from \"./abstract-api\";\r\nimport { Api as A } from \"./api\";\r\n\r\nexport namespace GlobalApi {\r\n export interface IGetter {\r\n // Default settings the getter's app is running on.\r\n env: A.EEnv;\r\n // Should return using app defaults if no params are specified.\r\n getApi: (env?: A.EEnv) => GlobalApi.Api;\r\n }\r\n\r\n /**\r\n * This is the request handler for Global Api,\r\n * it should be passed to any method that wants to communicate with this particular api.\r\n */\r\n export class Api extends AbstractApi {\r\n private env: A.Env;\r\n\r\n constructor(params: {\r\n env?: A.Env\r\n }) {\r\n super({\r\n ssidHeader: \"x-sessionid\",\r\n cacheId: `GLOBAL_API_${params?.env}_`\r\n });\r\n this.env = params?.env ? params.env : A.EEnv.PROD;\r\n this.setBaseUrl();\r\n }\r\n\r\n private setBaseUrl(): void {\r\n let url: string;\r\n const env = this.env.toUpperCase();\r\n switch (env) {\r\n case A.EEnv.DEV:\r\n url = \"https://bruceglobal.nextspace-dev.net/\";\r\n break;\r\n case A.EEnv.STG:\r\n url = \"https://bruceglobal.nextspace-stg.net/\";\r\n break;\r\n case A.EEnv.UAT:\r\n url = \"https://bruceglobal.api.nextspace-uat.net/\";\r\n break;\r\n case A.EEnv.PROD:\r\n url = \"https://bruceglobal.api.nextspace.host/\";\r\n break;\r\n default:\r\n throw(\"Specified Environment is not valid. SuppliedEnv=\" + env);\r\n }\r\n this.baseUrl = url;\r\n }\r\n\r\n public GetBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n public SetBaseUrl(url: string): void {\r\n this.baseUrl = url;\r\n if (!this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl += \"/\";\r\n }\r\n }\r\n\r\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.get(this.baseUrl + url, params);\r\n }\r\n\r\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.delete(this.baseUrl + url, params);\r\n }\r\n\r\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\r\n return this.post(this.baseUrl + url, data, params);\r\n }\r\n\r\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\r\n return this.upload(this.baseUrl + url, blob, params);\r\n }\r\n }\r\n}","import { AbstractApi } from \"./abstract-api\";\r\nimport { Api as A } from \"./api\";\r\n\r\n/**\r\n * * @deprecated Please use GuardianApi instead.\r\n */\r\nexport namespace IdmApi {\r\n export interface IGetter {\r\n // Default settings the getter's app is running on.\r\n env: A.EEnv;\r\n // Should return using app defaults if no params are specified.\r\n getApi: (env?: A.EEnv) => IdmApi.Api;\r\n }\r\n\r\n /**\r\n * This is the request handler for Idm Api,\r\n * it should be passed to any method that wants to communicate with this particular api.\r\n */\r\n export class Api extends AbstractApi {\r\n private env: A.Env;\r\n\r\n constructor(params: {\r\n env?: A.Env\r\n }) {\r\n super({\r\n ssidHeader: \"SSID\",\r\n cacheId: `IDM_API_${params?.env}_`\r\n });\r\n this.env = params?.env ? params.env : A.EEnv.PROD;\r\n this.setBaseUrl();\r\n }\r\n\r\n private setBaseUrl(): void {\r\n let url = \"https://guardian.nextspace\";\r\n const env = this.env.toUpperCase();\r\n switch (env) {\r\n case A.EEnv.DEV:\r\n url += \"-dev.net/\";\r\n break;\r\n case A.EEnv.STG:\r\n url += \"-stg.net/\";\r\n break;\r\n case A.EEnv.UAT:\r\n url += \"-uat.net/\";\r\n break;\r\n case A.EEnv.PROD:\r\n url += \".host/\";\r\n break;\r\n default:\r\n throw(\"Specified Environment is not valid. SuppliedEnv=\" + env);\r\n }\r\n this.baseUrl = url;\r\n }\r\n\r\n public GetBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n public SetBaseUrl(url: string): void {\r\n this.baseUrl = url;\r\n if (!this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl += \"/\";\r\n }\r\n }\r\n\r\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.get(this.baseUrl + url, params);\r\n }\r\n\r\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.delete(this.baseUrl + url, params);\r\n }\r\n\r\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\r\n return this.post(this.baseUrl + url, data, params);\r\n }\r\n\r\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\r\n return this.upload(this.baseUrl + url, blob, params);\r\n }\r\n }\r\n}","import { IDictionary } from \"../common/dictionary\";\r\nimport { Api } from \"./api\";\r\nimport { BruceApi } from \"./bruce-api\";\r\nimport { CamApi } from \"./cam-api\";\r\nimport { GlobalApi } from \"./global-api\";\r\nimport { GuardianApi } from \"./guardian-api\";\r\nimport { IdmApi } from \"./idm-api\";\r\n\r\nexport class ApiGetters {\r\n private bruce: IDictionary<BruceApi.Api> = {};\r\n private idm: IDictionary<IdmApi.Api> = {};\r\n private cam: IDictionary<CamApi.Api> = {};\r\n private guardian: IDictionary<GuardianApi.Api> = {};\r\n private global: IDictionary<GlobalApi.Api> = {};\r\n private accountId: string;\r\n private env: Api.EEnv;\r\n private sessionId: string;\r\n\r\n constructor(params: {\r\n accountId: string,\r\n env?: Api.EEnv,\r\n sessionId?: string\r\n }) {\r\n this.accountId = params?.accountId;\r\n this.env = params?.env ? params.env : Api.EEnv.PROD;\r\n this.sessionId = params?.sessionId;\r\n }\r\n\r\n public ClearCache() {\r\n for (const key in this.bruce) {\r\n this.bruce[key]?.Cache?.Clear();\r\n }\r\n for (const key in this.idm) {\r\n this.idm[key]?.Cache?.Clear();\r\n }\r\n for (const key in this.cam) {\r\n this.cam[key]?.Cache?.Clear();\r\n }\r\n for (const key in this.guardian) {\r\n this.guardian[key]?.Cache?.Clear();\r\n }\r\n for (const key in this.global) {\r\n this.global[key]?.Cache?.Clear();\r\n }\r\n }\r\n\r\n public SetAccountId(accountId: string) {\r\n this.accountId = accountId;\r\n }\r\n\r\n public GetAccountId(): string {\r\n return this.accountId;\r\n }\r\n\r\n public SetEnv(env: Api.EEnv) {\r\n this.env = env;\r\n }\r\n\r\n public GetEnv(): Api.EEnv {\r\n return this.env;\r\n }\r\n\r\n public SetSessionId(sessionId: string) {\r\n this.sessionId = sessionId;\r\n for (const key in this.bruce) {\r\n this.bruce[key].SetSessionId(sessionId);\r\n }\r\n for (const key in this.idm) {\r\n this.idm[key].SetSessionId(sessionId);\r\n }\r\n for (const key in this.cam) {\r\n this.cam[key].SetSessionId(sessionId);\r\n }\r\n for (const key in this.global) {\r\n this.global[key].SetSessionId(sessionId);\r\n }\r\n this.ClearCache();\r\n }\r\n\r\n public GetSessionId(): string {\r\n return this.sessionId;\r\n }\r\n\r\n public GetBruceApi(params?: {\r\n accountId?: string,\r\n env?: Api.EEnv\r\n }): BruceApi.Api {\r\n if (!params) {\r\n params = {};\r\n }\r\n let {accountId, env} = params;\r\n accountId = accountId ? accountId : this.accountId;\r\n env = env ? env : this.env;\r\n const key = `${accountId}-${env}`;\r\n if (!this.bruce[key]) {\r\n this.bruce[key] = new BruceApi.Api({\r\n accountId,\r\n env,\r\n loadRegionalBaseUrl: true\r\n });\r\n this.bruce[key].SetSessionId(this.sessionId);\r\n }\r\n return this.bruce[key];\r\n }\r\n\r\n public GetBruceGetter(): BruceApi.IGetter {\r\n return {\r\n accountId: this.accountId,\r\n env: this.env,\r\n getApi: (accountId?: string, env?: Api.EEnv) => {\r\n return this.GetBruceApi({accountId, env});\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Deprecated: Use GetGuardianApi instead.\r\n * @returns\r\n */\r\n public GetIdmApi(params?: {\r\n env?: Api.EEnv\r\n }): IdmApi.Api {\r\n if (!params) {\r\n params = {};\r\n }\r\n let {env} = params;\r\n env = env ? env : this.env;\r\n const key = `${env}`;\r\n if (!this.idm[key]) {\r\n this.idm[key] = new IdmApi.Api({\r\n env\r\n });\r\n this.idm[key].SetSessionId(this.sessionId);\r\n }\r\n return this.idm[key];\r\n }\r\n\r\n /**\r\n * Deprecated: Use GetGuardianGetter instead.\r\n * @returns\r\n */\r\n public GetIdmGetter(): IdmApi.IGetter {\r\n return {\r\n env: this.env,\r\n getApi: (env?: Api.EEnv) => {\r\n return this.GetIdmApi({env});\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Deprecated: Use GetGuardianApi instead.\r\n * @returns\r\n */\r\n public GetCamApi(params?: {\r\n env?: Api.EEnv\r\n }): CamApi.Api {\r\n if (!params) {\r\n params = {};\r\n }\r\n let {env} = params;\r\n env = env ? env : this.env;\r\n const key = `${env}`;\r\n if (!this.cam[key]) {\r\n this.cam[key] = new CamApi.Api({\r\n env\r\n });\r\n this.cam[key].SetSessionId(this.sessionId);\r\n }\r\n return this.cam[key];\r\n }\r\n\r\n /**\r\n * Deprecated: Use GetGuardianGetter instead.\r\n * @returns\r\n */\r\n public GetCamGetter(): CamApi.IGetter {\r\n return {\r\n env: this.env,\r\n getApi: (env?: Api.EEnv) => {\r\n return this.GetCamApi({env});\r\n }\r\n }\r\n }\r\n\r\n public GetGlobalApi(params?: {\r\n env?: Api.EEnv\r\n }): GlobalApi.Api {\r\n if (!params) {\r\n params = {};\r\n }\r\n let {env} = params;\r\n env = env ? env : this.env;\r\n const key = `${env}`;\r\n if (!this.global[key]) {\r\n this.global[key] = new GlobalApi.Api({\r\n env\r\n });\r\n this.global[key].SetSessionId(this.sessionId);\r\n }\r\n return this.global[key];\r\n }\r\n\r\n public GetGlobalGetter(): GlobalApi.IGetter {\r\n return {\r\n env: this.env,\r\n getApi: (env?: Api.EEnv) => {\r\n return this.GetGlobalApi({env});\r\n }\r\n }\r\n }\r\n\r\n public GetGuardianApi(params?: {\r\n env?: Api.EEnv\r\n }): GuardianApi.Api {\r\n if (!params) {\r\n params = {};\r\n }\r\n let {env} = params;\r\n env = env ? env : this.env;\r\n const key = `${env}`;\r\n if (!this.guardian[key]) {\r\n this.guardian[key] = new GuardianApi.Api({\r\n env\r\n });\r\n this.guardian[key].SetSessionId(this.sessionId);\r\n }\r\n return this.guardian[key];\r\n }\r\n\r\n public GetGuardianGetter(): GuardianApi.IGetter {\r\n return {\r\n env: this.env,\r\n getApi: (env?: Api.EEnv) => {\r\n return this.GetGuardianApi({env});\r\n }\r\n }\r\n }\r\n}","import { Api as A } from \"./api/api\";\r\nimport { ApiGetters } from \"./api/api-getters\";\r\n\r\ninterface IParams {\r\n isSelfManaged?: boolean;\r\n accountId?: string;\r\n env?: A.EEnv;\r\n sessionId?: string;\r\n apiGetters?: ApiGetters;\r\n}\r\n\r\n// Global instance for smaller use-cases where you don't want to manage the getters yourself.\r\nlet _getters: ApiGetters;\r\n\r\nexport namespace ENVIRONMENT {\r\n // If true, then defaults are not touched and it's assumed this is being managed.\r\n export let IS_SELF_MANAGED = false;\r\n // Unused if IS_SELF_MANAGED is false.\r\n export let PARAMS: IParams = {\r\n accountId: \"\",\r\n env: A.EEnv.UAT,\r\n sessionId: \"\"\r\n };\r\n\r\n export function Api() {\r\n if (IS_SELF_MANAGED) {\r\n throw(\"Self managed mode ON. You are getting this error because you didn't pass an Api instance to a function.\");\r\n }\r\n if (!PARAMS.accountId) {\r\n console.warn(\"No accountId set. This is required for the getters to work properly.\");\r\n }\r\n if (!_getters) {\r\n _getters = new ApiGetters({\r\n accountId: PARAMS.accountId,\r\n env: PARAMS.env ? PARAMS.env : A.EEnv.UAT,\r\n sessionId: PARAMS.sessionId\r\n });\r\n }\r\n return _getters;\r\n }\r\n\r\n export function Reset(params?: IParams) {\r\n if (IS_SELF_MANAGED) {\r\n throw(\"Self managed mode ON. You are getting this error because you didn't pass an Api instance to a function.\");\r\n }\r\n if (_getters) {\r\n _getters.ClearCache();\r\n if (params.accountId) {\r\n _getters.SetAccountId(params.accountId);\r\n }\r\n if (params.sessionId) {\r\n _getters.SetSessionId(params.sessionId);\r\n }\r\n if (params.env) {\r\n _getters.SetEnv(params.env);\r\n }\r\n }\r\n PARAMS = {\r\n ...PARAMS,\r\n ...params\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\ntype Type = AnnDocument.EType | string;\r\n\r\n/**\r\n * Describes communication with the \"Annotated Document\" concept in Bruce.\r\n * Annotated documents are files with hotspots that can link to Entity records.\r\n */\r\nexport namespace AnnDocument {\r\n export function GetCacheKey(id: number) {\r\n return `${Api.ECacheKey.AnnDocument}${Api.ECacheKey.Id}${id}`;\r\n }\r\n\r\n export function GetListCacheKey(type: Type) {\r\n return Api.ECacheKey.AnnDocument + type;\r\n }\r\n\r\n export interface IHotspot {\r\n X: number;\r\n Y: number;\r\n Key: string;\r\n Description?: string;\r\n LinkedEntity?: {\r\n \"Entity.ID\": string;\r\n };\r\n }\r\n\r\n export interface ISettings {\r\n Hotspots?: IHotspot[];\r\n DrawingScaleFactorX?: number;\r\n DrawingScaleFactorY?: number;\r\n }\r\n\r\n export interface IDocument {\r\n ID?: number;\r\n Type: Type;\r\n Name: string;\r\n \"ClientFile.ID\": string;\r\n Settings?: ISettings;\r\n }\r\n\r\n export enum EType {\r\n SVG = \"SVG\"\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n docId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n document: IDocument\r\n }> {\r\n let { api, docId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!docId) {\r\n throw(\"Doc ID is required.\");\r\n }\r\n const key = GetCacheKey(docId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`documentView/${docId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n document: 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,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n docType?: Type,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n documents: IDocument[]\r\n }> {\r\n let { api, docType: type, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!type) {\r\n type = \"\";\r\n }\r\n const cache = await api.GetCacheItem(GetListCacheKey(type), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const url = \"documentViews\" + (type ? \"?type=\" + type : \"\");\r\n const data = await api.GET(url, Api.PrepReqParams(reqParams));\r\n res({\r\n documents: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(type),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { CustomFormContent } from \"./custom-form-content\";\r\n\r\n/**\r\n * Describes the \"Custom Form\" concept within Bruce.\r\n * Custom forms are dynamic dialogs that get populated with Entity data.\r\n */\r\nexport namespace CustomForm {\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.CustomForm + Api.ECacheKey.Id + id;\r\n }\r\n\r\n export function GetListCacheKey(typeId: string): string {\r\n if (typeId) {\r\n return Api.ECacheKey.CustomForm + Api.ECacheKey.EntityType + Api.ECacheKey.Id + typeId;\r\n }\r\n return Api.ECacheKey.CustomForm;\r\n }\r\n\r\n export interface IForm {\r\n ID?: number;\r\n \"EntityType.ID\"?: string;\r\n Name?: string;\r\n Settings?: CustomFormContent.IContent | any;\r\n Type?: EType;\r\n }\r\n\r\n export enum EType {\r\n // Deprecated types.\r\n Form = \"GENERIC\",\r\n Markup = \"MARKUP\",\r\n // Supported types.\r\n ComponentStack = \"COMPONENT_STACK\"\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n formId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n form: IForm\r\n }> {\r\n let { api, formId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n \r\n if (!id) {\r\n throw(\"Id is required.\");\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 = await api.GET(`customForm/${id}`, Api.PrepReqParams(reqParams));\r\n res({\r\n form: data\r\n });\r\n } catch (err) {\r\n rej(err);\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 export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n formId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, formId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!id) {\r\n throw(\"Id is required.\");\r\n }\r\n await api.DELETE(`customForm/${id}`, Api.PrepReqParams(reqParams))\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.CustomForm);\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n entityTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n forms: IForm[]\r\n }> {\r\n let { api, entityTypeId: typeId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const url = typeId ? `entityType/${typeId}/customForms` : \"customForms\";\r\n const cache = await api.GetCacheItem(GetListCacheKey(typeId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req = api.GET(url, Api.PrepReqParams(reqParams));\r\n const prom = req.then((data) => {\r\n return {\r\n forms: data.Items\r\n };\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(typeId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n form: IForm,\r\n reqParams?: Api.IReqParams\r\n }): Promise<{\r\n form: IForm\r\n }> {\r\n let { api, form: data, reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data.ID) {\r\n data.ID = 0;\r\n }\r\n const res = await api.POST(`customForm/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.CustomForm);\r\n return {\r\n form: res\r\n };\r\n }\r\n}","export namespace Color {\r\n export interface IColor {\r\n // Max: 255, Min: 0.\r\n red: number;\r\n green: number;\r\n blue: number;\r\n // Max: 1, Min: 0.\r\n alpha: number ;\r\n }\r\n\r\n export enum EBlendMode {\r\n HIGHLIGHT,\r\n REPLACE,\r\n MIX\r\n }\r\n\r\n export interface IBlendSettings {\r\n blendMode?: EBlendMode;\r\n // 1 = 100% new color. 0 = original color.\r\n blendPercent?: number;\r\n }\r\n\r\n export function RandomColor(): IColor {\r\n // https://stackoverflow.com/a/7352887\r\n const brightness = 4;\r\n const rgb = [Math.random() * 256, Math.random() * 256, Math.random() * 256];\r\n const mix = [brightness * 51, brightness * 51, brightness * 51];\r\n const mixedrgb = [rgb[0] + mix[0], rgb[1] + mix[1], rgb[2] + mix[2]].map(function(x){\r\n return Math.round(x / 2.0);\r\n });\r\n const str = \"rgba(\" + mixedrgb.join(\",\") + \",0.9\" + \")\";\r\n return ColorFromStr(str);\r\n }\r\n\r\n /**\r\n * Attempts to parse a given color string into a model.\r\n * @param str \r\n * @returns \r\n */\r\n export function ColorFromStr(str: string): IColor {\r\n let r,g,b,a;\r\n const rgba = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([^\\)]+)\\s*)?\\)$/.exec(str);\r\n if (rgba) {\r\n r = parseInt(rgba[1]);\r\n g = parseInt(rgba[2]);\r\n b = parseInt(rgba[3]);\r\n a = rgba[4] != null ? parseFloat(rgba[4]) : 1;\r\n return {\r\n red: r,\r\n green: g,\r\n blue: b,\r\n alpha: a\r\n }\r\n }\r\n if (str.charAt(0) == \"#\") {\r\n str = str.substring(1);\r\n }\r\n if (str.length == 6) {\r\n // rgb.\r\n const parsed = /^(.{2})(.{2})(.{2})/.exec(str);\r\n if (!parsed) {\r\n return <any>null;\r\n }\r\n r = parseInt(parsed[1], 16);\r\n g = parseInt(parsed[2], 16);\r\n b = parseInt(parsed[3], 16);\r\n a = 1;\r\n }\r\n else if (str.length == 8) {\r\n // rgba.\r\n const parsed = /^(.{2})(.{2})(.{2})(.{2})/.exec(str);\r\n if (!parsed) {\r\n return <any>null;\r\n }\r\n r = parseInt(parsed[1], 16);\r\n g = parseInt(parsed[2], 16);\r\n b = parseInt(parsed[3], 16);\r\n a = parseInt(parsed[4], 16);\r\n if (a != 0) {\r\n a = a/255;\r\n }\r\n }\r\n else {\r\n return <any>null;\r\n }\r\n if (a == null) {\r\n a = 1;\r\n }\r\n return {\r\n red: r,\r\n blue: b,\r\n green: g,\r\n alpha: a\r\n }\r\n }\r\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}","/**\r\n * Utility to help with parsing and wrapping Bruce paths.\r\n */\r\nexport namespace PathUtils {\r\n export function Parse(str: string): string[] {\r\n if (!str) {\r\n return [];\r\n }\r\n const broken: string[] = str.split(\"\\\"/\\\"\");\r\n if (broken.length > 0) {\r\n let top = broken[0];\r\n if (top.length > 0) {\r\n if (top.charAt(0) == \"\\\"\") {\r\n top = top.substring(1);\r\n }\r\n broken[0] = top;\r\n }\r\n const endIndex = broken.length - 1;\r\n let bot = broken[endIndex];\r\n if (bot.length > 0) {\r\n if (bot.charAt(bot.length - 1) == \"\\\"\") {\r\n bot = bot.substring(0, bot.length - 1);\r\n }\r\n broken[endIndex] = bot;\r\n }\r\n }\r\n return broken;\r\n }\r\n\r\n export function Wrap(path: string[]): string {\r\n let tmp: string = \"\\\"\";\r\n for (let i = 0; i < path.length; i++) {\r\n let section = path[i];\r\n tmp += section;\r\n if (i < path.length - 1) {\r\n tmp += \"\\\"/\\\"\";\r\n }\r\n }\r\n tmp += \"\\\"\";\r\n return tmp;\r\n }\r\n\r\n export function ParseLegacy(str: string): string[] {\r\n const broken: string[] = str.split(\".\");\r\n for (let i = 0; i < broken.length; i++) {\r\n let piece = broken[0];\r\n if (piece.charAt(0) == \"\\\"\") {\r\n piece = broken[0] = piece.substring(1);\r\n }\r\n if (piece.charAt(piece.length - 1) == \"\\\"\") {\r\n broken[0] = piece.substring(0, piece.length - 1);\r\n }\r\n }\r\n return broken;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { Bounds } from \"../common/bounds\";\r\nimport { Geometry } from \"../common/geometry\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\nimport { Transform } from \"../common/transform\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { EntityType } from \"./entity-type\";\r\nimport { PathUtils } from \"../util/path-utils\";\r\nimport { IDictionary } from \"../common/dictionary\";\r\nimport { Carto } from \"../bruce-models\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\ntype _any = any;\r\n\r\n/**\r\n * Describes the \"Entity\" concept within Bruce.\r\n * An entity is a JSON blob containing both internal data and user-defined data.\r\n * Entity records have many thinks linked to them through their UIDs such as links, files and relationships.\r\n */\r\nexport namespace Entity {\r\n export function GetCacheKey(params: {\r\n entityId: string,\r\n entityTypeId?: string,\r\n expandLocation?: boolean,\r\n expandRelations?: boolean\r\n }): string {\r\n let { entityId, entityTypeId, expandLocation, expandRelations } = params;\r\n if (!entityTypeId) {\r\n entityTypeId = \"\";\r\n }\r\n return `${Api.ECacheKey.Entity}${Api.ECacheKey.Id}${entityId}${String(entityTypeId)}${String(Boolean(expandLocation))}${String(Boolean(expandRelations))}`;\r\n }\r\n\r\n export function GetContainsKey(entityId: string) {\r\n return `${Api.ECacheKey.Entity}${Api.ECacheKey.Id}${entityId}`;\r\n }\r\n\r\n export interface IEntity extends _any {\r\n Bruce: {\r\n \"CreatedBy.User.ID\"?: string;\r\n CreatedTime?: UTC.IUTC;\r\n \"EntityType.ID\": string;\r\n ID?: string;\r\n \"Layer.ID\"?: number[];\r\n // Available if expandRelations=true.\r\n // This is an array of all immediate downstream relationships for this entity.\r\n relations?: IRelationData[];\r\n };\r\n location?: Carto.ICarto;\r\n boundaries?: Bounds.IBounds;\r\n transform?: Transform.ITransform;\r\n position?: number[][];\r\n geometry?: Geometry.IGeometry;\r\n // Available if expandLocation is true.\r\n // Related tileset ids if any.\r\n tilesetID?: string[];\r\n // Available if expandLocation is true.\r\n // Relative offset to parent node.\r\n worldPosition?: number[][];\r\n }\r\n\r\n export interface IRelationData {\r\n \"Other.Entity.ID\": string;\r\n \"RelationType.ID\": string;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n // (Optional) Entity type ID to load specific schema.\r\n entityTypeId?: string;\r\n expandLocation?: boolean,\r\n expandRelations?: boolean\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n entity: IEntity\r\n }> {\r\n let { api, entityId, req: reqParams, expandLocation, expandRelations, entityTypeId } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n const key = GetCacheKey({\r\n entityId,\r\n entityTypeId,\r\n expandLocation,\r\n expandRelations\r\n });\r\n const cache = api.GetCacheItem(key, 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 urlParams = new URLSearchParams();\r\n if (expandLocation) {\r\n urlParams.append(\"$expand\", \"location\");\r\n }\r\n if (expandRelations) {\r\n urlParams.append(\"$expand\", \"relation\");\r\n }\r\n if (entityTypeId) {\r\n urlParams.append(\"BruceEntityType\", entityTypeId);\r\n }\r\n const data = await api.GET(\r\n `entity/${entityId}?${urlParams.toString()}`,\r\n Api.PrepReqParams(reqParams)\r\n );\r\n res({\r\n entity: data\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n api.SetCacheItem({\r\n key,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function GetListByIds(params: {\r\n api?: BruceApi.Api,\r\n entityIds: string[],\r\n expandRelations?: boolean,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n entities: IEntity[]\r\n }> {\r\n let { api, entityIds, req: reqParams, expandRelations } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!entityIds.length) {\r\n throw(\"Entity IDs are required.\");\r\n }\r\n const reqs: Promise<{ entity: IEntity }>[] = [];\r\n const reqIds: string[] = [];\r\n for (let i = 0; i < entityIds.length; i++) {\r\n const entityId = entityIds[i];\r\n const key = GetCacheKey({ entityId, expandRelations });\r\n const cache = api.GetCacheItem(key, reqParams);\r\n if (cache?.found) {\r\n reqs.push(cache.data);\r\n }\r\n else {\r\n reqIds.push(entityId);\r\n }\r\n }\r\n const reqData = {\r\n Filter: {\r\n ID: {\r\n in: reqIds\r\n }\r\n },\r\n PageSize: reqIds.length\r\n };\r\n if (reqIds.length > 0) {\r\n const urlParams = new URLSearchParams();\r\n if (expandRelations) {\r\n urlParams.append(\"$expand\", \"relation\");\r\n }\r\n const req: Promise<Api.IList<Entity.IEntity>> = api.POST(\"entities?\" + urlParams.toString(), reqData, Api.PrepReqParams(reqParams));\r\n for (let i = 0; i < reqIds.length; i++) {\r\n const entityId = reqIds[i];\r\n const key = GetCacheKey({ entityId });\r\n const prom: Promise<{ entity: IEntity }> = new Promise(async (res) => {\r\n try {\r\n const data = await req;\r\n const item = data.Items.find(x => x.Bruce.ID == entityId);\r\n res({\r\n entity: item\r\n });\r\n }\r\n catch (e) {\r\n // No showing error as we don't want to see it 2000 times.\r\n }\r\n res(<any>null);\r\n });\r\n api.SetCacheItem({\r\n key,\r\n value: prom,\r\n req: reqParams\r\n });\r\n reqs.push(prom);\r\n }\r\n }\r\n return {\r\n entities: (await Promise.all(reqs)).map(x => x?.entity).filter(x => !!x)\r\n };\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n await api.DELETE(`entity/${entityId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.RemoveByContains(GetContainsKey(entityId));\r\n }\r\n\r\n export async function DeleteList(params: {\r\n api?: BruceApi.Api,\r\n entityIds: string[],\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityIds, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!entityIds?.length) {\r\n throw(\"Entity IDs are required.\");\r\n }\r\n await api.POST(\"deleteEntities\", {\r\n Items: entityIds\r\n }, Api.PrepReqParams(reqParams));\r\n for (let i = 0; i < entityIds.length; i++) {\r\n const entityId = entityIds[i];\r\n api.Cache.RemoveByContains(GetContainsKey(entityId));\r\n }\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n entity: IEntity,\r\n override: boolean,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n entity: IEntity\r\n }> {\r\n let { api, entity: data, override, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!data?.Bruce?.[\"EntityType.ID\"]) {\r\n throw(\"Entity Type ID is required.\");\r\n }\r\n if (!data?.Bruce?.ID) {\r\n data.Bruce = {\r\n ...data.Bruce,\r\n ID: ObjectUtils.UId()\r\n };\r\n }\r\n const reqUrl = `entity/${data.Bruce.ID}/?dataoverride=${override}&BruceEntityType=${data.Bruce[\"EntityType.ID\"]}`;\r\n const res = await api.POST(reqUrl, data, Api.PrepReqParams(reqParams));\r\n api.Cache.RemoveByContains(GetContainsKey(<string>data.Bruce.ID));\r\n return {\r\n entity: res\r\n };\r\n }\r\n\r\n export function RemoveTag(params: {\r\n entity: IEntity,\r\n tagId: number\r\n }): void {\r\n const { entity: data, tagId } = params;\r\n const tags = data.Bruce[\"Layer.ID\"] ?? [];\r\n const index = tags.indexOf(tagId);\r\n if (index >= 0) {\r\n tags.splice(index, 1);\r\n data.Bruce[\"Layer.ID\"] = tags;\r\n }\r\n }\r\n\r\n export function AddTag(params: {\r\n entity: IEntity,\r\n tagId: number\r\n }): void {\r\n const { entity: data, tagId } = params;\r\n const tags = data.Bruce[\"Layer.ID\"] ?? [];\r\n if (!tags.includes(tagId)) {\r\n tags.push(tagId);\r\n data.Bruce[\"Layer.ID\"] = tags;\r\n }\r\n }\r\n\r\n export function SetValue(params: {\r\n entity: IEntity,\r\n path: string[],\r\n value: any\r\n }): void {\r\n const { entity: data, path, value } = params;\r\n let curData = data;\r\n for (let i = 0; i < path.length; i++) {\r\n const step = path[i];\r\n if (!curData[step] || typeof curData[step] != \"object\") {\r\n curData[step] = {};\r\n }\r\n if (i >= path.length - 1) {\r\n curData[step] = value;\r\n break;\r\n }\r\n curData = curData[step];\r\n }\r\n }\r\n\r\n export function GetValue(params: {\r\n entity: IEntity,\r\n path: string[]\r\n }): any {\r\n const { entity: data, path } = params;\r\n // Backwards compatibility.\r\n if (path.length == 1 && path[0] == \"ID\") {\r\n return data.Bruce?.ID;\r\n }\r\n let curData = data;\r\n for (let i = 0; i < path.length; i++) {\r\n const step = path[i];\r\n if (!curData[step]) {\r\n return null;\r\n }\r\n if (i >= path.length - 1) {\r\n return curData[step];\r\n }\r\n curData = curData[step];\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Calculates an entity's name based on attribute priority set in the type.\r\n * @param params\r\n * If true, will return the entity ID if no name can be calculated.\r\n * Otherwise it returns null.\r\n * @returns\r\n */\r\n export function CalculateName(params: {\r\n entity: IEntity,\r\n type: EntityType.IType,\r\n defaultToId?: boolean\r\n }): string {\r\n const { entity, type, defaultToId = true } = params;\r\n const attrStr = type.DisplayNameAttributePath;\r\n if (attrStr) {\r\n const attrPaths = attrStr.split(\",\");\r\n for (let i = 0; i < attrPaths.length; i++) {\r\n const pathStr = attrPaths[i];\r\n const path = PathUtils.Parse(pathStr);\r\n const name = Entity.GetValue({\r\n entity: entity,\r\n path\r\n });\r\n if (name && typeof name != \"object\") {\r\n return name;\r\n }\r\n }\r\n }\r\n return defaultToId ? entity.Bruce.ID : null;\r\n }\r\n\r\n export interface IFilter {\r\n orderBy?: any;\r\n entityTypeId?: string;\r\n layerIds?: number[];\r\n // Default is \"equals\" for backwards compatibility.\r\n layerIdsOperator?: \"equals\" | \"in\";\r\n bounds?: Bounds.IReqBounds;\r\n pageSize?: number;\r\n pageIndex?: number;\r\n lodCategoryId?: string;\r\n sortOrder?: Api.ESortOrder;\r\n entityTypeConditions?: IDictionary<any>;\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n filter: IFilter,\r\n expandRelations?: boolean,\r\n // Default = false. If false then only analysis data is returned instead of the entities.\r\n // TODO: Requires a provided entityTypeId. This is out of date in API.\r\n analysis?: boolean,\r\n // Default = false.\r\n viaCdn?: boolean;\r\n // (Optional) Cache killing token to append to the request url.\r\n viaCdnCacheToken?: number | string;\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Returned if analysis=false.\r\n entities?: IEntity[];\r\n // Returned if analysis=true.\r\n totalCount?: number;\r\n }> {\r\n let { api, filter, req: reqParams, viaCdn, viaCdnCacheToken, analysis, expandRelations } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n let requestFilter: any = {};\r\n if (filter.entityTypeConditions) {\r\n requestFilter = {\r\n ...filter.entityTypeConditions\r\n };\r\n }\r\n if (filter.layerIds != null && filter.layerIds.length > 0) {\r\n const operator = filter.layerIdsOperator ?? \"equals\";\r\n requestFilter[\"Bruce.Layer.ID\"] = {\r\n [operator]: filter.layerIds\r\n };\r\n }\r\n if (filter.bounds) {\r\n requestFilter[\"geometry\"] = {\r\n \"intersects\": [\r\n filter.bounds.south,\r\n filter.bounds.north,\r\n filter.bounds.west,\r\n filter.bounds.east\r\n ]\r\n };\r\n }\r\n\r\n const body = {\r\n SortOrder: filter.sortOrder == Api.ESortOrder.Asc ? \"ASC\" : \"DESC\",\r\n OrderBy: filter.orderBy,\r\n Filter: requestFilter,\r\n LODType: filter.lodCategoryId,\r\n BruceEntityType: filter.entityTypeId,\r\n PageIndex: filter.pageIndex,\r\n PageSize: filter.pageSize\r\n };\r\n\r\n let totalCount: number;\r\n let entities = [];\r\n if (analysis || expandRelations || (viaCdn && api.EntityCdnUrl)) {\r\n let url: URL;\r\n if (analysis) {\r\n url = new URL(api.GetBaseUrl() + \"entities/summary\");\r\n }\r\n else if (viaCdn && api.EntityCdnUrl) {\r\n url = new URL(api.EntityCdnUrl);\r\n }\r\n else {\r\n url = new URL(api.GetBaseUrl() + \"entities\");\r\n }\r\n\r\n const urlParams = new URLSearchParams(url.search);\r\n urlParams.set(\"cacheToken\", String(viaCdnCacheToken ? viaCdnCacheToken : 0));\r\n if (body.SortOrder) {\r\n urlParams.set(\"SortOrder\", body.SortOrder);\r\n }\r\n if (body.OrderBy) {\r\n urlParams.set(\"OrderBy\", body.OrderBy);\r\n }\r\n if (body.Filter) {\r\n urlParams.set(\"Filter\", JSON.stringify(body.Filter));\r\n }\r\n if (body.LODType) {\r\n urlParams.set(\"LODType\", body.LODType);\r\n }\r\n if (body.BruceEntityType) {\r\n urlParams.set(\"BruceEntityType\", body.BruceEntityType);\r\n }\r\n if (body.PageIndex) {\r\n urlParams.set(\"PageIndex\", String(body.PageIndex));\r\n }\r\n if (body.PageSize) {\r\n urlParams.set(\"PageSize\", String(body.PageSize));\r\n }\r\n if (expandRelations) {\r\n urlParams.append(\"$expand\", \"relation\");\r\n }\r\n const urlStr = url.toString() + \"?\" + urlParams.toString();\r\n const data = await api.get(urlStr, Api.PrepReqParams(reqParams));\r\n if (!analysis) {\r\n entities = data.Items;\r\n }\r\n totalCount = data.TotalCount;\r\n }\r\n else {\r\n const url = new URL(api.GetBaseUrl() + (analysis ? \"entities/summary\" : \"entities\"));\r\n const urlParams = new URLSearchParams(url.search);\r\n if (expandRelations) {\r\n urlParams.append(\"$expand\", \"relation\");\r\n }\r\n const urlStr = url.toString() + \"?\" + urlParams.toString();\r\n\r\n const data = await api.post(urlStr, body, Api.PrepReqParams(reqParams));\r\n if (!analysis) {\r\n entities = data.Items;\r\n // Only caching when non-CDN.\r\n for (let i = 0; i < entities.length; i++) {\r\n const entity = entities[i];\r\n const id = entity.Bruce.ID;\r\n api.SetCacheItem({\r\n key: GetCacheKey({\r\n entityId: id,\r\n expandRelations\r\n }),\r\n value: {\r\n entity: entity\r\n },\r\n req: reqParams\r\n });\r\n }\r\n }\r\n totalCount = data.TotalCount;\r\n }\r\n return {\r\n entities,\r\n totalCount\r\n };\r\n }\r\n}","import { Entity } from \"../entity/entity\";\r\nimport { PathUtils } from \"../util/path-utils\";\r\n\r\nfunction getVariable(str: string): { text: string, path: string } {\r\n const start = str.indexOf(\"${\");\r\n if (start > -1) {\r\n const end = str.indexOf(\"}\");\r\n if (end > -1) {\r\n if (start < end) {\r\n const path = str.substring(start + 2, end);\r\n const txt = str.substring(start, end + 1);\r\n return { path: path, text: txt };\r\n }\r\n }\r\n }\r\n return <any>null;\r\n}\r\n\r\n/**\r\n * Utilities for parsing \"Bruce variables\", typically within strings.\r\n *\r\n * A Bruce variable is a string that starts with \"${\" and ends with \"}\".\r\n * Within those brackets is a path to an attribute in an entity.\r\n */\r\nexport namespace BruceVariable {\r\n /**\r\n * Replaces all Bruce variables in a string with the value of the attribute.\r\n * @param str\r\n * @param data\r\n * @param legacyParse\r\n * @returns\r\n */\r\n export function SwapValues(params: {\r\n str: string,\r\n entity: Entity.IEntity,\r\n legacyParse?: boolean\r\n }): string {\r\n let { str, entity: data, legacyParse } = params;\r\n if (!legacyParse) {\r\n legacyParse = false;\r\n }\r\n while (true) {\r\n const variable = getVariable(str);\r\n if (variable) {\r\n const path = legacyParse ? PathUtils.ParseLegacy(variable.path) : PathUtils.Parse(variable.path);\r\n let value = \"\";\r\n if (path.length > 0) {\r\n value = Entity.GetValue({\r\n entity: data,\r\n path: path\r\n });\r\n }\r\n str = str.replace(variable.text, value);\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n return str;\r\n }\r\n}","import { Color } from \"../common/color\";\r\nimport { Entity } from \"../entity/entity\";\r\nimport { BruceVariable } from \"../common/bruce-variable\";\r\nimport { PathUtils } from \"../util/path-utils\";\r\n\r\n/**\r\n * Example: ${Test.Test1}\r\n * Needs to become [\"Test\", \"Test1\"].\r\n * We need to cull this in admin-ui.\r\n * @param path\r\n * @returns Possible paths this legacy one could mean.\r\n */\r\nfunction parseLegacyPath(path: string): string[][] {\r\n if (!path) {\r\n return [];\r\n }\r\n let paths = [];\r\n if (path.startsWith(\"${\") && path.endsWith(\"}\")) {\r\n path = path.replace(\"${\", \"\");\r\n path = path.replace(\"}\", \"\");\r\n }\r\n // Split by dots.\r\n paths.push(PathUtils.ParseLegacy(path));\r\n // Take string as is.\r\n paths.push([path]);\r\n // Split by backslashes.\r\n paths.push(PathUtils.Parse(path));\r\n // Remove duplicates.\r\n const tmpPaths = [];\r\n for (let i = 0; i < paths.length; i++) {\r\n const path = paths[i];\r\n let found = false;\r\n for (let j = 0; j < tmpPaths.length; j++) {\r\n const tmpPath = tmpPaths[j];\r\n if (tmpPath.length == path.length) {\r\n let match = true;\r\n for (let k = 0; k < tmpPath.length; k++) {\r\n const tmpPathPart = tmpPath[k];\r\n const pathPart = path[k];\r\n if (tmpPathPart != pathPart) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n if (match) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!found) {\r\n tmpPaths.push(path);\r\n }\r\n }\r\n paths = tmpPaths;\r\n return paths;\r\n}\r\n\r\n/**\r\n * Utility for calculating values from Bruce fields.\r\n * These fields are typically found in entity styles.\r\n */\r\nexport namespace Calculator {\r\n export enum EValueType {\r\n Color,\r\n Input,\r\n Gradient,\r\n Mapping,\r\n TagColor,\r\n RandomColor\r\n }\r\n\r\n export interface IMappingOption {\r\n fieldValue: string;\r\n appliedValue: string;\r\n }\r\n\r\n export interface IMappingValue {\r\n field: string;\r\n values: IMappingOption[];\r\n }\r\n\r\n export interface IGradientPoint {\r\n position: number;\r\n color: string;\r\n }\r\n\r\n export interface IGradientValue {\r\n field: string;\r\n points: IGradientPoint[];\r\n // Deprecated.\r\n // It will be calculated from the provided points.\r\n min?: number;\r\n max?: number;\r\n }\r\n\r\n export interface IField {\r\n value: IGradientValue | IMappingValue | string | number;\r\n type: EValueType;\r\n }\r\n\r\n /**\r\n * Calculates the value of arbitrary field options.\r\n * The context calling this should validate results and parse stuff if needed.\r\n * @deprecated use specific calls: eg GetColor or GetNumber.\r\n * @param fields\r\n * @param entity\r\n * @param tags\r\n * @returns\r\n */\r\n export function GetValue(fields: IField[], entity: Entity.IEntity, tags: any[]): string | number | Color.IColor {\r\n if (!fields?.length) {\r\n return null;\r\n }\r\n if (!tags) {\r\n tags = [];\r\n }\r\n if (!entity) {\r\n entity = <any>{};\r\n }\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n let value: any;\r\n switch (field.type) {\r\n case EValueType.Color:\r\n value = <string>field.value;\r\n if (value) {\r\n value = Color.ColorFromStr(value);\r\n }\r\n break;\r\n case EValueType.Gradient:\r\n value = GetGradientValue(<IGradientValue>field.value, entity);\r\n break;\r\n case EValueType.Input:\r\n value = GetInputValue(<string>field.value, entity);\r\n break;\r\n case EValueType.Mapping:\r\n value = GetMappingValue(<IMappingValue>field.value, entity);\r\n break;\r\n case EValueType.RandomColor:\r\n value = Color.RandomColor();\r\n break;\r\n case EValueType.TagColor:\r\n for (let i = 0; i < tags.length; i++) {\r\n const tag = tags[i];\r\n if (tag.Color) {\r\n value = Color.ColorFromStr(tag.Color);\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n if (value || value == 0) {\r\n return value;\r\n }\r\n }\r\n return <any>null;\r\n }\r\n\r\n /**\r\n * Calculates the value of arbitrary field options with assumption that desired result is a color.\r\n * Will return null if a color is not found.\r\n * @param fields\r\n * @param entity\r\n * @param tags\r\n */\r\n export function GetColor(fields: IField[], entity: Entity.IEntity, tags: any[]): Color.IColor {\r\n if (!fields?.length) {\r\n return null;\r\n }\r\n if (!tags) {\r\n tags = [];\r\n }\r\n if (!entity) {\r\n entity = <any>{};\r\n }\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n let value: any;\r\n switch (field.type) {\r\n case EValueType.Color:\r\n value = <string>field.value;\r\n break;\r\n case EValueType.Gradient:\r\n value = GetGradientValue(<IGradientValue>field.value, entity);\r\n break;\r\n case EValueType.Input:\r\n value = GetInputValue(<string>field.value, entity);\r\n break;\r\n case EValueType.Mapping:\r\n value = GetMappingValue(<IMappingValue>field.value, entity);\r\n break;\r\n case EValueType.RandomColor:\r\n value = Color.RandomColor();\r\n break;\r\n case EValueType.TagColor:\r\n for (let i = 0; i < tags.length; i++) {\r\n const tag = tags[i];\r\n if (tag.Color) {\r\n value = Color.ColorFromStr(tag.Color);\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n if (typeof value === \"string\") {\r\n value = Color.ColorFromStr(value);\r\n }\r\n if (value && typeof value === \"object\" && (value.red || value.red == 0)) {\r\n return value;\r\n }\r\n }\r\n return <any>null;\r\n }\r\n\r\n export function GetNumber(fields: IField[], entity: Entity.IEntity, tags: any[]): number {\r\n if (!fields?.length) {\r\n return null;\r\n }\r\n if (!tags) {\r\n tags = [];\r\n }\r\n if (!entity) {\r\n entity = <any>{};\r\n }\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n let value: any;\r\n switch (field.type) {\r\n case EValueType.Gradient:\r\n value = GetGradientValue(<IGradientValue>field.value, entity);\r\n break;\r\n case EValueType.Color:\r\n case EValueType.Input:\r\n value = GetInputValue(<string>field.value, entity);\r\n break;\r\n case EValueType.Mapping:\r\n value = GetMappingValue(<IMappingValue>field.value, entity);\r\n break;\r\n }\r\n if (value != \"\" && value != null && value != undefined) {\r\n value = Number(value);\r\n }\r\n if (value || value == 0) {\r\n return value;\r\n }\r\n }\r\n return <any>null;\r\n }\r\n\r\n export function GetString(fields: IField[], entity: Entity.IEntity, tags: any[]): string {\r\n if (!fields?.length) {\r\n return null;\r\n }\r\n if (!tags) {\r\n tags = [];\r\n }\r\n if (!entity) {\r\n entity = <any>{};\r\n }\r\n\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n let value: any;\r\n switch (field.type) {\r\n case EValueType.Gradient:\r\n {\r\n const tmp = GetGradientValue(<IGradientValue>field.value, entity);\r\n // This avoids null turning into \"null\".\r\n if (tmp) {\r\n value = String(tmp);\r\n }\r\n }\r\n break;\r\n case EValueType.Color:\r\n case EValueType.Input:\r\n {\r\n const tmp = GetInputValue(<string>field.value, entity);\r\n // This avoids null turning into \"null\".\r\n if (tmp) {\r\n value = String(tmp);\r\n }\r\n }\r\n break;\r\n case EValueType.Mapping:\r\n {\r\n const tmp = GetMappingValue(<IMappingValue>field.value, entity);\r\n // This avoids null turning into \"null\".\r\n if (tmp) {\r\n value = String(tmp);\r\n }\r\n }\r\n break;\r\n case EValueType.RandomColor:\r\n // Would be nice to randomize based on an attribute or entity ID instead of pure random.\r\n var color = Color.RandomColor();\r\n value = `rgba(${color.red},${color.green},${color.blue},${color.alpha})`;\r\n break;\r\n case EValueType.TagColor:\r\n for (let i = 0; i < tags.length; i++) {\r\n const tag = tags[i];\r\n if (tag.Color) {\r\n value = tag.Color;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n if (value) {\r\n return value;\r\n }\r\n }\r\n return <any>null;\r\n }\r\n\r\n export function GetMappingValue(value: IMappingValue, entity: Entity.IEntity): string | number {\r\n const attrPaths: string[][] = parseLegacyPath(value.field);\r\n for (let i = 0; i < attrPaths.length; i++) {\r\n const attrPath = attrPaths[i];\r\n let eValue: any = Entity.GetValue({\r\n entity: entity,\r\n path: attrPath\r\n });\r\n const isValueNum = !isNaN(+eValue);\r\n\r\n for (let i = 0; i < value.values.length; i++) {\r\n const option = value.values[i];\r\n const mapValue = option.fieldValue;\r\n const isMapValueNum = !isNaN(+mapValue);\r\n\r\n if (isValueNum && (isMapValueNum || mapValue.includes(\"-\"))) {\r\n if (+mapValue == +eValue) {\r\n return option.appliedValue;\r\n }\r\n const mapSplit = mapValue.split(\"-\");\r\n if (mapSplit.length == 2) {\r\n const min = mapSplit[0];\r\n const max = mapSplit[1];\r\n if (min != \"\") {\r\n if (+eValue < +min) {\r\n continue;\r\n }\r\n }\r\n if (max != \"\") {\r\n if (+eValue > +max) {\r\n continue;\r\n }\r\n }\r\n if (min == \"\" && max == \"\") {\r\n continue;\r\n }\r\n return option.appliedValue;\r\n }\r\n }\r\n else {\r\n if (mapValue == eValue) {\r\n return option.appliedValue;\r\n }\r\n }\r\n }\r\n }\r\n return <any>null;\r\n }\r\n\r\n export function GetGradientValue(value: IGradientValue, entity: Entity.IEntity): Color.IColor {\r\n const min = +value.points[0].position;\r\n const max = +value.points[value.points.length - 1].position;\r\n\r\n const attrPaths: string[][] = parseLegacyPath(value.field);\r\n for (let i = 0; i < attrPaths.length; i++) {\r\n const attrPath = attrPaths[i];\r\n let eValue: any = Entity.GetValue({\r\n entity: entity,\r\n path: attrPath\r\n });\r\n if (typeof eValue == \"string\") {\r\n eValue = Number(eValue);\r\n }\r\n\r\n if ((!eValue && eValue != 0) || isNaN(eValue)) {\r\n continue;\r\n }\r\n\r\n if (eValue >= max) {\r\n return Color.ColorFromStr(value.points[value.points.length - 1].color);\r\n }\r\n else if (eValue <= min) {\r\n return Color.ColorFromStr(value.points[0].color);\r\n }\r\n\r\n for (let i = 0; i < value.points.length - 1; i++) {\r\n const pointA = value.points[i];\r\n const pointB = value.points[i+1];\r\n\r\n if (eValue >= pointA.position && eValue <= pointB.position) {\r\n if (pointA.position == pointB.position) {\r\n return Color.ColorFromStr(pointA.color);\r\n }\r\n const distance = (eValue - pointA.position)/(pointB.position - pointA.position);\r\n const colorA = Color.ColorFromStr(pointA.color);\r\n const colorB = Color.ColorFromStr(pointB.color);\r\n return {\r\n red: colorA.red + (colorB.red - colorA.red) * distance,\r\n green: colorA.green + (colorB.green - colorA.green) * distance,\r\n blue: colorA.blue + (colorB.blue - colorA.blue) * distance,\r\n alpha: colorA.alpha + (colorB.alpha - colorA.alpha) * distance\r\n }\r\n }\r\n }\r\n }\r\n return Color.ColorFromStr(value.points[0].color);\r\n }\r\n\r\n export function GetInputValue(value: string, entity: Entity.IEntity): string | number {\r\n if (typeof value == \"string\") {\r\n try {\r\n value = BruceVariable.SwapValues({\r\n str: value,\r\n entity: entity\r\n });\r\n // Check if it includes a math operation.\r\n const MATH_REGEX = /(\\d+\\.?\\d*|\\.\\d+)([+\\-*/])(\\d+\\.?\\d*|\\.\\d+)/;\r\n if (MATH_REGEX.test(value)) {\r\n // https://rollupjs.org/guide/en/#avoiding-eval\r\n // This stops eval warning.\r\n const eval2 = eval;\r\n return eval2(value);\r\n }\r\n }\r\n catch (exception) {\r\n const e = exception as any;\r\n let suppress: boolean = false;\r\n if (e && typeof e == \"object\") {\r\n const msg: string = e.message;\r\n suppress = !!msg && (msg.includes(\"Unexpected end\") || msg.includes(\"got end of script\"));\r\n }\r\n if (!suppress) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n return value;\r\n }\r\n}","import { Carto } from \"./carto\";\r\n\r\n/**\r\n * Describes vector geometry that Bruce uses.\r\n */\r\nexport namespace Geometry {\r\n export interface IGeometry {\r\n // Polygon array is an array of rings.\r\n // There should be 1 outer ring and 0 or more inner rings.\r\n Polygon?: IPolygonRing[];\r\n MultiGeometry?: IGeometry[];\r\n Point?: string;\r\n LineString?: string;\r\n MultiSurface?: string;\r\n }\r\n\r\n export interface IPolygonRing {\r\n LinearRing: string;\r\n Facing: EPolygonRingType;\r\n Height?: number;\r\n }\r\n\r\n export enum EPolygonRingType {\r\n Boundaries = \"out\",\r\n Hole = \"in\"\r\n }\r\n\r\n /**\r\n * Turns an array of points into string vector geometry that Bruce can use.\r\n * This is used for saving polyline and polygon data.\r\n * @param points \r\n * @returns \r\n */\r\n export function LineStrFromPoints(points: Carto.ICarto[]): string {\r\n if (!points.length) {\r\n throw(\"points is empty.\");\r\n }\r\n let carto: Carto.ICarto = points[0];\r\n let lineString = `${carto.longitude},${carto.latitude}` + (carto.altitude != null ? `,${carto.altitude}` : \"\");\r\n for (let i = 1; i < points.length; i++) {\r\n carto = points[i];\r\n lineString += ` ${carto.longitude},${carto.latitude}` + (carto.altitude != null ? `,${carto.altitude}` : \"\");\r\n }\r\n return lineString;\r\n }\r\n\r\n /**\r\n * Removes same points that occur in a row.\r\n * This will not modify the original array.\r\n * @param positions \r\n * @returns \r\n */\r\n export function RemoveRepeatPoints(positions: Carto.ICarto[]): Carto.ICarto[] {\r\n const filteredList = [];\r\n for (let i = 0; i < positions.length; i++) {\r\n const pos = positions[i];\r\n const lastPos = filteredList.length > 0 ? filteredList[filteredList.length - 1] : null;\r\n if (!lastPos || (pos.latitude != lastPos.latitude || pos.longitude != lastPos.longitude || pos.altitude != lastPos.altitude)) {\r\n filteredList.push(pos); \r\n }\r\n }\r\n return filteredList;\r\n }\r\n\r\n export function ParsePoints(pointsStr: string): Carto.ICarto[] {\r\n pointsStr = pointsStr.replace(/[^\\d.,-\\s]/g, \"\");\r\n\r\n let splitterCoordinates = \" \";\r\n let splitterAxis = \",\";\r\n const commaIndex = pointsStr.indexOf(\",\");\r\n const spaceIndex = pointsStr.indexOf(\" \");\r\n if ((spaceIndex > -1 && commaIndex > spaceIndex) || commaIndex <= -1) {\r\n splitterCoordinates = \",\";\r\n splitterAxis = \" \";\r\n }\r\n\r\n let points = pointsStr.trim().split(splitterCoordinates);\r\n points = points.filter(a => a != \"\");\r\n\r\n const result: Carto.ICarto[] = [];\r\n for (let i = 0; i < points.length; i++) {\r\n const pointData = points[i];\r\n const coords = pointData.trim().split(splitterAxis);\r\n if (coords.length == 2 || coords.length == 3) {\r\n const longitude = Number(coords[0]);\r\n const latitude = Number(coords[1]);\r\n const altitude = Number(coords.length >= 3 ? coords[2] : 0);\r\n if (longitude != null && latitude != null) {\r\n result.push({\r\n altitude: altitude,\r\n latitude: latitude,\r\n longitude: longitude\r\n });\r\n }\r\n else {\r\n console.warn(\"Invalid point data detected.\", pointData);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Parses both string and object Bruce geometry.\r\n * String geometry is legacy Bruce data.\r\n * @param geometry \r\n * @returns \r\n */\r\n export function ParseGeometry(geometry: any): IGeometry {\r\n if (typeof geometry == \"string\") {\r\n let positions: Carto.ICarto[] = [];\r\n const geometryParsed: string[] = (geometry || \"\").split(\";\");\r\n for (let i = 0; i < geometryParsed.length; i++) {\r\n const data = geometryParsed[i];\r\n const points = ParsePoints(data);\r\n if (points && points.length > 0) {\r\n positions = positions.concat(points);\r\n }\r\n }\r\n positions = RemoveRepeatPoints(positions);\r\n const newGeometry: IGeometry = {};\r\n if (positions.length > 0) {\r\n const topPoint = positions[0];\r\n newGeometry.Point = `${topPoint.latitude},${topPoint.longitude}` + (topPoint.altitude != null ? `,${topPoint.altitude}` : \"\");\r\n if (positions.length > 1) {\r\n newGeometry.Polygon = [{ Facing: EPolygonRingType.Boundaries, LinearRing: LineStrFromPoints(positions) }];\r\n }\r\n if (positions.length > 2) {\r\n newGeometry.LineString = LineStrFromPoints(positions);\r\n }\r\n }\r\n return newGeometry;\r\n }\r\n return geometry;\r\n }\r\n}","import { Entity } from \"../entity/entity\";\r\nimport { Carto } from \"./carto\";\r\nimport { Geometry } from \"./geometry\";\r\n\r\nexport namespace Bounds {\r\n /**\r\n * Description of an entity's bounding box.\r\n */\r\n export interface IBounds {\r\n maxLatitude: number;\r\n maxLongitude: number;\r\n minLatitude: number;\r\n minLongitude: number;\r\n maxAltitude: number;\r\n minAltitude: number;\r\n }\r\n\r\n /**\r\n * Describes the boundaries used in entity requests.\r\n */\r\n export interface IReqBounds {\r\n south: number;\r\n west: number;\r\n north: number;\r\n east: number;\r\n\r\n // Used to exclude requests from UI that fall outside of min-max boundaries.\r\n // TODO: Migrate into \"entity-filter-getter.ts\", \"entity-globe.ts\" and then remove from here.\r\n alt?: number;\r\n }\r\n\r\n /**\r\n * Calculates boundaries from entity.\r\n * This will not use the set entity boundaries and instead calculate from geometry and location.\r\n * @param entity \r\n */\r\n export function FromEntity(entity: Entity.IEntity): IBounds {\r\n const bounds: IBounds = {\r\n maxAltitude: null,\r\n maxLatitude: null,\r\n maxLongitude: null,\r\n minAltitude: null,\r\n minLatitude: null,\r\n minLongitude: null\r\n };\r\n const points: Carto.ICarto[] = [];\r\n if (entity.location) {\r\n points.push(entity.location);\r\n }\r\n if (entity.geometry) {\r\n if (entity.geometry.Point) {\r\n points.push(...Geometry.ParsePoints(entity.geometry.Point));\r\n }\r\n if (entity.geometry.LineString) {\r\n points.push(...Geometry.ParsePoints(entity.geometry.LineString));\r\n }\r\n if (entity.geometry.Polygon) {\r\n for (const ring of entity.geometry.Polygon) {\r\n points.push(...Geometry.ParsePoints(ring.LinearRing));\r\n }\r\n }\r\n }\r\n for (const point of points) {\r\n if (bounds.maxLatitude == null || point.latitude > bounds.maxLatitude) {\r\n bounds.maxLatitude = point.latitude;\r\n }\r\n if (bounds.maxLongitude == null || point.longitude > bounds.maxLongitude) {\r\n bounds.maxLongitude = point.longitude;\r\n }\r\n if (bounds.maxAltitude == null || point.altitude > bounds.maxAltitude) {\r\n bounds.maxAltitude = point.altitude;\r\n }\r\n if (bounds.minLatitude == null || point.latitude < bounds.minLatitude) {\r\n bounds.minLatitude = point.latitude;\r\n }\r\n if (bounds.minLongitude == null || point.longitude < bounds.minLongitude) {\r\n bounds.minLongitude = point.longitude;\r\n }\r\n if (bounds.minAltitude == null || point.altitude < bounds.minAltitude) {\r\n bounds.minAltitude = point.altitude;\r\n }\r\n }\r\n return bounds;\r\n }\r\n}","interface IBruceEventCallback {\r\n _id: number;\r\n removeCallback: () => void;\r\n callback: (data: any) => void;\r\n}\r\n\r\n/**\r\n * Simple event utility.\r\n * Instantiate the model, then subscribe and trigger events.\r\n */\r\nexport class BruceEvent<TArgs> {\r\n // Counter to help differentiate subscriptions.\r\n private _counter: number = 0;\r\n\r\n // Record of all callback subscriptions for this event.\r\n private callbacks: IBruceEventCallback[] = [];\r\n\r\n\r\n public Subscribe(callback: (data: TArgs) => void): (() => void) {\r\n let id = this._counter++;\r\n let newBruceEventCallback: IBruceEventCallback = {\r\n \t_id: id,\r\n \tremoveCallback: () => {\r\n \t\tthis.Unsubscribe(id);\r\n \t},\r\n \tcallback: callback\r\n };\r\n this.callbacks.push(newBruceEventCallback);\r\n return newBruceEventCallback.removeCallback;\r\n }\r\n\r\n public Unsubscribe(id: number): void {\r\n let index = this.callbacks.findIndex(x => x._id == id);\r\n if (index > -1) {\r\n this.callbacks.splice(index, 1);\r\n }\r\n }\r\n\r\n public Trigger(data?: TArgs): void {\r\n let callbacks = this.callbacks;\r\n for (let i = 0; i < callbacks.length; i++) {\r\n let callback = callbacks[i];\r\n if (callback.callback) {\r\n callback.callback(data);\r\n }\r\n }\r\n }\r\n\r\n public Clear(): void {\r\n this.callbacks = [];\r\n }\r\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}","/**\r\n * Controls the flow of method calls.\r\n * If you have a method that may be called often, but you don't want it to run often, use this.\r\n */\r\nexport class DelayQueue {\r\n // The callback is the method we want to control queue for.\r\n private callback: () => void;\r\n\r\n // Millisecond delay.\r\n public delay: number = 200;\r\n\r\n // Date-time stamp for the last callback call.\r\n private lastCallTime: number = <any>null;\r\n\r\n // The delay timeout for calling update.\r\n private delayTimeout: any;\r\n\r\n\r\n constructor(callback: () => void, delay: number = 200) {\r\n this.callback = callback;\r\n this.delay = delay;\r\n }\r\n\r\n public Call(force: boolean = false): void {\r\n if (this.lastCallTime == null) {\r\n force = true;\r\n }\r\n if (force) {\r\n let endDate = new Date().getTime();\r\n this.doCall(endDate);\r\n }\r\n else {\r\n const endDate = new Date().getTime();\r\n const seconds = (endDate - this.lastCallTime) / 1000;\r\n const delay = this.delay / 1000;\r\n if (seconds > delay) {\r\n this.doCall(endDate);\r\n }\r\n else if (this.delayTimeout == null) {\r\n const diff = (delay - seconds) * 1000;\r\n this.delayTimeout = setTimeout(() => {\r\n this.delayTimeout = null;\r\n this.Call();\r\n }, diff + 0.02);\r\n }\r\n }\r\n }\r\n\r\n private doCall(endDate: number): void {\r\n if (this.delayTimeout != null) {\r\n clearTimeout(this.delayTimeout);\r\n this.delayTimeout = null;\r\n }\r\n this.lastCallTime = endDate;\r\n this.callback();\r\n }\r\n\r\n public Dispose(): void {\r\n if (this.delayTimeout != null) {\r\n clearTimeout(this.delayTimeout);\r\n this.delayTimeout = null;\r\n }\r\n }\r\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 export function ToDate(utc: IUTC): Date {\n return new Date(utc.y, utc.m - 1, utc.d, utc.hh, utc.mm, utc.ss, 0);\n }\n\n export function FromDate(date: Date): IUTC {\n return {\n y: date.getUTCFullYear(),\n m: date.getUTCMonth() + 1,\n d: date.getUTCDate(),\n hh: date.getUTCHours(),\n mm: date.getUTCMinutes(),\n ss: date.getUTCSeconds()\n };\n }\n}","export class LRUCache<TKey, TValue> {\r\n private readonly capacity: number;\r\n private readonly cache: Map<TKey, TValue>;\r\n\r\n constructor(capacity: number) {\r\n this.capacity = capacity;\r\n this.cache = new Map<TKey, TValue>();\r\n }\r\n\r\n public Get(key: TKey): TValue | undefined {\r\n const value = this.cache.get(key);\r\n if (value) {\r\n this.cache.delete(key);\r\n this.cache.set(key, value);\r\n }\r\n return value;\r\n }\r\n\r\n public Set(key: TKey, value: TValue): void {\r\n if (this.cache.size >= this.capacity) {\r\n const leastRecentlyUsedKey = this.cache.keys().next().value;\r\n this.cache.delete(leastRecentlyUsedKey);\r\n }\r\n this.cache.set(key, value);\r\n }\r\n\r\n public Entries(): IterableIterator<[TKey, TValue]> {\r\n return this.cache.entries();\r\n }\r\n\r\n public Clear() {\r\n this.cache.clear();\r\n }\r\n}\r\n","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\ntype Type = EntityAttachmentType.EType | string;\r\n\r\n/**\r\n * Describes the \"Entity Attachment Type\" concept within Bruce.\r\n * It is a record that describes the purpose of an attachment.\r\n */\r\nexport namespace EntityAttachmentType {\r\n export function GetCacheKey(id: Type): string {\r\n return Api.ECacheKey.AttachmentType + Api.ECacheKey.Id + id;\r\n }\r\n\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.AttachmentType;\r\n }\r\n\r\n export interface IType {\r\n Description: string;\r\n ID: string | EType;\r\n Name: string;\r\n }\r\n\r\n export enum EType {\r\n Photo = \"photo\",\r\n Document = \"document\"\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n attachmentTypeId: Type,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, attachmentTypeId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!id) {\r\n throw(\"Type ID is required.\");\r\n }\r\n await api.DELETE(`entityAttachmentType/${id}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(id));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n attachmentType: IType,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n attachmentType: IType\r\n }> {\r\n let { api, attachmentType: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data?.ID) {\r\n throw(\"Type ID is required.\");\r\n }\r\n const res = await api.POST(`entityAttachmentType/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n attachmentType: res\r\n };\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n reqParams?: Api.IReqParams\r\n }): Promise<{\r\n attachmentTypes: IType[]\r\n }> {\r\n let { api, reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`entityAttachmentTypes`, Api.PrepReqParams(reqParams));\r\n res({\r\n attachmentTypes: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ClientFile } from \"../client-file/client-file\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { EntityAttachmentType } from \"./entity-attachment-type\";\r\n\r\ntype Type = EntityAttachmentType.EType | string;\r\n\r\n/**\r\n * Describes the \"Entity Attachment\" concept within Bruce.\r\n * An entity attachment is an arbitrary file record that is linked to an entity record.\r\n * The same file can be attached to multiple entities.\r\n */\r\nexport namespace EntityAttachment {\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.Attachment + Api.ECacheKey.Id + id;\r\n }\r\n\r\n export function GetListCacheKey(entityId: string): string {\r\n return Api.ECacheKey.Attachment + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n export interface IAttachment {\r\n ID: number;\r\n ClientFile?: ClientFile.IFile;\r\n Group?: string;\r\n \"ClientFile.ID\": string;\r\n DisplayOrder?: number;\r\n \"Entity.ID\": string;\r\n \"EntityAttachmentType.ID\": Type;\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n attachments: IAttachment[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n attachments: IAttachment[]\r\n }> {\r\n let { api, attachments, req, entityId } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!attachments?.length) {\r\n return {\r\n attachments: []\r\n };\r\n }\r\n const res = await api.POST(`entity/${entityId}/attachments`, {\r\n attachments\r\n }, Api.PrepReqParams(req));\r\n for (let i = 0; i < attachments.length; i++) {\r\n if (attachments[i].ID) {\r\n api.Cache.Remove(GetCacheKey(attachments[i].ID));\r\n }\r\n }\r\n await api.Cache.Remove(GetListCacheKey(entityId));\r\n return {\r\n attachments: res.attachments\r\n };\r\n }\r\n\r\n export async function UpdateOrder(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n attachmentTypeId: Type,\r\n attachments: IAttachment[],\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityId, attachmentTypeId: typeId, attachments, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!entityId || !typeId || !attachments?.length) {\r\n throw(\"Entity ID, Type ID, and Attachments are required.\");\r\n }\r\n const reqData = {\r\n \t\"DisplayOrder.Start\": 0,\r\n \t\"ClientFile.ID\": attachments.map(x => x[\"ClientFile.ID\"])\r\n };\r\n await api.POST(`entity/${entityId}/attachments/${typeId}/setOrder`, reqData, Api.PrepReqParams(reqParams));\r\n for (let i = 0; i < attachments.length; i++) {\r\n api.Cache.Remove(GetCacheKey(attachments[i].ID));\r\n }\r\n await api.Cache.RemoveByStartsWith(GetListCacheKey(entityId));\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n attachmentId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, attachmentId, entityId, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!attachmentId || !entityId) {\r\n throw(\"Entity id and attachment id.\");\r\n }\r\n await api.DELETE(`entity/${entityId}/attachments/${attachmentId}`, Api.PrepReqParams(req));\r\n await api.Cache.Remove(GetCacheKey(attachmentId));\r\n await api.Cache.Remove(GetListCacheKey(params.entityId));\r\n }\r\n\r\n export async function GetListByEntityId(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n attachments: IAttachment[]\r\n }> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`entity/${entityId}/attachments`, Api.PrepReqParams(reqParams));\r\n res({\r\n attachments: (data.attachments ? data.attachments : data.Items)\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(entityId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n export async function Upload(params: {\r\n api?: BruceApi.Api,\r\n file: Blob,\r\n entityId: string,\r\n attachmentTypeId: Type,\r\n req?: Api.IUploadReqParams\r\n }): Promise<{\r\n attachment: IAttachment\r\n }> {\r\n let { api, file, entityId, attachmentTypeId: typeId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!entityId || !typeId || !file) {\r\n throw(\"Entity ID, Type ID, and File are required.\");\r\n }\r\n const url = `entity/${entityId}/attachment/${typeId}`;\r\n const res = await api.UPLOAD(url, file, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetListCacheKey(entityId));\r\n return {\r\n attachment: res\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Entity Comment\" concept within Bruce.\r\n * An entity comment is a user written message that is linked to an entity record.\r\n */\r\nexport namespace EntityComment {\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.Comment + Api.ECacheKey.Id + id;\r\n }\r\n\r\n export function GetListCacheKey(entityId: string): string {\r\n return Api.ECacheKey.Comment + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n export interface IComment {\r\n Comment: string;\r\n \"Created.ByUser.ID\": string;\r\n \"Created.Date\": UTC.IUTC;\r\n ID: number;\r\n RepliesCount: number;\r\n \"ReplyTo.Comment.ID\": number;\r\n \"TargetObject.ID\": string;\r\n \"TargetObject.Type\": string;\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n comment: IComment,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n comment: IComment\r\n }> {\r\n let { api, comment: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data?.[\"TargetObject.ID\"]) {\r\n throw(\"TargetObject.ID (entity id) is required.\");\r\n }\r\n const url = `entity/${data[\"TargetObject.ID\"]}/comment` + (data.ID == null ? \"\" : \"/\" + data.ID);\r\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ID));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Comment + Api.ECacheKey.Entity);\r\n return {\r\n comment: res\r\n };\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n commentId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityId, commentId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!commentId) {\r\n throw(\"Comment ID is required.\");\r\n }\r\n await api.DELETE(`entity/${entityId}/comment/${commentId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(commentId));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Comment + Api.ECacheKey.Entity);\r\n }\r\n\r\n export async function GetListByEntityId(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n comments: IComment[]\r\n }> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`entity/${entityId}/comments`, Api.PrepReqParams(reqParams));\r\n res({\r\n comments: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(entityId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Entity Link\" concept within Bruce.\r\n * An entity link is a URL linked to an entity record.\r\n */\r\nexport namespace EntityLink {\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.Link + Api.ECacheKey.Id + id;\r\n }\r\n\r\n export function GetListCacheKey(entityId: string): string {\r\n return Api.ECacheKey.Link + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n export interface ILink {\r\n DisplayName: string;\r\n ID?: number;\r\n \"Entity.ID\": string;\r\n URL: string;\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n link: ILink,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n link: ILink\r\n }> {\r\n let { api, link: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data?.[\"Entity.ID\"]) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n const url = `entity/${data[\"Entity.ID\"]}/link` + (data.ID == null ? \"\" : \"/\" + data.ID);\r\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(<number>data.ID));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Link + Api.ECacheKey.Entity);\r\n return {\r\n link: res\r\n };\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n linkId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityId, linkId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n \r\n if (!linkId) {\r\n throw(\"Link ID is required.\");\r\n }\r\n await api.DELETE(`entity/${entityId}/link/${linkId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(linkId));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Link + Api.ECacheKey.Entity);\r\n }\r\n\r\n export async function GetListByEntityId(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n links: ILink[]\r\n }> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`entity/${entityId}/links`, Api.PrepReqParams(reqParams));\r\n res({\r\n links: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(entityId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ClientFile } from \"../client-file/client-file\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Entity LOD\" concept within Bruce.\r\n * LOD stands for Level of Detail.\r\n * An lod record is a possible 2d/3d visualization of the entity record.\r\n * The most common kind is a GLB.\r\n */\r\nexport namespace EntityLod {\r\n export function GetCacheKey(url: string): string {\r\n return Api.ECacheKey.Lod + Api.ECacheKey.Id + url;\r\n }\r\n\r\n export function GetTypeListKey(typeId: string, group: string): string {\r\n return Api.ECacheKey.Lod + Api.ECacheKey.EntityType + typeId + Api.ECacheKey.Id + group;\r\n }\r\n\r\n export function GetEntityListKey(entityId: string): string {\r\n return Api.ECacheKey.Lod + Api.ECacheKey.Entity + entityId;\r\n }\r\n\r\n export interface ILod {\r\n ClientFile?: ClientFile.IFile;\r\n \"ClientFile.ID\": string;\r\n \"Entity.ID\": string;\r\n \"LODCategory.Key\": string;\r\n Level: number;\r\n Group?: string;\r\n }\r\n\r\n export interface IEntityLodUpdate {\r\n \"ClientFile.ID\": string;\r\n \"LODCategory.Key\": string;\r\n Level: number;\r\n }\r\n\r\n export function GetUrl(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n categoryId: string,\r\n level: number,\r\n strict?: boolean\r\n }): {\r\n url: string\r\n } {\r\n let { api, entityId, categoryId, level, strict } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n if (!categoryId) {\r\n categoryId = \"GLB\";\r\n }\r\n if (!level) {\r\n level = 0;\r\n }\r\n let url: string = api.GetBaseUrl() + `entity/${entityId}/lod/${categoryId}/${level}`;\r\n if (strict) {\r\n url = url + \"?strict=true\";\r\n }\r\n return {\r\n url: url\r\n };\r\n }\r\n\r\n export async function GetUrlFileId(params: {\r\n api?: BruceApi.Api,\r\n url: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n clientFileId: string\r\n }> {\r\n let { api, url, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!url) {\r\n throw(\"Url is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetCacheKey(url), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const record: ILod = await api.get(url, Api.PrepReqParams(reqParams));\r\n res({\r\n clientFileId: record[\"ClientFile.ID\"]\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(url),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n export async function GetLods(params: {\r\n api?: BruceApi.Api,\r\n filter: Filter.IListParams,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n lods: Filter.IListResItem[]\r\n }> {\r\n let { api, filter, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!filter?.Items?.length) {\r\n throw(\"Items are required.\");\r\n }\r\n const data = await api.POST(\"entity/getlods\", filter, reqParams);\r\n return {\r\n lods: data.Items\r\n };\r\n }\r\n\r\n export async function GetEntityLods(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n lods: ILod[]\r\n }> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!entityId) {\r\n throw(\"Entity id is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetEntityListKey(entityId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req = api.GET(`entity/${entityId}/lods?includeClientFiles=yes`, Api.PrepReqParams(reqParams));\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n lods: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetEntityListKey(entityId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns lods for a specified entity type.\r\n * @param params\r\n */\r\n export async function GetTypeLods(params: {\r\n api?: BruceApi.Api,\r\n entityTypeId: string,\r\n group?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n lods: ILod[]\r\n }> {\r\n let { api, entityTypeId: typeId, group, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!group) {\r\n group = \"DEFAULT\";\r\n }\r\n const cache = await api.GetCacheItem(GetTypeListKey(typeId, group), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const url = `entityType/${typeId}/lods?includeClientFiles=yes` + (group ? \"&group=\" + group : \"\");\r\n const req = api.GET(url, Api.PrepReqParams(reqParams));\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n lods: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetTypeListKey(typeId, group),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n req?: Api.IReqParams\r\n } & IEntityLodUpdate): Promise<void> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!params[\"ClientFile.ID\"] || !params[\"LODCategory.Key\"] || (!params.Level && params.Level !== 0)) {\r\n throw(\"ClientFile.ID, LODCategory.Key and Level are required.\");\r\n }\r\n const res = await api.POST(`entity/${entityId}/lod/${params[\"LODCategory.Key\"]}/${params.Level}`, {\r\n \"Level\": params.Level,\r\n \"ClientFile.ID\": params[\"ClientFile.ID\"]\r\n }, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetEntityListKey(entityId));\r\n return res;\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n lodCategoryId: string,\r\n level: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityId, lodCategoryId, level, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!entityId || !lodCategoryId) {\r\n throw(\"Entity ID and LOD Category ID are required.\");\r\n }\r\n level = +level;\r\n if (isNaN(level)) {\r\n throw(\"Level is required. It must be a number.\");\r\n }\r\n await api.POST(`entity/${entityId}/deleteLODs`, {\r\n Items: [{ \"LODCategory.Key\": lodCategoryId, \"Level\": level }]\r\n }, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetEntityListKey(entityId));\r\n }\r\n\r\n export namespace Filter {\r\n export interface IListParamsItem {\r\n \"entityId\": string,\r\n \"categoryId\": string,\r\n \"group\"?: string,\r\n \"level\"?: number\r\n }\r\n\r\n export interface IListParams {\r\n \"strict\": boolean,\r\n \"externalSources\": boolean,\r\n \"Items\": IListParamsItem[]\r\n }\r\n\r\n export interface IListResItem {\r\n clientFileId: string;\r\n entityId: string;\r\n accountId: string;\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\nexport namespace EntityLodCategory {\r\n export function GetCacheKey(id: string): string {\r\n return Api.ECacheKey.LodCategory + Api.ECacheKey.Id + id;\r\n }\r\n\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.LodCategory;\r\n }\r\n\r\n export interface ICategory {\r\n Description?: string;\r\n Key: string;\r\n Name: string;\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n categories: ICategory[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"lodCategories\", Api.PrepReqParams(reqParams));\r\n res({\r\n categories: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n categoryId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n category: ICategory\r\n }> {\r\n let { api, categoryId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!id) {\r\n throw(\"Lod category id is required.\");\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 req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`lodCategory/${id}`, Api.PrepReqParams(reqParams));\r\n res({\r\n category: 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: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n categoryId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, categoryId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!id) {\r\n throw(\"Lod category id is required.\");\r\n }\r\n await api.DELETE(`lodCategory/${id}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(id));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n category: ICategory,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n category: ICategory\r\n }> {\r\n let { api, category: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data.Key || !data.Name) {\r\n throw(\"Lod category key and name are required.\");\r\n }\r\n const res = await api.POST(`lodCategory/${data.Key}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.Key));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n category: res\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\n\r\n/**\r\n * Describes the \"Entity Relationship Type\" concept within Bruce.\r\n * A relationship type record describes the purpose of a relationship.\r\n */\r\nexport namespace EntityRelationType {\r\n export function GetCacheKey(id: string): string {\r\n return Api.ECacheKey.RelationType + Api.ECacheKey.Id + id;\r\n }\r\n\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.RelationType;\r\n }\r\n\r\n export interface IType {\r\n ID: string;\r\n ForwardName: string;\r\n ReverseName: string;\r\n Name: string;\r\n FlipDisplayDirection?: boolean;\r\n EntityDisplaySettingID?: string;\r\n \"Relation.EntityType.ID\"?: string;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n relationTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n relationType: IType\r\n }> {\r\n let { api, relationTypeId: typeId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!typeId) {\r\n throw(\"Type ID is required.\");\r\n }\r\n const key = GetCacheKey(typeId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`entityRelationType/${typeId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n relationType: 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,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n relationTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, relationTypeId: typeId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!typeId) {\r\n throw(\"Type ID is required.\");\r\n }\r\n await api.DELETE(`entityRelationType/${typeId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(typeId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n relationTypes: IType[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"entityRelationTypes\", Api.PrepReqParams(reqParams));\r\n res({\r\n relationTypes: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n relationType: IType,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n relationType: IType\r\n }> {\r\n let { api, relationType: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data?.ForwardName || !data?.ReverseName) {\r\n throw(\"Forward and reverse names are required.\");\r\n }\r\n if (!data.ID) {\r\n data.ID = ObjectUtils.UId();\r\n }\r\n const res = await api.POST(`entityRelationType/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n relationType: res\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Entity } from \"./entity\";\r\n\r\n/**\r\n * Describes the \"Entity Relationship\" concept within Bruce.\r\n * An entity relationship is an arbitrary link between two entity records.\r\n * The relationship can have a \"data entity\" linked to it as well for the relationship to store arbitrary data about itself.\r\n */\r\nexport namespace EntityRelation {\r\n export function GetCacheKey(entityA: string, entityB: string, typeId: string): string {\r\n return `${Api.ECacheKey.Relation}${Api.ECacheKey.Id}${entityA}${Api.ECacheKey.Id}${entityB}${Api.ECacheKey.Id}${typeId}`;\r\n }\r\n\r\n export function GetEntityCacheKey(entityId: string): string {\r\n return Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n export function GetListCacheKey(entityId: string, params: IListParams): string {\r\n return Api.ECacheKey.Relation + Api.ECacheKey.RelationType +\r\n Api.ECacheKey.Id + params.relationTypeId +\r\n Api.ECacheKey.Id + params.oneWayOnly +\r\n Api.ECacheKey.Id + params.loadEntityData +\r\n Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n export interface IRelation {\r\n \"Principal.Entity.ID\": string;\r\n \"Related.Entity.ID\": string;\r\n RelatedEntity?: Entity.IEntity;\r\n PrincipalEntity?: Entity.IEntity;\r\n \"Relation.Type.ID\": string;\r\n RelationType?: any;\r\n \"Data.Entity.ID\"?: string;\r\n }\r\n\r\n export interface IListParams {\r\n relationTypeId?: string;\r\n oneWayOnly?: boolean;\r\n loadEntityData?: boolean;\r\n }\r\n\r\n export async function Create(params: {\r\n api?: BruceApi.Api,\r\n relation: IRelation,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, relation: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data[\"Principal.Entity.ID\"] || !data[\"Related.Entity.ID\"] || !data[\"Relation.Type.ID\"]) {\r\n throw(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\r\n }\r\n const reqData = {\r\n \"Related.Entity.ID\": [data[\"Related.Entity.ID\"]]\r\n };\r\n const url = `entity/${data[\"Principal.Entity.ID\"]}/relation/${data[\"Relation.Type.ID\"]}/add`;\r\n await api.POST(url, reqData, Api.PrepReqParams(reqParams));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Principal.Entity.ID\"]);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Related.Entity.ID\"]);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType);\r\n if (data[\"Data.Entity.ID\"]) {\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + data[\"Data.Entity.ID\"]);\r\n }\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n principalEntityId: string,\r\n relatedEntityId: string,\r\n relationTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, principalEntityId, relatedEntityId, relationTypeId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!principalEntityId || !relatedEntityId || !relationTypeId) {\r\n throw new Error(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\r\n }\r\n const url = `entity/${principalEntityId}/relation/${relationTypeId}/delete`;\r\n await api.POST(url, {\r\n \"Related.Entity.ID\": [relatedEntityId]\r\n }, Api.PrepReqParams(reqParams));\r\n\r\n // Remove related cache entries\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + principalEntityId);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + relatedEntityId);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType + Api.ECacheKey.Id + relationTypeId);\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n relation: IRelation,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, relation: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data[\"Principal.Entity.ID\"] || !data[\"Related.Entity.ID\"] || !data[\"Relation.Type.ID\"]) {\r\n throw(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\r\n }\r\n const url = `entity/${data[\"Principal.Entity.ID\"]}/otherEntityID/${data[\"Related.Entity.ID\"]}/relation/${data[\"Relation.Type.ID\"]}/update`;\r\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Principal.Entity.ID\"]);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Related.Entity.ID\"]);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType + Api.ECacheKey.Id + data[\"Relation.Type.ID\"]);\r\n if (data[\"Data.Entity.ID\"]) {\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + data[\"Data.Entity.ID\"]);\r\n }\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n filter: IListParams,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n relations: IRelation[]\r\n }> {\r\n let { api, entityId, filter, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n filter = {\r\n relationTypeId: \"\",\r\n oneWayOnly: false,\r\n loadEntityData: false,\r\n ...filter\r\n }\r\n const cache = await api.GetCacheItem(GetListCacheKey(entityId, filter), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n let url = `entity/${entityId}/relations`;\r\n if (filter.relationTypeId) {\r\n url += \"/\" + filter.relationTypeId;\r\n }\r\n url += `?Oneway=${filter.oneWayOnly}&LoadInfo=${filter.loadEntityData}`;\r\n const data = await api.GET(url, Api.PrepReqParams(reqParams));\r\n res({\r\n relations: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(entityId, filter),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n export async function GetByDataEntityId(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n relation: IRelation\r\n }> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetEntityCacheKey(entityId), 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 = await api.GET(`entity/relation/${entityId}/dataentity`, Api.PrepReqParams(reqParams));\r\n res({\r\n relation: 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: GetEntityCacheKey(entityId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { IDictionary } from \"../common/dictionary\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n/**\r\n * Describes the \"Entity Source\" concept within Bruce.\r\n * An entity source is a record which links an arbitrary source id to a Bruce entity id.\r\n * For example an OSM building id to a Bruce entity id.\r\n */\r\nexport namespace EntitySource {\r\n export function GetCacheKey(sourceId: number, sourceKey: string): string {\r\n return `${Api.ECacheKey.EntitySource}${Api.ECacheKey.Id}${sourceId}${Api.ECacheKey.Id}${sourceKey}`;\r\n }\r\n\r\n export interface ISource {\r\n \"Entity.ID\": string;\r\n \"Source.ID\": number;\r\n \"SourceRecord.Key\": string;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n sourceId: number,\r\n sourceKey: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n source: ISource\r\n }> {\r\n let { api, sourceId, sourceKey, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!sourceId || !sourceKey) {\r\n throw(\"Source ID and Source Key are required.\");\r\n }\r\n const res = await GetListByKeys({\r\n api: api,\r\n sourceId: sourceId,\r\n sourceKeys: [sourceKey],\r\n req: reqParams\r\n })\r\n return {\r\n source: res.sources?.length ? res.sources[0] : null\r\n };\r\n }\r\n\r\n export async function GetListByKeys(params: {\r\n api?: BruceApi.Api,\r\n sourceId: number,\r\n sourceKeys: string[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n sources: ISource[]\r\n }> {\r\n let { api, sourceId, sourceKeys, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!sourceId || !sourceKeys.length) {\r\n throw(\"Source ID and Source Keys are required.\");\r\n }\r\n const reqKeys: string[] = [];\r\n const reqs: Promise<ISource>[] = [];\r\n for (let i = 0; i < sourceKeys.length; i++) {\r\n const sourceKey = sourceKeys[i];\r\n const cache = await api.GetCacheItem(GetCacheKey(sourceId, sourceKey), reqParams);\r\n if (cache?.found) {\r\n reqs.push(cache.data);\r\n }\r\n else {\r\n reqKeys.push(sourceKey);\r\n }\r\n }\r\n if (reqKeys.length) {\r\n const prom: Promise<ISource[]> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.POST(`entitysource/${sourceId}`, { SourceRecordKeys: reqKeys }, Api.PrepReqParams(reqParams));\r\n res(data.Items);\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n for (let i = 0; i < reqKeys.length; i++) {\r\n const req: Promise<ISource> = new Promise(async (res, rej) => {\r\n try {\r\n const sources = await prom;\r\n res(<ISource>sources.find((s: ISource) => s[\"SourceRecord.Key\"] === reqKeys[i]));\r\n }\r\n catch (e) {\r\n rej(<any>e);\r\n }\r\n });\r\n reqs.push(req);\r\n }\r\n }\r\n return {\r\n sources: (await Promise.all(reqs)).filter(x => !!x)\r\n };\r\n }\r\n\r\n export async function GetEntityIdsBySourceKeys(params: {\r\n api?: BruceApi.Api,\r\n sourceId: number,\r\n sourceKeys: string[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Source key to entity id mapping.\r\n idMapping: IDictionary<string>\r\n }> {\r\n let { api, sourceId, sourceKeys, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!sourceId || !sourceKeys.length) {\r\n throw(\"Source ID and Source Keys are required.\");\r\n }\r\n const result: IDictionary<string> = {};\r\n if (sourceKeys.length > 0) {\r\n const {sources} = await GetListByKeys({\r\n api,\r\n sourceId,\r\n sourceKeys,\r\n req: reqParams\r\n });\r\n for (let i = 0; i < sources.length; i++) {\r\n const source = sources[i];\r\n for (let i = 0; i < sourceKeys.length; i++) {\r\n const key = sourceKeys[i];\r\n if (key == source[\"SourceRecord.Key\"]) {\r\n result[key] = source[\"Entity.ID\"];\r\n }\r\n }\r\n }\r\n }\r\n return {\r\n idMapping: result\r\n };\r\n }\r\n\r\n export async function CreateLink(params: {\r\n api?: BruceApi.Api\r\n source: ISource\r\n }): Promise<{\r\n source: ISource\r\n }> {\r\n let {source, api} = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!source[\"Entity.ID\"] || !source[\"Source.ID\"] || !source[\"SourceRecord.Key\"]) {\r\n throw(\"Entity ID, Source ID and Source Key are required.\");\r\n }\r\n const res = await api.POST(\"entitysource\", source);\r\n const cacheKey = GetCacheKey(source[\"Source.ID\"], source[\"SourceRecord.Key\"]);\r\n await api.Cache.Remove(cacheKey);\r\n return {\r\n source: res\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Entity Tag\" concept within Bruce.\r\n * An entity tag is used to categorize an entity record.\r\n * Entity tags can be used in filters, or to restrict entity access.\r\n */\r\nexport namespace EntityTag {\r\n export function GetCacheKey(tagId: number): string {\r\n return `${Api.ECacheKey.Tag}${Api.ECacheKey.Id}${tagId}`;\r\n }\r\n\r\n export function GetListCacheKey(entityTypeId?: string): string {\r\n if (entityTypeId) {\r\n return Api.ECacheKey.Tag + Api.ECacheKey.EntityType + Api.ECacheKey.Id + entityTypeId;\r\n }\r\n return Api.ECacheKey.Tag;\r\n }\r\n\r\n export interface ITag {\r\n ID: number;\r\n Name?: string;\r\n Description?: string;\r\n IsAccessRestricted?: boolean;\r\n \"EntityType.ID\"?: string;\r\n Color?: string;\r\n \"Parent.Layer.ID\"?: number;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n tagId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n tag: ITag\r\n }> {\r\n let { api, tagId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tagId) {\r\n throw(\"Tag ID is required.\");\r\n }\r\n const {tags} = await GetListByIds({\r\n api,\r\n tagIds: [tagId],\r\n req: reqParams\r\n });\r\n return {\r\n tag: tags.length ? tags[0] : null\r\n };\r\n }\r\n\r\n export async function GetListByIds(params: {\r\n api?: BruceApi.Api,\r\n tagIds: number[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n tags: ITag[]\r\n }> {\r\n let { api, tagIds, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tagIds.length) {\r\n throw(\"Tag Ids are empty.\");\r\n }\r\n const reqIds: number[] = [];\r\n const reqs: Promise<{ tag: ITag }>[] = [];\r\n for (let i = 0; i < tagIds.length; i++) {\r\n const tagId = tagIds[i];\r\n const cache = await api.GetCacheItem(GetCacheKey(tagId), reqParams);\r\n if (cache?.found) {\r\n reqs.push(cache.data);\r\n }\r\n else {\r\n reqIds.push(tagId);\r\n }\r\n }\r\n if (reqIds.length) {\r\n const prom: Promise<ITag[]> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.POST(\"layers/get\", { layerIds: reqIds }, Api.PrepReqParams(reqParams));\r\n res(data.Items);\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n for (let i = 0; i < reqIds.length; i++) {\r\n const id = reqIds[i];\r\n const req: Promise<{ tag: ITag }> = new Promise(async (res, rej) => {\r\n try {\r\n const tags = await prom;\r\n const tag = tags.find((t: ITag) => t.ID === id);\r\n res({\r\n tag: tag\r\n });\r\n }\r\n catch (e) {\r\n rej(<any>e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(id),\r\n value: req,\r\n req: reqParams\r\n });\r\n reqs.push(req);\r\n }\r\n }\r\n return {\r\n tags: (await Promise.all(reqs)).map(x => x?.tag).filter(x => !!x)\r\n };\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n entityTypeId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n tags: ITag[]\r\n }> {\r\n let { api, entityTypeId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(entityTypeId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(entityTypeId ? `entityType/${entityTypeId}/layers` : \"layers\", Api.PrepReqParams(reqParams));\r\n res({\r\n tags: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(entityTypeId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n tagId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, tagId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tagId) {\r\n throw(\"Tag ID is required.\");\r\n }\r\n await api.DELETE(`layer/${tagId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(tagId));\r\n await api.Cache.RemoveByStartsWith(GetListCacheKey());\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n tag: ITag,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n tag: ITag\r\n }> {\r\n let { api, tag: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n \r\n const url = data.ID ? `layer/${data.ID}` : \"layer\";\r\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ID));\r\n await api.Cache.RemoveByStartsWith(GetListCacheKey());\r\n return {\r\n tag: res\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\nimport { Entity } from \"./entity\";\r\nimport { EntityAttribute } from \"./entity-attribute\";\r\nimport { EntityTypeVisualSettings } from \"./entity-type-visual-settings\";\r\n\r\n/**\r\n * Describes the \"Entity Type\" concept within Bruce.\r\n * An entity type is an \"expectation\" of what data \"should\" look like in a particular entity record.\r\n * The schema is stencils onto entity data to filter out what we should display or search against.\r\n */\r\nexport namespace EntityType {\r\n export function GetCacheKey(typeId: string): string {\r\n return `${Api.ECacheKey.EntityType}${Api.ECacheKey.Id}${typeId}`;\r\n }\r\n\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.EntityType;\r\n }\r\n\r\n export interface IType {\r\n ID?: string;\r\n IsDeleted?: boolean;\r\n Name: string;\r\n Description?: string;\r\n Data?: Entity.IEntity;\r\n IsAccessRestricted?: boolean;\r\n DataSchema?: {\r\n Key: \"root\",\r\n Name?: \"Root\",\r\n Structure: EntityAttribute.IAttribute[],\r\n Type: EntityAttribute.EType.Structure\r\n };\r\n DisplayNameAttributePath?: string;\r\n IsStrictSchema?: boolean;\r\n \"DisplaySetting.ID\"?: number;\r\n AuthoringSettings?: {\r\n enabledTools: string[];\r\n defaultTool: string;\r\n };\r\n \"LastUpdate.Time\"?: UTC.IUTC;\r\n \"Parent.EntityType.ID\"?: string;\r\n VisualSettings?: EntityTypeVisualSettings.ISettings;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n entityTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n entityType: IType\r\n }> {\r\n let { api, entityTypeId: typeId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!typeId) {\r\n throw(\"Type ID is required.\");\r\n }\r\n const key = GetCacheKey(typeId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`entitytype/${typeId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n entityType: 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,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n entityTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityTypeId: typeId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!typeId) {\r\n throw(\"Type ID is required.\");\r\n }\r\n await api.DELETE(`entitytype/${typeId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(typeId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n entityTypes: IType[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"entitytypes\", Api.PrepReqParams(reqParams));\r\n res({\r\n entityTypes: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: req,\r\n req: reqParams,\r\n duration: 60 * 5 // 5 minutes.\r\n });\r\n return req;\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n entityType: IType,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n entityType: IType\r\n }> {\r\n let { api, entityType: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data) {\r\n data = <any>{};\r\n }\r\n if (!data.ID) {\r\n data.ID = ObjectUtils.UId();\r\n }\r\n if (!data.Name) {\r\n data.Name = data.ID;\r\n }\r\n const res = await api.POST(`entitytype/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(<string>data.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n entityType: res\r\n };\r\n }\r\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\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { Carto } from \"../common/carto\";\r\nimport { Transform } from \"../common/transform\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { MathUtils } from \"../util/math-utils\";\r\nimport { Entity } from \"./entity\";\r\n\r\nexport namespace EntityCoords {\r\n export const UCS_ENTITY_TYPE_ID = \"Bruce_UCS_Type\";\r\n\r\n export function GetCacheKey(entityId: string): string {\r\n return Api.ECacheKey.EntityCoords + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n export interface IUcs {\r\n name: string;\r\n location: Carto.ICarto;\r\n \"Entity.ID\": string;\r\n transform: Transform.ITransform;\r\n }\r\n\r\n export interface IEntityCoords extends Entity.IEntity {\r\n ucs?: IUcs;\r\n }\r\n\r\n export interface IRelToPointParams {\r\n point: Carto.ICarto;\r\n test: boolean;\r\n name?: string;\r\n }\r\n\r\n export interface IRelToEpsgParams {\r\n epsg: number;\r\n test: boolean;\r\n name?: string;\r\n }\r\n\r\n export interface IRelToUcsParams {\r\n ucsId: string;\r\n test: boolean;\r\n name?: boolean;\r\n }\r\n\r\n export async function GetEntityCoords(params: {\r\n api?: BruceApi.Api,\r\n rootEntityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n coords: IEntityCoords\r\n }> {\r\n let { api, rootEntityId: entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(entityId), 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 = await api.GET(`entity/${entityId}/ucs`, reqParams);\r\n res({\r\n coords: data\r\n });\r\n } catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(entityId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function EntityRelativeToPoint(params: {\r\n api?: BruceApi.Api,\r\n rootEntityId: string,\r\n req?: Api.IReqParams\r\n } & IRelToPointParams): Promise<{\r\n coords: IEntityCoords\r\n }> {\r\n let { api, rootEntityId: entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!params.test) {\r\n await UnlinkCoords({\r\n api,\r\n rootEntityId: entityId,\r\n req: reqParams\r\n });\r\n }\r\n const point = params.point;\r\n const name = params.name || `${MathUtils.Round(point.latitude, 4)}, ${MathUtils.Round(point.longitude, 4)}`;\r\n const res = await api.POST(`entity/${entityId}/ucs`, {\r\n \"ucs\": {\r\n \"Entity.ID\": null,\r\n \"name\": name,\r\n \"location\": {\r\n \"latitude\": point.latitude,\r\n \"longitude\": point.longitude,\r\n \"altitude\": point.altitude,\r\n \"coordinates\": {\r\n \"Entity.ID\": entityId\r\n }\r\n }\r\n },\r\n \"test\": params.test\r\n }, reqParams);\r\n if (!params.test) {\r\n api.Cache.Remove(GetCacheKey(entityId));\r\n }\r\n return {\r\n coords: res\r\n };\r\n }\r\n\r\n export async function EntityRelativeToEpsg(params: {\r\n api?: BruceApi.Api,\r\n rootEntityId: string,\r\n req?: Api.IReqParams\r\n } & IRelToEpsgParams): Promise<{\r\n coords: IEntityCoords\r\n }> {\r\n let { api, rootEntityId: entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!params.test) {\r\n await UnlinkCoords({\r\n api,\r\n rootEntityId: entityId,\r\n req: reqParams\r\n });\r\n }\r\n const epsg = params.epsg;\r\n const name = params.name ?? \"EPSG: \" + epsg;\r\n const res = await api.POST(`entity/${entityId}/ucs`, {\r\n \"ucs\": {\r\n \"Entity.ID\": null,\r\n \"name\": name,\r\n \"location\": {\r\n \"coordinates\": {\r\n \"SRID\": \"EPSG:\" + epsg,\r\n \"Entity.ID\": entityId\r\n }\r\n }\r\n },\r\n \"test\": params.test\r\n }, reqParams);\r\n if (!params.test) {\r\n api.Cache.Remove(GetCacheKey(entityId));\r\n }\r\n return {\r\n coords: res\r\n };\r\n }\r\n\r\n export async function EntityRelativeToUcs(params: {\r\n api?: BruceApi.Api,\r\n rootEntityId: string,\r\n req?: Api.IReqParams\r\n } & IRelToUcsParams): Promise<{\r\n coords: IEntityCoords\r\n }> {\r\n let { api, rootEntityId: entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!params.test) {\r\n await UnlinkCoords({\r\n api,\r\n rootEntityId: entityId,\r\n req: reqParams\r\n });\r\n }\r\n const ucsId = params.ucsId;\r\n const res = await api.POST(`entity/${entityId}/ucs`, {\r\n \"ucs\": {\r\n \"Entity.ID\": ucsId\r\n },\r\n \"test\": params.test\r\n }, reqParams);\r\n if (!params.test) {\r\n api.Cache.Remove(GetCacheKey(entityId));\r\n }\r\n return {\r\n coords: res\r\n };\r\n }\r\n\r\n export async function UnlinkCoords(params: {\r\n api?: BruceApi.Api,\r\n rootEntityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, rootEntityId: entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n return api.DELETE(`entity/${entityId}/ucs`, reqParams);\r\n }\r\n}","export namespace EntityTypeVisualSettings {\r\n export enum EAction {\r\n LeftClick = \"LeftClick.CustomForm.ID\",\r\n RightClick = \"RightClick.CustomForm.ID\",\r\n DoubleClick = \"DoubleClick.CustomForm.ID\",\r\n MouseHover = \"MouseHover.CustomForm.ID\"\r\n }\r\n\r\n export interface ISettings {\r\n // Custom forms to display when a certain action is performed on related entities.\r\n // If the form is set to 0, that means use the default panel instead of a form.\r\n // When the form value is -1 that means don't display anything.\r\n CustomForms?: {\r\n // Default is 0.\r\n [EAction.LeftClick]?: number,\r\n // Default is -1.\r\n [EAction.RightClick]?: number,\r\n // Default is -1.\r\n [EAction.MouseHover]?: number,\r\n // Default is -1.\r\n [EAction.DoubleClick]?: number\r\n }\r\n }\r\n}","export namespace EntityAttribute {\r\n export enum EType {\r\n String = \"String\",\r\n Double = \"Double\",\r\n Integer = \"Integer\",\r\n Datetime = \"Datetime\",\r\n Structure = \"Structure\",\r\n Geometry = \"Geometry\",\r\n Dictionary = \"Dictionary\",\r\n Boolean = \"Boolean\"\r\n }\r\n\r\n export interface IAttribute {\r\n Key: string;\r\n Name?: string;\r\n Type?: EType;\r\n Size?: number;\r\n IsIndexed?: boolean;\r\n IsArray?: boolean;\r\n IsImportant?: boolean;\r\n Description?: string;\r\n Metadata?: IMetadata;\r\n Structure?: IAttribute[];\r\n IsFamilyAttribute?: boolean;\r\n IsFamilyAttributeDefault?: boolean;\r\n Sources?: string[];\r\n }\r\n\r\n export interface IMetadata {\r\n Description?: string;\r\n Mandatory?: boolean;\r\n Dictionary?: IDictionary;\r\n }\r\n \r\n export interface IDictionary {\r\n UseAttribute?: boolean;\r\n EntityTypeID?: string;\r\n SourceAttributePath?: string;\r\n\r\n // exists so UI components don't break - depreciated. \r\n SourceAttribute?: IAttribute;\r\n }\r\n\r\n export function GetAttribute(items: IAttribute[], path: string[]): IAttribute {\r\n if (!items || !path || !path.length) {\r\n return null;\r\n }\r\n const key = path[0];\r\n const item = items.find((i) => i.Key === key);\r\n if (!item || !item.Structure || !path.length) {\r\n return item;\r\n }\r\n return GetAttribute(item.Structure, path.slice(1));\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\n\r\n\r\nexport namespace Uploader {\r\n export const MIN_LARGE_FILE_SIZE = 100000000; // 100MB.\r\n\r\n export interface IProgress {\r\n percent: number;\r\n uploaded: boolean;\r\n }\r\n\r\n export async function DoMultiPartUpload(params: {\r\n file: File,\r\n api?: BruceApi.Api,\r\n urlSuffix: string,\r\n req?: Api.IUploadReqParams,\r\n onProgress?: (progress: IProgress) => void\r\n }) {\r\n let { file, api, urlSuffix: url, req, onProgress } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const FILE_PORTION_SIZE = 100000000; // 100MB.\r\n let fileSize = file.size;\r\n let fileOffset = 0;\r\n let filePartsCount = fileSize / FILE_PORTION_SIZE;\r\n let t = Math.trunc(filePartsCount);\r\n filePartsCount = filePartsCount > t ? t + 1 : t;\r\n let filePartIndex = 1;\r\n let uploadToken = ObjectUtils.UId();\r\n let data: any;\r\n while (fileOffset < fileSize) {\r\n let partSize = Math.min(FILE_PORTION_SIZE, fileSize - fileOffset);\r\n let retryCount: number = 5;\r\n let retryWait: number = 1000;\r\n while (retryCount > 0) {\r\n try {\r\n const blob = file.slice(fileOffset, fileOffset + partSize);\r\n const formData = new FormData();\r\n formData.append(\"originalFileName\", file.name);\r\n formData.append(\"token\", uploadToken);\r\n formData.append(\"count\", \"\" + filePartsCount);\r\n formData.append(\"part\", \"\" + filePartIndex);\r\n formData.append(\"file\", blob);\r\n const reqParams = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n reqParams.formData = formData;\r\n reqParams.onProgress = (progress: ProgressEvent) => {\r\n const sofar = fileOffset + progress.loaded;\r\n const percent = Math.round ((sofar / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n data = await api.UPLOAD(url, blob, reqParams)\r\n retryCount = 0;\r\n }\r\n catch (up) {\r\n retryCount -= 1;\r\n if (retryCount <= 0) {\r\n throw up;\r\n }\r\n await new Promise((res) => setTimeout(res, retryWait));\r\n retryWait = retryWait * 2;\r\n }\r\n }\r\n fileOffset += partSize;\r\n filePartIndex++;\r\n }\r\n onProgress?.({\r\n percent: 100,\r\n uploaded: true\r\n });\r\n return data;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Uploader } from \"../internal/uploader\";\r\n\r\n/**\r\n * Describes the \"Client File\" concept within Bruce.\r\n * A client file is a record of a file uploaded to Bruce.\r\n */\r\nexport namespace ClientFile {\r\n export function GetCacheKey(fileId: string): string {\r\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.Id}${fileId}`;\r\n }\r\n\r\n export interface IFile {\r\n UploadedTimeUTC: UTC.IUTC;\r\n FileExt: string;\r\n ID: string;\r\n MIMEType: string;\r\n OriginalFileName: string;\r\n OriginalLength: number;\r\n \"UploadedByUser.ID\": string;\r\n Purpose: string;\r\n }\r\n\r\n export function GetUrl(params: {\r\n api?: BruceApi.Api,\r\n fileId: string\r\n }): string {\r\n let { api, fileId } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n return `${api.GetBaseUrl()}file/${fileId}`;\r\n }\r\n\r\n export function GetUrlWithExt(params: {\r\n api?: BruceApi.Api,\r\n file: IFile\r\n }): string {\r\n let { api, file } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n return `${api.GetBaseUrl()}file/${file.ID}${file.FileExt ? file.FileExt : \"\"}`;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n fileId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n clientFile: IFile\r\n }> {\r\n let { api, fileId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!fileId) {\r\n throw(\"File ID is required.\");\r\n }\r\n const key = GetCacheKey(fileId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`file/${fileId}/details`, Api.PrepReqParams(reqParams));\r\n res({\r\n clientFile: 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,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n fileIds: string[],\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, fileIds, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!fileIds.length) {\r\n throw(\"File IDs are required.\");\r\n }\r\n const data = {\r\n Items: fileIds\r\n };\r\n await api.POST(\"deleteFiles\", data, Api.PrepReqParams(reqParams));\r\n for (let i = 0; i < fileIds.length; i++) {\r\n const key = GetCacheKey(fileIds[i]);\r\n api.Cache.Remove(key);\r\n }\r\n }\r\n\r\n export async function Upload(params: {\r\n api?: BruceApi.Api,\r\n file: File,\r\n purpose?: string,\r\n onProgress?: (progress: Uploader.IProgress) => void,\r\n req?: Api.IUploadReqParams\r\n }): Promise<{\r\n clientFile: IFile\r\n }> {\r\n let { api, file, purpose, req, onProgress } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!file) {\r\n throw(\"File is required.\");\r\n }\r\n const size = file?.size;\r\n if (!size) {\r\n throw(\"You cannot upload a 0byte sized file.\");\r\n }\r\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n let clientFile: IFile;\r\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\r\n clientFile = await Uploader.DoMultiPartUpload({\r\n api,\r\n file,\r\n urlSuffix: \"fileUpload\",\r\n req,\r\n onProgress\r\n });\r\n // TODO: Check if we can add it to the request like the small file upload.\r\n if (clientFile?.ID && purpose) {\r\n await UpdatePurpose({\r\n api,\r\n fileId: clientFile.ID,\r\n purpose,\r\n req\r\n })\r\n }\r\n }\r\n else {\r\n req.onProgress = (progress: ProgressEvent) => {\r\n const percent = Math.round ((progress.loaded / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n if (purpose) {\r\n req.formData = {\r\n Purpose: purpose\r\n };\r\n }\r\n clientFile = await api.UPLOAD(\"file/uploadNew\", file, req);\r\n }\r\n onProgress?.({\r\n percent: 100,\r\n uploaded: true\r\n });\r\n return {\r\n clientFile\r\n };\r\n }\r\n\r\n export async function UpdatePurpose(params: {\r\n api?: BruceApi.Api,\r\n fileId: string,\r\n purpose: string,\r\n req?: Api.IReqParams\r\n }) {\r\n let { api, fileId, purpose, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!purpose) {\r\n purpose = \"\";\r\n }\r\n await api.POST(\"file/updatepurpose/\" + fileId + \"/?Purpose=\" + purpose, {\r\n Purpose: purpose\r\n }, Api.PrepReqParams(reqParams));\r\n const cacheKey = GetCacheKey(fileId);\r\n api.Cache.RemoveByContains(cacheKey);\r\n }\r\n\r\n /**\r\n * Uploads a temp file.\r\n * This will return a temp file id which can be used in various endpoints.\r\n * @param params\r\n * @returns\r\n */\r\n export async function UploadTemp(params: {\r\n api?: BruceApi.Api,\r\n file: File,\r\n onProgress?: (progress: Uploader.IProgress) => void,\r\n req?: Api.IUploadReqParams\r\n }): Promise<{\r\n tempFileId: string\r\n }> {\r\n let { api, file, req, onProgress } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!file) {\r\n throw(\"File is required.\");\r\n }\r\n const size = file?.size;\r\n if (!size) {\r\n throw(\"You cannot upload a 0byte sized file.\");\r\n }\r\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n let tempFile: any;\r\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\r\n tempFile = await Uploader.DoMultiPartUpload({\r\n api,\r\n file,\r\n urlSuffix: \"tempFileUpload\",\r\n req,\r\n onProgress\r\n });\r\n }\r\n else {\r\n req.onProgress = (progress: ProgressEvent) => {\r\n const percent = Math.round ((progress.loaded / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n tempFile = await api.UPLOAD(\"file/uploadTemp\", file, req);\r\n }\r\n onProgress?.({\r\n percent: 100,\r\n uploaded: true\r\n });\r\n return {\r\n tempFileId: tempFile[\"TempFile.ID\"]\r\n };\r\n }\r\n\r\n export namespace Filter {\r\n export enum EColumn {\r\n ID = \"id\",\r\n Name = \"name\",\r\n DateTime = \"datetime\",\r\n MIMEType = \"mimeType\",\r\n Size = \"size\",\r\n User = \"user\",\r\n Extension = \"extension\"\r\n }\r\n\r\n export enum ESortOrder {\r\n ASC = \"asc\",\r\n DEC = \"desc\"\r\n }\r\n\r\n export enum ERowOperator {\r\n AND = \"AND\",\r\n OR = \"OR\"\r\n }\r\n\r\n export interface IRow {\r\n column: EColumn;\r\n value: any;\r\n valueOperator: string;\r\n includes: boolean;\r\n rowOperator: ERowOperator;\r\n rows?: IRow[];\r\n }\r\n }\r\n\r\n export interface IFilter {\r\n PageSize?: number;\r\n PageIndex?: number;\r\n OrderBy?: Filter.EColumn;\r\n SortOrder?: Filter.ESortOrder;\r\n Purpose?: string;\r\n FilterRows?: Filter.IRow[];\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n filter: IFilter,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n clientFiles: IFile[],\r\n // Total available matching the filter.\r\n // This is not the total returned in the current page.\r\n totalCount: number\r\n }> {\r\n let { api, filter, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const data = await api.POST(\"files/filtered\", filter, Api.PrepReqParams(reqParams));\r\n return {\r\n clientFiles: data.Items,\r\n totalCount: data.TotalCount\r\n };\r\n }\r\n\r\n export namespace Processor {\r\n export interface IResult {\r\n success: boolean;\r\n clientFileId: string;\r\n clientFileName: string;\r\n }\r\n\r\n export enum EConvertExt {\r\n GLB = \".glb\",\r\n SKP = \".skp\",\r\n }\r\n\r\n export async function ConvertFormat(params: {\r\n api?: BruceApi.Api,\r\n fileId: string,\r\n ext: EConvertExt | string,\r\n req?: Api.IReqParams\r\n }): Promise<IResult> {\r\n let { api, fileId: clientFileId, ext, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!clientFileId || !ext) {\r\n throw(\"Client File ID and extension are required.\");\r\n }\r\n return api.POST(\"convertFileToFile\", {\r\n clientFileId: clientFileId,\r\n destinationFormat: ext,\r\n operations: []\r\n }, reqParams);\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\ntype Id = ProgramKey.EProgramId | string;\r\n\r\n/**\r\n * Describes the \"Program Key\" concept within Bruce.\r\n * A program key is an access token for an arbitrary software.\r\n */\r\nexport namespace ProgramKey {\r\n export function GetCacheKey(programId: string): string {\r\n return Api.ECacheKey.ProgramKey + Api.ECacheKey.Id + programId;\r\n }\r\n\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.ProgramKey;\r\n }\r\n\r\n export enum EProgramId {\r\n CesiumIon = \"CesiumIon\",\r\n BingMaps = \"BingMaps\",\r\n Mapbox = \"Mapbox\",\r\n Google = \"Google\"\r\n }\r\n\r\n export interface IKey {\r\n ProgramId: Id;\r\n Key: string;\r\n IsAccessRestricted?: boolean;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n programId: Id,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n programKey: IKey\r\n }> {\r\n let { api, programId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!programId) {\r\n throw(\"Program ID is required.\");\r\n }\r\n\r\n // Our API throws an error when a key is not set which is a bit annoying.\r\n // Since we only use these keys for a few specific things we'll just request the list and avoid the error.\r\n // If this becomes useful for more things we'll make requesting a key that doesn't exist just return empty JSON.\r\n\r\n const prom = await GetList({\r\n api,\r\n req: reqParams\r\n });\r\n const key = prom.programKeys.find(k => k.ProgramId === programId);\r\n \r\n\r\n // const key = GetCacheKey(programId);\r\n // const cache = await api.GetCacheItem(key, 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 = await api.GET(`programkey/${programId}`, Api.PrepReqParams(reqParams));\r\n // res({\r\n // programKey: 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,\r\n // value: prom,\r\n // req: reqParams\r\n // });\r\n\r\n return {\r\n programKey: key\r\n };\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n programKeys: IKey[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"programkeys\", Api.PrepReqParams(reqParams));\r\n res({\r\n programKeys: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n programId: Id,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, programId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!programId) {\r\n throw(\"Program ID is required.\");\r\n }\r\n await api.DELETE(`programkey/${programId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(programId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n programKey: IKey,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n programKey: IKey\r\n }> {\r\n let { api, programKey: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data?.ProgramId) {\r\n throw(\"Program ID is required.\");\r\n }\r\n const res = await api.POST(\"programkey\", data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ProgramId));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n programKey: res\r\n };\r\n }\r\n}","import { Style } from \"../bruce-models\";\r\n\r\n/**\r\n * Describes an expectation on what should be rendered for a menu item-\r\n * between a min-max distance of an entity to the camera.\r\n */\r\nexport namespace ZoomControl {\r\n export enum EDisplayType {\r\n Hidden = \"hidden\",\r\n Point = \"point\",\r\n Geometry = \"geometry\",\r\n Model3D = \"3d\"\r\n }\r\n\r\n export interface IItem {\r\n MinZoom?: number,\r\n MaxZoom?: number,\r\n DisplayType?: EDisplayType,\r\n StyleID?: number,\r\n Style?: Style.IEntitySettings;\r\n LODCategoryID?: string,\r\n LODLevel?: number | string;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { PendingAction } from \"../server/pending-action\";\r\nimport { GlobalApi } from \"../api/global-api\";\r\nimport { Transform } from \"../common/transform\";\r\nimport { Carto } from \"../common/carto\";\r\nimport { Bounds } from \"../common/bounds\";\r\nimport { Uploader } from \"../internal/uploader\";\r\nimport { IDictionary } from \"../common/dictionary\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\ntype Settings = Tileset.Settings.IPointcloud |\r\n Tileset.Settings.ICad |\r\n Tileset.Settings.IEntitiesMap |\r\n Tileset.Settings.IEntities |\r\n Tileset.Settings.IExternalMap |\r\n Tileset.Settings.IExternalTerrain |\r\n Tileset.Settings.IMap |\r\n Tileset.Settings.ITerrain;\r\n\r\n/**\r\n * Describes the \"Tileset\" concept in Bruce.\r\n *\r\n * Tilesets come in three possible variants,\r\n * 1- A set of instructions to generate a tileset.\r\n * 2- Settings to load a tileset hosted elsewhere.\r\n * 3- A set of user-provided files to serve.\r\n *\r\n * Read the individual tileset-type settings for each variant.\r\n */\r\nexport namespace Tileset {\r\n export function GetCacheKey(tilesetId: string, loadFiles: boolean): string {\r\n return `${Api.ECacheKey.Tileset}${Api.ECacheKey.Id}${tilesetId}${Api.ECacheKey.Id}${loadFiles}`;\r\n }\r\n\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.Tileset;\r\n }\r\n\r\n export interface ITileset {\r\n id: string;\r\n name: string;\r\n type: EType;\r\n rootFileName?: string;\r\n settings?: Settings;\r\n fileIds?: string[];\r\n creationTime?: UTC.IUTC;\r\n modificationTime?: UTC.IUTC;\r\n generateVersion?: number;\r\n isDeleteDisabled?: boolean;\r\n loadUrl?: string;\r\n isRestricted?: boolean;\r\n }\r\n\r\n export enum EType {\r\n PointCloud = \"POINT_CLOUD\",\r\n GeoMap = \"GEO_MAP\", // Previously gtfRasterMaps.\r\n EntitiesMap = \"ENTITIES_MAP\", // Previously rasterMap.\r\n EntitiesSet = \"ENTITIES_SET\", // Previously dynamic.\r\n Cad = \"MODEL\", // Generated CAD tileset from entity id.\r\n Terrain = \"GEO_TERR\",\r\n ExternalTerrain = \"EXTERNAL_TERR\",\r\n ExternalGeoMap = \"EXTERNAL_MAP\",\r\n LegacyEntitiesSet = \"D\",\r\n LegacyStatic = \"S\",\r\n LegacyExternal = \"X\"\r\n }\r\n\r\n export enum EPivot {\r\n None = \"none\",\r\n Box = \"box\",\r\n Weight = \"weight\",\r\n UCS = \"ucs\"\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n tilesetId: string,\r\n loadFiles?: boolean,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n tileset: ITileset\r\n }> {\r\n let { api, tilesetId, loadFiles, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetCacheKey(tilesetId, loadFiles), 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 = await api.GET(`tileset/get/${tilesetId}?noFiles=${Boolean(loadFiles) ? 0 : 1}`, reqParams);\r\n res({\r\n tileset: 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(tilesetId, loadFiles),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns tileset types for given tileset ids.\r\n * @param params\r\n * @deprecated Just use GetList and Get to find the type from the tileset record.\r\n * @returns\r\n */\r\n export async function GetTypes(params: {\r\n api?: BruceApi.Api,\r\n tilesetIds: string[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Tileset id -> type mapping.\r\n typeMapping: IDictionary<EType>\r\n }> {\r\n // UPDATE: This was corrected, this will be removed.\r\n // Our api is auto-converting legacy types right now which makes it impossible to know what they are.\r\n // This uses the legacy end-point which doesn't do that...\r\n let { api, tilesetIds, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const mapping = {};\r\n if (tilesetIds.length == 1) {\r\n const tileset = await api.GET(\"ui.tileset/\" + tilesetIds[0], Api.PrepReqParams(reqParams));\r\n if (tileset) {\r\n mapping[tilesetIds[0]] = tileset.Type;\r\n }\r\n }\r\n else if (tilesetIds.length > 1) {\r\n const tilesets = await api.GET(\"ui.tilesets\", Api.PrepReqParams(reqParams));\r\n for (const tileset of tilesets) {\r\n if (tilesetIds.indexOf(tileset.ID) >= 0) {\r\n mapping[tileset.ID] = tileset.Type;\r\n }\r\n }\r\n }\r\n return {\r\n typeMapping: mapping\r\n };\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n tilesets: ITileset[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"tileset/getList\", reqParams)\r\n res({\r\n tilesets: 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: GetListCacheKey(),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n tilesetId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, tilesetId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n await api.DELETE(`tileset/delete/${tilesetId}`, reqParams);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset + Api.ECacheKey.Id + tilesetId);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset);\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n tileset: ITileset,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n tileset: ITileset\r\n }> {\r\n let { api, tileset: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data?.name || !data?.type) {\r\n throw(\"Tileset name and type are required.\");\r\n }\r\n let isNew = !data.id;\r\n if (isNew) {\r\n const res: ITileset = await api.GET(`tileset/new?type=${data.type}&name=${Api.Encode(data.name)}`, reqParams);\r\n data = {\r\n ...res,\r\n ...data,\r\n settings: {\r\n ...res.settings,\r\n ...data.settings\r\n },\r\n id: res.id\r\n }\r\n }\r\n await api.POST(`tileset/update/${data.id}`, data, Api.PrepReqParams(reqParams));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset + Api.ECacheKey.Id + data.id);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset);\r\n return {\r\n tileset: data\r\n };\r\n }\r\n\r\n export async function UploadFile(params: {\r\n api?: BruceApi.Api,\r\n tilesetId: string,\r\n file: File,\r\n onProgress?: (progress: Uploader.IProgress) => void,\r\n req?: Api.IUploadReqParams\r\n }): Promise<void> {\r\n let { api, file, req, tilesetId, onProgress } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tilesetId || !file) {\r\n throw(\"Tileset ID and file are required.\");\r\n }\r\n const size = file?.size;\r\n if (!size) {\r\n throw(\"You cannot upload a 0byte sized file.\");\r\n }\r\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\r\n await Uploader.DoMultiPartUpload({\r\n api,\r\n file,\r\n urlSuffix: `tileset/uploadFileEx/${tilesetId}/add`,\r\n req,\r\n onProgress\r\n });\r\n }\r\n else {\r\n req.onProgress = (progress: ProgressEvent) => {\r\n const percent = Math.round ((progress.loaded / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n await api.UPLOAD(`tileset/uploadFile/${tilesetId}/files`, file, req);\r\n }\r\n api.Cache.Remove(GetCacheKey(tilesetId, true));\r\n onProgress?.({\r\n percent: 100,\r\n uploaded: true\r\n });\r\n }\r\n\r\n export async function DeleteFile(params: {\r\n api?: BruceApi.Api,\r\n tilesetId: string,\r\n file: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, tilesetId, file, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tilesetId || !file) {\r\n throw(\"Tileset ID and file are required.\");\r\n }\r\n await api.DELETE(`tileset/deleteFile/${tilesetId}/files/${file}`, reqParams);\r\n api.Cache.Remove(GetCacheKey(tilesetId, true));\r\n }\r\n\r\n export async function UploadSrcFile(params: {\r\n api?: BruceApi.Api,\r\n tilesetId: string,\r\n file: File,\r\n onProgress?: (progress: Uploader.IProgress) => void,\r\n req?: Api.IUploadReqParams\r\n }): Promise<void> {\r\n let { api, file, req, tilesetId, onProgress } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tilesetId || !file) {\r\n throw(\"Tileset ID and file are required.\");\r\n }\r\n const size = file?.size;\r\n if (!size) {\r\n throw(\"You cannot upload a 0byte sized file.\");\r\n }\r\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\r\n await Uploader.DoMultiPartUpload({\r\n api,\r\n file,\r\n urlSuffix: `tileset/uploadFileEx/${tilesetId}/src`,\r\n req,\r\n onProgress\r\n });\r\n }\r\n else {\r\n req.onProgress = (progress: ProgressEvent) => {\r\n const percent = Math.round ((progress.loaded / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n await api.UPLOAD(`tileset/uploadFile/${tilesetId}/src`, file, req);\r\n }\r\n api.Cache.Remove(GetCacheKey(tilesetId, true));\r\n onProgress?.({\r\n percent: 100,\r\n uploaded: true\r\n });\r\n return;\r\n }\r\n\r\n export async function DeleteSrcFile(params: {\r\n api?: BruceApi.Api,\r\n tilesetId: string,\r\n file: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, tilesetId, file, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tilesetId || !file) {\r\n throw(\"Tileset ID and file are required.\");\r\n }\r\n await api.DELETE(`tileset/deleteFile/${tilesetId}/src/${file}`, reqParams);\r\n api.Cache.Remove(GetCacheKey(tilesetId, true));\r\n }\r\n\r\n export function GetFileUrl(params: {\r\n api?: BruceApi.Api,\r\n tilesetId: string,\r\n file: string\r\n }): string {\r\n let { api, tilesetId, file } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n if (!file) {\r\n file = \"\";\r\n }\r\n return api.GetBaseUrl() + `tileset/getFile/${tilesetId}/files/${file}`;\r\n }\r\n\r\n export function GetSrcFileUrl(params: {\r\n api?: BruceApi.Api,\r\n tilesetId: string,\r\n file: string\r\n }): string {\r\n let { api, tilesetId, file } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n if (!file) {\r\n file = \"\";\r\n }\r\n return api.GetBaseUrl() + `tileset/getFile/${tilesetId}/src/${file}`;\r\n }\r\n\r\n export function GetPublicFileUrl(params: {\r\n api?: BruceApi.Api,\r\n tilesetId: string,\r\n // Default = false.\r\n viaCdn?: boolean,\r\n // (Optional) Cache killing token to append to the request url.\r\n viaCdnCacheToken?: number | string,\r\n file: string\r\n }): string {\r\n let { api, tilesetId, file, viaCdn, viaCdnCacheToken } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n if (!file) {\r\n file = \"\";\r\n }\r\n const cdnBaseUrl = viaCdn ? api.GetCdnBaseUrl() : null;\r\n if (cdnBaseUrl) {\r\n if (!viaCdnCacheToken) {\r\n viaCdnCacheToken = 0;\r\n }\r\n return cdnBaseUrl + `tileset/file/${tilesetId}/${file}?accountId=${api.AccountId}&cacheToken=${viaCdnCacheToken}`;\r\n }\r\n else {\r\n return api.GetBaseUrl() + `tileset/file/${tilesetId}/${file}`;\r\n }\r\n }\r\n\r\n export async function Generate(params: {\r\n api?: BruceApi.Api,\r\n tilesetId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n pendingActionId: number\r\n }> {\r\n let { api, tilesetId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n const res: PendingAction.IAction = await api.GET(`tileset/generate/${tilesetId}`, Api.PrepReqParams(reqParams));\r\n return {\r\n pendingActionId: res.ID\r\n };\r\n }\r\n\r\n export namespace Publish {\r\n export function GetCacheKey(accountId: string, tilesetId?: string): string {\r\n if (!tilesetId) {\r\n tilesetId = \"\";\r\n }\r\n return Api.ECacheKey.PublishTileset + Api.ECacheKey.Id + accountId + Api.ECacheKey.Id + tilesetId;\r\n }\r\n\r\n export function GetAccessAllowedCacheKey(tilesetId: string, sourceAccountId: string, forAccountId: string) {\r\n return Api.ECacheKey.PublishTileset + Api.ECacheKey.TilesetAccess + Api.ECacheKey.Id + tilesetId + Api.ECacheKey.Id + sourceAccountId + Api.ECacheKey.Id + forAccountId;\r\n }\r\n\r\n export interface IPublish {\r\n ID?: number;\r\n Name: string;\r\n \"Tileset.ID\"?: string;\r\n \"PublishedBy.ClientAccount.ID\"?: string;\r\n \"PublishedBy.User.ID\"?: string;\r\n \"Published.DateTime\"?: UTC.IUTC;\r\n IsPublic: boolean;\r\n \"EnabledFor.ClientAccount.ID\"?: string[];\r\n }\r\n\r\n export async function Update(params: {\r\n api?: GlobalApi.Api,\r\n published: IPublish,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n published: IPublish\r\n }> {\r\n let { api, published: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGlobalApi();\r\n }\r\n\r\n if (!data?.[\"Tileset.ID\"] || !data?.[\"PublishedBy.ClientAccount.ID\"] || !data?.[\"PublishedBy.User.ID\"]) {\r\n throw(\"Tileset ID, client account ID, and user ID are required.\");\r\n }\r\n if (!data.ID) {\r\n data.ID = 0;\r\n }\r\n const res: IPublish = await api.POST(`tileset/${data.ID}`, data, reqParams);\r\n const req = {\r\n \"ClientAccount.ID\": data[\"EnabledFor.ClientAccount.ID\"]\r\n };\r\n data.ID = res.ID;\r\n await api.POST(`tileset/${data.ID}/enableForAccounts`, req, reqParams);\r\n await api.Cache.Remove(GetCacheKey(data[\"PublishedBy.ClientAccount.ID\"], data[\"Tileset.ID\"]));\r\n await api.Cache.Remove(GetCacheKey(data[\"PublishedBy.ClientAccount.ID\"]));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.PublishTileset + Api.ECacheKey.TilesetAccess);\r\n return {\r\n published: data\r\n };\r\n }\r\n\r\n export async function Get(params: {\r\n api?: GlobalApi.Api,\r\n accountId: string,\r\n tilesetId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n published: IPublish\r\n }> {\r\n let { api, accountId, tilesetId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGlobalApi();\r\n }\r\n\r\n if (!accountId || !tilesetId) {\r\n throw(\"Client account ID and tileset ID are required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetCacheKey(accountId, tilesetId), 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 = await api.GET(`tilesetByPublisher/${accountId}/${tilesetId}`, reqParams);\r\n res({\r\n published: 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(accountId, tilesetId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: GlobalApi.Api,\r\n accountId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n published: IPublish[]\r\n }> {\r\n let { api, accountId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGlobalApi();\r\n }\r\n\r\n if (!accountId) {\r\n throw(\"Client account ID is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetCacheKey(accountId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`tilesets/enabledForAccount/${accountId}`, reqParams);\r\n res({\r\n published: data.Items\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(accountId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Returns if a given tileset is allowed to be loaded for a given account.\r\n * @param params \r\n */\r\n export async function IsAccessAllowed(params: {\r\n // Tileset + account from which to load.\r\n tilesetId: string,\r\n sourceAccountId: string,\r\n api?: GlobalApi.Api,\r\n // Account we're loading in.\r\n forAccountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<boolean> {\r\n let { tilesetId, sourceAccountId, api, forAccountId, req } = params;\r\n if (!forAccountId) {\r\n forAccountId = ENVIRONMENT.PARAMS.accountId;\r\n }\r\n // Null source account id means it's a tileset from within the same account.\r\n // We also don't want to bother looking for records if we're loading in our own account.\r\n if (forAccountId == sourceAccountId || !sourceAccountId) {\r\n return true;\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGlobalApi();\r\n }\r\n req = Api.PrepReqParams(req);\r\n const key = GetAccessAllowedCacheKey(tilesetId, sourceAccountId, forAccountId);\r\n const cacheData = await api.GetCacheItem(key, req);\r\n if (cacheData?.found) {\r\n return cacheData.data;\r\n }\r\n const prom: Promise<boolean> = new Promise(async (res, rej) => {\r\n try {\r\n // We try find the published record for the tileset.\r\n // If it doesn't exist, then it's not published.\r\n const {published} = await GetList({\r\n accountId: forAccountId,\r\n api: api,\r\n });\r\n const tileset = published.find(x => x[\"Tileset.ID\"] == tilesetId && x[\"PublishedBy.ClientAccount.ID\"] == sourceAccountId);\r\n res(tileset != null);\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: key,\r\n value: prom,\r\n req: req\r\n });\r\n return prom;\r\n }\r\n }\r\n\r\n export namespace Settings {\r\n export interface ICad {\r\n rootEntityId: string;\r\n entityTypeId: string;\r\n styleId?: number;\r\n lodKey?: string;\r\n movePivot?: Tileset.EPivot;\r\n ucsId?: number;\r\n epsg?: number;\r\n thumbFileId?: string;\r\n location?: Carto.ICarto;\r\n offset?: any;\r\n transform?: Transform.ITransform;\r\n doubleSided?: boolean;\r\n b3dmFileSize?: number;\r\n maximumScreenSpaceError?: number;\r\n }\r\n\r\n export enum EMapTileSize {\r\n IMG_256 = 256,\r\n IMG_512 = 512,\r\n IMG_1024 = 1024,\r\n IMG_2048 = 2048\r\n }\r\n\r\n export interface IEntitiesMap {\r\n imageSize: EMapTileSize;\r\n levelMin: number;\r\n levelMax: number;\r\n entityTypeId: string;\r\n styleId: number;\r\n filter: any;\r\n boundaries: Bounds.IBounds;\r\n }\r\n\r\n export interface IEntities {\r\n zoomControl?: any[];\r\n boundaries?: Bounds.IBounds;\r\n filter?: any;\r\n altitudeRefType?: string;\r\n terrainSource?: string;\r\n terrainUri?: string;\r\n doubleSided?: boolean;\r\n entityTypeId?: string;\r\n styleId?: number;\r\n }\r\n\r\n export enum EExternalMapType {\r\n TileMapImagery = \"TileMapImagery\",\r\n OpenStreetMapImagery = \"OpenStreetMapImagery\",\r\n MapBoxImagery = \"MapBoxImagery\",\r\n CesiumIon = \"CesiumIon\",\r\n CustomTemplate = \"Static\"\r\n }\r\n\r\n export interface IExternalMap {\r\n url?: string;\r\n mapType?: EExternalMapType;\r\n fileExtension?: string;\r\n externalId?: number | string;\r\n styleId?: string;\r\n account?: string;\r\n key?: string;\r\n iconClientFileId?: string;\r\n }\r\n\r\n export interface IExternalTerrain {\r\n requestVertexNormals?: boolean;\r\n url?: string;\r\n }\r\n\r\n export interface IMap {\r\n sourceFileId: string;\r\n imageSize: number;\r\n levelMin: number;\r\n levelMax: number;\r\n boundaries?: Bounds.IBounds;\r\n }\r\n\r\n export interface IPointcloud {\r\n sourceFileIds: string[];\r\n location: Carto.ICarto;\r\n transform: Transform.ITransform;\r\n pntFileSize?: number;\r\n epsg?: number;\r\n attenuation?: boolean;\r\n attenuationMax?: number;\r\n movePivot?: Tileset.EPivot;\r\n maximumScreenSpaceError?: number;\r\n }\r\n\r\n export interface ITerrain {\r\n sourceFileId?: string;\r\n startLevel?: number;\r\n }\r\n }\r\n}","import {IDictionary} from \"../bruce-models\";\r\nimport { Entity } from \"../entity/entity\";\r\nimport { Tileset } from \"../tileset/tileset\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\nimport { ZoomControl } from \"./zoom-control\";\r\n\r\n/**\r\n * Describes a menu item found in project views.\r\n * Menu items are used to dictate what data to load in a scene.\r\n * A menu item may be a container for other items.\r\n */\r\nexport namespace MenuItem {\r\n export enum EType {\r\n None = \"NONE\",\r\n Entities = \"BruceEntity\",\r\n Entity = \"SingleEntity\",\r\n Osm = \"OSMBuildingsTileset\",\r\n CadTileset = \"ModelTileset\",\r\n ArbTileset = \"ArbitraryTileset\",\r\n IonTileset = \"Cesium3DTileset\",\r\n Kml = \"StaticKML\",\r\n EntityTileset = \"EntitiesTileset\",\r\n EntityRaster = \"RasterEntitiesTileset\",\r\n PointCloud = \"PointCloudTileset\",\r\n EntitiesLoaded = \"LoadedEntities\",\r\n EntitiesIds = \"EntitiesIds\",\r\n // Deprecated. Use Relationships instead.\r\n Relations = \"Relations\",\r\n Relationships = \"Relationships\",\r\n GooglePhotoTileset = \"GooglePhotoTileset\"\r\n }\r\n\r\n export interface ILegend {\r\n model3d: boolean;\r\n point: boolean;\r\n polygon: boolean;\r\n polylines: boolean;\r\n tileset3d: boolean;\r\n }\r\n\r\n export interface IAuthorSettings {\r\n // If true, the clicked entity will be read and used to update the authored entity.\r\n readClickedEntity?: boolean;\r\n // Optional relationship type to use when relating to the clicked entity.\r\n clickedRelationTypeId?: string;\r\n // If set, specified attributes will be copied between the clicked and authored entities.\r\n copyClickedAttrMapping?: {\r\n // String is a wrapped path, check PathUtils.\r\n fromPathStr: string;\r\n toPathStr: string;\r\n }[];\r\n }\r\n\r\n export interface IItem {\r\n id: string;\r\n Caption: string;\r\n Children?: IItem[];\r\n Type: EType;\r\n hideChildren?: boolean;\r\n legend?: ILegend;\r\n authoringEnabled?: boolean;\r\n authoring?: IAuthorSettings;\r\n LabelColor?: string;\r\n renderPriority?: number;\r\n // Default = false.\r\n cdnEnabled?: boolean;\r\n // Used to kill cache. Default = 0.\r\n // Tilesets have their own counter within their records.\r\n // This is used for non-tileset items.\r\n cdnCounter?: number;\r\n }\r\n\r\n export function CreateFromEntityId(entityId: string, typeId: string, styleId?: number): IItem {\r\n return <Item.IEntity>{\r\n id: ObjectUtils.UId(),\r\n Type: EType.Entity,\r\n Caption: \"Generated Entity Menu Item\",\r\n BruceEntity: {\r\n \"EntityType.ID\": typeId,\r\n EntityId: entityId\r\n },\r\n CameraZoomSettings: [\r\n {\r\n DisplayType: ZoomControl.EDisplayType.Model3D,\r\n MaxZoom: 1000000,\r\n MinZoom: 0,\r\n StyleID: styleId\r\n }\r\n ]\r\n };\r\n }\r\n\r\n export function CreateFromTypeId(typeId: string, styleId?: number): IItem {\r\n return <Item.IEntities>{\r\n id: ObjectUtils.UId(),\r\n Type: EType.Entities,\r\n Caption: \"Generated Entity Type Menu Item\",\r\n BruceEntity: {\r\n \"EntityType.ID\": typeId\r\n },\r\n CameraZoomSettings: [\r\n {\r\n DisplayType: ZoomControl.EDisplayType.Model3D,\r\n MaxZoom: 100000,\r\n MinZoom: 0,\r\n StyleID: styleId\r\n }\r\n ]\r\n };\r\n }\r\n\r\n export function CreateFromTilesetId(tilesetId: string, type: Tileset.EType): IItem {\r\n if (type === Tileset.EType.Cad) {\r\n return <Item.ICadTileset>{\r\n\t id: ObjectUtils.UId(),\r\n\t Type: EType.CadTileset,\r\n Caption: \"Generated CAD Menu Item\",\r\n\t FlyTo: false,\r\n\t\t\t\ttileset: {\r\n\t\t\t\t\tTilesetID: tilesetId\r\n\t\t\t\t}\r\n };\r\n }\r\n else if (type == Tileset.EType.EntitiesSet) {\r\n return <Item.IEntitiesTileset>{\r\n id: ObjectUtils.UId(),\r\n Type: EType.EntityTileset,\r\n Caption: \"Generated Entities Menu Item\",\r\n FlyTo: false,\r\n tileset: {\r\n TilesetID: tilesetId\r\n }\r\n };\r\n }\r\n else if (type == Tileset.EType.PointCloud) {\r\n return <Item.IPointcloud>{\r\n id: ObjectUtils.UId(),\r\n Type: EType.PointCloud,\r\n Caption: \"Generated Point Cloud Menu Item\",\r\n FlyTo: false,\r\n tileset: {\r\n TilesetID: tilesetId\r\n }\r\n };\r\n }\r\n else if (type == Tileset.EType.EntitiesMap) {\r\n return <Item.IEntitiesRaster>{\r\n id: ObjectUtils.UId(),\r\n Type: EType.EntityRaster,\r\n Caption: \"Generated Entities Menu Item\",\r\n tileset: {\r\n TilesetID: tilesetId\r\n }\r\n };\r\n }\r\n throw(\"Tileset type not supported.\");\r\n }\r\n\r\n export namespace Item {\r\n export interface ITileset {\r\n TilesetURL?: string;\r\n ClientAccountID?: string;\r\n TilesetID?: string;\r\n }\r\n\r\n /**\r\n * Settings related to how entity clustering should behave.\r\n */\r\n export interface IClustering {\r\n // Minimum distance to an entity for it to cluster.\r\n // bruce-cesium/point-clustering.ts will have 5000 as default.\r\n minDistance?: number;\r\n // Minimum total loaded for the menu item for clustering to kick in.\r\n // bruce-cesium/point-clustering.ts will have 0 as default.\r\n // It will always try to cluster when points are near each-other and camera is far away.\r\n minTotalCount?: number;\r\n // TODO: Zoom control-like settings for clustering.\r\n // Between x and y meters the points should cluster with z distance.\r\n // Eg: \"Between 5,000 and 15,000 meters the points should cluster within 500 meters.\"\r\n }\r\n\r\n export interface IEntities extends IItem {\r\n Type: EType.Entities;\r\n BruceEntity: {\r\n \"EntityType.ID\": string;\r\n Filter?: IDictionary<string>;\r\n // If true, menu item will display individual sub-items for tags.\r\n ExpandLayers?: boolean;\r\n // If ExpandLayers = true, this is the saved sub-items to render.\r\n // If this is null or empty, that means there is nothing to render for this menu item.\r\n SelectedExpandLayers?: number[];\r\n };\r\n CameraZoomSettings?: ZoomControl.IItem[];\r\n\r\n // If true, menu item will render point and icon entities as clustered points when close together.\r\n enableClustering?: boolean;\r\n clustering?: IClustering;\r\n\r\n // If BruceEntity.ExpandLayers = true,\r\n // this will dictate if camera should be used to scan for tags in view.\r\n filterLayersByCameraLocation?: boolean;\r\n showAllLayersExcludeBelow?: boolean;\r\n layers?: number[];\r\n extLayers?: {\r\n ID: number,\r\n checked: boolean\r\n }[];\r\n }\r\n\r\n export interface IEntity extends IItem {\r\n Type: EType.Entity;\r\n BruceEntity: {\r\n \"EntityType.ID\"?: string;\r\n EntityId: string;\r\n };\r\n CameraZoomSettings?: ZoomControl.IItem[];\r\n showAllLayers?: boolean;\r\n showAllLayersExcludeBelow?: boolean;\r\n }\r\n\r\n export interface IArbTileset extends IItem {\r\n Type: EType.ArbTileset | EType.IonTileset;\r\n FlyTo?: boolean;\r\n BruceEntity?: {\r\n \"EntityType.ID\"?: string;\r\n };\r\n tileset?: ITileset;\r\n StyleMapping?: any[];\r\n styleId?: number;\r\n ApplyStyles?: boolean;\r\n IonResource?: {\r\n AssetID: string | number;\r\n // If not supplied then the client account default is used.\r\n AccessToken?: string;\r\n }\r\n }\r\n export interface IIonTileset extends IArbTileset {}\r\n\r\n export interface ICadTileset extends IItem {\r\n Type: EType.CadTileset;\r\n tileset: ITileset;\r\n FlyTo?: boolean;\r\n StyleMapping?: any[];\r\n StyleBlending?: {\r\n // Hightlight = 0, replace = 1, mix = 2.\r\n blendMode: 0 | 1 | 2;\r\n // 1 = 100% new colour. 0 = original colour.\r\n blendPercent: number;\r\n };\r\n styleId?: number;\r\n BruceEntity?: {\r\n // Optional restriction.\r\n // When not null, only entities matching supplied ids will be visible.\r\n EntityIds?: string[];\r\n // Optional styling.\r\n // When entity ids are set, other entities can optionally be \"ghosts\".\r\n // This means they will be available but at low opacity.\r\n Ghosts?: boolean;\r\n }\r\n }\r\n\r\n export interface IPointcloud extends IItem {\r\n Type: EType.PointCloud;\r\n FlyTo?: boolean;\r\n tileset: ITileset;\r\n }\r\n\r\n export interface IEntitiesRaster extends IItem {\r\n Type: EType.EntityRaster;\r\n tileset: ITileset;\r\n }\r\n\r\n export interface IOsm extends IItem {\r\n Type: EType.Osm;\r\n BruceEntity?: {\r\n \"EntityType.ID\"?: string;\r\n SourceId: string;\r\n };\r\n ghostLoading?: boolean;\r\n }\r\n\r\n export interface IKml extends IItem {\r\n Type: EType.Kml;\r\n KML?: {\r\n ClientFile?: {\r\n ID: string;\r\n },\r\n // Arbitrarily hosted file to load instead of a client file.\r\n fileUrl?: string;\r\n }[]\r\n }\r\n\r\n export interface IEntitiesTileset extends IItem {\r\n Type: EType.EntityTileset;\r\n FlyTo: boolean;\r\n tileset: ITileset;\r\n // Point cloud settings as this tileset can include point clouds and 3d models.\r\n // The use-case is that this tileset is made from entities and what the user wants to show between bookmarks is different.\r\n // Bookmarks have \"menuItemAlternations\" to have different settings for menu items per bookmark.\r\n attenuation?: boolean;\r\n attenuationMax?: number;\r\n }\r\n\r\n export interface IEntitiesLoaded extends MenuItem.IItem {\r\n Type: EType.EntitiesLoaded;\r\n BruceEntity: {\r\n \"EntityType.ID\"?: string;\r\n Entities: Entity.IEntity[];\r\n };\r\n CameraZoomSettings?: ZoomControl.IItem[];\r\n }\r\n\r\n export interface IEntityIds extends MenuItem.IItem {\r\n Type: EType.EntitiesIds;\r\n BruceEntity: {\r\n EntityIds: string[];\r\n };\r\n CameraZoomSettings?: ZoomControl.IItem[];\r\n\r\n // If true, menu item will render point and icon entities as clustered points when close together.\r\n // Default = false.\r\n enableClustering?: boolean;\r\n clustering?: IClustering;\r\n }\r\n\r\n /**\r\n * Auto-generated menu item when entity-relationships are marked to be rendered.\r\n * @deprecated, use IRelationships instead.\r\n */\r\n export interface IEntityRelations extends MenuItem.IItem {\r\n Type: EType.Relations;\r\n BruceEntity?: {\r\n EntityIds?: string[];\r\n },\r\n }\r\n\r\n export interface IRenderedRelations {\r\n // Entities to drawn relationships for.\r\n // Downstream relationships will be drawn for these entities.\r\n entityIds: string[];\r\n // The relationship type to render for the ids.\r\n relationTypeId: string;\r\n }\r\n\r\n /**\r\n * Auto-generated menu item when entity-relationships are marked to be rendered.\r\n */\r\n export interface IRelationships extends MenuItem.IItem {\r\n Type: EType.Relationships;\r\n // Relationships to render.\r\n // This is an entityIds -> relationship type grouping.\r\n // The relationships will be drawn downstream only.\r\n relations?: IRenderedRelations[];\r\n }\r\n\r\n export interface IGooglePhotoTileset extends IItem {\r\n Type: EType.GooglePhotoTileset;\r\n // Css color string to apply to the tileset.\r\n // This follows Cesium logic for when color is pure white,\r\n // that means don't apply colour and only apply alpha.\r\n colorMask?: string;\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { Camera } from \"../common/camera\";\r\nimport { IDictionary } from \"../common/dictionary\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Markup } from \"../markup/markup\";\r\nimport { Section } from \"../common/section\";\r\nimport { MenuItem } from \"./menu-item\";\r\nimport { ProjectViewTile } from \"./project-view-tile\";\r\n\r\n/**\r\n * Describe the \"Project View Bookmark\" concept within Bruce.\r\n * This is referred to as \"slides\" in older code.\r\n *\r\n * A bookmark is a snapshot of what should be displayed and how in a particular project view.\r\n */\r\nexport namespace ProjectViewBookmark {\r\n export function GetCacheKey(viewId: string, bookmarkId: string): string {\r\n return `${Api.ECacheKey.ProjectViewBookmark}${Api.ECacheKey.Id}${viewId}${Api.ECacheKey.Id}${bookmarkId}`;\r\n }\r\n\r\n export function GetListCacheKey(viewId: string): string {\r\n return `${Api.ECacheKey.ProjectViewBookmark}${Api.ECacheKey.Id}${viewId}`;\r\n }\r\n\r\n // This is the expected default version for the DataVersion value.\r\n // This value should NOT be changed without looking at our API and seeing what the default value is.\r\n export const DEFAULT_DATA_VERSION = 1;\r\n\r\n export interface IBookmark {\r\n ID?: string;\r\n Title?: string;\r\n Note?: string;\r\n \"Screenshot.ClientFile.ID\"?: string;\r\n \"UI.View.ID\"?: string;\r\n \"Created.ByUser.ID\"?: string;\r\n \"Created.Date\"?: UTC.IUTC;\r\n \"UI.SlideGroup.ID\"?: number;\r\n // This is the version of the data in the bookmark.\r\n // This is used to determine how to parse the bookmark's settings.\r\n // 1 - 10,000 are reserved for Nextspace use.\r\n DataVersion: number;\r\n DisplayOrder?: number;\r\n Settings?: ISettings;\r\n Camera?: ICamera;\r\n // Clipping planes to apply to terrain/entities in the scene.\r\n // A clipping plane is associated with a tileset by root entity id.\r\n sections?: Section.ISection[];\r\n }\r\n\r\n /**\r\n * These are the base settings expected in any bookmark data-version.\r\n * The only exception is data-version = 1 which is our deprecated legacy format.\r\n */\r\n export interface ISettings {\r\n menuItemIds?: string[];\r\n // This is a map of menu item ids to their alternations.\r\n // An alternation is a menu item that has varied settings to the base menu item.\r\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.\r\n menuItemAlternations?: IDictionary<MenuItem.IItem>;\r\n // Array of entity ids for which to draw labels for.\r\n // If empty, no labels are drawn.\r\n labelledEntityIds?: string[];\r\n // Bookmark-wide relationships to render.\r\n // The lines will render regardless of entities being rendered.\r\n renderedRelations?: MenuItem.Item.IRenderedRelations[];\r\n groundOcclusion?: boolean;\r\n // Null = use default, empty array = no imagery.\r\n imagery?: ProjectViewTile.IBookmarkImagery[];\r\n terrain?: ProjectViewTile.IBookmarkTerrain;\r\n // Css color string to apply to the base globe.\r\n globeColor?: string;\r\n // 0 = 0%, 1 = 100%. Default is 100%.\r\n globeAlpha?: number;\r\n // If true, the globe will be hidden. Default is false.\r\n globeHidden?: boolean;\r\n markup?: Markup.IMarkup;\r\n shadows?: IShadows;\r\n ambientOcclusion?: IAmbientOcclusion;\r\n lighting?: ILighting;\r\n quality?: IQuality;\r\n // iso8601 date time string.\r\n dateTime?: string;\r\n // Entity id -> opacity. Where 1 = 100% opacity.\r\n entityOpacityMap?: IDictionary<number>;\r\n // Null = use default, empty array = deselect.\r\n // If default is null then selected ids should not be altered.\r\n selectedEntityIds?: string[];\r\n hiddenEntityIds?: string[];\r\n isolatedEntityIds?: string[];\r\n // This enables lighting that makes terrain elevation apparent.\r\n hillShades?: boolean;\r\n // This is a list of entity ids that are refreshed every x seconds.\r\n // We'll enforce about 200 maximum ids. Refresh every 2 - 5 seconds.\r\n liveEntityIds?: string[];\r\n // This will enable the wireframe view for the terrain provider.\r\n terrainWireframe?: boolean;\r\n // A bit of an awkward transition from the old system.\r\n // We render \"all\" relationships for given entity ids.\r\n // This will create a menu item under the hood, later we will use menu items directly.\r\n // @deprecated, use 'renderedRelations' instead.\r\n renderedEntityRelations?: string[];\r\n }\r\n\r\n export interface IShadows {\r\n enabled: boolean;\r\n soften: boolean;\r\n pixelSize: number;\r\n darkness: number;\r\n }\r\n\r\n export interface IAmbientOcclusion {\r\n enabled: boolean;\r\n intensity: number;\r\n lengthCap: number;\r\n bias: number;\r\n blurStepSize: number;\r\n stepSize: number;\r\n }\r\n\r\n export interface ILighting {\r\n color: string;\r\n intensity: number;\r\n }\r\n\r\n export interface IQuality {\r\n fxaa: boolean;\r\n }\r\n\r\n export interface ICamera {\r\n // Meters relative to ground.\r\n altitude: number;\r\n // In degrees.\r\n latitude: number;\r\n longitude: number;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n // Milliseconds transition from current position to bookmark.\r\n transition?: number;\r\n // If frustum is different between two bookmarks, transition should be instant.\r\n cameraFrustum?: Camera.EFrustum;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n viewId: string,\r\n bookmarkId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n bookmark: IBookmark\r\n }> {\r\n let { api, viewId, bookmarkId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n \r\n if (!viewId || !bookmarkId) {\r\n throw(\"View ID and Bookmark ID are required.\");\r\n }\r\n const key = GetCacheKey(viewId, bookmarkId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`ui.view/${viewId}/slide/${bookmarkId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n bookmark: 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,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n viewId: string,\r\n bookmarkId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, viewId, bookmarkId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!viewId || !bookmarkId) {\r\n throw(\"View ID and Bookmark ID are required.\");\r\n }\r\n await api.DELETE(`ui.view/${viewId}/slide/${bookmarkId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(viewId, bookmarkId));\r\n api.Cache.Remove(GetListCacheKey(viewId));\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n viewId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n bookmarks: IBookmark[]\r\n }> {\r\n let { api, viewId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!viewId) {\r\n throw(\"View ID is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetListCacheKey(viewId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`ui.view/${viewId}/slides`, Api.PrepReqParams(reqParams));;\r\n const items = data.Items ? data.Items : [];\r\n // Cache individual items.\r\n // Maybe better to load list cache when getting 1 slide and seeing if it's in there.\r\n // WARNING: Right now the data matches, in the future the list may contain a shortened result.\r\n for (let i = 0; i < items.length; i++) {\r\n const item = items[i] as ProjectViewBookmark.IBookmark;\r\n const prom = new Promise((res) => {\r\n res({\r\n bookmark: item\r\n });\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(viewId, item.ID),\r\n value: prom,\r\n req: reqParams\r\n });\r\n }\r\n res({\r\n bookmarks: items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(viewId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n viewId: string,\r\n bookmark: IBookmark,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n bookmark: IBookmark\r\n }> {\r\n let { api, viewId, bookmark: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data?.Title) {\r\n data.Title = data.ID;\r\n }\r\n const res = await api.POST(`ui.view/${viewId}/slide/${data.ID ? data.ID : \"\"}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(viewId, <string>data.ID));\r\n api.Cache.Remove(GetListCacheKey(viewId));\r\n return {\r\n bookmark: res\r\n };\r\n }\r\n\r\n export async function SetOrder(params: {\r\n api?: BruceApi.Api,\r\n viewId: string,\r\n bookmarkIds: string[],\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, viewId, bookmarkIds, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const reqData = {\r\n \t\"UISlide.ID\": bookmarkIds,\r\n \t\"DisplayOrder.Start\": 0\r\n };\r\n await api.POST(`ui.view/${viewId}/slides/setOrder`, reqData, Api.PrepReqParams(reqParams));\r\n await api.Cache.RemoveByStartsWith(GetListCacheKey(viewId));\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { MenuItem } from \"./menu-item\";\r\nimport { ProjectViewTile } from \"./project-view-tile\";\r\nimport { ProjectViewBookmark } from \"./project-view-bookmark\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { ProjectViewSelection } from \"./project-view-selection\";\r\n\r\n/**\r\n * Describes the \"Project View\" concept within Bruce.\r\n * A project view is a collection of settings for a visualization application we support.\r\n * It will describe what panels to show and how, it will also describe all possible ways data can be displayed.\r\n */\r\nexport namespace ProjectView {\r\n export function GetCacheKey(viewId: string): string {\r\n return `${Api.ECacheKey.ProjectView}${Api.ECacheKey.Id}${viewId}`;\r\n }\r\n\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.ProjectView;\r\n }\r\n\r\n // This is the expected default version for the DataVersion value.\r\n // This value should NOT be changed without looking at our API and seeing what the default value is.\r\n export const DEFAULT_DATA_VERSION = 2;\r\n\r\n export interface IView {\r\n ID?: string;\r\n Name: string;\r\n Description?: string;\r\n Feature?: string[];\r\n \"CreatedByUser.ID\"?: string;\r\n CreatedTime?: UTC.IUTC;\r\n DefaultUISlideID?: string;\r\n CreatedByUIVersion?: string;\r\n DataVersion: number;\r\n // Admin only property for what email should be the project view's support line.\r\n SupportEmail?: string;\r\n Settings?: ISettings;\r\n // If true, this view is considered the default for the account.\r\n // Operator may use this project view to load default settings.\r\n IsDefault?: boolean;\r\n }\r\n\r\n /**\r\n * These are the base settings expected in any project view data-version.\r\n * The only exception is data-version = 1 which is our deprecated legacy format.\r\n */\r\n export interface ISettings {\r\n // Menu item structure that defines how and what to load in the scene.\r\n menuItems?: MenuItem.IItem[];\r\n // If true, anonymous users won't be able to access the view.\r\n IsLoginRequired?: boolean;\r\n // If true, users must have the permission \"Permission.EPermPrefix.ACCESS_PROJECT_VIEW + view.ID\" to access the view.\r\n IsRestricted?: boolean;\r\n // Per project view branding to compliment the account branding.\r\n branding?: IBranding\r\n // Describes settings for entity selection for a project view record.\r\n selection?: ProjectViewSelection.ISelection;\r\n // Imagery and terrains that non-admin users can select from.\r\n // Sources used in bookmarks will automatically be added to this list.\r\n imageries?: ProjectViewTile.IViewImagery[];\r\n terrains?: ProjectViewTile.IViewTerrain[];\r\n // Defaults are values to apply for bookmarks when either the bookmark-\r\n // is missing or the value is missing in the bookmark settings.\r\n defaults?: {\r\n camera?: ProjectViewBookmark.ICamera;\r\n settings?: ProjectViewBookmark.ISettings;\r\n };\r\n // Describes how to present contact information to the users.\r\n // The contact email is set in \"view.SupportEmail\". Only an admin can read or write this value.\r\n contact?: IContact;\r\n plugins?: IPlugins;\r\n // Default is yellow at 0.5 opacity.\r\n selectionColor?: string;\r\n // Presentation mode settings.\r\n present?: IPresent;\r\n }\r\n \r\n export interface IBranding {\r\n // Client file id for the project view's banner.\r\n // In Navigator this is found within the Navigator's dashboard.\r\n bannerFileId?: string;\r\n }\r\n\r\n export interface IPresent {\r\n // Time in milliseconds to hold bookmarks before moving to the next bookmark.\r\n // This is a default time and can be overridden by the bookmark's duration.\r\n bookmarkDuration?: number;\r\n }\r\n\r\n /**\r\n * Describes how to present contact information to the users.\r\n */\r\n export interface IContact {\r\n // Default = false.\r\n // Indicates if the user should be able to reach support.\r\n enabled: boolean;\r\n // Description to display in the support dialog.\r\n // Null = application's default text.\r\n description?: string;\r\n // FontAwesome icon to use for the support dialog button.\r\n // Null = application's default icon.\r\n icon?: string;\r\n }\r\n\r\n export interface IPlugins {\r\n // Enabled plugin ids.\r\n enabledIds: string[];\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n viewId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n view: IView\r\n }> {\r\n let { api, viewId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!viewId) {\r\n throw(\"View ID is required.\");\r\n }\r\n const key = GetCacheKey(viewId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`ui.view/${viewId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n view: 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,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n views: IView[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), 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 = await api.GET(\"ui.view/list\", Api.PrepReqParams(reqParams));\r\n res({\r\n views: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n viewId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, viewId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!viewId) {\r\n throw(\"View ID is required.\");\r\n }\r\n await api.DELETE(`ui.view/${viewId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(viewId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n view: IView,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n view: IView\r\n }> {\r\n let { api, view: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data) {\r\n data = <any>{};\r\n }\r\n const isNew = !data.ID;\r\n if (!data.ID) {\r\n data.ID = ObjectUtils.UId();\r\n }\r\n if (!data.Name) {\r\n data.Name = data.ID;\r\n }\r\n if (!data.CreatedByUIVersion) {\r\n data.CreatedByUIVersion = \"-1\";\r\n }\r\n if (isNew) {\r\n data = await api.POST(`ui.view/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n }\r\n else {\r\n data = await api.PUT(`ui.view/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n }\r\n api.Cache.Remove(GetCacheKey(<string>data.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n view: data\r\n };\r\n }\r\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}","\r\nexport namespace ProjectViewTile {\r\n export type MapTileId = string | EDefaultImagery;\r\n export type TerrainTileId = string | EDefaultTerrain;\r\n\r\n export interface ITileMeta {\r\n // Null = using a default tile.\r\n // (Not the same as a template account one. Default means we don't have a database record of it.).\r\n accountId?: string;\r\n tilesetId: string;\r\n }\r\n\r\n export interface IViewTerrain extends ITileMeta {\r\n tilesetId: TerrainTileId;\r\n }\r\n\r\n export interface IViewImagery extends ITileMeta {\r\n tilesetId: MapTileId;\r\n }\r\n\r\n export interface IBookmarkImagery extends IViewImagery {\r\n // 0 - 1, 1 = 100% opacity.\r\n // Default = 1.\r\n alpha?: number;\r\n // Default = 1.\r\n brightness?: number;\r\n // Default = 1.\r\n saturation?: number;\r\n // Default = 1.\r\n contrast?: number;\r\n // Default = 1.\r\n gamma?: number;\r\n // Default = 0.\r\n hue?: number;\r\n }\r\n\r\n export interface IBookmarkTerrain extends IViewTerrain {\r\n\r\n }\r\n\r\n export enum EDefaultImagery {\r\n BingMapsAerial = \"bingmapsaerial\",\r\n BingMapsAerialWithLabels = \"bingmapsaerialwithlabels\",\r\n BingMapsRoads = \"bingmapsroads\",\r\n MapboxSatellite = \"mapboxsatellite\",\r\n MapBoxStreets = \"mapboxstreets\",\r\n MapBoxStreetsClassic = \"mapboxstreetsclassic\",\r\n EsriWorldImagery = \"esriworldimagery\",\r\n EsriWorldStreetMap = \"esriworldstreetmap\",\r\n EsriNationalGeographic = \"esrinationalgeographic\",\r\n OpenStreetMap = \"openstreetmap\",\r\n LINZ = \"linz\",\r\n StamenWaterColor = \"stamenwatercolor\",\r\n StamenToner = \"stamentoner\",\r\n Grid = \"grid\"\r\n }\r\n\r\n export interface IDefaultImagery {\r\n id: EDefaultImagery;\r\n name: string;\r\n iconUrl?: string;\r\n }\r\n\r\n /**\r\n * Prepared array for UI.\r\n * TODO: Im not happy with icon urls sitting in the code. I'd prefer we ship these icons in the library as files.\r\n */\r\n export const DefaultImagery: IDefaultImagery[] = [\r\n {\r\n id: EDefaultImagery.BingMapsAerial,\r\n name: \"Bing Maps Aerial\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingAerial.png\"\r\n },\r\n {\r\n id: EDefaultImagery.BingMapsAerialWithLabels,\r\n name: \"Bing Maps Aerial with Labels\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingAerialLabels.png\"\r\n },\r\n {\r\n id: EDefaultImagery.BingMapsRoads,\r\n name: \"Bing Maps Roads\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingRoads.png\"\r\n },\r\n {\r\n id: EDefaultImagery.MapboxSatellite,\r\n name: \"Mapbox Satellite\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxSatellite.png\"\r\n },\r\n {\r\n id: EDefaultImagery.MapBoxStreets,\r\n name: \"Mapbox Streets\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxTerrain.png\"\r\n },\r\n {\r\n id: EDefaultImagery.MapBoxStreetsClassic,\r\n name: \"Mapbox Streets Classic\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxStreets.png\"\r\n },\r\n {\r\n id: EDefaultImagery.EsriWorldImagery,\r\n name: \"Esri World Imagery\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriWorldImagery.png\"\r\n },\r\n {\r\n id: EDefaultImagery.EsriWorldStreetMap,\r\n name: \"Esri World Street Map\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriWorldStreetMap.png\"\r\n },\r\n {\r\n id: EDefaultImagery.EsriNationalGeographic,\r\n name: \"Esri National Geographic\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriNationalGeographic.png\"\r\n },\r\n {\r\n id: EDefaultImagery.OpenStreetMap,\r\n name: \"Open Street Map\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/openStreetMap.png\"\r\n },\r\n {\r\n id: EDefaultImagery.LINZ,\r\n name: \"LINZ\",\r\n iconUrl: \"https://template.ui.nextspace.host/media/linz.jpg\"\r\n },\r\n {\r\n id: EDefaultImagery.StamenWaterColor,\r\n name: \"Stamen Water Color\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/stamenWatercolor.png\"\r\n },\r\n {\r\n id: EDefaultImagery.StamenToner,\r\n name: \"Stamen Toner\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/stamenToner.png\"\r\n },\r\n {\r\n id: EDefaultImagery.Grid,\r\n name: \"Grid\",\r\n iconUrl: \"https://template.api.nextspace-uat.net/file/2885d8df-028b-4f5c-80b3-2634f7e7cf69.png\"\r\n }\r\n ];\r\n\r\n export enum EDefaultTerrain {\r\n CesiumWorldTerrain = \"cesiumworldterrain\",\r\n FlatTerrain = \"flatterrain\",\r\n LINZ = \"linz\"\r\n }\r\n\r\n export interface IDefaultTerrain {\r\n id: EDefaultTerrain;\r\n name: string;\r\n iconUrl?: string;\r\n }\r\n\r\n /**\r\n * Prepared array for UI.\r\n * TODO: Im not happy with icon urls sitting in the code. I'd prefer we ship these icons in the library as files.\r\n */\r\n export const DefaultTerrains: IDefaultTerrain[] = [\r\n {\r\n id: EDefaultTerrain.CesiumWorldTerrain,\r\n name: \"Cesium World Terrain\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/TerrainProviders/CesiumWorldTerrain.png\"\r\n },\r\n {\r\n id: EDefaultTerrain.LINZ,\r\n name: \"LINZ\",\r\n iconUrl: \"https://template.ui.nextspace.host/media/linz.jpg\"\r\n },\r\n {\r\n id: EDefaultTerrain.FlatTerrain,\r\n name: \"Flat Terrain\",\r\n }\r\n ]\r\n}","import { MenuItem } from \"./menu-item\";\r\nimport { ProjectView as PV } from \"./project-view\";\r\nimport { ProjectViewLegacyTile } from \"./project-view-legacy-tile\";\r\n\r\n/**\r\n * Deprecated Project View record.\r\n * This was used in the legacy web Navigator.\r\n */\r\nexport namespace ProjectViewLegacy {\r\n export const DATA_VERSION = 1;\r\n\r\n export interface IShadowSettings {\r\n IsShadowEnabled?: boolean;\r\n IsShadowSoft?: boolean;\r\n ShadowSampleSize?: number;\r\n }\r\n\r\n export interface ISettings extends PV.ISettings {\r\n BookmarkTransitionSpeed?: number;\r\n Camera?: any;\r\n CameraFrustum?: number;\r\n CesiumMapSources?: ProjectViewLegacyTile.IMapSource[];\r\n CesiumTerrainSources?: ProjectViewLegacyTile.ITerrainSource[];\r\n ControlsSettings?: any;\r\n DefaultMapTiles?: string;\r\n DefaultTerrain?: string;\r\n DisplayTimeline?: boolean;\r\n GroundOcclusion?: boolean;\r\n Extensions?: any;\r\n GlobeColor?: string;\r\n SelectionHighlightColor?: string;\r\n LayersMenu?: MenuItem.IItem[];\r\n OASettings?: any;\r\n LogoImage?: any;\r\n LegendImage?: any;\r\n TilesetBackfaceCulling?: boolean;\r\n TopPanelComponents?: string[];\r\n LeftPanelComponents?: string[];\r\n PostProcessFXAA?: boolean;\r\n Shadows?: boolean;\r\n CustomFormSettings?: any;\r\n PreloadEntityTypes?: boolean;\r\n ClickActions?: any;\r\n Shadow?: {\r\n StaticCamera?: IShadowSettings;\r\n MovingCamera?: IShadowSettings;\r\n }\r\n }\r\n\r\n export interface IView extends PV.IView {\r\n Settings: ISettings;\r\n }\r\n}","import { Camera } from \"../common/camera\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { Markup } from \"../markup/markup\";\r\n\r\n/**\r\n * Deprecated Project View Bookmark record.\r\n * This was used in the legacy web Navigator.\r\n */\r\nexport namespace ProjectViewLegacyBookmark {\r\n export const DATA_VERSION = 1;\r\n\r\n export interface IBookmark {\r\n ID?: string;\r\n Title?: string;\r\n Camera?: ICamera;\r\n Settings?: ISettings;\r\n \"Screenshot.ClientFile.ID\"?: string;\r\n \"UI.View.ID\"?: string;\r\n \"Created.ByUser.ID\"?: string;\r\n \"Created.Date\"?: UTC.IUTC;\r\n DataVersion: number;\r\n DisplayOrder?: number;\r\n }\r\n\r\n export interface IBookmarkImagery {\r\n title: string;\r\n contrast: number;\r\n hue: number;\r\n saturation: number;\r\n gamma: number;\r\n brightness: number;\r\n alpha: number;\r\n }\r\n\r\n export interface ISettings {\r\n selectedItemIds?: string[];\r\n order?: number;\r\n hiddenEntityIds?: string[];\r\n drawnRelationEntityIDs?: string[];\r\n imagery?: IBookmarkImagery[];\r\n terrain?: string;\r\n globeColor?: string;\r\n shadows?: boolean;\r\n groundOcclusion?: boolean;\r\n ambientOcclusion?: boolean;\r\n markup?: Markup.IMarkup;\r\n cameraFrustum?: Camera.EFrustum;\r\n displayTimeline?: boolean;\r\n timelineSettings?: any;\r\n }\r\n\r\n /**\r\n * Lat,lon is in degrees.\r\n * Altitude is meters relative to ground.\r\n * Heading, pitch, roll are in radians.\r\n */\r\n export interface ICamera {\r\n position: {\r\n latitude: number;\r\n longitude: number;\r\n height: number;\r\n };\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Pending Action\" concept within Bruce.\r\n * A pending action is a record of a server-side background process.\r\n * This record is used to monitor its progress and completion state.\r\n */\r\nexport namespace PendingAction {\r\n export interface IAction {\r\n ID: number;\r\n \"CreatedBy.Application\": string;\r\n \"Created.Time\": UTC.IUTC;\r\n \"CreatedByUser.ID\": string;\r\n Result: string;\r\n Progress: number;\r\n \"Completed.Time\": UTC.IUTC;\r\n Description: string;\r\n Status: EStatus;\r\n lastUpdated: UTC.IUTC;\r\n }\r\n\r\n export enum EStatus {\r\n InProgress = \"IN_PROGRESS\",\r\n Cancelled = \"CANCELLED\",\r\n Complete = \"COMPLETE\",\r\n Failed = \"FAILED\"\r\n }\r\n\r\n export interface IMessage {\r\n \"PendingAction.ID\": number;\r\n ID: number;\r\n \"CreatedBy.Application\": string;\r\n \"Created.Time\": UTC.IUTC;\r\n \"Message.Type\": EMessageType | string;\r\n Message: string;\r\n }\r\n\r\n export enum EMessageType {\r\n Warn = \"WARNING\",\r\n Error = \"ERROR\",\r\n Status = \"STATUS\",\r\n Info = \"INFO\"\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n actionId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n action: IAction\r\n }> {\r\n let { api, actionId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!actionId) {\r\n throw(\"Action ID is required.\");\r\n }\r\n const data = await api.GET(`pendingAction/${actionId}`, Api.PrepReqParams(reqParams));\r\n return {\r\n action: data\r\n }\r\n }\r\n\r\n export async function GetRelevantList(params: {\r\n api?: BruceApi.Api,\r\n stricter?: boolean,\r\n reqParams?: Api.IReqParams\r\n }): Promise<{\r\n actions: IAction[]\r\n }> {\r\n let { api, stricter, reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const data = await api.GET(`pendingActions/important?Update=${Boolean(stricter)}`, Api.PrepReqParams(reqParams));\r\n return {\r\n actions: data.Items\r\n };\r\n }\r\n\r\n export async function GetMessages(params: {\r\n api?: BruceApi.Api,\r\n actionId: number,\r\n order?: Api.ESortOrder,\r\n startIndex?: number,\r\n amount?: number,\r\n types?: EMessageType[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n messages: IMessage[]\r\n }> {\r\n let { api, actionId, order, startIndex, amount, req: reqParams, types } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (amount == null) {\r\n amount = 500;\r\n }\r\n if (startIndex == null) {\r\n startIndex = 0;\r\n }\r\n if (order == null) {\r\n order = Api.ESortOrder.Asc;\r\n }\r\n let args = `?SortOrder=${order == Api.ESortOrder.Desc ? \"DESC\" : \"ASC\"}&PageSize=${amount}&PageIndex=${startIndex}`;\r\n if (types?.length) {\r\n for (let i = 0; i < types.length; i++) {\r\n args += `&Type=${types[i]}`;\r\n }\r\n }\r\n const data = await api.GET(`pendingAction/${actionId}/progressMessages` + args, Api.PrepReqParams(reqParams));\r\n return {\r\n messages: data.Items\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { Calculator } from \"../calculator/calculator\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Style\" concept within Bruce.\r\n * A legacy way of referring to styles is \"entity display settings\".\r\n *\r\n * A style is a collection of settings (which can be calculations to perform on entity data) that\r\n * describe how an entity should be displayed.\r\n */\r\nexport namespace Style {\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.Style + Api.ECacheKey.Id + id;\r\n }\r\n\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.Style;\r\n }\r\n\r\n export enum EType {\r\n Entity = \"ENTITY\",\r\n EntityRelationship = \"ENTITY_RELATIONSHIP\"\r\n }\r\n\r\n export enum EPointType {\r\n Point = \"POINT\",\r\n Icon = \"ICON\",\r\n Cylinder = \"CYLINDER\"\r\n }\r\n\r\n export interface IPointSettings {\r\n color: Calculator.IField[];\r\n size: Calculator.IField[];\r\n iconId: string;\r\n iconUrl: Calculator.IField[];\r\n iconScale: Calculator.IField[];\r\n altitudeOption?: any;\r\n Type: EPointType;\r\n // Indicates if depth-test should be disabled which forces the point to render above all other entities.\r\n // This is currently for icon points exclusively.\r\n renderOnTop?: boolean;\r\n // To review.\r\n CylinderFillColor?: Calculator.IField[];\r\n CylinderFillExtrusion?: Calculator.IField[];\r\n CylinderRadius?: Calculator.IField[];\r\n CylinderBorderEnabled?: boolean;\r\n CylinderBorderExtrusion?: Calculator.IField[];\r\n CylinderBorderWidth?: Calculator.IField[];\r\n CylinderBorderColor?: Calculator.IField[];\r\n // To remove.\r\n ClusterNearbyEntities?: boolean;\r\n MinimumEntitiesCountForClustering?: Calculator.IField[];\r\n }\r\n\r\n export interface IPolygonSettings {\r\n useExtrusion: boolean;\r\n extrusionPath: Calculator.IField[];\r\n fillColor: Calculator.IField[];\r\n lineColor: Calculator.IField[];\r\n lineWidth: Calculator.IField[];\r\n // Default is \"m\".\r\n // When units are in px the lines will draw as Cesium Polyline graphics, for meters corridors are used.\r\n // Meters are more stable and will reduce crashes. Pixels have better FPS.\r\n lineWidthUnits?: \"px\" | \"m\";\r\n altitudeOption?: any;\r\n zIndex?: Calculator.IField[];\r\n // If the polygon should be draped over the terrain or tilesets + terrain.\r\n // Default is just terrain.\r\n drapeOver?: \"TERRAIN\" | \"ALL\";\r\n }\r\n\r\n export interface IPolylineSettings {\r\n lineColor: Calculator.IField[];\r\n lineWidth: Calculator.IField[];\r\n // Default is \"px\" for backward compatibility.\r\n // When units are in px the lines will draw as Cesium Polyline graphics, for meters corridors are used.\r\n // Meters are more stable and will reduce crashes. Pixels have better FPS.\r\n lineWidthUnits?: \"px\" | \"m\";\r\n altitudeOption?: any;\r\n zIndex?: Calculator.IField[];\r\n // If the polyline should be draped over the terrain or tilesets + terrain.\r\n // Default is just terrain.\r\n drapeOver?: \"TERRAIN\" | \"ALL\";\r\n }\r\n\r\n export interface IModelSettings {\r\n customize: boolean;\r\n fillColor: Calculator.IField[];\r\n scale: Calculator.IField[];\r\n fillColorBlendMode?: any;\r\n fillColorBlendAmount?: number;\r\n altitudeOption?: any;\r\n }\r\n\r\n export interface IEntitySettings {\r\n pointStyle?: IPointSettings;\r\n polygonStyle?: IPolygonSettings;\r\n polylineStyle?: IPolylineSettings;\r\n modelStyle?: IModelSettings;\r\n }\r\n\r\n export interface IRelationSettings {\r\n lineColor?: Calculator.IField[];\r\n lineWidth?: Calculator.IField[];\r\n heightDistanceRatio?: Calculator.IField[];\r\n duration?: Calculator.IField[];\r\n }\r\n\r\n export type Settings = IEntitySettings | IRelationSettings;\r\n\r\n export interface IStyle {\r\n ID: number;\r\n Name: string;\r\n Settings: Settings;\r\n Type: EType;\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n styles: IStyle[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const res: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"ui.entityDisplaySettings\", Api.PrepReqParams(reqParams));\r\n res({\r\n styles: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: res,\r\n req: reqParams\r\n });\r\n return res;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n styleId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n style: IStyle\r\n }> {\r\n let { api, styleId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!id) {\r\n throw(\"Style ID is required.\");\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 = await api.GET(`ui.entityDisplaySetting/${id}`, Api.PrepReqParams(reqParams));\r\n res({\r\n style: 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 export async function Update(params: {\r\n api?: BruceApi.Api,\r\n style: IStyle,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n style: IStyle\r\n }> {\r\n let { api, style: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data?.Name) {\r\n throw(\"Style name is required.\");\r\n }\r\n if (!data.ID) {\r\n data.ID = 0;\r\n }\r\n const res = await api.POST(`ui.entityDisplaySetting/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n style: res\r\n };\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n styleId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, styleId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!id) {\r\n throw(\"Style ID is required.\");\r\n }\r\n await api.DELETE(`ui.entityDisplaySetting/${id}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(id));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n}","export namespace Permission {\r\n export type Perm = EPerm | string;\r\n\r\n export enum EPerm {\r\n ADMIN = \"ADMIN\",\r\n ADMIN_VIEW = \"ADMIN_VIEW\",\r\n LOGIN = \"LOGIN\",\r\n DELETE_ENTITY_TYPE = \"DELETE_ENTITY_TYPE\",\r\n CREATE_ENTITY_TYPE = \"CREATE_ENTITY_TYPE\",\r\n UPDATE_ENTITY_TYPE = \"UPDATE_ENTITY_TYPE\"\r\n }\r\n\r\n export enum EPermPrefix {\r\n ACCESS_PROJECT_VIEW = \"UIVIEW_\",\r\n MANAGE_PROJECT_VIEW_BOOKMARKS = \"UIVIEW_MANAGE_BOOKMARKS_\",\r\n ACCESS_TILESET = \"TILESET_\"\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { IdmApi } from \"../api/idm-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Permission } from \"./permission\";\r\nimport { User } from \"./user\";\r\n\r\n/**\r\n * Describes the \"Session\" concept within Bruce.\r\n * A session is a set of settings produced from a user or access token login.\r\n * The session describes what the access should be allowed to do.\r\n */\r\nexport namespace Session {\r\n function GetCacheKey(sessionId: string): string {\r\n return `${Api.ECacheKey.Session}${Api.ECacheKey.Id}${sessionId}`;\r\n }\r\n\r\n export interface ISession {\r\n AccessPermissions: IAccountPermissions;\r\n HypeportalAccessPermisssions?: ISuperPermissions;\r\n \"ClientAccount.ID\": string;\r\n ID: string;\r\n IP: string;\r\n LastAccessTime: UTC.IUTC;\r\n User: User.IUser;\r\n }\r\n\r\n export interface IAccountPermissions {\r\n \"ClientAccount.ID\"?: string;\r\n EnabledFeatures?: Permission.Perm[];\r\n UserGroups?: string[];\r\n }\r\n\r\n export interface ISuperPermissions {\r\n EnabledFeatures?: Permission.Perm[];\r\n UserGroups?: string[];\r\n }\r\n\r\n export async function Get(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n // If none is specified it'll return an anonymous session.\r\n sessionId?: string,\r\n // Optional param to specify the account ID to get permissions for.\r\n // If not specified, the session's original logged in account will be used.\r\n accountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n session: ISession\r\n }> {\r\n let { api, sessionId, req: reqParams, accountId } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const key = GetCacheKey(sessionId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`session/${sessionId}${accountId ? `?account=${accountId}`: \"\"}`, reqParams);\r\n res({\r\n session: 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,\r\n value: prom,\r\n req: reqParams,\r\n duration: 5000\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Request to login or to swap existing session to a different account.\r\n * If api is already logged in, pass account param to swap the session.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Login(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n username?: string,\r\n password?: string,\r\n accountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n session: ISession\r\n }> {\r\n let { api, username, password, accountId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const data: any = await api.POST(\"login\", {\r\n account: accountId ? accountId : \"\",\r\n login: username,\r\n password: password\r\n }, reqParams);\r\n const session: ISession = data?.Session;\r\n const ssid = session?.ID;\r\n api.SetSessionId(ssid);\r\n api.Cache.Remove(GetCacheKey(ssid));\r\n return {\r\n session: session\r\n };\r\n }\r\n\r\n export async function Logout(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const ssid = api.GetSessionId();\r\n if (ssid) {\r\n await api.POST(\"logout\", null, reqParams);\r\n api.SetSessionId(<any>null);\r\n api.Cache.Remove(GetCacheKey(ssid));\r\n }\r\n }\r\n\r\n export function IsPermEnabled(params: {\r\n session: ISession,\r\n accountId: string,\r\n perm: string\r\n }): boolean {\r\n let { session, accountId, perm } = params;\r\n if (!perm) {\r\n throw(\"Perm is required.\");\r\n }\r\n perm = perm.toLocaleUpperCase();\r\n const perms = <User.IAccessPermission>session?.User?.AccessPermissions?.find(x => x[\"ClientAccount.ID\"] == accountId);\r\n if (!perms) {\r\n return false;\r\n }\r\n if (!perms.UserGroups) {\r\n perms.UserGroups = [];\r\n }\r\n for (let i = 0; i < perms.UserGroups.length; i++) {\r\n const group = perms.UserGroups[i];\r\n if (typeof group != \"string\") {\r\n const features = group.Features;\r\n if (features && features.findIndex(x => x.toLocaleUpperCase() == perm) > -1) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n export function IsSuperPermEnabled(params: {\r\n session: ISession,\r\n perm: string\r\n }): boolean {\r\n let { session, perm } = params;\r\n if (!perm) {\r\n throw(\"Perm is required.\");\r\n }\r\n perm = perm.toLocaleUpperCase();\r\n const accessPerms = session?.HypeportalAccessPermisssions?.EnabledFeatures ?? [];\r\n return accessPerms.findIndex(x => x.toLocaleUpperCase() == perm) > -1;\r\n }\r\n\r\n export function IsAccountAdmin(params: {\r\n session: ISession,\r\n accountId: string\r\n }): boolean {\r\n return IsPermEnabled({\r\n perm: Permission.EPerm.ADMIN,\r\n accountId: params.accountId,\r\n session: params.session\r\n });\r\n }\r\n\r\n export function IsSuperAdmin(params: {\r\n session: ISession\r\n }): boolean {\r\n return IsSuperPermEnabled({\r\n session: params.session,\r\n perm: Permission.EPerm.ADMIN\r\n });\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { IdmApi } from \"../api/idm-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Permission } from \"./permission\";\r\nimport { User } from \"./user\";\r\n\r\n/**\r\n * Describes the \"User Group\" concept within Bruce.\r\n * A user group is a collection of permissions (\"Features\") and what users should be in the group.\r\n */\r\nexport namespace UserGroup {\r\n export interface IGroup {\r\n \"ClientAccount.ID\"?: string;\r\n \"Features\": Permission.Perm[];\r\n \"ID\": string;\r\n \"Name\"?: string;\r\n }\r\n\r\n export async function GetByName(params: {\r\n api?: IdmApi.Api | GuardianApi.Api, \r\n accountId: string, \r\n name: string, \r\n req?: Api.IReqParams\r\n }): Promise<{\r\n group: IGroup\r\n }> {\r\n let { api, accountId, name, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!name || !accountId) {\r\n throw(\"Name and AccountID are required.\");\r\n }\r\n const data = await api.GET(`account/${accountId}/userGroupByName/${name}`, reqParams);\r\n return {\r\n group: data\r\n };\r\n }\r\n\r\n export async function GetUsers(params: {\r\n api?: IdmApi.Api | GuardianApi.Api, \r\n accountId: string, \r\n groupId: string, \r\n req?: Api.IReqParams\r\n }): Promise<{\r\n users: User.IUser[]\r\n }> {\r\n let { api, accountId, groupId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!accountId || !id) {\r\n throw(\"AccountID and ID are required.\");\r\n }\r\n const data = await api.GET(`userGroup/${accountId}/${id}/users`, reqParams);\r\n return {\r\n users: data.Items\r\n };\r\n }\r\n\r\n export async function GetListByPerm(params: {\r\n api?: IdmApi.Api | GuardianApi.Api, \r\n accountId: string, \r\n perm: Permission.Perm, \r\n req?: Api.IReqParams\r\n }): Promise<{\r\n groups: IGroup[]\r\n }> {\r\n let { api, accountId, perm, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!accountId || !perm) {\r\n throw(\"AccountID and Perm are required.\");\r\n }\r\n const data = await api.GET(`userGroupsByFeature/${accountId}/${perm}`, reqParams);\r\n return {\r\n groups: data.Items\r\n };\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: IdmApi.Api | GuardianApi.Api, \r\n accountId: string, \r\n req?: Api.IReqParams\r\n }): Promise<{\r\n groups: IGroup[]\r\n }> {\r\n let { api, accountId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!accountId) {\r\n throw(\"AccountID is required.\");\r\n }\r\n const data = await api.GET(`userGroups/${accountId}`, reqParams);\r\n return {\r\n groups: data.Items\r\n };\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: IdmApi.Api | GuardianApi.Api, \r\n accountId: string, \r\n groupId: string, \r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, accountId, groupId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!accountId || !id) {\r\n throw(\"AccountID and ID are required.\");\r\n }\r\n return api.DELETE(`account/${accountId}/userGroupID/${id}`, reqParams);\r\n }\r\n\r\n export async function Update(params: {\r\n api?: IdmApi.Api | GuardianApi.Api, \r\n group: IGroup, \r\n reqParams?: Api.IReqParams\r\n }): Promise<{\r\n group: IGroup\r\n }> {\r\n let { api, group: data, reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!data.Name || !data[\"ClientAccount.ID\"]) {\r\n throw(\"User group name and client account ID are required.\");\r\n }\r\n const res = await api.POST(`userGroup${data.ID ? (\"/\" + data.ID) : \"\"}`, data, reqParams);\r\n return {\r\n group: res\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { IdmApi } from \"../api/idm-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { UserGroup } from \"./user-group\";\r\n\r\n/**\r\n * Describes the \"User\" concept within Bruce.\r\n * A user is either a login-user or an access-token.\r\n *\r\n * You cannot login using an access-token, but both concepts are-\r\n * treated the same way in terms of permissions and user groups.\r\n */\r\nexport namespace User {\r\n export function GetCacheKey(userId: string, accountId?: string): string {\r\n if (!accountId) {\r\n accountId = \"\";\r\n }\r\n return Api.ECacheKey.User + Api.ECacheKey.Id + userId + Api.ECacheKey.Id + accountId;\r\n }\r\n\r\n export function GetEmailCacheKey(email: string, accountId?: string): string {\r\n if (!accountId) {\r\n accountId = \"\";\r\n }\r\n return Api.ECacheKey.User + Api.ECacheKey.UserEmail + email + Api.ECacheKey.Id + accountId;\r\n }\r\n\r\n export function GetSettingsCacheKey(userId: string, appId: string): string {\r\n return Api.ECacheKey.User + Api.ECacheKey.UserSettings + userId + Api.ECacheKey.Id + appId;\r\n }\r\n\r\n export interface IUser {\r\n AccessPermissions?: IAccessPermission[];\r\n Email?: string;\r\n Login?: string;\r\n FullName?: string;\r\n ID?: string;\r\n IsActivated?: boolean;\r\n IsDisabled?: boolean;\r\n IsPasswordChangeRequired?: boolean;\r\n Mobile?: string;\r\n Password?: string;\r\n Type?: EType;\r\n }\r\n\r\n export enum EType {\r\n User = \"LOGIN_USER\",\r\n AccessToken = \"ACCESS_TOKEN\"\r\n }\r\n\r\n export interface IAccessPermission {\r\n \"ClientAccount.ID\": string;\r\n \"UserGroup.ID\"?: string[];\r\n \"UserGroups\"?: UserGroup.IGroup[];\r\n }\r\n\r\n export async function Get(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n userId: string,\r\n accountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n user: IUser\r\n }> {\r\n let { api, userId: id, accountId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!id) {\r\n throw(\"ID is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetCacheKey(id, <string>accountId), 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 = await api.GET(`user/${id}${accountId ? `?clientAccountID=${accountId}` : \"\"}`, reqParams)\r\n res({\r\n user: 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, <string>accountId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function Update(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n user: IUser,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n user: IUser\r\n }> {\r\n let { api, user: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!data?.ID || !data?.Type) {\r\n throw(\"ID and Type are required.\");\r\n }\r\n // When getting a user it is structured slightly different to when we update it.\r\n // We can make up the difference here.\r\n if (data.AccessPermissions?.length) {\r\n for (let i = 0; i < data.AccessPermissions.length; i++) {\r\n const perm = data.AccessPermissions[i];\r\n if (!perm[\"UserGroup.ID\"] && perm.UserGroups) {\r\n perm[\"UserGroup.ID\"] = [];\r\n for (let j = 0; j < perm.UserGroups.length; j++) {\r\n perm[\"UserGroup.ID\"].push(perm.UserGroups[j].ID);\r\n }\r\n }\r\n }\r\n }\r\n const res = await api.POST(`user/${data.ID}`, data, reqParams);\r\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + data.ID);\r\n if (data.Type == EType.AccessToken) {\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\r\n }\r\n else if (data.Type == EType.User) {\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.User + Api.ECacheKey.Account);\r\n }\r\n return {\r\n user: res\r\n };\r\n }\r\n\r\n /**\r\n * Loads settings for a given user + app.\r\n * The session's account id is used to separate settings between accounts.\r\n * @param params\r\n */\r\n export async function GetSettings(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n userId: string,\r\n appId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n settings: any\r\n }> {\r\n let { api, userId, appId, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!userId || !appId) {\r\n throw(\"UserId and appId are required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetSettingsCacheKey(userId, appId), req);\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 = await api.GET(`user/${userId}/application/${appId}/settings`);\r\n const settings = data?.Settings ? data.Settings : {};\r\n res({\r\n settings: settings\r\n });\r\n }\r\n catch (e) {\r\n // It will complain if an app id hasn't been used yet.\r\n // We need to suppress that error.\r\n if (e && typeof e == \"object\") {\r\n if (e.ERROR && typeof e.ERROR == \"object\" && e.ERROR.Type == \"NotFound\") {\r\n res({\r\n settings: {}\r\n });\r\n return;\r\n }\r\n }\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetSettingsCacheKey(userId, appId),\r\n value: prom,\r\n req: req\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Updates settings for a given accId + user + app.\r\n * The settings update will replace the existing record, please ensure to merge with existing settings.\r\n * AccountId is optional and will use a globally shared record if not provided.\r\n * @param params\r\n */\r\n export async function UpdateSettings(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n accId?: string,\r\n userId: string,\r\n appId: string,\r\n settings: any,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, accId, userId, appId, settings, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!userId || !appId) {\r\n throw(\"UserId and appId are required.\");\r\n }\r\n const postBody = {\r\n Settings: settings == null ? {} : settings,\r\n Application: appId,\r\n ClientAccountID: accId,\r\n UserID: userId\r\n };\r\n const prom = api.POST(`user/${userId}/application/${appId}/settings`, postBody, req);\r\n api.Cache.Remove(GetSettingsCacheKey(userId, appId));\r\n return prom;\r\n }\r\n\r\n export async function GetUsernameAvailable(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n username: string,\r\n excludeUserId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n isAvailable: boolean\r\n }> {\r\n let { api, username, excludeUserId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!username) {\r\n throw(\"Username is required.\");\r\n }\r\n const req = api.GET(`user/loginavailable/${username}${excludeUserId ? \"?excludeUserId=\" + excludeUserId : \"\"}`, reqParams);\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n isAvailable: data.IsAvailable\r\n });\r\n }\r\n catch (e) {\r\n rej(<any>e);\r\n }\r\n });\r\n return prom;\r\n }\r\n\r\n export namespace LoginUser {\r\n export function GetListCacheKey(accountId: string): string {\r\n return Api.ECacheKey.User + Api.ECacheKey.Account + Api.ECacheKey.Id + accountId;\r\n }\r\n\r\n export async function GetByEmail(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n email: string,\r\n accountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n user: IUser\r\n }> {\r\n let { api, email, accountId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!email) {\r\n throw(\"Email is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetEmailCacheKey(email, <string>accountId), 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 = await api.GET(`userByEmail/${email}${accountId ? `?clientAccountID=${accountId}` : \"\"}`, reqParams);\r\n res({\r\n user: 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: GetEmailCacheKey(email, <string>accountId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n accountId: string,\r\n exclusive?: boolean,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n users: IUser[]\r\n }> {\r\n let { api, accountId, exclusive, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!accountId) {\r\n throw(\"Client account ID is required.\");\r\n }\r\n if (!exclusive) {\r\n exclusive = false;\r\n }\r\n const cache = exclusive ? null : await api.GetCacheItem(GetListCacheKey(accountId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`users?clientAccountID=${accountId}${exclusive ? \"&allExcludingClientAccount=true\" : \"\" }`, reqParams);\r\n res({\r\n users: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n req.then(async (data) => {\r\n const users = data.users;\r\n for (let i = 0; i < users.length; i++) {\r\n await api.SetCacheItem({\r\n key: GetCacheKey(<string>users[i].ID, accountId),\r\n value: {\r\n user: users[i]\r\n },\r\n req: reqParams\r\n });\r\n }\r\n });\r\n if (!exclusive) {\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(accountId),\r\n value: req,\r\n req: reqParams\r\n });\r\n }\r\n return req;\r\n }\r\n\r\n /**\r\n * Sends a signup email to the specified email address.\r\n * @param params\r\n * @returns\r\n */\r\n export async function Signup(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n email: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, email, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!email) {\r\n throw(\"Email is required.\");\r\n }\r\n return api.POST(\"clientaccount/signup\", {\r\n Email: email\r\n }, reqParams);\r\n }\r\n\r\n /**\r\n * Sends a new signup email using a previous one's expired code.\r\n * @param params\r\n * @returns\r\n */\r\n export async function SignupResend(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n expiredCode: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, expiredCode, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!expiredCode) {\r\n throw(\"Expired activation code is required.\");\r\n }\r\n return api.POST(`clientaccount/signup/resend?activationKey=${Api.Encode(expiredCode)}`, null, reqParams);\r\n }\r\n\r\n /**\r\n * Completes signup using user data and a signup code.\r\n * @param params\r\n * @returns\r\n */\r\n export async function SignupComplete(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n code: string,\r\n user: IUser,\r\n accountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n user: IUser\r\n }> {\r\n let { api, code, user: data, accountId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!code || !data?.Login || !data?.Password) {\r\n throw(\"Login, password, and activation code are required.\");\r\n }\r\n data = JSON.parse(JSON.stringify(data));\r\n data.IsActivated = true;\r\n data.IsDisabled = false;\r\n (<any>data).key = code;\r\n const res: IUser = await api.POST(`UserActivate/${accountId ? accountId : \"\"}`, data, reqParams);\r\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + res.ID);\r\n if (data.Email) {\r\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.UserEmail + data.Email);\r\n }\r\n return {\r\n user: res\r\n };\r\n }\r\n\r\n /**\r\n * Sends a password reset email to the specified email address.\r\n * @param params\r\n * @returns user id associated with provided email.\r\n */\r\n export async function ForgotPassword(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n accountId: string,\r\n email: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n userId: string\r\n }> {\r\n let { api, accountId, email, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!accountId || !email) {\r\n throw(\"Account ID and email are required.\");\r\n }\r\n const req = api.POST(`UserForgotPassword/${accountId}`, {\r\n Email: email\r\n }, reqParams);\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n userId: data.ID\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Completes password reset using a password reset code and new password.\r\n * @param params\r\n * @returns\r\n */\r\n export async function ForgotPasswordComplete(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n code: string,\r\n userId: string,\r\n password: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n user: IUser\r\n }> {\r\n let { api, code, userId, password, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const {user} = await Get({\r\n api: api,\r\n userId: userId,\r\n accountId: \"\",\r\n req: reqParams\r\n });\r\n const res = await api.POST(\"UserSetNameAndPassword\", {\r\n ID: userId,\r\n Email: user.Email,\r\n ActivationCode: code,\r\n Password: password,\r\n FullName: user.FullName\r\n }, reqParams);\r\n return {\r\n user: res\r\n };\r\n }\r\n }\r\n\r\n export namespace AccessToken {\r\n export function GetListCacheKey(accountId: string): string {\r\n return Api.ECacheKey.AccessToken + Api.ECacheKey.Account + Api.ECacheKey.Id + accountId;\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n accountId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n users: IUser[]\r\n }> {\r\n let { api, accountId, 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(accountId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"usersByClientAccount/accessTokens\", reqParams);\r\n res({\r\n users: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n req.then(async (data) => {\r\n const users = data.tokens;\r\n for (let i = 0; i < users.length; i++) {\r\n await api.SetCacheItem({\r\n key: GetCacheKey(<string>users[i].ID, accountId),\r\n value: {\r\n user: users[i]\r\n },\r\n req: reqParams\r\n });\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(accountId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n export async function Delete(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n tokenId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, tokenId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n await api.DELETE(`accessToken/${id}`, reqParams);\r\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + id);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\r\n }\r\n\r\n export async function Create(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n token: IUser,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n user: IUser\r\n }> {\r\n let { api, token: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n if (!data) {\r\n data = {};\r\n }\r\n if (data.Type == EType.User) {\r\n throw(\"User type is not allowed.\");\r\n }\r\n if (!data.Type) {\r\n data.Type = EType.AccessToken;\r\n }\r\n data = await api.POST(\"accessToken\", data, reqParams);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\r\n return {\r\n user: data\r\n };\r\n }\r\n }\r\n}","\r\nimport { Api } from \"../api/api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { IdmApi } from \"../api/idm-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { User } from \"../user/user\";\r\n\r\nexport namespace AccountInvite {\r\n export interface IInvite {\r\n ID: number;\r\n \"Account.ID\": string;\r\n \"Invited.User.ID\": string;\r\n \"InvitedBy.User.ID\": string;\r\n CreatedDate: UTC.IUTC;\r\n InviteMethod: EInviteMethod;\r\n IsExpired: boolean;\r\n Status: EStatus;\r\n }\r\n\r\n export enum EStatus {\r\n Denied = \"Denied\",\r\n Cancelled = \"Cancelled\",\r\n Sent = \"Sent\",\r\n NotSent = \"NotSent\",\r\n Accepted = \"Accepted\"\r\n }\r\n\r\n export enum EInviteMethod {\r\n Email = \"Email\",\r\n SMS = \"SMS\",\r\n Manual = \"Manual\"\r\n }\r\n\r\n export async function GetByCode(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n code: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n invite: IInvite\r\n }> {\r\n let { api, code, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.GET(`invite/code?inviteCode=${code}`, Api.PrepReqParams(req));\r\n return res;\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n accountId?: string,\r\n userId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n invites: IInvite[],\r\n warnings?: string[]\r\n }> {\r\n let { api, accountId, userId, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const urlParams = new URLSearchParams();\r\n if (accountId) {\r\n urlParams.append(\"accountId\", accountId);\r\n }\r\n if (userId) {\r\n urlParams.append(\"userId\", userId);\r\n }\r\n const res = await api.GET(\"invites?\" + urlParams.toString(), Api.PrepReqParams(req));\r\n return res;\r\n }\r\n\r\n export async function Update(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n code: string,\r\n status: string,\r\n user?: User.IUser,\r\n req?: Api.IReqParams\r\n }) {\r\n let { api, code, status, user, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.POST(\"invite/update\", {\r\n InviteCode: code,\r\n Status: status,\r\n User: user\r\n }, Api.PrepReqParams(req));\r\n return res;\r\n }\r\n\r\n export async function Create(params: {\r\n api?: IdmApi.Api | GuardianApi.Api,\r\n accountId: string,\r\n login?: string,\r\n userId?: string,\r\n email?: string,\r\n mobile?: string,\r\n emailTemplateKey?: string,\r\n groupIds?: string[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n warnings?: string[],\r\n user: User.IUser,\r\n manualInviteCode?: string,\r\n invite: IInvite,\r\n manualInvite?: IInvite\r\n }> {\r\n let { api, accountId, login, userId, email, mobile, emailTemplateKey, groupIds, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.POST(\"invite/new\", {\r\n accountId,\r\n login,\r\n email,\r\n mobile,\r\n userId,\r\n groupIds,\r\n emailTemplateKey\r\n }, Api.PrepReqParams(req));\r\n return res;\r\n }\r\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}","import { IDictionary } from \"../common/dictionary\";\n\n/**\n * Utility to help with url manipulation.\n */\nexport namespace UrlUtils {\n export function GetQueryString(doc: Document): IDictionary<string> {\n const qs: any = {};\n const p0 = doc.location.href.indexOf(\"?\");\n if (p0 >= 0) {\n const str = doc.location.href.substring(p0 + 1);\n const tokens = str.split(\"&\");\n tokens.forEach(token => {\n const p = token.split(\"=\");\n if (p.length == 2) {\n qs[p[0]] = p[1];\n }\n });\n }\n return qs;\n }\n\n /**\n * Helper to get and set url params for a given window.\n */\n export class Handler {\n private _window: Window;\n public get window(): Window {\n return this._window;\n }\n private get document(): Document {\n return this.window?.document;\n }\n private _allowedKeys: string[] = <any>null;\n public get allowedKeys(): string[] {\n return this._allowedKeys;\n }\n \n public constructor(window: Window, allowedKeys?: string[]) {\n this._window = window;\n this._allowedKeys = <string[]>allowedKeys;\n }\n \n public UpdateAllowedKeys(allowedKeys: string[]): void {\n this._allowedKeys = allowedKeys;\n let params = this.GetParams();\n this.refresh(params);\n }\n \n public UpdateParam(key: string, value: string | number): void {\n let params = this.GetParams();\n params[key + \"\"] = value + \"\";\n this.refresh(params);\n }\n \n public RemoveParam(key: string): void {\n let params = this.GetParams();\n params[key + \"\"] = <any>null;\n this.refresh(params);\n }\n \n public GetParamKeys(): string[] {\n let params = GetQueryString(this.document);\n return Object.keys(params);\n }\n \n public GetParams(): IDictionary<string> {\n return GetQueryString(this.document);\n }\n \n public GetParam(key: string): string {\n let params = this.GetParams();\n return params[key + \"\"];\n }\n \n public Clear(): void {\n this.refresh({});\n }\n \n private refresh(urlParams: IDictionary<string | number>): void {\n const params: string[] = [];\n const keys = Object.keys(urlParams);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (this._allowedKeys == null || this._allowedKeys.includes(key)) {\n const val = urlParams[key];\n if (!!val || val == 0) {\n params.push(`${key}=${val}`);\n }\n }\n }\n if (params.length > 0) {\n this.window.history.replaceState({}, <any>null, \"?\" + params.join(\"&\"));\n }\n else {\n this.window.history.replaceState({}, <any>null, \"\");\n }\n }\n }\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Entity as E } from \"../entity/entity\";\r\n\r\nexport namespace DataLab {\r\n export enum EReqKey {\r\n Primary = \"PrimarySelection\",\r\n Secondary = \"SecondarySelection\"\r\n }\r\n\r\n // WIP.\r\n export interface IQuery {\r\n [EReqKey.Primary]: {\r\n Items: any[]\r\n },\r\n [EReqKey.Secondary]?: any,\r\n Action?: string,\r\n PrimaryEntityTypeID?: string;\r\n PrimaryEntityID?: string;\r\n }\r\n\r\n export async function Run(params: {\r\n api?: BruceApi.Api,\r\n query: IQuery, \r\n key?: EReqKey, \r\n skip?: number, \r\n load?: number, \r\n req?: Api.IReqParams\r\n }): Promise<{\r\n entities: E.IEntity[]\r\n }> \r\n {\r\n let { api, query, key, skip, load, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!key) {\r\n key = EReqKey.Primary;\r\n }\r\n if (!skip) {\r\n skip = 0;\r\n }\r\n if (!load) {\r\n load = 50;\r\n }\r\n const req = api.POST(`entities/datalab/getMatchingEntities/${key}?skip=${skip}&load=${load}`, \r\n query, \r\n Api.PrepReqParams(reqParams)\r\n );\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n entities: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n return prom;\r\n }\r\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\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ClientFile } from \"../client-file/client-file\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\nexport namespace ImportedFile {\r\n export function GetCacheKey(fileId: number): string {\r\n return Api.ECacheKey.ImportedFile + Api.ECacheKey.Id + fileId;\r\n }\r\n\r\n export function GetCacheKeyByRootId(rootId: string): string {\r\n return Api.ECacheKey.ImportedFile + Api.ECacheKey.Id + rootId;\r\n }\r\n\r\n export function GetListCacheKey(type: EFileType, pageIndex: number): string {\r\n return Api.ECacheKey.ImportedFile + type + pageIndex;\r\n }\r\n\r\n export interface IFile {\r\n ID: number;\r\n \"ClientFile.ID\": string;\r\n \"ImportedBy.User.ID\": string;\r\n \"Imported.DateTime\": any;\r\n \"EntityType.ID\": string;\r\n \"RootEntity.ID\": string;\r\n \"Source.ID\": number;\r\n \"PendingAction.ID\": number;\r\n NewEntitiesCount: number;\r\n UpdatedEntitiesCount: number;\r\n ClientFile: ClientFile.IFile;\r\n }\r\n\r\n export enum EFileType {\r\n CAD = \"CAD\",\r\n All = \"All\"\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n fileType?: EFileType,\r\n pageIndex?: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n importedFiles: IFile[]\r\n }> {\r\n let { api, fileType: type, pageIndex, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!type) {\r\n type = EFileType.All;\r\n }\r\n if (!pageIndex) {\r\n pageIndex = 0;\r\n }\r\n const cache = await api.GetCacheItem(GetListCacheKey(type, pageIndex), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n\r\n let first = true;\r\n let url = \"entityImportFiles\";\r\n if (type != EFileType.All) {\r\n url += \"?FileType=\" + type;\r\n first = false;\r\n }\r\n if (pageIndex > 0) {\r\n url += (first ? \"?\" : \"&\") + \"pageIndex=\" + pageIndex;\r\n }\r\n const req = api.GET(url, Api.PrepReqParams(reqParams));\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n importedFiles: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(type, pageIndex),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function GetListByRootId(params: {\r\n api?: BruceApi.Api,\r\n rootId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n importedFiles: IFile[]\r\n }> {\r\n let { api, rootId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKeyByRootId(rootId), 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 = await api.GET(`entityImportFiles?Entity.ID=${rootId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n importedFiles: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKeyByRootId(rootId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n importedFileId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n importedFile: IFile\r\n }> {\r\n let { api, importedFileId: fileId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(fileId), 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 = await api.GET(`entityImportFile/${fileId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n importedFile: 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(fileId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n}","import { Cartes, EntityAttachmentType } from \"../bruce-models\";\r\n\r\n/**\r\n * Description of a \"Markup\" which is stored in custom-form or bookmark records.\r\n */\r\nexport namespace Markup {\r\n export interface IMarkup {\r\n divs?: Div.IDiv[];\r\n vectors?: (Line.ILine | FreePaint.IPaint)[];\r\n cesiumObjects?: (Polygon.IPolygon | Polyline.IPolyline | Circle.ICircle | Walkscore.IWalkscore)[];\r\n width?: number;\r\n height?: number;\r\n defaultCameraPos?: any;\r\n // Default = true.\r\n visible?: boolean;\r\n }\r\n\r\n export interface IElement {\r\n // Unique id of the element within the markup.\r\n // Warning: IAnchor elements are not elements and do not have an id.\r\n // Anchors only exist as sub elements to other items.\r\n id: string;\r\n // Human readable name for the element.\r\n // This is presented in editing screens to help differentiate elements.\r\n name?: string;\r\n // Default = true.\r\n visible?: boolean;\r\n // The screen position of the original drawn element.\r\n // Used to determine if anything needs to change based on viewer's screen size.\r\n screenWidth?: number;\r\n screenHeight?: number;\r\n }\r\n\r\n export namespace Div {\r\n // Types of div that can be created.\r\n export enum EType {\r\n // Default, no special handling.\r\n Default = \"default\",\r\n // Callout, assumes it will be positioned in 3d space.\r\n // Assumes existence of line that is used to anchor it.\r\n Callout = \"callout\"\r\n }\r\n\r\n export interface IDiv extends IElement {\r\n // Type of div. Determines how it is rendered / positioned.\r\n type?: EType;\r\n // The div's content.\r\n contentRows: IRow[];\r\n // Css box shadow.\r\n boxShadow?: IBoxShadow;\r\n // Css border radius.\r\n borderRadius?: number;\r\n // If the border radius should be in pixels or percent.\r\n borderUsingPercent?: boolean;\r\n // Css border color.\r\n borderColor?: string;\r\n // Css border width.\r\n borderWidth?: number;\r\n // Screen x/y position in pixels.\r\n x: number;\r\n y: number;\r\n // Width/height in pixels.\r\n width: number;\r\n height: number;\r\n // Default is absolute. When fixed the UI panels won't shift the div.\r\n position?: \"absolute\" | \"fixed\";\r\n }\r\n\r\n // Describes css box shadow.\r\n export interface IBoxShadow {\r\n horizontal: number;\r\n vertical: number;\r\n blur: number;\r\n spread: number;\r\n color: string;\r\n }\r\n\r\n // Describes a content row.\r\n export interface IRow {\r\n items: IRowItem[];\r\n height: number;\r\n }\r\n\r\n // Describes expected content of a row cell.\r\n export enum EItemType {\r\n // Default, no special handling.\r\n Default = \"DEFAULT\",\r\n // Embed, assume content is html.\r\n // Make it take over the whole cell instead of padding it and such.\r\n Embed = \"EMBED\",\r\n // Content is expected to be an SVG or font-awesome icon.\r\n Icon = \"ICON\",\r\n // Content is expected to be an image.\r\n Image = \"IMAGE\",\r\n // No content. Only a shape.\r\n None = \"NONE\"\r\n }\r\n\r\n export interface IRowItem {\r\n // Text or HTML to display.\r\n text?: string;\r\n // Embedded HTML to render when item type is \"EMBED\".\r\n // Different to text as text will be auto-cleaned.\r\n embedRaw?: string;\r\n // Embedded ICON to render when item type is \"ICON\".\r\n // Icon is expected to be a font-awesome icon.\r\n icon?: string;\r\n // Action ot perform when this cell is clicked.\r\n action?: ItemAction.IItemAction;\r\n // Background image to use.\r\n bgImage?: IRowItemImage;\r\n // Css background color.\r\n backgroundColor?: string;\r\n // Css font color.\r\n fontColor?: string;\r\n // Css font size.\r\n fontSize?: number;\r\n // Css horizontal text alignment.\r\n textAlign?: string;\r\n // Css vertical text alignment.\r\n verticalAlign?: string;\r\n // Padding in pixels to apply to all 4 sides.\r\n // @deprecated, use innerPadding instead.\r\n padding?: number;\r\n // Css padding to apply.\r\n innerPadding?: string;\r\n // Css text shadow.\r\n textShadow?: ITextShadow;\r\n // Expected content type. Dictates if special handling is needed.\r\n contentType?: EItemType;\r\n // Width of the cell in percent of total row width.\r\n width?: number;\r\n }\r\n\r\n // Describes a cell's background image.\r\n export interface IRowItemImage {\r\n // Client file id of the image.\r\n FileID?: string;\r\n // If the markup's entity's default image should be used.\r\n UseEntityDefault?: boolean;\r\n }\r\n\r\n // Describes css text shadow.\r\n export interface ITextShadow {\r\n horizontal: number;\r\n vertical: number;\r\n blur: number;\r\n color: string;\r\n }\r\n\r\n export namespace ItemAction {\r\n export interface IActionLinkParams {\r\n // URL to open.\r\n // URL may be a path to the markup's entity's attribute data.\r\n // If \"${\" and \"}\" exist in the URL, then it has entity attribute data.\r\n URL?: string;\r\n // If the URL should be opened in a new tab.\r\n openInNewTab?: boolean;\r\n // If the markup should be closed when the link is opened.\r\n closeMarkupOnOpen?: boolean;\r\n }\r\n \r\n export interface IActionBookmarkParams {\r\n // Id of the bookmark to enable.\r\n // Assumes view id matches currently rendering view.\r\n bookmarkID?: string;\r\n }\r\n\r\n export interface IActionInfoViewParams {\r\n\r\n }\r\n\r\n export interface IActionRelationParams {\r\n\r\n }\r\n\r\n export interface IActionGalleryParams {\r\n documentType?: EntityAttachmentType.EType | string;\r\n }\r\n\r\n export interface IItemAction {\r\n type: ItemAction.EType;\r\n params: IActionLinkParams | IActionInfoViewParams | IActionRelationParams | IActionGalleryParams;\r\n }\r\n\r\n // Types of actions that can be performed when a cell is clicked.\r\n // Null = \"NONE\".\r\n export enum EType {\r\n None = \"NONE\",\r\n // Open a link specified in params.\r\n OpenLink = \"LINK\",\r\n // Open the markup's entity's details panel.\r\n OpenInfoView = \"INFOVIEW\",\r\n // Open the markup's entity's gallery popup.\r\n OpenEntityGallery = \"GALLERY\",\r\n // Toggle visibility of the markup's entity's relationships.\r\n ToggleRelationships = \"RELATIONSHIPS\",\r\n // Dictates this cell can be used to drag the div around.\r\n Draggable = \"DRAGABBLE\",\r\n // Closes the markup.\r\n Close = \"CLOSE\",\r\n // Opens a bookmark specified in params.\r\n OpenBookmark = \"BOOKMARK\"\r\n }\r\n }\r\n\r\n export const DEFAULT: IDiv = {\r\n contentRows: [\r\n {\r\n height: 100,\r\n items: [\r\n {\r\n contentType: EItemType.Default,\r\n text: \"Type here...\",\r\n width: 100,\r\n backgroundColor: \"white\",\r\n fontColor: \"black\",\r\n textAlign: \"center\",\r\n verticalAlign: \"center\",\r\n fontSize: 15\r\n }\r\n ]\r\n }\r\n ],\r\n height: null,\r\n width: null,\r\n id: null,\r\n x: null,\r\n y: null,\r\n borderColor: \"black\",\r\n borderWidth: 1,\r\n borderUsingPercent: false,\r\n borderRadius: 8,\r\n type: EType.Default\r\n };\r\n }\r\n\r\n export namespace Line {\r\n // Describes a line end's head.\r\n export enum ELineHead {\r\n None = \"NONE\",\r\n Circle = \"CIRCLE\",\r\n Arrow = \"ARROW\"\r\n }\r\n\r\n export interface ILine extends IElement {\r\n pathType: \"LINE\";\r\n // SVG path string.\r\n path: string;\r\n // SVG transform string.\r\n transform: string;\r\n // Snaps determine where the ends of the line snap to.\r\n // This can be 3d positions, screen positions or links to markup DIVs.\r\n // Calculated positions of the snaps will then alter the path of the line.\r\n snaps: IAnchor[];\r\n // Css color of the line.\r\n brushColor?: string;\r\n // Css stroke width of the line.\r\n brushSize?: number;\r\n // Determines if the line should angle towards its destination instead of being straight.\r\n angled?: boolean;\r\n // Backwards compatibility.\r\n // Use brushHead on anchors instead when available.\r\n brushHead?: ELineHead;\r\n // Css color of the brush head.\r\n outlineColor?: string;\r\n }\r\n\r\n // Dictates where on a DIV an anchor should snap to.\r\n export enum EAnchorDivSide {\r\n TopLeft = 0,\r\n TopRight = 1,\r\n BottomLeft = 2,\r\n BottomRight = 3,\r\n Center = 4,\r\n CenterLeft = 5,\r\n CenterRight = 6,\r\n CenterTop = 7,\r\n CenterBottom = 8\r\n }\r\n\r\n // Dictates what end of the line an anchor should render on.\r\n export enum EAnchorLineSide {\r\n Start = 0,\r\n End = 1,\r\n }\r\n\r\n export interface IAnchor {\r\n // Id of markup DIV that this anchor is attached to.\r\n id?: string;\r\n // Side of the markup DIV we are attached to.\r\n snapPosition?: EAnchorDivSide;\r\n // Side of the line we are attached to.\r\n side?: EAnchorLineSide;\r\n // How the anchor should be drawn in the context of a line.\r\n brushHead?: ELineHead;\r\n // Css fill color.\r\n fill?: string;\r\n // Determines size of anchor's \"ARROW\" head.\r\n size?: number;\r\n // Multiplied by \"size\" to determine size of anchor \"CIRCLE\" head.\r\n outlineFactor?: number;\r\n // Css stroke color.\r\n stroke?: string;\r\n // 3d world position.\r\n cartesian?: Cartes.ICartes3;\r\n // 2d screen position.\r\n screenPos?: Cartes.ICartes2;\r\n // If the anchor's position should be relative to the markup's entity.\r\n positionFromEntity?: boolean;\r\n }\r\n\r\n export const DEFAULT: ILine = {\r\n brushColor: \"rgba(255, 255, 255, 1)\",\r\n brushSize: 4,\r\n path: null,\r\n pathType: \"LINE\",\r\n transform: null,\r\n snaps: null,\r\n id: null\r\n };\r\n }\r\n\r\n export namespace FreePaint {\r\n // Describes a free-paint end's head.\r\n export enum EPaintHead {\r\n None = \"NONE\",\r\n Circle = \"CIRCLE\",\r\n Arrow = \"ARROW\"\r\n }\r\n\r\n export interface IPaint extends IElement {\r\n pathType: \"PLAIN\";\r\n // SVG path string.\r\n path: string;\r\n // SVG transform string.\r\n transform: string;\r\n // Css color of the line.\r\n brushColor?: string;\r\n // Css stroke width of the line.\r\n brushSize?: number;\r\n // Style of the ends of the free-paint.\r\n brushHead?: EPaintHead;\r\n // Css color of the brush head if one is used.\r\n // Eg arrow or circle heads.\r\n outlineColor?: string;\r\n }\r\n\r\n export const DEFAULT: IPaint = {\r\n brushColor: \"rgba(255, 255, 255, 1)\",\r\n brushSize: 4,\r\n path: null,\r\n pathType: \"PLAIN\",\r\n transform: null,\r\n id: null\r\n };\r\n }\r\n\r\n export namespace Polygon {\r\n // Determines if terrain and 3d models should be overlapped or not.\r\n export enum EClassificationType {\r\n // 3d models and terrain are overlapped.\r\n Both = \"BOTH\",\r\n // Only terrain is overlapped.\r\n Terrain = \"TERRAIN\"\r\n }\r\n\r\n export interface IPolygon extends IElement {\r\n type: \"POLYGON\";\r\n // 3d positions of the polygon.\r\n positions: Cartes.ICartes3[];\r\n // Css color of the polygon.\r\n color?: string;\r\n // Css color of the polygon's outline.\r\n outlineColor?: string;\r\n // Width of the polygon's outline in pixels.\r\n outlineWidth?: number;\r\n // Height of the polygon in meters.\r\n extrudedHeight?: number;\r\n // Determines if terrain and 3d models should be overlapped or not.\r\n classificationType?: EClassificationType;\r\n // Determines how many times to run Chaikin's algorithm on the polygon.\r\n // Null or 0 means no smoothing.\r\n smoothen?: number;\r\n }\r\n\r\n export const DEFAULT: IPolygon = {\r\n type: \"POLYGON\",\r\n id: null,\r\n positions: null,\r\n color: \"rgba(254, 234, 57, 0.54)\",\r\n outlineColor: \"rgba(215, 215, 215, 0)\",\r\n outlineWidth: 2,\r\n extrudedHeight: 0,\r\n classificationType: EClassificationType.Both,\r\n smoothen: 0\r\n };\r\n }\r\n\r\n export namespace Polyline {\r\n export interface IPolyline extends IElement {\r\n type: \"POLYLINE\";\r\n // 3d positions of the polyline.\r\n positions: Cartes.ICartes3[];\r\n // Css color of the polyline.\r\n color?: string;\r\n // Width of the polyline in pixels.\r\n outlineWidth?: number;\r\n // Determines how many times to run Chaikin's algorithm on the polygon.\r\n // Null or 0 means no smoothing.\r\n smoothen?: number;\r\n }\r\n\r\n export const DEFAULT: IPolyline = {\r\n type: \"POLYLINE\",\r\n id: null,\r\n positions: null,\r\n color: \"rgba(254, 234, 57, 0.54)\",\r\n outlineWidth: 4,\r\n smoothen: 0\r\n };\r\n }\r\n\r\n export namespace Circle {\r\n export interface ICircle extends IElement {\r\n type: \"CIRCLE\",\r\n // 3d position of the circle.\r\n position: Cartes.ICartes3;\r\n // Radius of the circle in meters.\r\n radius: number;\r\n // Css color of the circle.\r\n color?: string;\r\n // Width of the outline in meters.\r\n outlineWidth?: number;\r\n // Height of the circle in meters.\r\n extrudedHeight?: number;\r\n // Height of the circle's outline in meters.\r\n outlineExtrusion?: number;\r\n // Css color of the circle's outline.\r\n outlineColor?: string;\r\n }\r\n\r\n export const DEFAULT: ICircle = {\r\n type: \"CIRCLE\",\r\n id: null,\r\n position: null,\r\n radius: 50,\r\n color: \"rgba(254, 234, 57, 0.54)\"\r\n };\r\n }\r\n\r\n export namespace Walkscore {\r\n export interface IWalkscore extends IElement {\r\n type: \"WALKSCORE\";\r\n // 3d position of the walkscore.\r\n cartesian: Cartes.ICartes3;\r\n // Walkscore value out of 100.\r\n details: number;\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Uploader } from \"../internal/uploader\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\n\r\nexport namespace Plugin {\r\n export function GetCacheKey(pluginId: string): string {\r\n return `${Api.ECacheKey.Plugin}${Api.ECacheKey.Id}${pluginId}`;\r\n }\r\n\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.Plugin;\r\n }\r\n\r\n export interface IPlugin {\r\n ID: string,\r\n Name: string,\r\n Version: number,\r\n Icon: string,\r\n Location: string,\r\n IsAccessRestricted: boolean,\r\n IsLoginRequired: boolean,\r\n \"LastUpdated.Date\": UTC.IUTC,\r\n \"Created.Date\": UTC.IUTC\r\n }\r\n\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n pluginId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n plugin: IPlugin\r\n }> {\r\n let { api, pluginId, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!pluginId) {\r\n throw (\"Plugin ID is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetCacheKey(pluginId), req);\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 = await api.GET(`ui.plugin/${pluginId}`, Api.PrepReqParams(req));\r\n res({\r\n plugin: 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(pluginId),\r\n value: prom,\r\n req: req\r\n });\r\n return prom;\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n plugins: IPlugin[]\r\n }> {\r\n let { api, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), req);\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 = await api.GET(\"ui.plugins\", Api.PrepReqParams(req));\r\n res({\r\n plugins: data.Items\r\n })\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: prom,\r\n req: req\r\n });\r\n return prom;\r\n }\r\n\r\n export function GetLoadUrl(params: {\r\n api?: BruceApi.Api,\r\n pluginId: string,\r\n cacheKey?: number | string\r\n }): {\r\n indexFileUrl: string\r\n } {\r\n let { api, pluginId, cacheKey } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!cacheKey) {\r\n cacheKey = 0;\r\n }\r\n return {\r\n indexFileUrl: `${api.GetBaseUrl()}ui.plugin/${pluginId}/file/index.jsc?version=${cacheKey}`\r\n };\r\n }\r\n\r\n export async function Update(params: {\r\n plugin: IPlugin,\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { plugin, api, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!plugin.Name || !plugin.ID) {\r\n throw(\"Plugin name and ID are required.\");\r\n }\r\n if (!plugin.ID) {\r\n plugin.ID = ObjectUtils.UId();\r\n }\r\n await api.POST(`ui.plugin/${plugin.ID}`, plugin, Api.PrepReqParams(req));\r\n api.Cache.Remove(GetCacheKey(plugin.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n export async function Delete(params: {\r\n pluginId: string,\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { pluginId, api, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!pluginId) {\r\n throw(\"Plugin ID is required.\");\r\n }\r\n await api.DELETE(`ui.plugin/${pluginId}`, Api.PrepReqParams(req));\r\n api.Cache.Remove(GetCacheKey(pluginId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Warning: This will replace the contents of your plugin.\r\n * Upload only ZIP files.\r\n * @param params \r\n */\r\n export async function Upload(params: {\r\n pluginId: string,\r\n api?: BruceApi.Api,\r\n file: File,\r\n onProgress?: (progress: Uploader.IProgress) => void,\r\n req?: Api.IUploadReqParams\r\n }): Promise<void> {\r\n let { pluginId, api, file, onProgress, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!pluginId || !file) {\r\n throw(\"Plugin ID and file are required.\");\r\n }\r\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n req.onProgress = (progress: ProgressEvent) => {\r\n const percent = Math.round ((progress.loaded / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n await api.UPLOAD(`ui.plugin/${pluginId}/file`, file, req);\r\n api.Cache.Remove(GetCacheKey(pluginId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Returns a run function to call that'll load a plugin within your provided container element.\r\n * The run function will return a dispose function to call to remove the plugin.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetRunFunction(params: {\r\n // If container does not have an HTML ID, one will be assigned to it.\r\n containerId?: string;\r\n container?: HTMLElement;\r\n\r\n // Arbitrary params to pass into the plugin.\r\n pluginParams?: any;\r\n \r\n // Params required to get the plugin load file.\r\n api?: BruceApi.Api,\r\n // Either plugin or plugin ID must be supplied.\r\n pluginId?: string,\r\n plugin?: Plugin.IPlugin\r\n }): Promise<{\r\n // Function to run to initialize the plugin.\r\n // This function will run eval on a generated script within your container.\r\n // It will return a dispose function to call.\r\n run: () => () => void\r\n }> {\r\n let { containerId, container, pluginParams, pluginId, plugin, api } = params;\r\n if (!containerId && container) {\r\n containerId = container.id;\r\n if (!containerId) {\r\n containerId = ObjectUtils.UId();\r\n container.id = containerId;\r\n }\r\n }\r\n if (!plugin && pluginId) {\r\n plugin = (await Plugin.Get({\r\n pluginId,\r\n api\r\n })).plugin;\r\n }\r\n if (plugin && !pluginId) {\r\n pluginId = plugin.ID;\r\n }\r\n const { indexFileUrl } = GetLoadUrl({\r\n api,\r\n pluginId,\r\n cacheKey: plugin.Version\r\n });\r\n\r\n let fileContent = await fetch(indexFileUrl).then((res) => res.text());\r\n const start = fileContent.indexOf(\"{\");\r\n const end = fileContent.lastIndexOf(\"}\");\r\n fileContent = fileContent.substring(start + 1, end);\r\n\r\n const paramsId = ObjectUtils.UId();\r\n window[paramsId] = pluginParams ? pluginParams : {};\r\n const disposeId = ObjectUtils.UId();\r\n const elementId = ObjectUtils.UId();\r\n\r\n let script = `\r\n function run() {\r\n ${fileContent}\r\n\r\n const paramsId = \"${paramsId}\";\r\n const containerId = \"${containerId}\";\r\n let container;\r\n if (containerId) {\r\n container = document.getElementById(\"${containerId}\");\r\n }\r\n\r\n let pluginHTML = null;\r\n if (container) {\r\n pluginHTML = document.createElement(\"div\");\r\n pluginHTML.id = \"${elementId}\";\r\n container.appendChild(pluginHTML);\r\n }\r\n\r\n {TEMPLATE_CODE}\r\n const params = window[\"${paramsId}\"];\r\n\r\n window[\"${disposeId}\"] = Run({\r\n element: pluginHTML,\r\n container: container,\r\n pluginParams: params\r\n });\r\n }\r\n run();\r\n `;\r\n if (script.includes(\"var template\")) {\r\n script = script.replace(\"{TEMPLATE_CODE}\", `\r\n if (pluginHTML && template) {\r\n pluginHTML.innerHTML = template;\r\n }\r\n `);\r\n }\r\n else {\r\n script = script.replace(\"{TEMPLATE_CODE}\", \"\");\r\n }\r\n\r\n return {\r\n run: () => {\r\n const eval2 = eval;\r\n eval2(script);\r\n\r\n // Ensure a function is returned, even if the plugin is not configured properly to return one.\r\n if (!window[disposeId] || typeof window[disposeId] !== \"function\") {\r\n window[disposeId] = () => {\r\n console.warn(\"Plugin called to be disposed but no dispose function was found.\");\r\n };\r\n }\r\n const callDispose = window[disposeId];\r\n return () => {\r\n if (elementId) {\r\n const element = document.getElementById(elementId);\r\n if (element && element.parentElement) {\r\n element.parentElement.removeChild(element);\r\n }\r\n }\r\n callDispose();\r\n };\r\n }\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { EntityAttribute } from \"../entity/entity-attribute\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\nexport namespace DataSource {\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.DataSource + Api.ECacheKey.Id + id;\r\n }\r\n\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.DataSource;\r\n }\r\n\r\n export interface ISource {\r\n // Not set for new records.\r\n ID?: number;\r\n Name: string;\r\n URL?: string;\r\n Type?: Type;\r\n MinLatitude?: number;\r\n MaxLatitude?: number;\r\n MinLongitude?: number;\r\n MaxLongitude?: number;\r\n DataSchema?: EntityAttribute.IAttribute;\r\n Parameters?: object;\r\n }\r\n\r\n export enum EType {\r\n IDMapping = \"IDMapping\"\r\n }\r\n export type Type = EType | string;\r\n\r\n export async function Update(params: {\r\n source: ISource,\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }) {\r\n let { source: data, api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const url = `source` + (data.ID == null ? \"\" : \"/\" + data.ID);\r\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\r\n await api.Cache.Remove(GetCacheKey(<number>data.ID));\r\n await api.Cache.Remove(GetListCacheKey());\r\n\r\n return {\r\n source: res\r\n };\r\n }\r\n\r\n export async function Delete(params: {\r\n id: number,\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }) {\r\n let { id, api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`source/${id}`, Api.PrepReqParams(reqParams));\r\n await api.Cache.Remove(GetCacheKey(id));\r\n await api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n export async function Get(params: {\r\n id: number,\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }) {\r\n let { id, api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n reqParams = Api.PrepReqParams(reqParams);\r\n const cacheData = await api.GetCacheItem(GetCacheKey(id), reqParams);\r\n if (cacheData?.found) {\r\n return cacheData.data;\r\n }\r\n\r\n const prom = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`source/${id}`, Api.PrepReqParams(reqParams));\r\n res({\r\n source: data\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n 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 export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }) {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n reqParams = Api.PrepReqParams(reqParams);\r\n const cacheData = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cacheData?.found) {\r\n return cacheData.data;\r\n }\r\n \r\n const prom = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"sources\", Api.PrepReqParams(reqParams))\r\n res({\r\n sources: data?.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n}","export * from \"./ann-document/ann-document\";\r\n\r\nexport * from \"./custom-form/custom-form\";\r\nexport * from \"./custom-form/custom-form-content\";\r\n\r\nexport * from \"./api/abstract-api\";\r\nexport * from \"./api/api\";\r\nexport * from \"./api/bruce-api\";\r\nexport * from \"./api/cam-api\";\r\nexport * from \"./api/idm-api\";\r\nexport * from \"./api/global-api\";\r\nexport * from \"./api/guardian-api\";\r\nexport * from \"./api/api-getters\";\r\n\r\nexport * from \"./calculator/calculator\";\r\n\r\nexport * from \"./common/bounds\";\r\nexport * from \"./common/bruce-event\";\r\nexport * from \"./common/cache\";\r\nexport * from \"./common/camera\";\r\nexport * from \"./common/cartes\";\r\nexport * from \"./common/carto\";\r\nexport * from \"./common/color\";\r\nexport * from \"./common/delay-queue\";\r\nexport * from \"./common/dictionary\";\r\nexport * from \"./common/geometry\";\r\nexport * from \"./common/transform\";\r\nexport * from \"./common/utc\";\r\nexport * from \"./common/bruce-variable\";\r\nexport * from \"./common/lru-cache\";\r\nexport * from \"./common/section\";\r\n\r\nexport * from \"./entity/entity-attachment-type\";\r\nexport * from \"./entity/entity-attachment\";\r\nexport * from \"./entity/entity-comment\";\r\nexport * from \"./entity/entity-link\";\r\nexport * from \"./entity/entity-lod\";\r\nexport * from \"./entity/entity-lod-category\";\r\nexport * from \"./entity/entity-relation-type\";\r\nexport * from \"./entity/entity-relation\";\r\nexport * from \"./entity/entity-source\";\r\nexport * from \"./entity/entity-tag\";\r\nexport * from \"./entity/entity-type\";\r\nexport * from \"./entity/entity\";\r\nexport * from \"./entity/entity-coords\";\r\nexport * from \"./entity/entity-type-visual-settings\";\r\nexport * from \"./entity/entity-attribute\";\r\n\r\nexport * from \"./client-file/client-file\";\r\n\r\nexport * from \"./program-key/program-key\";\r\n\r\nexport * from \"./project/zoom-control\";\r\nexport * from \"./project/menu-item\";\r\nexport * from \"./project/project-view-bookmark\";\r\nexport * from \"./project/project-view\";\r\nexport * from \"./project/project-view-legacy-tile\";\r\nexport * from \"./project/project-view-tile\";\r\nexport * from \"./project/project-view-selection\";\r\nexport * from \"./project/project-view-legacy\";\r\nexport * from \"./project/project-view-legacy-bookmark\";\r\n\r\nexport * from \"./server/pending-action\";\r\nexport * from \"./server/message-broker\";\r\nexport * from \"./server/hosting-location\";\r\n\r\nexport * from \"./style/style\";\r\n\r\nexport * from \"./tileset/tileset\";\r\n\r\nexport * from \"./user/permission\";\r\nexport * from \"./user/session\";\r\nexport * from \"./user/user-group\";\r\nexport * from \"./user/user\";\r\n\r\nexport * from \"./account/account\";\r\nexport * from \"./account/account-settings\";\r\nexport * from \"./account/account-invite\";\r\n\r\nexport * from \"./util/encrypt-utils\";\r\nexport * from \"./util/math-utils\";\r\nexport * from \"./util/object-utils\";\r\nexport * from \"./util/path-utils\";\r\nexport * from \"./util/url-utils\";\r\n\r\nexport * from \"./data-lab/data-lab\";\r\n\r\nexport * from \"./import/import-cad\";\r\nexport * from \"./import/import-csv\";\r\nexport * from \"./import/import-json\";\r\nexport * from \"./import/import-kml\";\r\nexport * from \"./import/imported-file\";\r\n\r\nexport * from \"./markup/markup\";\r\nexport * from \"./internal/uploader\";\r\nexport * from \"./plugin/plugin\";\r\nexport * from \"./environment\";\r\nexport * from \"./data-source/data-source\";\r\n\r\nexport const VERSION = \"3.2.0\";"],"names":["Api","A"],"mappings":"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"}
1
+ {"version":3,"file":"bruce-models.es5.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/account/account.ts","../src/server/hosting-location.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/util/object-utils.ts","../src/entity/entity-type.ts","../src/util/path-utils.ts","../src/entity/entity.ts","../src/common/bruce-variable.ts","../src/calculator/calculator.ts","../src/common/geometry.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-attribute.ts","../src/internal/uploader.ts","../src/client-file/client-file.ts","../src/program-key/program-key.ts","../src/project/zoom-control.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/style/style.ts","../src/user/permission.ts","../src/user/session.ts","../src/user/user-group.ts","../src/user/user.ts","../src/account/account-invite.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\";\r\n\r\n/**\r\n * Contains generic descriptions used for Nextspace requests.\r\n */\r\nexport namespace Api {\r\n /**\r\n * Cache keys utilized by methods within this library.\r\n * These help construct keys to store and retrieve data from the local cache.\r\n */\r\n export enum ECacheKey {\r\n Id = \":\",\r\n Entity = \"entity\",\r\n EntityType = \"entitytype\",\r\n ProjectView = \"projectview\",\r\n ProjectViewBookmark = \"pvbookmark\",\r\n Tileset = \"tileset\",\r\n ClientFile = \"clientfile\",\r\n Session = \"session\",\r\n PendingAction = \"pendingaction\",\r\n EntitySource = \"entitysource\",\r\n DataSource = \"datasource\",\r\n ProgramKey = \"programkey\",\r\n EntityCoords = \"entitycoords\",\r\n Tag = \"tag\",\r\n Attachment = \"attachment\",\r\n Comment = \"comment\",\r\n Link = \"link\",\r\n AnnDocument = \"anndocument\",\r\n AttachmentType = \"attachmenttype\",\r\n Relation = \"relation\",\r\n RelationType = \"relationtype\",\r\n Lod = \"lod\",\r\n LodCategory = \"lodcategory\",\r\n Style = \"style\",\r\n PublishTileset = \"publishtileset\",\r\n TilesetAccess = \"tilesetaccess\",\r\n User = \"user\",\r\n UserSettings = \"usersettings\",\r\n UserEmail = \"useremail\",\r\n AccessToken = \"accesstoken\",\r\n UserGroup = \"usergroup\",\r\n Account = \"account\",\r\n DatabaseRegion = \"databaseregion\",\r\n CustomForm = \"customform\",\r\n ImportedFile = \"importedfile\",\r\n Plugin = \"plugin\"\r\n }\r\n\r\n // 1 minute.\r\n export const DEFAULT_CACHE_DURATION = 60 * 1000;\r\n // The template client account is a container for default settings to reference.\r\n export const TEMPLATE_ACCOUNT_ID = \"template\";\r\n // Default session token header.\r\n export const ACCESS_TOKEN_HEADER = \"X-Access-Token\";\r\n\r\n /**\r\n * Possible environments we host Bruce apps on.\r\n * When these are matched, they should be case-insensitive.\r\n */\r\n export enum EEnv {\r\n // DEV environment that is separate to production data.\r\n DEV = \"DEV\",\r\n // Currently out of use.\r\n // DEV environment that is separate to production data.\r\n STG = \"STG\",\r\n // Production data with a beta API.\r\n UAT = \"UAT\",\r\n // Production data with a stable API.\r\n PROD = \"PROD\"\r\n }\r\n export type Env = EEnv | string;\r\n // False = cache is enabled by default for req-params.\r\n export let DEFAULT_NO_CACHE = false;\r\n\r\n /**\r\n * Prepares a string to be included in a url.\r\n * @param str\r\n * @returns\r\n */\r\n export function Encode(str: string): string {\r\n return encodeURIComponent(str.replace(/\\+/g, \"%2B\").replace(/\\./g, \"%2E\"));\r\n }\r\n\r\n /**\r\n * Standard list response from Nextspace APIs.\r\n * Newer APIs will typically use a different format. Eg: \"entities\" for an entity list.\r\n */\r\n export interface IList<T> {\r\n Items: T[];\r\n TotalCount?: number;\r\n }\r\n\r\n export enum ESortOrder {\r\n None = 0,\r\n Asc = 1,\r\n Desc = -1\r\n }\r\n\r\n /**\r\n * Known response encodings from Nextspace APIs.\r\n */\r\n export enum EEncoding {\r\n // Default.\r\n UTF8 = \"UTF-8\",\r\n // Deprecated. Shouldn't be found anywhere anymore.\r\n UTF16 = \"UTF-16BE\"\r\n }\r\n\r\n /**\r\n * Describes request params for any HTTP request performed through this library.\r\n */\r\n export interface IReqParams {\r\n // Default is Api.DEFAULT_CACHE_STATE.\r\n // If true then local cache check will be skipped.\r\n noCache?: boolean;\r\n // Request headers.\r\n headers?: IDictionary<string>;\r\n }\r\n\r\n /**\r\n * Prepares default settings for a request to Bruce Api.\r\n * (Currently none).\r\n * @param base\r\n * @returns\r\n */\r\n export function PrepReqParams(base?: Api.IReqParams | IUploadReqParams): IReqParams | IUploadReqParams {\r\n base = {\r\n ...base\r\n };\r\n return base;\r\n }\r\n\r\n /**\r\n * Describes upload request params.\r\n */\r\n export interface IUploadReqParams extends IReqParams {\r\n // (Optional) Upload progress callback.\r\n onProgress?: (e: ProgressEvent) => void;\r\n // The form data to upload.\r\n formData?: IDictionary<string> | FormData;\r\n }\r\n}","type Key = string | number;\ntype Persistence = \"memory\" | \"storage\";\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 // Persistence is currently set to memory until storage is reworked.\n persistence?: Persistence,\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 // Prioritize memory over storage because it's faster to access.\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}","import { CacheControl } from \"../common/cache\";\r\nimport { Api } from \"./api\";\r\n\r\n// TODO: Currently checks for CSV vs json specifically,\r\n// Need to see if our api is generally good at setting content-type headers.\r\n// Make it less specific to CSV.\r\nasync function parseResult(data: Response): Promise<any> {\r\n if (data.status >= 400 || data.status < 200) {\r\n const error = await data.json();\r\n throw(error);\r\n }\r\n\r\n let type = data.headers.get(\"Content-Type\")?.trim().toLowerCase();\r\n let encoding = type?.split(\";\").find((x) => x.startsWith(\"charset=\"))?.split(\"=\")[1].toLowerCase();\r\n if (encoding === \"utf-16\") {\r\n encoding = Api.EEncoding.UTF16;\r\n }\r\n\r\n const text = await (encoding && encoding !== \"utf-8\" \r\n ? new TextDecoder(encoding).decode(await data.arrayBuffer()) \r\n : data.text());\r\n\r\n if (!text?.trim()) {\r\n return null;\r\n }\r\n return type?.includes(\"text/csv\") ? text : JSON.parse(text);\r\n}\r\n\r\n/**\r\n * This is a base class for communication with an arbitrary Nextspace API.\r\n */\r\nexport class AbstractApi {\r\n // HTTP header to use for session ID.\r\n private ssidHeader: string;\r\n // Session ID.\r\n private ssid: string = \"\";\r\n // Base URL for API.\r\n protected baseUrl: string = \"\";\r\n // Cache control utility.\r\n public Cache: CacheControl<any>;\r\n\r\n constructor(params: {\r\n ssidHeader?: string,\r\n cacheId?: string\r\n }) {\r\n this.ssidHeader = params?.ssidHeader;\r\n this.Cache = new CacheControl<any>(params?.cacheId);\r\n }\r\n\r\n /**\r\n * Returns the base URL for the API.\r\n * @returns \r\n */\r\n public GetBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n /**\r\n * Sets the base URL for the API.\r\n * @param url \r\n */\r\n public SetBaseUrl(url: string): void {\r\n this.baseUrl = url;\r\n if (!this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl += \"/\";\r\n }\r\n }\r\n\r\n /**\r\n * Returns a cache item matching the provided key.\r\n * If the reqParams specify that caching is disabled, null is returned.\r\n * @param key \r\n * @param reqParams \r\n * @returns \r\n */\r\n public GetCacheItem(key: string, reqParams?: Api.IReqParams) {\r\n let noCache = reqParams?.noCache;\r\n if (noCache == null) {\r\n noCache = Api.DEFAULT_NO_CACHE;\r\n }\r\n if (noCache) {\r\n return null;\r\n }\r\n return this.Cache.Get(key);\r\n }\r\n\r\n /**\r\n * Sets a cache item matching the provided key.\r\n * If the reqParams specify that caching is disabled, then no action is taken.\r\n * @param params \r\n * @returns \r\n */\r\n public SetCacheItem(params: {\r\n key: string,\r\n value: any,\r\n duration?: number,\r\n req?: Api.IReqParams\r\n }) {\r\n let {key, value, duration, req} = params;\r\n let noCache = req?.noCache;\r\n if (noCache == null) {\r\n noCache = Api.DEFAULT_NO_CACHE;\r\n }\r\n if (noCache) {\r\n return;\r\n }\r\n if (isNaN(duration)) {\r\n duration = Api.DEFAULT_CACHE_DURATION;\r\n }\r\n this.Cache.Set({\r\n id: key,\r\n data: value,\r\n duration,\r\n persistence: \"memory\"\r\n });\r\n }\r\n\r\n /**\r\n * Returns the session ID.\r\n * @returns \r\n */\r\n public GetSessionId(): string {\r\n return this.ssid;\r\n }\r\n\r\n /**\r\n * Sets the session ID.\r\n * @param value \r\n */\r\n public SetSessionId(value: string): void {\r\n this.ssid = value;\r\n }\r\n\r\n /**\r\n * Returns the session header.\r\n * @returns \r\n */\r\n public GetSessionHeader(): string {\r\n return this.ssidHeader;\r\n }\r\n\r\n /**\r\n * Sets the session header.\r\n * @param value \r\n */\r\n public SetSessionHeader(value: string): void {\r\n this.ssidHeader = value;\r\n }\r\n\r\n /**\r\n * Performs a GET request.\r\n * This will NOT prepend the base URL to the provided URL.\r\n * @param url \r\n * @param params \r\n * @returns \r\n */\r\n public async get(url: string, params?: Api.IReqParams): Promise<any> {\r\n if (!params) {\r\n params = {};\r\n }\r\n params.headers = params.headers || {};\r\n params.headers = {\r\n \"Content-Type\": \"application/json;\",\r\n ...params.headers\r\n };\r\n if (this.ssidHeader && this.ssid) {\r\n params.headers[this.ssidHeader] = this.ssid;\r\n }\r\n const res = await fetch(url, {\r\n headers: params.headers\r\n });\r\n return parseResult(res);\r\n }\r\n\r\n /**\r\n * Performs a DELETE request.\r\n * This will NOT prepend the base URL to the provided URL.\r\n * @param url \r\n * @param params \r\n * @returns \r\n */\r\n public async delete(url: string, params?: Api.IReqParams): Promise<any> {\r\n if (!params) {\r\n params = {};\r\n }\r\n params.headers = params.headers || {};\r\n params.headers = {\r\n \"Content-Type\": \"application/json;\",\r\n ...params.headers\r\n };\r\n if (this.ssidHeader && this.ssid) {\r\n params.headers[this.ssidHeader] = this.ssid;\r\n }\r\n const res = await fetch(url, {\r\n headers: params.headers,\r\n method: \"DELETE\"\r\n });\r\n return parseResult(res);\r\n }\r\n\r\n /**\r\n * Performs a POST request.\r\n * This will NOT prepend the base URL to the provided URL.\r\n * @param url \r\n * @param data \r\n * @param params \r\n * @returns \r\n */\r\n public async post(url: string, data: any, params?: Api.IReqParams): Promise<any> {\r\n if (!params) {\r\n params = {};\r\n }\r\n params.headers = params.headers || {};\r\n params.headers = {\r\n \"Content-Type\": \"application/json;\",\r\n ...params.headers\r\n };\r\n if (this.ssidHeader && this.ssid) {\r\n params.headers[this.ssidHeader] = this.ssid;\r\n }\r\n if (!data) {\r\n data = {};\r\n }\r\n if (typeof data != \"string\") {\r\n data = JSON.stringify(data);\r\n }\r\n const res = await fetch(url, {\r\n headers: params.headers,\r\n method: \"POST\",\r\n body: data\r\n });\r\n return parseResult(res);\r\n }\r\n\r\n /**\r\n * Performs a PUT request.\r\n * This will NOT prepend the base URL to the provided URL.\r\n * @param url \r\n * @param data \r\n * @param params \r\n * @returns \r\n */\r\n public async put(url: string, data: any, params?: Api.IReqParams): Promise<any> {\r\n if (!params) {\r\n params = {};\r\n }\r\n params.headers = params.headers || {};\r\n params.headers = {\r\n \"Content-Type\": \"application/json;\",\r\n ...params.headers\r\n };\r\n if (this.ssidHeader && this.ssid) {\r\n params.headers[this.ssidHeader] = this.ssid;\r\n }\r\n if (!data) {\r\n data = {};\r\n }\r\n if (typeof data != \"string\") {\r\n data = JSON.stringify(data);\r\n }\r\n const res = await fetch(url, {\r\n headers: params.headers,\r\n method: \"PUT\",\r\n body: data\r\n });\r\n return parseResult(res);\r\n }\r\n\r\n /**\r\n * Performs a file upload (POST) request.\r\n * This will NOT prepend the base URL to the provided URL.\r\n * @param url \r\n * @param blob \r\n * @param params \r\n * @returns \r\n */\r\n public async upload(url: string, blob: Blob, params?: Api.IUploadReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n try {\r\n let xhr = new XMLHttpRequest();\r\n const headers = <any>params?.headers;\r\n if (headers) {\r\n const headerKeys = Object.keys(headers);\r\n for (let i = 0; i < headerKeys.length; i++) {\r\n const key = headerKeys[i];\r\n const value = headers[key];\r\n xhr.setRequestHeader(key, value);\r\n }\r\n }\r\n if (params?.onProgress) {\r\n if (xhr.upload) {\r\n xhr.upload.onprogress = params?.onProgress;\r\n }\r\n else {\r\n xhr.addEventListener(\"progress\", params?.onProgress);\r\n }\r\n }\r\n xhr.onreadystatechange = (e) => {\r\n if (xhr.readyState == 4) {\r\n if (xhr.status >= 400 || xhr.status < 200) {\r\n rej(e);\r\n }\r\n else {\r\n try {\r\n res(JSON.parse(xhr.responseText));\r\n }\r\n catch (e) {\r\n console.error(e, xhr.responseText);\r\n res(xhr.responseText);\r\n }\r\n }\r\n }\r\n };\r\n xhr.open(\"POST\", url, true);\r\n if (this.ssidHeader && this.ssid) {\r\n xhr.setRequestHeader(this.ssidHeader, this.ssid);\r\n }\r\n let formData: any;\r\n if (params?.formData instanceof FormData) {\r\n formData = params?.formData;\r\n }\r\n else {\r\n formData = new FormData();\r\n if (params?.formData) {\r\n for (const key in params.formData) {\r\n formData.append(key, params.formData[key]);\r\n }\r\n }\r\n }\r\n formData.append(\"file\", blob);\r\n xhr.send(formData);\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n }\r\n}","import { Api } from \"../api/api\";\r\n\r\n/**\r\n * TODO: rewrite.\r\n */\r\nexport namespace MessageBroker {\r\n export enum EAction {\r\n // Subscribes a client to topic messages on a server side.\r\n SUBSCRIBE = \"subscribe\",\r\n // Subscribes a client to a topic without notifying other clients.\r\n SUBSCRIBE_SHADOW = \"subscribeShadow\",\r\n // Unsubscribes clients from topic messages on a server side\r\n UNSUBSCRIBE = \"unsubscribe\",\r\n // Sends a message to all topic subscribers.\r\n BROADCAST = \"broadcast\",\r\n // Requests topic subscribers without subscribing.\r\n GET_TOPIC_SUBSCRIBERS = \"getTopicSubscribers\"\r\n }\r\n\r\n export type SubscribeType = EAction.SUBSCRIBE | EAction.SUBSCRIBE_SHADOW;\r\n\r\n export interface IMessageBase {\r\n topic: string;\r\n event?: string;\r\n data?: any;\r\n }\r\n\r\n export interface IMessage extends IMessageBase {\r\n // Timestamp of message.\r\n time?: number;\r\n // User id of message sender.\r\n user?: string;\r\n action: EAction;\r\n }\r\n\r\n export interface IBroker {\r\n /**\r\n * Add a subscriber to a topic.\r\n * @param topic \r\n * @param callback \r\n * @param action \r\n */\r\n Subscribe: (topic: string, callback: (msg: IMessage) => void, type?: SubscribeType) => void,\r\n /**\r\n * Remove a subscriber from a topic.\r\n * @param topic \r\n * @param callback \r\n */\r\n Unsubscribe: (topic: string, callback: (msg: IMessage) => void) => void,\r\n /**\r\n * Send message to server.\r\n * @param base \r\n * @returns \r\n */\r\n SendMessage: (base: IMessageBase | IMessage) => void;\r\n SetUserId: (userId: string) => void;\r\n IsConnected: boolean;\r\n }\r\n\r\n /**\r\n * Communicates with a server message broker.\r\n */\r\n export class WebSocketBroker implements IBroker {\r\n private subscriptions = new Map<string, ((msg: IMessage) => void)[]>();\r\n private ws: WebSocket;\r\n private reconnects: number = 0;\r\n private maxReconnects: number = 5;\r\n private userId: string;\r\n private uri: string;\r\n private env: Api.Env;\r\n\r\n public constructor(uri: string, env?: Api.Env) {\r\n this.uri = uri;\r\n this.env = env ? env : Api.EEnv.PROD;\r\n this.connect();\r\n }\r\n\r\n public get IsConnected(): boolean {\r\n return this.ws.readyState === WebSocket.OPEN;\r\n }\r\n\r\n public SetUserId(userId: string): void {\r\n this.userId = this.userId ? this.userId : userId;\r\n }\r\n\r\n private connect() {\r\n try {\r\n if (!WebSocket) {\r\n throw new Error(\"WebSocket is not supported by this browser\");\r\n }\r\n this.ws = new WebSocket(this.formatApiUri(this.uri));\r\n this.ws.onopen = this.onOpen.bind(this);\r\n this.ws.onmessage = this.onMessage.bind(this);\r\n this.ws.onerror = this.onError.bind(this);\r\n this.ws.onclose = this.onClose.bind(this);\r\n } \r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n private formatApiUri(uri: string): string {\r\n const ws = document.location.protocol === \"https:\" ? \"wss\" : \"ws\";\r\n return uri.replace(/^(https|http)/, ws) + \"websocket\";\r\n }\r\n\r\n private onOpen(ev: any): void {\r\n if (this.env === Api.EEnv.DEV) {\r\n console.log(\"MessageBroker connection opened: \", ev);\r\n }\r\n }\r\n\r\n private onClose(ev: any): void {\r\n if (this.env === Api.EEnv.DEV) {\r\n console.log(\"MessageBroker connection closed, trying to reconnect: \", ev);\r\n }\r\n if (this.reconnects < this.maxReconnects) {\r\n this.reconnects += 1;\r\n setTimeout(() => this.connect(), 5000 * this.reconnects);\r\n }\r\n }\r\n\r\n private onMessage(ev: any): void {\r\n const data: IMessage = JSON.parse(ev.data);\r\n this.subscriptions.get(data.topic)?.forEach(cb => cb(data));\r\n }\r\n\r\n private onError(ev: any): void {\r\n console.error(\"MessageBroker connection error: \", ev);\r\n }\r\n\r\n private addSubscriber(topic: string, callback: (msg: IMessage) => void): void {\r\n const subscribers = this.subscriptions.get(topic) || [];\r\n if (subscribers.includes(callback)) {\r\n return;\r\n }\r\n subscribers.push(callback);\r\n this.subscriptions.set(topic, subscribers);\r\n }\r\n\r\n /**\r\n * Send message to server.\r\n * @param base \r\n * @returns \r\n */\r\n public SendMessage(base: IMessageBase | IMessage): void {\r\n if (this.ws.readyState !== WebSocket.OPEN) {\r\n return;\r\n }\r\n try {\r\n const msg = base as IMessage;\r\n if (!msg.event) {\r\n msg.event = EAction.BROADCAST;\r\n }\r\n let message = base.data ? base.data : {};\r\n if (typeof message == \"object\") {\r\n message = JSON.stringify(message);\r\n }\r\n msg.data = message;\r\n\r\n const outgoingMessage: IMessage = { ...msg, user: this.userId, time: Date.now() };\r\n this.ws.send(JSON.stringify(outgoingMessage));\r\n } \r\n catch (e) {\r\n console.warn(e);\r\n }\r\n }\r\n\r\n /**\r\n * Add a subscriber to a topic.\r\n * @param topic \r\n * @param callback \r\n * @param action \r\n */\r\n public Subscribe(topic: string, callback: (msg: IMessage) => void, action?: SubscribeType): void {\r\n if (!action) {\r\n action = EAction.SUBSCRIBE;\r\n }\r\n this.addSubscriber(topic, callback);\r\n this.SendMessage({ topic, action });\r\n }\r\n\r\n /**\r\n * Remove a subscriber from a topic.\r\n * @param topic \r\n * @param callback \r\n */\r\n public Unsubscribe(topic: string, callback: (msg: IMessage) => void): void {\r\n const subscribers = this.subscriptions.get(topic) || [];\r\n this.subscriptions.set(topic, subscribers.filter(fn => fn != callback));\r\n this.SendMessage({ topic, action: EAction.UNSUBSCRIBE });\r\n }\r\n\r\n public RequestTopicUsers(topic: string, callback: (msg: IMessage) => void): void {\r\n this.addSubscriber(topic, callback);\r\n this.SendMessage({ topic, event: EAction.GET_TOPIC_SUBSCRIBERS });\r\n }\r\n }\r\n}","import { AbstractApi } from \"./abstract-api\";\r\nimport { Api as A } from \"./api\";\r\n\r\n/**\r\n * This is the request handler for Cam/Idm Api,\r\n * This API is in charge of user session management.\r\n */\r\nexport namespace GuardianApi {\r\n export class Api extends AbstractApi {\r\n // The environment this api is running on.\r\n private env: A.Env;\r\n\r\n constructor(params: {\r\n // Optional environment to use. If unspecified, the default environment will be used.\r\n // Default is A.EEnv.PROD.\r\n env?: A.Env\r\n }) {\r\n super({\r\n ssidHeader: \"x-sessionid\",\r\n cacheId: `GUARDIAN_API_${params?.env}_`\r\n });\r\n this.env = params?.env ? params.env : A.EEnv.PROD;\r\n this.setBaseUrl();\r\n }\r\n\r\n /**\r\n * Sets the base url for this api.\r\n */\r\n private setBaseUrl(): void {\r\n let url = \"https://guardian.nextspace\";\r\n const env = this.env.toUpperCase();\r\n switch (env) {\r\n case A.EEnv.DEV:\r\n url += \"-dev.net/\";\r\n break;\r\n case A.EEnv.STG:\r\n url += \"-stg.net/\";\r\n break;\r\n case A.EEnv.UAT:\r\n url += \"-uat.net/\";\r\n break;\r\n case A.EEnv.PROD:\r\n url += \".host/\";\r\n break;\r\n default:\r\n throw(\"Specified Environment is not valid. SuppliedEnv=\" + env);\r\n }\r\n this.baseUrl = url;\r\n }\r\n\r\n /**\r\n * Gets the base url for this api.\r\n * @returns \r\n */\r\n public GetBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n /**\r\n * Sets the base url for this api.\r\n * @param url \r\n */\r\n public SetBaseUrl(url: string): void {\r\n this.baseUrl = url;\r\n if (!this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl += \"/\";\r\n }\r\n }\r\n\r\n /**\r\n * Performs an HTTP GET request.\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param params \r\n * @returns \r\n */\r\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.get(this.baseUrl + url, params);\r\n }\r\n\r\n /**\r\n * Performs an HTTP DELETE request.\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param params \r\n * @returns \r\n */\r\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.delete(this.baseUrl + url, params);\r\n }\r\n\r\n /**\r\n * Performs an HTTP POST request.\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param data \r\n * @param params \r\n * @returns \r\n */\r\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\r\n return this.post(this.baseUrl + url, data, params);\r\n }\r\n\r\n /**\r\n * Performs a file upload request (HTTP POST).\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param blob \r\n * @param params \r\n * @returns \r\n */\r\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\r\n return this.upload(this.baseUrl + url, blob, params);\r\n }\r\n }\r\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 * 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\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 }\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 * Describes a Nextspace client account record.\r\n */\r\n export interface IAccount {\r\n ID?: 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 // This will depend on what \"appSettingsId\" you request for.\r\n \"Application.ID\"?: string;\r\n \"Application.Settings\"?: AccountSettings.Settings;\r\n // Hosting location ID. \r\n \"HostingLocation.Key\"?: string;\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 }\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 req = await api.GET(`account/${id}`, reqParams);\r\n const resData = {\r\n account: req\r\n };\r\n await api.SetCacheItem({\r\n key: GetCacheKey(id),\r\n value: resData,\r\n req: reqParams\r\n });\r\n return resData;\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}","import { Account } from \"../account/account\";\r\nimport { AccountSettings } from \"../account/account-settings\";\r\nimport { Api } from \"../api/api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * A hosting location is a record for a possible bruce-api server configuration.\r\n * A hosting location will have one or many database servers as well, this is an additional setting.\r\n */\r\nexport namespace HostingLocation {\r\n /**\r\n * Describes a hosting location record.\r\n */\r\n export interface ILocation {\r\n // Internal ID.\r\n ID: number;\r\n // External ID.\r\n Key: string;\r\n // Indicates if creation of a new bruce account is allowed in this region.\r\n // This should dictate if the record is visible in UI dropdowns as well for non-super-admins.\r\n IsEnabledForNewAccounts: boolean;\r\n DisplayName?: string;\r\n Description?: string;\r\n // Eg: \"us-west-1\".\r\n AWSRegion?: string;\r\n // Eg: \"Singapore\".\r\n Country?: string;\r\n // Eg: \"Vultr\".\r\n Hoster?: string;\r\n // Eg: \"San Francisco\".\r\n City?: string;\r\n // URL template to the corresponding API instance.\r\n // Eg: \"https://<ACCOUNTID>.api.nextspace-us.host/\".\r\n BruceAPIURL?: string;\r\n // Comma separated list of Api.EEnv.\r\n Environment?: string;\r\n // Arbitrary settings for the particular location.\r\n // For example this may include CDN template URLs.\r\n Settings?: any;\r\n }\r\n\r\n /**\r\n * Returns a list of hosting locations.\r\n * @Warning: This will not return the Settings property.\r\n * @param params\r\n * @returns\r\n */\r\n export async function GetList(params: {\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of hosting locations.\r\n locations: ILocation[]\r\n }> {\r\n let { api, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.GET(\"hostinglocations\", Api.PrepReqParams(req));\r\n return {\r\n locations: res.Items\r\n };\r\n }\r\n\r\n /**\r\n * Returns a hosting location record by ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetById(params: {\r\n // ID of the hosting location record.\r\n id: number,\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The hosting location record.\r\n location: ILocation\r\n }> {\r\n let { id, api, req } = params;\r\n if (!id) {\r\n throw(\"Invalid id\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.GET(`hostinglocation/id/${id}`, Api.PrepReqParams(req));\r\n return {\r\n location: res\r\n };\r\n }\r\n\r\n /**\r\n * Returns a hosting location record by key.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetByKey(params: {\r\n // Key of the hosting location record.\r\n key: string,\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n location: ILocation\r\n }> {\r\n let { key, api, req } = params;\r\n if (!key) {\r\n throw(\"Invalid key\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.GET(`hostinglocation/key/${key}`, Api.PrepReqParams(req));\r\n return {\r\n location: res\r\n };\r\n }\r\n\r\n /**\r\n * Returns hostingLocationKey from given db url.\r\n * Some older accounts don't have this set, so we need to guess it.\r\n * @param params\r\n * @returns\r\n */\r\n export function GuessKey(params: {\r\n // Database connection string.\r\n DBServer?: string\r\n }) {\r\n const { DBServer: databaseUrl } = params;\r\n if (databaseUrl.includes(\"hyperfarm-prod-instance-1\")) {\r\n return \"HYPERFARM\";\r\n }\r\n if (databaseUrl.includes(\"prod-syd1.nextspace.host\")) {\r\n return \"AU-VULTR-FIRST\";\r\n }\r\n else if (databaseUrl.includes(\"prod-nyc1.nextspace.host\")) {\r\n return \"US-VULTR-FIRST\";\r\n }\r\n else if (databaseUrl.includes(\"prod-ams1.nextspace.host\")) {\r\n return \"EU-VULTR-FIRST\";\r\n }\r\n else if (databaseUrl.includes(\"prod-sing1.nextspace.host\")) {\r\n return \"SE-VULTR-FIRST\";\r\n }\r\n else if (databaseUrl.includes(\"dev-first\")) {\r\n return \"DEV-FIRST\";\r\n }\r\n else if (databaseUrl.includes(\".ap-southeast-1.\")) {\r\n return \"SE\";\r\n }\r\n else if (databaseUrl.includes(\".us-west-1.\")) {\r\n return \"US\";\r\n }\r\n else if (databaseUrl.includes(\".eu-west-3.\")) {\r\n return \"EU\";\r\n }\r\n else if (databaseUrl.includes(\"bruce-prod-au\")) {\r\n return \"AU\";\r\n }\r\n else if (databaseUrl.includes(\"bruce-dev\")) {\r\n return \"DEV\";\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns a hosting location key by account ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetKeyByAccountId(params: {\r\n // Either accountId or apiSettings must be provided.\r\n // Client account ID.\r\n accountId?: string,\r\n // API settings for the client account.\r\n apiSettings?: AccountSettings.IBruceApi,\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Hosting location key.\r\n key: string,\r\n // Indicates if the key was inferred by legacy data.\r\n isLegacy?: boolean\r\n }> {\r\n let { accountId, apiSettings, api, req } = params;\r\n if (!accountId && !apiSettings) {\r\n throw(\"Invalid accountId or apiSettings\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const settings = apiSettings ? apiSettings : (await Account.GetAppSettings({\r\n api,\r\n accountId,\r\n appId: Account.EAppId.BruceApi\r\n })).settings as AccountSettings.IBruceApi;\r\n let hostingKey = settings[\"HostingLocation.Key\"];\r\n let isLegacy = false;\r\n if (!hostingKey) {\r\n hostingKey = settings.DBLocation;\r\n isLegacy = true;\r\n }\r\n if (!hostingKey) {\r\n hostingKey = GuessKey({\r\n DBServer: settings.DBServer\r\n });\r\n isLegacy = true;\r\n }\r\n return {\r\n key: hostingKey,\r\n isLegacy\r\n };\r\n }\r\n\r\n /**\r\n * Returns a hosting location record by account ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetByAccountId(params: {\r\n // Either accountId or apiSettings must be provided.\r\n // Client account ID.\r\n accountId?: string,\r\n // API settings for the client account.\r\n apiSettings?: AccountSettings.IBruceApi,\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Hosting location record.\r\n location: ILocation\r\n }> {\r\n let { accountId, apiSettings, api, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const data = await GetKeyByAccountId({\r\n accountId,\r\n apiSettings,\r\n api,\r\n req\r\n });\r\n if (!data?.key) {\r\n return null;\r\n }\r\n const key = await GetByKey({\r\n key: data.key,\r\n api,\r\n req\r\n });\r\n return key;\r\n }\r\n}","import { AbstractApi } from \"./abstract-api\";\r\nimport { Api as A } from \"./api\";\r\nimport { MessageBroker } from \"../server/message-broker\";\r\nimport { GuardianApi } from \"./guardian-api\";\r\nimport { HostingLocation } from \"../server/hosting-location\";\r\n\r\n/**\r\n * The primary API for communication with Nextspace.\r\n * This API is used to manage your data.\r\n */\r\nexport namespace BruceApi {\r\n /**\r\n * This is the interface for the Bruce Api getter.\r\n * A getter helps manage requests to multiple client accounts.\r\n * @deprecated, please pass an instance ApiGetters.ts instead.\r\n */\r\n export interface IGetter {\r\n accountId: string;\r\n // Default settings the getter's app is running on.\r\n env?: A.EEnv;\r\n // Should return using app defaults if no params are specified.\r\n getApi: (accountId?: string, env?: A.EEnv) => BruceApi.Api;\r\n }\r\n\r\n /**\r\n * This is the request handler for Bruce Api,\r\n * it should be passed to any method that wants to communicate with this particular api.\r\n */\r\n export class Api extends AbstractApi {\r\n // The account id this api is connected to.\r\n private accountId: string;\r\n public get AccountId(): string {\r\n return this.accountId;\r\n }\r\n // The environment this api is connected to.\r\n private env: A.Env;\r\n // Load cancelled indicates the user set a custom base url.\r\n // This will stop the regional url from being set if it's still loading.\r\n private loadCancelled: boolean = false;\r\n // The websocket message broker instance.\r\n // If null then the message broker is not loaded.\r\n private messageBroker: MessageBroker.IBroker;\r\n public get MessageBroker(): MessageBroker.IBroker {\r\n return this.messageBroker;\r\n }\r\n\r\n // The regional base url for the account.\r\n // When using the CDN base url you MUST include a query param for accountId.\r\n // Eg: \"https://d3pb232f6pp9if.cloudfront.net/entity/myEntityId?accountId=myAccountId\"\r\n private cdnBaseUrl: string;\r\n\r\n // Used for entity GET list-by-filter requests.\r\n // When set and viaCdn = true when performing an entity request, this will be used in place for base-url.\r\n // Eg: \"https://d3pb232f6pp9if.cloudfront.net/entitiesListForCDN/alex\"\r\n public EntityCdnUrl: string;\r\n // Works only for static/dynamic tilesets.\r\n // When set and viaCdn = true when getting a legacy tileset file, this will be used in place for base-url.\r\n // Eg: \"https://d15gsaz0jz5ika.cloudfront.net/alex/<TILESETID>/file/<FILEPATH>\"\r\n public LegacyTilesetCdnUrl: string;\r\n // Works for all tilesets including older ones.\r\n // Eg: \"https://blah.cloudfront.net/tilesets/<TILESETID>/files/<FILEPATH>?accountId=<ACCOUNT>\"\r\n public TilesetCdnUrl: string;\r\n\r\n // Indicates if the init process has finished loading.\r\n // This means the regional base url has been set and message broker is ready.\r\n private loadProm: Promise<void>;\r\n public get Loading(): Promise<void> {\r\n return this.loadProm;\r\n }\r\n\r\n\r\n constructor(params: {\r\n // Required client account to connect to.\r\n accountId: string,\r\n // Default is PROD.\r\n env?: A.Env,\r\n // @Deprecated, use loadConfig instead.\r\n loadRegionalBaseUrl?: boolean\r\n // True to load settings for regional base url and CDN.\r\n /// Default = false.\r\n loadConfig?: boolean\r\n // True to load message broker.\r\n // Default = true.\r\n loadWebSocket?: boolean,\r\n // Guardian instance used for regional url loading.\r\n // If not provided then a new instance of the API is made.\r\n guardian?: GuardianApi.Api,\r\n }) {\r\n super({\r\n ssidHeader: \"x-sessionid\",\r\n cacheId: `BRUCE_API_${params?.env}_${params?.accountId}_`\r\n });\r\n let {accountId, env, guardian, loadRegionalBaseUrl, loadConfig, loadWebSocket} = params;\r\n this.accountId = accountId;\r\n this.env = env ?? A.EEnv.PROD;\r\n\r\n if (loadRegionalBaseUrl) {\r\n loadConfig = true;\r\n }\r\n if (!guardian && loadConfig) {\r\n guardian = new GuardianApi.Api({\r\n env: this.env\r\n });\r\n }\r\n this.loadProm = this.init(guardian, loadConfig, loadWebSocket);\r\n }\r\n\r\n /**\r\n * Loads regional base url and sets up message broker.\r\n * @param guardian Required for loading regional base url.\r\n * @param loadConfig\r\n * @returns\r\n */\r\n private async init(\r\n guardian?: GuardianApi.Api,\r\n loadConfig?: boolean,\r\n loadWebSocket?: boolean\r\n ): Promise<void> {\r\n if (!this.accountId) {\r\n throw(\"accountId is required.\");\r\n }\r\n\r\n const env = this.env.toUpperCase();\r\n let domain = \"nextspace.host\";\r\n switch (env) {\r\n case A.EEnv.DEV:\r\n domain = \"nextspace-dev.net\";\r\n break;\r\n case A.EEnv.STG:\r\n domain = \"nextspace-stg.net\";\r\n break;\r\n case A.EEnv.UAT:\r\n domain = \"nextspace-uat.net\";\r\n break;\r\n case A.EEnv.PROD:\r\n domain = \"nextspace.host\";\r\n break;\r\n default:\r\n console.error(\"Specified Environment is not valid. SuppliedEnv=\" + env);\r\n }\r\n\r\n // Set using a stable default.\r\n this.baseUrl = `https://${this.accountId}.api.${domain}/`;\r\n\r\n if (guardian && loadConfig) {\r\n try {\r\n const host = await HostingLocation.GetByAccountId({\r\n accountId: this.accountId,\r\n api: guardian\r\n });\r\n if (host?.location) {\r\n const settings = host.location.Settings;\r\n\r\n if (!this.loadCancelled) {\r\n // Attempt to load regional base url.\r\n // First try go through settings.\r\n let urlSet = false;\r\n if (settings?.BruceAPIURL) {\r\n let envUrl = settings.BruceAPIURL[env];\r\n if (envUrl) {\r\n envUrl = envUrl\r\n .replace(\"<ACCOUNTID>\", this.accountId)\r\n .replace(\"<ACCOUNT>\", this.accountId)\r\n if (envUrl && envUrl.length > 1) {\r\n this.baseUrl = envUrl;\r\n urlSet = true;\r\n }\r\n }\r\n }\r\n // Try go through host location's base url.\r\n // This may be wrong env which is why it's used as fallback right now.\r\n if (!urlSet && host.location.BruceAPIURL) {\r\n const regionalUrl = host.location.BruceAPIURL\r\n .replace(\"<ACCOUNTID>\", this.accountId)\r\n .replace(\"<ACCOUNT>\", this.accountId)\r\n .replace(\"<DOMAIN>\", domain);\r\n if (regionalUrl && regionalUrl.length > 1) {\r\n this.baseUrl = regionalUrl;\r\n urlSet = true;\r\n }\r\n }\r\n }\r\n\r\n // Attempt to load CDN settings.\r\n if (settings?.CDN) {\r\n this.EntityCdnUrl = settings.CDN.entityURL?.[env];\r\n // We need to fix our configs.\r\n if (this.EntityCdnUrl) {\r\n if (this.EntityCdnUrl.includes(\"entitiesListForCDN\")) {\r\n this.EntityCdnUrl = this.EntityCdnUrl.replace(\"<ACCOUNT>\", this.accountId);\r\n }\r\n else {\r\n this.EntityCdnUrl = this.EntityCdnUrl.replace(\"<ACCOUNT>\", \"entitiesListForCDN/\" + this.accountId);\r\n }\r\n }\r\n this.LegacyTilesetCdnUrl = settings.CDN.legacyTilesetURL?.[env];\r\n this.TilesetCdnUrl = settings.CDN.tilesetURL?.[env];\r\n if (this.TilesetCdnUrl) {\r\n this.TilesetCdnUrl = this.TilesetCdnUrl.replace(\"<ACCOUNT>\", this.accountId);\r\n }\r\n\r\n // TilesetCdnUrl example: \"https://blah.cloudfront.net/tilesets/<TILESETID>/files/<FILEPATH>?accountId=<ACCOUNT>\".\r\n // Lazy at the moment to go around updating every region we have, I'll interpret the url from tilesetCdnUrl.\r\n if (this.TilesetCdnUrl) {\r\n try {\r\n const url = new URL(this.TilesetCdnUrl);\r\n this.cdnBaseUrl = `${url.protocol}//${url.hostname}/`;\r\n } \r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n \r\n }\r\n }\r\n }\r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n if (loadWebSocket != false) {\r\n try {\r\n this.messageBroker = new MessageBroker.WebSocketBroker(this.baseUrl, this.env);\r\n }\r\n catch (e) {\r\n console.warn(\"BruceApi: Failed to create message broker.\", e);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Warning: This method does not wait for init to finish loading.\r\n * This means the url could be changed once fully initialized.\r\n * The url will be valid either way, but the loaded one may be faster as it is region specific.\r\n * Await the \"Loading\" promise if you care about this.\r\n * @returns\r\n */\r\n public GetBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n /**\r\n * Warning: Wait the \"Loading\" promise before using this url.\r\n * @returns \r\n */\r\n public GetCdnBaseUrl(): string {\r\n return this.cdnBaseUrl;\r\n }\r\n\r\n /**\r\n * Warning: This will cancel the init process.\r\n * The init process loads a region specific endpoint.\r\n * Setting a base url will stop that process from completing.\r\n * @param url\r\n */\r\n public SetBaseUrl(url: string): void {\r\n this.baseUrl = url;\r\n if (!this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl += \"/\";\r\n }\r\n this.loadCancelled = true;\r\n }\r\n\r\n /**\r\n * Performs an HTTP GET request.\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param params \r\n * @returns \r\n */\r\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n this.loadProm.then(() => {\r\n this.get(this.baseUrl + url, params).then(res).catch(rej);\r\n }).catch(rej);\r\n });\r\n }\r\n\r\n /**\r\n * Performs an HTTP DELETE request.\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param params \r\n * @returns \r\n */\r\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n this.loadProm.then(() => {\r\n this.delete(this.baseUrl + url, params).then(res).catch(rej);\r\n }).catch(rej);\r\n });\r\n }\r\n\r\n /**\r\n * Performs an HTTP POST request.\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param data \r\n * @param params \r\n * @returns \r\n */\r\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n this.loadProm.then(() => {\r\n this.post(this.baseUrl + url, data, params).then(res).catch(rej);\r\n }).catch(rej);\r\n });\r\n }\r\n\r\n /**\r\n * Performs an HTTP PUT request.\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param data \r\n * @param params \r\n * @returns \r\n */\r\n public async PUT(url: string, data: any, params?: A.IReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n this.loadProm.then(() => {\r\n this.put(this.baseUrl + url, data, params).then(res).catch(rej);\r\n }).catch(rej);\r\n });\r\n }\r\n\r\n /**\r\n * Performs a file upload request (HTTP POST).\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param blob \r\n * @param params \r\n * @returns \r\n */\r\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\r\n return new Promise((res, rej) => {\r\n this.loadProm.then(() => {\r\n this.upload(this.baseUrl + url, blob, params).then(res).catch(rej);\r\n }).catch(rej);\r\n });\r\n }\r\n }\r\n}","import { AbstractApi } from \"./abstract-api\";\r\nimport { Api as A } from \"./api\";\r\n\r\n/**\r\n * This is the request handler for Global Api,\r\n * The global api is used to store information that is higher level than client accounts.\r\n * For example it will store usage records, client account group settings, data sharing settings, etc.\r\n */\r\nexport namespace GlobalApi {\r\n export class Api extends AbstractApi {\r\n // The environment this api is running on.\r\n private env: A.Env;\r\n\r\n constructor(params: {\r\n // Optional environment to use. If unspecified, the default environment will be used.\r\n // Default is A.EEnv.PROD.\r\n env?: A.Env\r\n }) {\r\n super({\r\n ssidHeader: \"x-sessionid\",\r\n cacheId: `GLOBAL_API_${params?.env}_`\r\n });\r\n this.env = params?.env ? params.env : A.EEnv.PROD;\r\n this.setBaseUrl();\r\n }\r\n\r\n /**\r\n * Sets the base url for this api.\r\n */\r\n private setBaseUrl(): void {\r\n let url: string;\r\n const env = this.env.toUpperCase();\r\n switch (env) {\r\n case A.EEnv.DEV:\r\n url = \"https://bruceglobal.nextspace-dev.net/\";\r\n break;\r\n case A.EEnv.STG:\r\n url = \"https://bruceglobal.nextspace-stg.net/\";\r\n break;\r\n case A.EEnv.UAT:\r\n url = \"https://bruceglobal.api.nextspace-uat.net/\";\r\n break;\r\n case A.EEnv.PROD:\r\n url = \"https://bruceglobal.api.nextspace.host/\";\r\n break;\r\n default:\r\n throw(\"Specified Environment is not valid. SuppliedEnv=\" + env);\r\n }\r\n this.baseUrl = url;\r\n }\r\n\r\n /**\r\n * Gets the base url for this api.\r\n * @returns \r\n */\r\n public GetBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n /**\r\n * Sets the base url for this api.\r\n * @param url \r\n */\r\n public SetBaseUrl(url: string): void {\r\n this.baseUrl = url;\r\n if (!this.baseUrl.endsWith(\"/\")) {\r\n this.baseUrl += \"/\";\r\n }\r\n }\r\n\r\n /**\r\n * Performs an HTTP GET request.\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param params \r\n * @returns \r\n */\r\n public async GET(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.get(this.baseUrl + url, params);\r\n }\r\n\r\n /**\r\n * Performs an HTTP DELETE request.\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param params \r\n * @returns \r\n */\r\n public async DELETE(url: string, params?: A.IReqParams): Promise<any> {\r\n return this.delete(this.baseUrl + url, params);\r\n }\r\n\r\n /**\r\n * Performs an HTTP POST request.\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param data \r\n * @param params \r\n * @returns \r\n */\r\n public async POST(url: string, data: any, params?: A.IReqParams): Promise<any> {\r\n return this.post(this.baseUrl + url, data, params);\r\n }\r\n\r\n /**\r\n * Performs a file upload request (HTTP POST).\r\n * This will prepend the base url to the url.\r\n * @param url \r\n * @param blob \r\n * @param params \r\n * @returns \r\n */\r\n public async UPLOAD(url: string, blob: Blob, params?: A.IUploadReqParams): Promise<any> {\r\n return this.upload(this.baseUrl + url, blob, params);\r\n }\r\n }\r\n}","import { IDictionary } from \"../common/dictionary\";\r\nimport { Api } from \"./api\";\r\nimport { BruceApi } from \"./bruce-api\";\r\nimport { GlobalApi } from \"./global-api\";\r\nimport { GuardianApi } from \"./guardian-api\";\r\n\r\n/**\r\n * Utility for managing multiple API instances.\r\n * Example: {\r\n * const api = new ApiGetters({\r\n * accountId: \"123\",\r\n * env: Api.EEnv.PROD\r\n * });\r\n * \r\n * // Returns default API instance specified in constructor.\r\n * const bruce1 = api.GetBruceApi();\r\n * // Returns API instance for account 456.\r\n * const bruce2 = api.GetBruceApi({\r\n * accountId: \"456\"\r\n * });\r\n * \r\n * const global = api.GetGlobalApi();\r\n * const guardian = api.GetGuardianApi();\r\n * }\r\n */\r\nexport class ApiGetters {\r\n private bruce: IDictionary<BruceApi.Api> = {};\r\n private guardian: IDictionary<GuardianApi.Api> = {};\r\n private global: IDictionary<GlobalApi.Api> = {};\r\n // Default account ID to use when one is unspecified.\r\n private accountId: string;\r\n // Default environment to use when one is unspecified.\r\n private env: Api.EEnv;\r\n // Session ID to use for all API instances.\r\n private sessionId: string;\r\n\r\n constructor(params: {\r\n // Optional account ID to use. If unspecified, the default account ID will be used.\r\n accountId: string,\r\n // Optional environment to use. If unspecified, the default environment will be used.\r\n // Default is PROD.\r\n env?: Api.EEnv,\r\n // Session ID to use for all API instances.\r\n sessionId?: string\r\n }) {\r\n this.accountId = params?.accountId;\r\n this.env = params?.env ? params.env : Api.EEnv.PROD;\r\n this.sessionId = params?.sessionId;\r\n }\r\n\r\n /**\r\n * Clears all cache items in all API instances.\r\n */\r\n public ClearCache() {\r\n for (const key in this.bruce) {\r\n this.bruce[key]?.Cache?.Clear();\r\n }\r\n for (const key in this.guardian) {\r\n this.guardian[key]?.Cache?.Clear();\r\n }\r\n for (const key in this.global) {\r\n this.global[key]?.Cache?.Clear();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the default account ID to use when one is unspecified.\r\n * @param accountId \r\n */\r\n public SetAccountId(accountId: string) {\r\n this.accountId = accountId;\r\n }\r\n\r\n /**\r\n * Returns the default account ID to use when one is unspecified.\r\n * @returns \r\n */\r\n public GetAccountId(): string {\r\n return this.accountId;\r\n }\r\n\r\n /**\r\n * Sets the default environment to use when one is unspecified.\r\n * @param env \r\n */\r\n public SetEnv(env: Api.EEnv) {\r\n this.env = env;\r\n }\r\n\r\n /**\r\n * Returns the default environment to use when one is unspecified.\r\n * @returns \r\n */\r\n public GetEnv(): Api.EEnv {\r\n return this.env;\r\n }\r\n\r\n /**\r\n * Updates the session ID for all API instances.\r\n * This will auto-clear all cache items.\r\n * @param sessionId \r\n */\r\n public SetSessionId(sessionId: string) {\r\n this.sessionId = sessionId;\r\n for (const key in this.bruce) {\r\n this.bruce[key].SetSessionId(sessionId);\r\n }\r\n for (const key in this.global) {\r\n this.global[key].SetSessionId(sessionId);\r\n }\r\n this.ClearCache();\r\n }\r\n\r\n /**\r\n * Returns the session ID.\r\n * @returns \r\n */\r\n public GetSessionId(): string {\r\n return this.sessionId;\r\n }\r\n\r\n /**\r\n * Returns a BruceApi instance.\r\n * @param params \r\n * @returns \r\n */\r\n public GetBruceApi(params?: {\r\n // Optional accountId to use. If unspecified, the default account ID will be used.\r\n accountId?: string,\r\n // Optional environment to use. If unspecified, the default environment will be used.\r\n env?: Api.EEnv\r\n }): BruceApi.Api {\r\n if (!params) {\r\n params = {};\r\n }\r\n let {accountId, env} = params;\r\n accountId = accountId ? accountId : this.accountId;\r\n env = env ? env : this.env;\r\n const key = `${accountId}-${env}`;\r\n if (!this.bruce[key]) {\r\n this.bruce[key] = new BruceApi.Api({\r\n accountId,\r\n env,\r\n loadRegionalBaseUrl: true\r\n });\r\n this.bruce[key].SetSessionId(this.sessionId);\r\n }\r\n return this.bruce[key];\r\n }\r\n\r\n /**\r\n * Returns a BruceApi getter instance.\r\n * This is a micro-utility that is used to request the bruce-api specifically for various client accounts.\r\n * @deprecated: use the full api-getters instance instead.\r\n * @returns \r\n */\r\n public GetBruceGetter(): BruceApi.IGetter {\r\n return {\r\n accountId: this.accountId,\r\n env: this.env,\r\n getApi: (accountId?: string, env?: Api.EEnv) => {\r\n return this.GetBruceApi({accountId, env});\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns a GlobalApi instance.\r\n * @param params \r\n * @returns \r\n */\r\n public GetGlobalApi(params?: {\r\n // Optional environment to use. If unspecified, the default environment will be used.\r\n env?: Api.EEnv\r\n }): GlobalApi.Api {\r\n if (!params) {\r\n params = {};\r\n }\r\n let {env} = params;\r\n env = env ? env : this.env;\r\n const key = `${env}`;\r\n if (!this.global[key]) {\r\n this.global[key] = new GlobalApi.Api({\r\n env\r\n });\r\n this.global[key].SetSessionId(this.sessionId);\r\n }\r\n return this.global[key];\r\n }\r\n\r\n /**\r\n * Returns a GuardianApi instance.\r\n * @param params \r\n * @returns \r\n */\r\n public GetGuardianApi(params?: {\r\n // Optional environment to use. If unspecified, the default environment will be used.\r\n env?: Api.EEnv\r\n }): GuardianApi.Api {\r\n if (!params) {\r\n params = {};\r\n }\r\n let {env} = params;\r\n env = env ? env : this.env;\r\n const key = `${env}`;\r\n if (!this.guardian[key]) {\r\n this.guardian[key] = new GuardianApi.Api({\r\n env\r\n });\r\n this.guardian[key].SetSessionId(this.sessionId);\r\n }\r\n return this.guardian[key];\r\n }\r\n}","import { Api as A } from \"./api/api\";\r\nimport { ApiGetters } from \"./api/api-getters\";\r\n\r\ninterface IParams {\r\n isSelfManaged?: boolean;\r\n accountId?: string;\r\n env?: A.EEnv;\r\n sessionId?: string;\r\n apiGetters?: ApiGetters;\r\n}\r\n\r\n// Global instance for smaller use-cases where you don't want to manage the getters yourself.\r\nlet _getters: ApiGetters;\r\n\r\nexport namespace ENVIRONMENT {\r\n // If true, then defaults are not touched and it's assumed this is being managed.\r\n export let IS_SELF_MANAGED = false;\r\n // Unused if IS_SELF_MANAGED is false.\r\n export let PARAMS: IParams = {\r\n // Default client account ID.\r\n accountId: \"\",\r\n // Default environment.\r\n env: A.EEnv.UAT,\r\n // Default session ID.\r\n sessionId: \"\"\r\n };\r\n\r\n /**\r\n * Returns the ApiGetters instance.\r\n * This is used to communicate with any Nextspace API instance.\r\n * @returns \r\n */\r\n export function Api() {\r\n if (IS_SELF_MANAGED) {\r\n throw(\"Self managed mode ON. You are getting this error because you didn't pass an Api instance to a function.\");\r\n }\r\n if (!PARAMS.accountId) {\r\n console.warn(\"No accountId set. This is required for the getters to work properly.\");\r\n }\r\n if (!_getters) {\r\n _getters = new ApiGetters({\r\n accountId: PARAMS.accountId,\r\n env: PARAMS.env ? PARAMS.env : A.EEnv.UAT,\r\n sessionId: PARAMS.sessionId\r\n });\r\n }\r\n return _getters;\r\n }\r\n\r\n /**\r\n * Resets the environment to the specified params.\r\n * @param params \r\n */\r\n export function Reset(params?: IParams) {\r\n if (IS_SELF_MANAGED) {\r\n throw(\"Self managed mode ON. You are getting this error because you didn't pass an Api instance to a function.\");\r\n }\r\n if (_getters) {\r\n _getters.ClearCache();\r\n if (params.accountId) {\r\n _getters.SetAccountId(params.accountId);\r\n }\r\n if (params.sessionId) {\r\n _getters.SetSessionId(params.sessionId);\r\n }\r\n if (params.env) {\r\n _getters.SetEnv(params.env);\r\n }\r\n }\r\n PARAMS = {\r\n ...PARAMS,\r\n ...params\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\ntype Type = AnnDocument.EType | string;\r\n\r\n/**\r\n * Describes communication with the \"Annotated Document\" concept in Bruce.\r\n * Annotated documents are files with hotspots that can link to Entity records.\r\n */\r\nexport namespace AnnDocument {\r\n /**\r\n * Returns cache identifier for an annotated document 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 id \r\n * @returns \r\n */\r\n export function GetCacheKey(id: number) {\r\n return `${Api.ECacheKey.AnnDocument}${Api.ECacheKey.Id}${id}`;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of annotated documents by type.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"SVG\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param type \r\n * @returns \r\n */\r\n export function GetListCacheKey(type: Type) {\r\n return Api.ECacheKey.AnnDocument + type;\r\n }\r\n\r\n /**\r\n * Describes a hotspot on an annotated document.\r\n * Hotspots are areas of interest on the document that can be linked to Entity records.\r\n */\r\n export interface IHotspot {\r\n X: number;\r\n Y: number;\r\n Key: string;\r\n Description?: string;\r\n LinkedEntity?: {\r\n \"Entity.ID\": string;\r\n };\r\n }\r\n\r\n /**\r\n * Describes settings for an annotated document.\r\n */\r\n export interface ISettings {\r\n Hotspots?: IHotspot[];\r\n DrawingScaleFactorX?: number;\r\n DrawingScaleFactorY?: number;\r\n }\r\n\r\n /**\r\n * Describes an annotated document record.\r\n */\r\n export interface IDocument {\r\n ID?: number;\r\n Type: Type;\r\n Name: string;\r\n \"ClientFile.ID\": string;\r\n Settings?: ISettings;\r\n }\r\n\r\n /**\r\n * The types of supported annotated documents.\r\n */\r\n export enum EType {\r\n SVG = \"SVG\"\r\n }\r\n\r\n /**\r\n * Returns an annotated document by ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n docId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n document: IDocument\r\n }> {\r\n let { api, docId, req: reqParams } = params;\r\n if (!docId) {\r\n throw(\"Doc ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const key = GetCacheKey(docId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`documentView/${docId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n document: 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,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns a list of annotated documents by type.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n // If not specified, all types are returned.\r\n docType?: Type,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n documents: IDocument[]\r\n }> {\r\n let { api, docType: type, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!type) {\r\n type = \"\";\r\n }\r\n \r\n const cache = await api.GetCacheItem(GetListCacheKey(type), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const url = \"documentViews\" + (type ? \"?type=\" + type : \"\");\r\n const data = await api.GET(url, Api.PrepReqParams(reqParams));\r\n res({\r\n documents: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(type),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { CustomFormContent } from \"./custom-form-content\";\r\n\r\n/**\r\n * Describes the \"Custom Form\" concept within Nextspace.\r\n * Custom forms are dynamic dialogs that get populated with Entity data.\r\n */\r\nexport namespace CustomForm {\r\n /**\r\n * Returns cache identifier for a Custom Form 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 id \r\n * @returns \r\n */\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.CustomForm + Api.ECacheKey.Id + id;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of Custom Forms by Entity Type ID.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"123\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param typeId \r\n * @returns \r\n */\r\n export function GetListCacheKey(typeId: string): string {\r\n if (typeId) {\r\n return Api.ECacheKey.CustomForm + Api.ECacheKey.EntityType + Api.ECacheKey.Id + typeId;\r\n }\r\n return Api.ECacheKey.CustomForm;\r\n }\r\n\r\n /**\r\n * Describes a custom form record.\r\n */\r\n export interface IForm {\r\n ID?: number;\r\n // This is the entity type ID that this custom form is associated with.\r\n \"EntityType.ID\"?: string;\r\n // Human readable custom form name.\r\n Name?: string;\r\n // Custom form content.\r\n Settings?: CustomFormContent.IContent | any;\r\n // Custom form type. This helps identify how to parse the settings.\r\n Type?: EType;\r\n }\r\n\r\n /**\r\n * Types of custom forms available.\r\n */\r\n export enum EType {\r\n // Deprecated types.\r\n Form = \"GENERIC\",\r\n Markup = \"MARKUP\",\r\n // Supported types.\r\n ComponentStack = \"COMPONENT_STACK\"\r\n }\r\n\r\n /**\r\n * Gets a custom form by ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // The ID of the custom form to get.\r\n formId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The custom form record associated with the ID.\r\n form: IForm\r\n }> {\r\n let { api, formId: id, req: reqParams } = params;\r\n if (!id) {\r\n throw(\"Id is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\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 = await api.GET(`customForm/${id}`, Api.PrepReqParams(reqParams));\r\n res({\r\n form: data\r\n });\r\n } catch (err) {\r\n rej(err);\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 * Deletes a custom form by ID.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // The ID of the custom form to delete.\r\n formId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, formId: id, req: reqParams } = params;\r\n if (!id) {\r\n return Promise.resolve();\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`customForm/${id}`, Api.PrepReqParams(reqParams))\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.CustomForm);\r\n }\r\n\r\n /**\r\n * Gets a list of custom forms by entity type ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n // The ID of the entity type to get custom forms for.\r\n entityTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of custom forms associated with the entity type ID.\r\n forms: IForm[]\r\n }> {\r\n let { api, entityTypeId: typeId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const url = typeId ? `entityType/${typeId}/customForms` : \"customForms\";\r\n const cache = await api.GetCacheItem(GetListCacheKey(typeId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req = api.GET(url, Api.PrepReqParams(reqParams));\r\n const prom = req.then((data) => {\r\n return {\r\n forms: data.Items\r\n };\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(typeId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Creates or updates a custom form record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // The custom form record to create or update.\r\n // To create a record don't set the ID property.\r\n form: IForm,\r\n reqParams?: Api.IReqParams\r\n }): Promise<{\r\n // The custom form record that was created or updated.\r\n form: IForm\r\n }> {\r\n let { api, form: data, reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!data.ID) {\r\n data.ID = 0;\r\n }\r\n const res = await api.POST(`customForm/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.CustomForm);\r\n return {\r\n form: res\r\n };\r\n }\r\n}","/**\r\n * Dictionary of CSS color names and their hex values.\r\n */\r\nexport const COLOR_CSS_DEFAULTS = {\r\n \"aliceblue\": \"#F0F8FF\",\r\n \"antiquewhite\": \"#FAEBD7\",\r\n \"aqua\": \"#00FFFF\",\r\n \"aquamarine\": \"#7FFFD4\",\r\n \"azure\": \"#F0FFFF\",\r\n \"beige\": \"#F5F5DC\",\r\n \"bisque\": \"#FFE4C4\",\r\n \"black\": \"#000000\",\r\n \"blanchedalmond\": \"#FFEBCD\",\r\n \"blue\": \"#0000FF\",\r\n \"blueviolet\": \"#8A2BE2\",\r\n \"brown\": \"#A52A2A\",\r\n \"burlywood\": \"#DEB887\",\r\n \"cadetblue\": \"#5F9EA0\",\r\n \"chartreuse\": \"#7FFF00\",\r\n \"chocolate\": \"#D2691E\",\r\n \"coral\": \"#FF7F50\",\r\n \"cornflowerblue\": \"#6495ED\",\r\n \"cornsilk\": \"#FFF8DC\",\r\n \"crimson\": \"#DC143C\",\r\n \"cyan\": \"#00FFFF\",\r\n \"darkblue\": \"#00008B\",\r\n \"darkcyan\": \"#008B8B\",\r\n \"darkgoldenrod\": \"#B8860B\",\r\n \"darkgray\": \"#A9A9A9\",\r\n \"darkgreen\": \"#006400\",\r\n \"darkgrey\": \"#A9A9A9\",\r\n \"darkkhaki\": \"#BDB76B\",\r\n \"darkmagenta\": \"#8B008B\",\r\n \"darkolivegreen\": \"#556B2F\",\r\n \"darkorange\": \"#FF8C00\",\r\n \"darkorchid\": \"#9932CC\",\r\n \"darkred\": \"#8B0000\",\r\n \"darksalmon\": \"#E9967A\",\r\n \"darkseagreen\": \"#8FBC8F\",\r\n \"darkslateblue\": \"#483D8B\",\r\n \"darkslategray\": \"#2F4F4F\",\r\n \"darkslategrey\": \"#2F4F4F\",\r\n \"darkturquoise\": \"#00CED1\",\r\n \"darkviolet\": \"#9400D3\",\r\n \"deeppink\": \"#FF1493\",\r\n \"deepskyblue\": \"#00BFFF\",\r\n \"dimgray\": \"#696969\",\r\n \"dimgrey\": \"#696969\",\r\n \"dodgerblue\": \"#1E90FF\",\r\n \"firebrick\": \"#B22222\",\r\n \"floralwhite\": \"#FFFAF0\",\r\n \"forestgreen\": \"#228B22\",\r\n \"fuchsia\": \"#FF00FF\",\r\n \"gainsboro\": \"#DCDCDC\",\r\n \"ghostwhite\": \"#F8F8FF\",\r\n \"gold\": \"#FFD700\",\r\n \"goldenrod\": \"#DAA520\",\r\n \"gray\": \"#808080\",\r\n \"green\": \"#008000\",\r\n \"greenyellow\": \"#ADFF2F\",\r\n \"grey\": \"#808080\",\r\n \"honeydew\": \"#F0FFF0\",\r\n \"hotpink\": \"#FF69B4\",\r\n \"indianred\": \"#CD5C5C\",\r\n \"indigo\": \"#4B0082\",\r\n \"ivory\": \"#FFFFF0\",\r\n \"khaki\": \"#F0E68C\",\r\n \"lavender\": \"#E6E6FA\",\r\n \"lavenderblush\": \"#FFF0F5\",\r\n \"lawngreen\": \"#7CFC00\",\r\n \"lemonchiffon\": \"#FFFACD\",\r\n \"lightblue\": \"#ADD8E6\",\r\n \"lightcoral\": \"#F08080\",\r\n \"lightcyan\": \"#E0FFFF\",\r\n \"lightgoldenrodyellow\": \"#FAFAD2\",\r\n \"lightgray\": \"#D3D3D3\",\r\n \"lightgreen\": \"#90EE90\",\r\n \"lightgrey\": \"#D3D3D3\",\r\n \"lightpink\": \"#FFB6C1\",\r\n \"lightsalmon\": \"#FFA07A\",\r\n \"lightseagreen\": \"#20B2AA\",\r\n \"lightskyblue\": \"#87CEFA\",\r\n \"lightslategray\": \"#778899\",\r\n \"lightslategrey\": \"#778899\",\r\n \"lightsteelblue\": \"#B0C4DE\",\r\n \"lightyellow\": \"#FFFFE0\",\r\n \"lime\": \"#00FF00\",\r\n \"limegreen\": \"#32CD32\",\r\n \"linen\": \"#FAF0E6\",\r\n \"magenta\": \"#FF00FF\",\r\n \"maroon\": \"#800000\",\r\n \"mediumaquamarine\": \"#66CDAA\",\r\n \"mediumblue\": \"#0000CD\",\r\n \"mediumorchid\": \"#BA55D3\",\r\n \"mediumpurple\": \"#9370DB\",\r\n \"mediumseagreen\": \"#3CB371\",\r\n \"mediumslateblue\": \"#7B68EE\",\r\n \"mediumspringgreen\": \"#00FA9A\",\r\n \"mediumturquoise\": \"#48D1CC\",\r\n \"mediumvioletred\": \"#C71585\",\r\n \"midnightblue\": \"#191970\",\r\n \"mintcream\": \"#F5FFFA\",\r\n \"mistyrose\": \"#FFE4E1\",\r\n \"moccasin\": \"#FFE4B5\",\r\n \"navajowhite\": \"#FFDEAD\",\r\n \"navy\": \"#000080\",\r\n \"oldlace\": \"#FDF5E6\",\r\n \"olive\": \"#808000\",\r\n \"olivedrab\": \"#6B8E23\",\r\n \"orange\": \"#FFA500\",\r\n \"orangered\": \"#FF4500\",\r\n \"orchid\": \"#DA70D6\",\r\n \"palegoldenrod\": \"#EEE8AA\",\r\n \"palegreen\": \"#98FB98\",\r\n \"paleturquoise\": \"#AFEEEE\",\r\n \"palevioletred\": \"#DB7093\",\r\n \"papayawhip\": \"#FFEFD5\",\r\n \"peachpuff\": \"#FFDAB9\",\r\n \"peru\": \"#CD853F\",\r\n \"pink\": \"#FFC0CB\",\r\n \"plum\": \"#DDA0DD\",\r\n \"powderblue\": \"#B0E0E6\",\r\n \"purple\": \"#800080\",\r\n \"rebeccapurple\": \"#663399\",\r\n \"red\": \"#FF0000\",\r\n \"rosybrown\": \"#BC8F8F\",\r\n \"royalblue\": \"#4169E1\",\r\n \"saddlebrown\": \"#8B4513\",\r\n \"salmon\": \"#FA8072\",\r\n \"sandybrown\": \"#F4A460\",\r\n \"seagreen\": \"#2E8B57\",\r\n \"seashell\": \"#FFF5EE\",\r\n \"sienna\": \"#A0522D\",\r\n \"silver\": \"#C0C0C0\",\r\n \"skyblue\": \"#87CEEB\",\r\n \"slateblue\": \"#6A5ACD\",\r\n \"slategray\": \"#708090\",\r\n \"slategrey\": \"#708090\",\r\n \"snow\": \"#FFFAFA\",\r\n \"springgreen\": \"#00FF7F\",\r\n \"steelblue\": \"#4682B4\",\r\n \"tan\": \"#D2B48C\",\r\n \"teal\": \"#008080\",\r\n \"thistle\": \"#D8BFD8\",\r\n \"tomato\": \"#FF6347\",\r\n \"turquoise\": \"#40E0D0\",\r\n \"violet\": \"#EE82EE\",\r\n \"wheat\": \"#F5DEB3\",\r\n \"white\": \"#FFFFFF\",\r\n \"whitesmoke\": \"#F5F5F5\",\r\n \"yellow\": \"#FFFF00\",\r\n \"yellowgreen\": \"#9ACD32\"\r\n};","import { COLOR_CSS_DEFAULTS } from \"./color-css-defaults\";\r\n\r\nexport namespace Color {\r\n export interface IColor {\r\n // Max: 255, Min: 0.\r\n red: number;\r\n green: number;\r\n blue: number;\r\n // Max: 1, Min: 0.\r\n alpha: number ;\r\n }\r\n\r\n /**\r\n * Setting for how a colour should be applied in certain contexts.\r\n * For example should a 3D model's colour be replaced or blended with?\r\n */\r\n export enum EBlendMode {\r\n HIGHLIGHT,\r\n REPLACE,\r\n MIX\r\n }\r\n\r\n export interface IBlendSettings {\r\n blendMode?: EBlendMode;\r\n // 1 = 100% new color. 0 = original color.\r\n blendPercent?: number;\r\n }\r\n\r\n export function RandomColor(): IColor {\r\n // https://stackoverflow.com/a/7352887\r\n const brightness = 4;\r\n const rgb = [Math.random() * 256, Math.random() * 256, Math.random() * 256];\r\n const mix = [brightness * 51, brightness * 51, brightness * 51];\r\n const mixedrgb = [rgb[0] + mix[0], rgb[1] + mix[1], rgb[2] + mix[2]].map(function(x){\r\n return Math.round(x / 2.0);\r\n });\r\n const str = \"rgba(\" + mixedrgb.join(\",\") + \",0.9\" + \")\";\r\n return ColorFromStr(str);\r\n }\r\n\r\n /**\r\n * Attempts to parse a given css-color.\r\n * On failure null is returned.\r\n * @param str \r\n * @returns \r\n */\r\n export function ColorFromStr(str: string): IColor {\r\n if (!str || typeof str != \"string\") {\r\n return <any>null;\r\n }\r\n\r\n // Check for known CSS keywords.\r\n const knownHex = COLOR_CSS_DEFAULTS[str.toLowerCase()];\r\n if (knownHex) {\r\n str = knownHex;\r\n }\r\n \r\n if (str.charAt(0) == \"#\") {\r\n str = str.substring(1);\r\n }\r\n let r: number, g: number, b: number, a: number;\r\n const rgba = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([^\\)]+)\\s*)?\\)$/.exec(str);\r\n if (rgba) {\r\n r = parseInt(rgba[1]);\r\n g = parseInt(rgba[2]);\r\n b = parseInt(rgba[3]);\r\n a = rgba[4] != null ? parseFloat(rgba[4]) : 1;\r\n return {\r\n red: r,\r\n green: g,\r\n blue: b,\r\n alpha: a\r\n }\r\n }\r\n if (str.length == 6) {\r\n // rgb.\r\n const parsed = /^(.{2})(.{2})(.{2})/.exec(str);\r\n if (!parsed) {\r\n return <any>null;\r\n }\r\n r = parseInt(parsed[1], 16);\r\n g = parseInt(parsed[2], 16);\r\n b = parseInt(parsed[3], 16);\r\n a = 1;\r\n }\r\n else if (str.length == 8) {\r\n // rgba.\r\n const parsed = /^(.{2})(.{2})(.{2})(.{2})/.exec(str);\r\n if (!parsed) {\r\n return <any>null;\r\n }\r\n r = parseInt(parsed[1], 16);\r\n g = parseInt(parsed[2], 16);\r\n b = parseInt(parsed[3], 16);\r\n a = parseInt(parsed[4], 16);\r\n if (a != 0) {\r\n a = a/255;\r\n }\r\n }\r\n else {\r\n return <any>null;\r\n }\r\n if (a == null) {\r\n a = 1;\r\n }\r\n return {\r\n red: r,\r\n blue: b,\r\n green: g,\r\n alpha: a\r\n }\r\n }\r\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}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\nimport { Entity } from \"./entity\";\r\nimport { EntityAttribute } from \"./entity-attribute\";\r\nimport { EntityTypeVisualSettings } from \"./entity-type-visual-settings\";\r\n\r\n/**\r\n * Describes the \"Entity Type\" concept within Nextspace.\r\n * An entity type is an \"expectation\" of what data \"should\" look like in a particular entity record.\r\n * The schema is stencils onto entity data to filter out what we should display or search against.\r\n */\r\nexport namespace EntityType {\r\n /**\r\n * Returns cache identifier for an entity type.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param typeId\r\n * @returns \r\n */\r\n export function GetCacheKey(typeId: string): string {\r\n return `${Api.ECacheKey.EntityType}${Api.ECacheKey.Id}${typeId}`;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of entity types.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @returns \r\n */\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.EntityType;\r\n }\r\n\r\n /**\r\n * Describes an entity type record.\r\n */\r\n export interface IType {\r\n // ID of the entity type.\r\n ID?: string;\r\n // Whether or not the entity type is deleted.\r\n // Unlikely to ever surface to client.\r\n IsDeleted?: boolean;\r\n // Human readable name of the entity type.\r\n Name: string;\r\n // Description of the entity type.\r\n Description?: string;\r\n // An entity record used for default values.\r\n Data?: Entity.IEntity;\r\n // If entity type access (and entity access) should be restricted.\r\n // When an entity type is restricted a user must have the \"EntityType_<typeId>\" permission.\r\n IsAccessRestricted?: boolean;\r\n // The data schema defining expected attributes for entities to have.\r\n DataSchema?: {\r\n Key: \"root\",\r\n Name?: \"Root\",\r\n Structure: EntityAttribute.IAttribute[],\r\n Type: EntityAttribute.EType.Structure\r\n };\r\n // Split by comma then use \"BrucePathUtils.ParsePath(..) on each item\".\r\n // This is an array of attribute paths to use for display name.\r\n // The default will be the entity's ID.\r\n DisplayNameAttributePath?: string;\r\n // If this schema is \"strict\". If entities in an entity type are different enough between each-other then the schema is not strict.\r\n // This will dictate how UI will display the attributes.\r\n IsStrictSchema?: boolean;\r\n // Default style for the corresponding entities.\r\n \"DisplaySetting.ID\"?: number;\r\n // Last updated date/time.\r\n \"LastUpdate.Time\"?: UTC.IUTC;\r\n // ID of the parent entity type.\r\n // This is used for organization. When a parent type is deleted, the child types are also deleted.\r\n \"Parent.EntityType.ID\"?: string;\r\n // @deprecated.\r\n VisualSettings?: EntityTypeVisualSettings.ISettings;\r\n // @deprecated.\r\n AuthoringSettings?: {\r\n enabledTools: string[];\r\n defaultTool: string;\r\n };\r\n }\r\n\r\n /**\r\n * Gets an entity type record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the entity type.\r\n entityTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity type record.\r\n entityType: IType\r\n }> {\r\n let { api, entityTypeId: typeId, req: reqParams } = params;\r\n if (!typeId) {\r\n throw(\"Type ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const key = GetCacheKey(typeId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`entitytype/${typeId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n entityType: 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,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Deletes an entity type record and all corresponding entities.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // ID of the entity type.\r\n entityTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityTypeId: typeId, req: reqParams } = params;\r\n if (!typeId) {\r\n throw(\"Type ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`entitytype/${typeId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(typeId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Gets a list of entity types.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of entity types.\r\n entityTypes: IType[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"entitytypes\", Api.PrepReqParams(reqParams));\r\n res({\r\n entityTypes: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: req,\r\n req: reqParams,\r\n duration: 60 * 5 // 5 minutes.\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Updates or creates an entity type record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // Entity type record.\r\n entityType: IType,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity type record.\r\n entityType: IType\r\n }> {\r\n let { api, entityType: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data) {\r\n data = <any>{};\r\n }\r\n if (!data.ID) {\r\n data.ID = ObjectUtils.UId();\r\n }\r\n if (!data.Name) {\r\n data.Name = data.ID;\r\n }\r\n const res = await api.POST(`entitytype/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(<string>data.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n entityType: res\r\n };\r\n }\r\n}","/**\r\n * Utility to help with parsing and wrapping Nextspace paths.\r\n */\r\nexport namespace PathUtils {\r\n /**\r\n * Parses a string path into an array of strings.\r\n * @param str \r\n * @returns \r\n */\r\n export function Parse(str: string): string[] {\r\n if (!str) {\r\n return [];\r\n }\r\n const broken: string[] = str.split(\"\\\"/\\\"\");\r\n if (broken.length > 0) {\r\n let top = broken[0];\r\n if (top.length > 0) {\r\n if (top.charAt(0) == \"\\\"\") {\r\n top = top.substring(1);\r\n }\r\n broken[0] = top;\r\n }\r\n const endIndex = broken.length - 1;\r\n let bot = broken[endIndex];\r\n if (bot.length > 0) {\r\n if (bot.charAt(bot.length - 1) == \"\\\"\") {\r\n bot = bot.substring(0, bot.length - 1);\r\n }\r\n broken[endIndex] = bot;\r\n }\r\n }\r\n return broken;\r\n }\r\n\r\n /**\r\n * Wraps an array of strings into a Nextspace string path.\r\n * @param path \r\n * @returns \r\n */\r\n export function Wrap(path: string[]): string {\r\n let tmp: string = \"\\\"\";\r\n for (let i = 0; i < path.length; i++) {\r\n let section = path[i];\r\n tmp += section;\r\n if (i < path.length - 1) {\r\n tmp += \"\\\"/\\\"\";\r\n }\r\n }\r\n tmp += \"\\\"\";\r\n return tmp;\r\n }\r\n\r\n /**\r\n * Parses a Nextspace legacy string path into an array of strings.\r\n * @param str \r\n * @returns \r\n */\r\n export function ParseLegacy(str: string): string[] {\r\n const broken: string[] = str.split(\".\");\r\n for (let i = 0; i < broken.length; i++) {\r\n let piece = broken[0];\r\n if (piece.charAt(0) == \"\\\"\") {\r\n piece = broken[0] = piece.substring(1);\r\n }\r\n if (piece.charAt(piece.length - 1) == \"\\\"\") {\r\n broken[0] = piece.substring(0, piece.length - 1);\r\n }\r\n }\r\n return broken;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { Bounds } from \"../common/bounds\";\r\nimport { Geometry } from \"../common/geometry\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\nimport { Transform } from \"../common/transform\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { EntityType } from \"./entity-type\";\r\nimport { PathUtils } from \"../util/path-utils\";\r\nimport { IDictionary } from \"../common/dictionary\";\r\nimport { Carto } from \"../bruce-models\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\ntype _any = any;\r\n\r\n/**\r\n * Describes the \"Entity\" concept within Nextspace.\r\n * An entity is a JSON blob containing both internal data and user-defined data.\r\n * Entity records have many thinks linked to them through their UIDs such as links, files and relationships.\r\n */\r\nexport namespace Entity {\r\n /**\r\n * Returns cache identifier for an entity record.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey({...});\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param params \r\n * @returns \r\n */\r\n export function GetCacheKey(params: {\r\n entityId: string,\r\n entityTypeId?: string,\r\n expandLocation?: boolean,\r\n expandRelations?: boolean\r\n }): string {\r\n let { entityId, entityTypeId, expandLocation, expandRelations } = params;\r\n if (!entityTypeId) {\r\n entityTypeId = \"\";\r\n }\r\n return `${Api.ECacheKey.Entity}${Api.ECacheKey.Id}${entityId}${String(entityTypeId)}${String(Boolean(expandLocation))}${String(Boolean(expandRelations))}`;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for an entity record.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param entityId \r\n * @returns \r\n */\r\n export function GetContainsKey(entityId: string) {\r\n return `${Api.ECacheKey.Entity}${Api.ECacheKey.Id}${entityId}`;\r\n }\r\n\r\n /**\r\n * Describes an entity record.\r\n */\r\n export interface IEntity extends _any {\r\n // Nextspace internal data.\r\n Bruce: {\r\n // ID of the user who created the entity.\r\n \"CreatedBy.User.ID\"?: string;\r\n // Created date/time of the entity.\r\n CreatedTime?: UTC.IUTC;\r\n // Entity type ID.\r\n \"EntityType.ID\": string;\r\n // ID of the entity.\r\n ID?: string;\r\n // Array of associated tags (Used to be called layers).\r\n \"Layer.ID\"?: number[];\r\n // Available if expandRelations=true.\r\n // This is an array of all immediate downstream relationships for this entity.\r\n relations?: IRelationData[];\r\n };\r\n // Entity location.\r\n location?: Carto.ICarto;\r\n // Entity boundaries.\r\n boundaries?: Bounds.IBounds;\r\n // Entity transformation.\r\n transform?: Transform.ITransform;\r\n // Entity relative position to parent within an assembly.\r\n position?: number[][];\r\n // Entity vector geometry.\r\n geometry?: Geometry.IGeometry;\r\n // Available if expandLocation is true.\r\n // Related tileset ids if any.\r\n tilesetID?: string[];\r\n // Available if expandLocation is true.\r\n // Relative offset to parent node.\r\n worldPosition?: number[][];\r\n }\r\n\r\n /**\r\n * Available if expandRelations=true.\r\n * Describes a downstream relationship between the entity and another.\r\n */\r\n export interface IRelationData {\r\n // ID of the related child entity.\r\n \"Other.Entity.ID\": string;\r\n // ID of the relationship type.\r\n \"RelationType.ID\": string;\r\n }\r\n\r\n /**\r\n * Returns an entity record for the given entity id.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the entity.\r\n entityId: string,\r\n // (Optional) Entity type ID to load specific schema.\r\n entityTypeId?: string;\r\n // (Optional) If true, will calculate the location of a relative entity and include tilesetIds.\r\n expandLocation?: boolean,\r\n // (Optional) If true, will include all immediate downstream relationships for this entity.\r\n expandRelations?: boolean\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity record.\r\n entity: IEntity\r\n }> {\r\n let { api, entityId, req: reqParams, expandLocation, expandRelations, entityTypeId } = params;\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const key = GetCacheKey({\r\n entityId,\r\n entityTypeId,\r\n expandLocation,\r\n expandRelations\r\n });\r\n const cache = api.GetCacheItem(key, 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 urlParams = new URLSearchParams();\r\n if (expandLocation) {\r\n urlParams.append(\"$expand\", \"location\");\r\n }\r\n if (expandRelations) {\r\n urlParams.append(\"$expand\", \"relation\");\r\n }\r\n if (entityTypeId) {\r\n urlParams.append(\"BruceEntityType\", entityTypeId);\r\n }\r\n const data = await api.GET(\r\n `entity/${entityId}?${urlParams.toString()}`,\r\n Api.PrepReqParams(reqParams)\r\n );\r\n res({\r\n entity: data\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n api.SetCacheItem({\r\n key,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns a list of entity records for the given entity ids.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetListByIds(params: {\r\n api?: BruceApi.Api,\r\n // Array of entity IDs.\r\n entityIds: string[],\r\n // (Optional) If true, the immediate downstream relationships for each entity will be included.\r\n expandRelations?: boolean,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Array of entity records.\r\n entities: IEntity[]\r\n }> {\r\n let { api, entityIds, req: reqParams, expandRelations } = params;\r\n if (!entityIds.length) {\r\n throw(\"Entity IDs are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const reqs: Promise<{ entity: IEntity }>[] = [];\r\n const reqIds: string[] = [];\r\n for (let i = 0; i < entityIds.length; i++) {\r\n const entityId = entityIds[i];\r\n const key = GetCacheKey({ entityId, expandRelations });\r\n const cache = api.GetCacheItem(key, reqParams);\r\n if (cache?.found) {\r\n reqs.push(cache.data);\r\n }\r\n else {\r\n reqIds.push(entityId);\r\n }\r\n }\r\n const reqData = {\r\n Filter: {\r\n ID: {\r\n in: reqIds\r\n }\r\n },\r\n PageSize: reqIds.length\r\n };\r\n if (reqIds.length > 0) {\r\n const urlParams = new URLSearchParams();\r\n if (expandRelations) {\r\n urlParams.append(\"$expand\", \"relation\");\r\n }\r\n const req: Promise<Api.IList<Entity.IEntity>> = api.POST(\"entities?\" + urlParams.toString(), reqData, Api.PrepReqParams(reqParams));\r\n for (let i = 0; i < reqIds.length; i++) {\r\n const entityId = reqIds[i];\r\n const key = GetCacheKey({ entityId });\r\n const prom: Promise<{ entity: IEntity }> = new Promise(async (res) => {\r\n try {\r\n const data = await req;\r\n const item = data.Items.find(x => x.Bruce.ID == entityId);\r\n res({\r\n entity: item\r\n });\r\n }\r\n catch (e) {\r\n // No showing error as we don't want to see it 2000 times.\r\n }\r\n res(<any>null);\r\n });\r\n api.SetCacheItem({\r\n key,\r\n value: prom,\r\n req: reqParams\r\n });\r\n reqs.push(prom);\r\n }\r\n }\r\n return {\r\n entities: (await Promise.all(reqs)).map(x => x?.entity).filter(x => !!x)\r\n };\r\n }\r\n\r\n /**\r\n * Deletes an entity record.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // ID of the entity.\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n await api.DELETE(`entity/${entityId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.RemoveByContains(GetContainsKey(entityId));\r\n }\r\n\r\n /**\r\n * Deletes a list of entity records.\r\n * @param params \r\n */\r\n export async function DeleteList(params: {\r\n api?: BruceApi.Api,\r\n // Array of entity IDs.\r\n entityIds: string[],\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityIds, req: reqParams } = params;\r\n if (!entityIds?.length) {\r\n throw(\"Entity IDs are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.POST(\"deleteEntities\", {\r\n Items: entityIds\r\n }, Api.PrepReqParams(reqParams));\r\n for (let i = 0; i < entityIds.length; i++) {\r\n const entityId = entityIds[i];\r\n api.Cache.RemoveByContains(GetContainsKey(entityId));\r\n }\r\n }\r\n\r\n /**\r\n * Creates or updates an entity record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // Entity record.\r\n entity: IEntity,\r\n // If true, will override any existing data.\r\n // If false, only supplied attributes will be updated.\r\n // Ensure your data-schema matches the data well otherwise sub-attributes will be overridden regardless!\r\n override: boolean,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity record.\r\n entity: IEntity\r\n }> {\r\n let { api, entity: data, override, req: reqParams } = params;\r\n if (!data?.Bruce?.[\"EntityType.ID\"]) {\r\n throw(\"Entity Type ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!data?.Bruce?.ID) {\r\n data.Bruce = {\r\n ...data.Bruce,\r\n ID: ObjectUtils.UId()\r\n };\r\n }\r\n const reqUrl = `entity/${data.Bruce.ID}/?dataoverride=${override}&BruceEntityType=${data.Bruce[\"EntityType.ID\"]}`;\r\n const res = await api.POST(reqUrl, data, Api.PrepReqParams(reqParams));\r\n api.Cache.RemoveByContains(GetContainsKey(<string>data.Bruce.ID));\r\n return {\r\n entity: res\r\n };\r\n }\r\n\r\n /**\r\n * Util to remove a tag from an entity.\r\n * @param params \r\n */\r\n export function RemoveTag(params: {\r\n // Entity record.\r\n entity: IEntity,\r\n // ID of the tag to remove.\r\n tagId: number\r\n }): void {\r\n const { entity: data, tagId } = params;\r\n const tags = data.Bruce[\"Layer.ID\"] ?? [];\r\n const index = tags.indexOf(tagId);\r\n if (index >= 0) {\r\n tags.splice(index, 1);\r\n data.Bruce[\"Layer.ID\"] = tags;\r\n }\r\n }\r\n\r\n /**\r\n * Util to add a tag to an entity.\r\n * @param params \r\n */\r\n export function AddTag(params: {\r\n // Entity record.\r\n entity: IEntity,\r\n // ID of the tag to add.\r\n tagId: number\r\n }): void {\r\n const { entity: data, tagId } = params;\r\n const tags = data.Bruce[\"Layer.ID\"] ?? [];\r\n if (!tags.includes(tagId)) {\r\n tags.push(tagId);\r\n data.Bruce[\"Layer.ID\"] = tags;\r\n }\r\n }\r\n\r\n /**\r\n * Util to set a value on an entity.\r\n * @param params \r\n */\r\n export function SetValue(params: {\r\n // Entity record.\r\n entity: IEntity,\r\n // Path to the value to set.\r\n path: string[],\r\n // Value to set.\r\n value: any\r\n }): void {\r\n const { entity: data, path, value } = params;\r\n let curData = data;\r\n for (let i = 0; i < path.length; i++) {\r\n const step = path[i];\r\n if (!curData[step] || typeof curData[step] != \"object\") {\r\n curData[step] = {};\r\n }\r\n if (i >= path.length - 1) {\r\n curData[step] = value;\r\n break;\r\n }\r\n curData = curData[step];\r\n }\r\n }\r\n\r\n /**\r\n * Util to get a value from an entity.\r\n * @param params \r\n * @returns \r\n */\r\n export function GetValue(params: {\r\n // Entity record.\r\n entity: IEntity,\r\n // Path to the value to get.\r\n path: string[]\r\n }): any {\r\n const { entity: data, path } = params;\r\n // Backwards compatibility.\r\n if (path.length == 1 && path[0] == \"ID\") {\r\n return data.Bruce?.ID;\r\n }\r\n let curData = data;\r\n for (let i = 0; i < path.length; i++) {\r\n const step = path[i];\r\n if (!curData[step]) {\r\n return null;\r\n }\r\n if (i >= path.length - 1) {\r\n return curData[step];\r\n }\r\n curData = curData[step];\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Calculates an entity's name based on attribute priority set in the type.\r\n * @param params\r\n * @returns\r\n */\r\n export function CalculateName(params: {\r\n entity: IEntity,\r\n type: EntityType.IType,\r\n // If true, will return the entity ID if no name can be calculated.\r\n defaultToId?: boolean\r\n }): string {\r\n const { entity, type, defaultToId = true } = params;\r\n const attrStr = type.DisplayNameAttributePath;\r\n if (attrStr) {\r\n const attrPaths = attrStr.split(\",\");\r\n for (let i = 0; i < attrPaths.length; i++) {\r\n const pathStr = attrPaths[i];\r\n const path = PathUtils.Parse(pathStr);\r\n const name = Entity.GetValue({\r\n entity: entity,\r\n path\r\n });\r\n if (name && typeof name != \"object\") {\r\n return name;\r\n }\r\n }\r\n }\r\n return defaultToId ? entity.Bruce.ID : null;\r\n }\r\n\r\n /**\r\n * Calculates an entity name.\r\n * This will request data if entity or type is not provided.\r\n * @param params \r\n * @returns \r\n */\r\n export async function CalculateNameAsync(params: {\r\n // Either entityId or entity is required.\r\n entityId: string;\r\n entity: IEntity;\r\n // Type and typeId are optional.\r\n // They will be sampled from the entity if not provided.\r\n typeId?: string;\r\n type?: EntityType.IType;\r\n // If true, will return the entity ID if no name can be calculated.\r\n defaultToId?: boolean;\r\n }) {\r\n let { entityId, entity, typeId, type, defaultToId } = params;\r\n if (entityId && !entity) {\r\n const { entity: data } = await Get({\r\n entityId,\r\n entityTypeId: typeId\r\n });\r\n entity = data;\r\n }\r\n if (!entity) {\r\n return null;\r\n }\r\n if (!typeId) {\r\n typeId = entity.Bruce?.[\"EntityType.ID\"];\r\n }\r\n if (typeId && !type) {\r\n const { entityType: data } = await EntityType.Get({\r\n entityTypeId: typeId\r\n });\r\n type = data;\r\n }\r\n if (!type) {\r\n return null;\r\n }\r\n return CalculateName({\r\n entity,\r\n type,\r\n defaultToId\r\n });\r\n }\r\n\r\n /**\r\n * Describes a filter for entity records.\r\n */\r\n export interface IFilter {\r\n // (Optional) Order by attribute.\r\n orderBy?: any;\r\n // (Optional) Entity type ID.\r\n entityTypeId?: string;\r\n // (Optional) Array of tag IDs to restrict against.\r\n layerIds?: number[];\r\n // Default is \"equals\" for backwards compatibility.\r\n layerIdsOperator?: \"equals\" | \"in\";\r\n // (Optional) Graphical bounds to restrict against.\r\n bounds?: Bounds.IReqBounds;\r\n // (Optional) Page size.\r\n pageSize?: number;\r\n // (Optional) Page index. Default is 0.\r\n pageIndex?: number;\r\n // (Optional) LOD category ID.\r\n lodCategoryId?: string;\r\n // (Optional) Sort order.\r\n sortOrder?: Api.ESortOrder;\r\n // (Optional) Entity type conditions.\r\n // This is a filter against the entity attributes.\r\n // Ensure attributes are indexed for best results.\r\n entityTypeConditions?: IDictionary<any>;\r\n }\r\n\r\n /**\r\n * Returns a list of entity records for the given filter.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n // Filter to apply.\r\n filter: IFilter,\r\n // (Optional) If true, will include all immediate downstream relationships for each entity.\r\n expandRelations?: boolean,\r\n // Default = false. If false then only analysis data is returned instead of the entities.\r\n // TODO: Requires a provided entityTypeId. This is out of date in API.\r\n analysis?: boolean,\r\n // Default = false.\r\n viaCdn?: boolean;\r\n // (Optional) Cache killing token to append to the request url.\r\n viaCdnCacheToken?: number | string;\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Returned if analysis=false.\r\n entities?: IEntity[];\r\n // Returned if analysis=true.\r\n totalCount?: number;\r\n }> {\r\n let { api, filter, req: reqParams, viaCdn, viaCdnCacheToken, analysis, expandRelations } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n let requestFilter: any = {};\r\n if (filter.entityTypeConditions) {\r\n requestFilter = {\r\n ...filter.entityTypeConditions\r\n };\r\n }\r\n if (filter.layerIds != null && filter.layerIds.length > 0) {\r\n const operator = filter.layerIdsOperator ?? \"equals\";\r\n requestFilter[\"Bruce.Layer.ID\"] = {\r\n [operator]: filter.layerIds\r\n };\r\n }\r\n if (filter.bounds) {\r\n requestFilter[\"geometry\"] = {\r\n \"intersects\": [\r\n filter.bounds.south,\r\n filter.bounds.north,\r\n filter.bounds.west,\r\n filter.bounds.east\r\n ]\r\n };\r\n }\r\n\r\n const body = {\r\n SortOrder: filter.sortOrder == Api.ESortOrder.Asc ? \"ASC\" : \"DESC\",\r\n OrderBy: filter.orderBy,\r\n Filter: requestFilter,\r\n LODType: filter.lodCategoryId,\r\n BruceEntityType: filter.entityTypeId,\r\n PageIndex: filter.pageIndex,\r\n PageSize: filter.pageSize\r\n };\r\n\r\n let totalCount: number;\r\n let entities = [];\r\n if (analysis || expandRelations || (viaCdn && api.EntityCdnUrl)) {\r\n let url: URL;\r\n if (analysis) {\r\n url = new URL(api.GetBaseUrl() + \"entities/summary\");\r\n }\r\n else if (viaCdn && api.EntityCdnUrl) {\r\n url = new URL(api.EntityCdnUrl);\r\n }\r\n else {\r\n url = new URL(api.GetBaseUrl() + \"entities\");\r\n }\r\n\r\n const urlParams = new URLSearchParams(url.search);\r\n urlParams.set(\"cacheToken\", String(viaCdnCacheToken ? viaCdnCacheToken : 0));\r\n if (body.SortOrder) {\r\n urlParams.set(\"SortOrder\", body.SortOrder);\r\n }\r\n if (body.OrderBy) {\r\n urlParams.set(\"OrderBy\", body.OrderBy);\r\n }\r\n if (body.Filter) {\r\n urlParams.set(\"Filter\", JSON.stringify(body.Filter));\r\n }\r\n if (body.LODType) {\r\n urlParams.set(\"LODType\", body.LODType);\r\n }\r\n if (body.BruceEntityType) {\r\n urlParams.set(\"BruceEntityType\", body.BruceEntityType);\r\n }\r\n if (body.PageIndex) {\r\n urlParams.set(\"PageIndex\", String(body.PageIndex));\r\n }\r\n if (body.PageSize) {\r\n urlParams.set(\"PageSize\", String(body.PageSize));\r\n }\r\n if (expandRelations) {\r\n urlParams.append(\"$expand\", \"relation\");\r\n }\r\n const urlStr = url.toString() + \"?\" + urlParams.toString();\r\n const data = await api.get(urlStr, Api.PrepReqParams(reqParams));\r\n if (!analysis) {\r\n entities = data.Items;\r\n }\r\n totalCount = data.TotalCount;\r\n }\r\n else {\r\n const url = new URL(api.GetBaseUrl() + (analysis ? \"entities/summary\" : \"entities\"));\r\n const urlParams = new URLSearchParams(url.search);\r\n if (expandRelations) {\r\n urlParams.append(\"$expand\", \"relation\");\r\n }\r\n const urlStr = url.toString() + \"?\" + urlParams.toString();\r\n\r\n const data = await api.post(urlStr, body, Api.PrepReqParams(reqParams));\r\n if (!analysis) {\r\n entities = data.Items;\r\n // Only caching when non-CDN.\r\n for (let i = 0; i < entities.length; i++) {\r\n const entity = entities[i];\r\n const id = entity.Bruce.ID;\r\n api.SetCacheItem({\r\n key: GetCacheKey({\r\n entityId: id,\r\n expandRelations\r\n }),\r\n value: {\r\n entity: entity\r\n },\r\n req: reqParams\r\n });\r\n }\r\n }\r\n totalCount = data.TotalCount;\r\n }\r\n return {\r\n entities,\r\n totalCount\r\n };\r\n }\r\n}","import { Entity } from \"../entity/entity\";\r\nimport { PathUtils } from \"../util/path-utils\";\r\n\r\n/**\r\n * Gets the first Bruce variable in a string.\r\n * @param str \r\n * @returns \r\n */\r\nfunction getVariable(str: string): { text: string, path: string } {\r\n const start = str.indexOf(\"${\");\r\n if (start > -1) {\r\n const end = str.indexOf(\"}\");\r\n if (end > -1) {\r\n if (start < end) {\r\n const path = str.substring(start + 2, end);\r\n const txt = str.substring(start, end + 1);\r\n return { path: path, text: txt };\r\n }\r\n }\r\n }\r\n return <any>null;\r\n}\r\n\r\n/**\r\n * Utilities for parsing \"Bruce variables\", typically within strings.\r\n *\r\n * A Bruce variable is a string that starts with \"${\" and ends with \"}\".\r\n * Within those brackets is a path to an attribute in an entity.\r\n */\r\nexport namespace BruceVariable {\r\n /**\r\n * Replaces all Bruce variables in a string with the value of the attribute.\r\n * @param str\r\n * @param data\r\n * @param legacyParse\r\n * @returns\r\n */\r\n export function SwapValues(params: {\r\n str: string,\r\n entity: Entity.IEntity,\r\n legacyParse?: boolean\r\n }): string {\r\n let { str, entity: data, legacyParse } = params;\r\n if (!legacyParse) {\r\n legacyParse = false;\r\n }\r\n while (true) {\r\n const variable = getVariable(str);\r\n if (variable) {\r\n const path = legacyParse ? PathUtils.ParseLegacy(variable.path) : PathUtils.Parse(variable.path);\r\n let value = \"\";\r\n if (path.length > 0) {\r\n value = Entity.GetValue({\r\n entity: data,\r\n path: path\r\n });\r\n }\r\n str = str.replace(variable.text, value);\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n return str;\r\n }\r\n}","import { Color } from \"../common/color\";\r\nimport { Entity } from \"../entity/entity\";\r\nimport { BruceVariable } from \"../common/bruce-variable\";\r\nimport { PathUtils } from \"../util/path-utils\";\r\n\r\n/**\r\n * Example: ${Test.Test1}\r\n * Needs to become [\"Test\", \"Test1\"].\r\n * We need to cull this in admin-ui.\r\n * @param path\r\n * @returns Possible paths this legacy one could mean.\r\n */\r\nfunction parseLegacyPath(path: string): string[][] {\r\n if (!path) {\r\n return [];\r\n }\r\n let paths = [];\r\n if (path.startsWith(\"${\") && path.endsWith(\"}\")) {\r\n path = path.replace(\"${\", \"\");\r\n path = path.replace(\"}\", \"\");\r\n }\r\n // Split by dots.\r\n paths.push(PathUtils.ParseLegacy(path));\r\n // Take string as is.\r\n paths.push([path]);\r\n // Split by backslashes.\r\n paths.push(PathUtils.Parse(path));\r\n // Remove duplicates.\r\n const tmpPaths = [];\r\n for (let i = 0; i < paths.length; i++) {\r\n const path = paths[i];\r\n let found = false;\r\n for (let j = 0; j < tmpPaths.length; j++) {\r\n const tmpPath = tmpPaths[j];\r\n if (tmpPath.length == path.length) {\r\n let match = true;\r\n for (let k = 0; k < tmpPath.length; k++) {\r\n const tmpPathPart = tmpPath[k];\r\n const pathPart = path[k];\r\n if (tmpPathPart != pathPart) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n if (match) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n }\r\n if (!found) {\r\n tmpPaths.push(path);\r\n }\r\n }\r\n paths = tmpPaths;\r\n return paths;\r\n}\r\n\r\n/**\r\n * Utility for calculating values from Nextspace fields.\r\n * These fields are typically found in entity styles.\r\n */\r\nexport namespace Calculator {\r\n /**\r\n * Possible types of values that can be calculated.\r\n * This will determine how to calculate the values, and if extra levels of validation for specific value types are done.\r\n */\r\n export enum EValueType {\r\n Color,\r\n Input,\r\n Gradient,\r\n Mapping,\r\n TagColor,\r\n RandomColor\r\n }\r\n\r\n /**\r\n * A mapping option for a mapping value.\r\n */\r\n export interface IMappingOption {\r\n // Value to compare the attribute value against.\r\n fieldValue: string;\r\n // Value to return if the attribute value matches the field value.\r\n appliedValue: string;\r\n }\r\n\r\n /**\r\n * A mapping value.\r\n * This is a comparison between an attribute value to a set of available values.\r\n * If the attribute value matches a field value, then the applied value is returned.\r\n */\r\n export interface IMappingValue {\r\n // The attribute to compare against.\r\n // This is a string path. Check 'PathUtils.Wrap([...])'.\r\n field: string;\r\n // The available values to compare against.\r\n values: IMappingOption[];\r\n }\r\n\r\n /**\r\n * A gradient point.\r\n */\r\n export interface IGradientPoint {\r\n // The value we're comparing the attribute value against.\r\n position: number;\r\n // The color to return if the attribute value matches the position or falls between two positions.\r\n color: string;\r\n }\r\n\r\n export interface IGradientValue {\r\n // The attribute to compare against.\r\n field: string;\r\n // The available values to compare against.\r\n points: IGradientPoint[];\r\n // Deprecated.\r\n // It will be calculated from the provided points.\r\n min?: number;\r\n max?: number;\r\n }\r\n\r\n /**\r\n * A field option.\r\n * This is a value that can be calculated based on outlined settings.\r\n */\r\n export interface IField {\r\n // Settings that outline how to calculate the value based on the provided 'type'.\r\n value: IGradientValue | IMappingValue | string | number;\r\n // The type of calculation to perform.\r\n type: EValueType;\r\n }\r\n\r\n /**\r\n * Calculates the value of arbitrary field options.\r\n * The context calling this should validate results and parse stuff if needed.\r\n * @deprecated use specific calls: eg GetColor or GetNumber.\r\n * @param fields\r\n * @param entity\r\n * @param tags\r\n * @returns\r\n */\r\n export function GetValue(fields: IField[], entity: Entity.IEntity, tags: any[]): string | number | Color.IColor {\r\n if (!fields?.length) {\r\n return null;\r\n }\r\n if (!tags) {\r\n tags = [];\r\n }\r\n if (!entity) {\r\n entity = <any>{};\r\n }\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n let value: any;\r\n switch (field.type) {\r\n case EValueType.Color:\r\n value = <string>field.value;\r\n if (value) {\r\n value = Color.ColorFromStr(value);\r\n }\r\n break;\r\n case EValueType.Gradient:\r\n value = GetGradientValue(<IGradientValue>field.value, entity);\r\n break;\r\n case EValueType.Input:\r\n value = GetInputValue(<string>field.value, entity);\r\n break;\r\n case EValueType.Mapping:\r\n value = GetMappingValue(<IMappingValue>field.value, entity);\r\n break;\r\n case EValueType.RandomColor:\r\n value = Color.RandomColor();\r\n break;\r\n case EValueType.TagColor:\r\n for (let i = 0; i < tags.length; i++) {\r\n const tag = tags[i];\r\n if (tag.Color) {\r\n value = Color.ColorFromStr(tag.Color);\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n if (value || value == 0) {\r\n return value;\r\n }\r\n }\r\n return <any>null;\r\n }\r\n\r\n /**\r\n * Calculates the value of arbitrary field options with assumption that desired result is a color.\r\n * Will return null if a color is not found.\r\n * @param fields\r\n * @param entity\r\n * @param tags\r\n */\r\n export function GetColor(fields: IField[], entity: Entity.IEntity, tags: any[]): Color.IColor {\r\n if (!fields?.length) {\r\n return null;\r\n }\r\n if (!tags) {\r\n tags = [];\r\n }\r\n if (!entity) {\r\n entity = <any>{};\r\n }\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n let value: any;\r\n switch (field.type) {\r\n case EValueType.Color:\r\n value = <string>field.value;\r\n break;\r\n case EValueType.Gradient:\r\n value = GetGradientValue(<IGradientValue>field.value, entity);\r\n break;\r\n case EValueType.Input:\r\n value = GetInputValue(<string>field.value, entity);\r\n break;\r\n case EValueType.Mapping:\r\n value = GetMappingValue(<IMappingValue>field.value, entity);\r\n break;\r\n case EValueType.RandomColor:\r\n value = Color.RandomColor();\r\n break;\r\n case EValueType.TagColor:\r\n for (let i = 0; i < tags.length; i++) {\r\n const tag = tags[i];\r\n if (tag.Color) {\r\n value = Color.ColorFromStr(tag.Color);\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n if (typeof value === \"string\") {\r\n value = Color.ColorFromStr(value);\r\n }\r\n if (value && typeof value === \"object\" && (value.red || value.red == 0)) {\r\n return value;\r\n }\r\n }\r\n return <any>null;\r\n }\r\n\r\n /**\r\n * Calculates the value of arbitrary field options with assumption that desired result is a number.\r\n * Will return null if a number is not found.\r\n * @param fields \r\n * @param entity \r\n * @param tags \r\n * @returns \r\n */\r\n export function GetNumber(fields: IField[], entity: Entity.IEntity, tags: any[]): number {\r\n if (!fields?.length) {\r\n return null;\r\n }\r\n if (!tags) {\r\n tags = [];\r\n }\r\n if (!entity) {\r\n entity = <any>{};\r\n }\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n let value: any;\r\n switch (field.type) {\r\n case EValueType.Gradient:\r\n value = GetGradientValue(<IGradientValue>field.value, entity);\r\n break;\r\n case EValueType.Color:\r\n case EValueType.Input:\r\n value = GetInputValue(<string>field.value, entity);\r\n break;\r\n case EValueType.Mapping:\r\n value = GetMappingValue(<IMappingValue>field.value, entity);\r\n break;\r\n }\r\n if (value != \"\" && value != null && value != undefined) {\r\n value = Number(value);\r\n }\r\n if (value || value == 0) {\r\n return value;\r\n }\r\n }\r\n return <any>null;\r\n }\r\n\r\n /**\r\n * Calculates the value of arbitrary field options with assumption that desired result is a string.\r\n * Will return null if a string is not found.\r\n * @param fields \r\n * @param entity \r\n * @param tags \r\n * @returns \r\n */\r\n export function GetString(fields: IField[], entity: Entity.IEntity, tags: any[]): string {\r\n if (!fields?.length) {\r\n return null;\r\n }\r\n if (!tags) {\r\n tags = [];\r\n }\r\n if (!entity) {\r\n entity = <any>{};\r\n }\r\n\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n let value: any;\r\n switch (field.type) {\r\n case EValueType.Gradient:\r\n {\r\n const tmp = GetGradientValue(<IGradientValue>field.value, entity);\r\n // This avoids null turning into \"null\".\r\n if (tmp) {\r\n value = String(tmp);\r\n }\r\n }\r\n break;\r\n case EValueType.Color:\r\n case EValueType.Input:\r\n {\r\n const tmp = GetInputValue(<string>field.value, entity);\r\n // This avoids null turning into \"null\".\r\n if (tmp) {\r\n value = String(tmp);\r\n }\r\n }\r\n break;\r\n case EValueType.Mapping:\r\n {\r\n const tmp = GetMappingValue(<IMappingValue>field.value, entity);\r\n // This avoids null turning into \"null\".\r\n if (tmp) {\r\n value = String(tmp);\r\n }\r\n }\r\n break;\r\n case EValueType.RandomColor:\r\n // Would be nice to randomize based on an attribute or entity ID instead of pure random.\r\n var color = Color.RandomColor();\r\n value = `rgba(${color.red},${color.green},${color.blue},${color.alpha})`;\r\n break;\r\n case EValueType.TagColor:\r\n for (let i = 0; i < tags.length; i++) {\r\n const tag = tags[i];\r\n if (tag.Color) {\r\n value = tag.Color;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n if (value) {\r\n return value;\r\n }\r\n }\r\n return <any>null;\r\n }\r\n\r\n /**\r\n * Calculates a mapping value. This can return any value type.\r\n * It is intended to be parsed and validated within a value-type context. Eg: GetColor, GetNumber, GetString.\r\n * @param value \r\n * @param entity \r\n * @returns \r\n */\r\n export function GetMappingValue(value: IMappingValue, entity: Entity.IEntity): string | number {\r\n const attrPaths: string[][] = parseLegacyPath(value.field);\r\n for (let i = 0; i < attrPaths.length; i++) {\r\n const attrPath = attrPaths[i];\r\n let eValue: any = Entity.GetValue({\r\n entity: entity,\r\n path: attrPath\r\n });\r\n const isValueNum = !isNaN(+eValue);\r\n\r\n for (let i = 0; i < value.values.length; i++) {\r\n const option = value.values[i];\r\n const mapValue = option.fieldValue;\r\n const isMapValueNum = !isNaN(+mapValue);\r\n\r\n if (isValueNum && (isMapValueNum || mapValue.includes(\"-\"))) {\r\n if (+mapValue == +eValue) {\r\n return option.appliedValue;\r\n }\r\n const mapSplit = mapValue.split(\"-\");\r\n if (mapSplit.length == 2) {\r\n const min = mapSplit[0];\r\n const max = mapSplit[1];\r\n if (min != \"\") {\r\n if (+eValue < +min) {\r\n continue;\r\n }\r\n }\r\n if (max != \"\") {\r\n if (+eValue > +max) {\r\n continue;\r\n }\r\n }\r\n if (min == \"\" && max == \"\") {\r\n continue;\r\n }\r\n return option.appliedValue;\r\n }\r\n }\r\n else {\r\n if (mapValue == eValue) {\r\n return option.appliedValue;\r\n }\r\n }\r\n }\r\n }\r\n return <any>null;\r\n }\r\n\r\n /**\r\n * Calculates a gradient value. This can return any value type.\r\n * It is intended to be parsed and validated within a value-type context. Eg: GetColor, GetNumber, GetString.\r\n * @param value \r\n * @param entity \r\n * @returns \r\n */\r\n export function GetGradientValue(value: IGradientValue, entity: Entity.IEntity): Color.IColor {\r\n const min = +value.points[0].position;\r\n const max = +value.points[value.points.length - 1].position;\r\n\r\n const attrPaths: string[][] = parseLegacyPath(value.field);\r\n for (let i = 0; i < attrPaths.length; i++) {\r\n const attrPath = attrPaths[i];\r\n let eValue: any = Entity.GetValue({\r\n entity: entity,\r\n path: attrPath\r\n });\r\n if (typeof eValue == \"string\") {\r\n eValue = Number(eValue);\r\n }\r\n\r\n if ((!eValue && eValue != 0) || isNaN(eValue)) {\r\n continue;\r\n }\r\n\r\n if (eValue >= max) {\r\n return Color.ColorFromStr(value.points[value.points.length - 1].color);\r\n }\r\n else if (eValue <= min) {\r\n return Color.ColorFromStr(value.points[0].color);\r\n }\r\n\r\n for (let i = 0; i < value.points.length - 1; i++) {\r\n const pointA = value.points[i];\r\n const pointB = value.points[i+1];\r\n\r\n if (eValue >= pointA.position && eValue <= pointB.position) {\r\n if (pointA.position == pointB.position) {\r\n return Color.ColorFromStr(pointA.color);\r\n }\r\n const distance = (eValue - pointA.position)/(pointB.position - pointA.position);\r\n const colorA = Color.ColorFromStr(pointA.color);\r\n const colorB = Color.ColorFromStr(pointB.color);\r\n return {\r\n red: colorA.red + (colorB.red - colorA.red) * distance,\r\n green: colorA.green + (colorB.green - colorA.green) * distance,\r\n blue: colorA.blue + (colorB.blue - colorA.blue) * distance,\r\n alpha: colorA.alpha + (colorB.alpha - colorA.alpha) * distance\r\n }\r\n }\r\n }\r\n }\r\n return Color.ColorFromStr(value.points[0].color);\r\n }\r\n\r\n /**\r\n * Calculates an input value. This can return any value type.\r\n * It is intended to be parsed and validated within a value-type context. Eg: GetColor, GetNumber, GetString.\r\n * @param value \r\n * @param entity \r\n * @returns \r\n */\r\n export function GetInputValue(value: string, entity: Entity.IEntity): string | number {\r\n if (typeof value == \"string\") {\r\n try {\r\n value = BruceVariable.SwapValues({\r\n str: value,\r\n entity: entity\r\n });\r\n // Check if it includes a math operation.\r\n const MATH_REGEX = /(\\d+\\.?\\d*|\\.\\d+)([+\\-*/])(\\d+\\.?\\d*|\\.\\d+)/;\r\n if (MATH_REGEX.test(value)) {\r\n // https://rollupjs.org/guide/en/#avoiding-eval\r\n // This stops eval warning.\r\n const eval2 = eval;\r\n return eval2(value);\r\n }\r\n }\r\n catch (exception) {\r\n const e = exception as any;\r\n let suppress: boolean = false;\r\n if (e && typeof e == \"object\") {\r\n const msg: string = e.message;\r\n suppress = !!msg && (msg.includes(\"Unexpected end\") || msg.includes(\"got end of script\"));\r\n }\r\n if (!suppress) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n return value;\r\n }\r\n}","import { Carto } from \"./carto\";\r\n\r\n/**\r\n * Describes vector geometry that Bruce uses.\r\n */\r\nexport namespace Geometry {\r\n export interface IGeometry {\r\n // Polygon array is an array of rings.\r\n // There should be 1 outer ring and 0 or more inner rings.\r\n Polygon?: IPolygonRing[];\r\n MultiGeometry?: IGeometry[];\r\n Point?: string;\r\n LineString?: string;\r\n MultiSurface?: string;\r\n }\r\n\r\n export interface IPolygonRing {\r\n LinearRing: string;\r\n Facing: EPolygonRingType;\r\n Height?: number;\r\n }\r\n\r\n export enum EPolygonRingType {\r\n Boundaries = \"out\",\r\n Hole = \"in\"\r\n }\r\n\r\n /**\r\n * Turns an array of points into string vector geometry that Bruce can use.\r\n * This is used for saving polyline and polygon data.\r\n * @param points \r\n * @returns \r\n */\r\n export function LineStrFromPoints(points: Carto.ICarto[]): string {\r\n if (!points.length) {\r\n throw(\"points is empty.\");\r\n }\r\n let carto: Carto.ICarto = points[0];\r\n let lineString = `${carto.longitude},${carto.latitude}` + (carto.altitude != null ? `,${carto.altitude}` : \"\");\r\n for (let i = 1; i < points.length; i++) {\r\n carto = points[i];\r\n lineString += ` ${carto.longitude},${carto.latitude}` + (carto.altitude != null ? `,${carto.altitude}` : \"\");\r\n }\r\n return lineString;\r\n }\r\n\r\n /**\r\n * Removes same points that occur in a row.\r\n * This will not modify the original array.\r\n * @param positions \r\n * @returns \r\n */\r\n export function RemoveRepeatPoints(positions: Carto.ICarto[]): Carto.ICarto[] {\r\n const filteredList = [];\r\n for (let i = 0; i < positions.length; i++) {\r\n const pos = positions[i];\r\n const lastPos = filteredList.length > 0 ? filteredList[filteredList.length - 1] : null;\r\n if (!lastPos || (pos.latitude != lastPos.latitude || pos.longitude != lastPos.longitude || pos.altitude != lastPos.altitude)) {\r\n filteredList.push(pos); \r\n }\r\n }\r\n return filteredList;\r\n }\r\n\r\n /**\r\n * Parses a string of points into an array of points.\r\n * @param pointsStr \r\n * @returns \r\n */\r\n export function ParsePoints(pointsStr: string): Carto.ICarto[] {\r\n pointsStr = pointsStr.replace(/[^\\d.,-\\s]/g, \"\");\r\n\r\n let splitterCoordinates = \" \";\r\n let splitterAxis = \",\";\r\n const commaIndex = pointsStr.indexOf(\",\");\r\n const spaceIndex = pointsStr.indexOf(\" \");\r\n if ((spaceIndex > -1 && commaIndex > spaceIndex) || commaIndex <= -1) {\r\n splitterCoordinates = \",\";\r\n splitterAxis = \" \";\r\n }\r\n\r\n let points = pointsStr.trim().split(splitterCoordinates);\r\n points = points.filter(a => a != \"\");\r\n\r\n const result: Carto.ICarto[] = [];\r\n for (let i = 0; i < points.length; i++) {\r\n const pointData = points[i];\r\n const coords = pointData.trim().split(splitterAxis);\r\n if (coords.length == 2 || coords.length == 3) {\r\n const longitude = Number(coords[0]);\r\n const latitude = Number(coords[1]);\r\n const altitude = Number(coords.length >= 3 ? coords[2] : 0);\r\n if (longitude != null && latitude != null) {\r\n result.push({\r\n altitude: altitude,\r\n latitude: latitude,\r\n longitude: longitude\r\n });\r\n }\r\n else {\r\n console.warn(\"Invalid point data detected.\", pointData);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Parses both string and object Bruce geometry.\r\n * String geometry is legacy Bruce data.\r\n * @param geometry \r\n * @returns \r\n */\r\n export function ParseGeometry(geometry: any): IGeometry {\r\n if (typeof geometry == \"string\") {\r\n let positions: Carto.ICarto[] = [];\r\n const geometryParsed: string[] = (geometry || \"\").split(\";\");\r\n for (let i = 0; i < geometryParsed.length; i++) {\r\n const data = geometryParsed[i];\r\n const points = ParsePoints(data);\r\n if (points && points.length > 0) {\r\n positions = positions.concat(points);\r\n }\r\n }\r\n positions = RemoveRepeatPoints(positions);\r\n const newGeometry: IGeometry = {};\r\n if (positions.length > 0) {\r\n const topPoint = positions[0];\r\n newGeometry.Point = `${topPoint.latitude},${topPoint.longitude}` + (topPoint.altitude != null ? `,${topPoint.altitude}` : \"\");\r\n if (positions.length > 1) {\r\n newGeometry.Polygon = [{ Facing: EPolygonRingType.Boundaries, LinearRing: LineStrFromPoints(positions) }];\r\n }\r\n if (positions.length > 2) {\r\n newGeometry.LineString = LineStrFromPoints(positions);\r\n }\r\n }\r\n return newGeometry;\r\n }\r\n return geometry;\r\n }\r\n}","import { Entity } from \"../entity/entity\";\r\nimport { Carto } from \"./carto\";\r\nimport { Geometry } from \"./geometry\";\r\n\r\nexport namespace Bounds {\r\n /**\r\n * Description of an entity's bounding box.\r\n */\r\n export interface IBounds {\r\n // Values are in degrees.\r\n maxLatitude: number;\r\n maxLongitude: number;\r\n minLatitude: number;\r\n minLongitude: number;\r\n // Values are in meters.\r\n maxAltitude?: number;\r\n minAltitude?: number;\r\n }\r\n\r\n /**\r\n * Describes the boundaries used in entity requests.\r\n */\r\n export interface IReqBounds {\r\n south: number;\r\n west: number;\r\n north: number;\r\n east: number;\r\n\r\n // Used to exclude requests from UI that fall outside of min-max boundaries.\r\n // TODO: Migrate into \"entity-filter-getter.ts\", \"entity-globe.ts\" and then remove from here.\r\n alt?: number;\r\n }\r\n\r\n /**\r\n * Calculates boundaries from entity.\r\n * This will not use the entity's boundaries and instead calculate from geometry and location.\r\n * @param entity \r\n */\r\n export function FromEntity(entity: Entity.IEntity): IBounds {\r\n const bounds: IBounds = {\r\n maxAltitude: null,\r\n maxLatitude: null,\r\n maxLongitude: null,\r\n minAltitude: null,\r\n minLatitude: null,\r\n minLongitude: null\r\n };\r\n const points: Carto.ICarto[] = [];\r\n if (entity.location) {\r\n points.push(entity.location);\r\n }\r\n if (entity.geometry) {\r\n if (entity.geometry.Point) {\r\n points.push(...Geometry.ParsePoints(entity.geometry.Point));\r\n }\r\n if (entity.geometry.LineString) {\r\n points.push(...Geometry.ParsePoints(entity.geometry.LineString));\r\n }\r\n if (entity.geometry.Polygon) {\r\n for (const ring of entity.geometry.Polygon) {\r\n points.push(...Geometry.ParsePoints(ring.LinearRing));\r\n }\r\n }\r\n }\r\n for (const point of points) {\r\n if (bounds.maxLatitude == null || point.latitude > bounds.maxLatitude) {\r\n bounds.maxLatitude = point.latitude;\r\n }\r\n if (bounds.maxLongitude == null || point.longitude > bounds.maxLongitude) {\r\n bounds.maxLongitude = point.longitude;\r\n }\r\n if (bounds.maxAltitude == null || point.altitude > bounds.maxAltitude) {\r\n bounds.maxAltitude = point.altitude;\r\n }\r\n if (bounds.minLatitude == null || point.latitude < bounds.minLatitude) {\r\n bounds.minLatitude = point.latitude;\r\n }\r\n if (bounds.minLongitude == null || point.longitude < bounds.minLongitude) {\r\n bounds.minLongitude = point.longitude;\r\n }\r\n if (bounds.minAltitude == null || point.altitude < bounds.minAltitude) {\r\n bounds.minAltitude = point.altitude;\r\n }\r\n }\r\n return bounds;\r\n }\r\n}","interface IBruceEventCallback {\r\n _id: number;\r\n removeCallback: () => void;\r\n callback: (data: any) => void;\r\n}\r\n\r\n/**\r\n * Simple event utility.\r\n * Instantiate the model, then subscribe and trigger events.\r\n */\r\nexport class BruceEvent<TArgs> {\r\n // Counter to help differentiate subscriptions.\r\n private _counter: number = 0;\r\n // Record of all callback subscriptions for this event.\r\n private callbacks: IBruceEventCallback[] = [];\r\n\r\n /**\r\n * Subscribes to this event.\r\n * The provided callback will be called when the event is triggered.\r\n * @param callback \r\n * @returns A function that can be called to unsubscribe from this event.\r\n */\r\n public Subscribe(callback: (data: TArgs) => void): (() => void) {\r\n let id = this._counter++;\r\n let newBruceEventCallback: IBruceEventCallback = {\r\n \t_id: id,\r\n \tremoveCallback: () => {\r\n \t\tthis.Unsubscribe(id);\r\n \t},\r\n \tcallback: callback\r\n };\r\n this.callbacks.push(newBruceEventCallback);\r\n return newBruceEventCallback.removeCallback;\r\n }\r\n\r\n /**\r\n * Unsubscribes from this event.\r\n * @param id specific subscription entry to remove.\r\n * @warning please use the returned function from Subscribe() instead of this function.\r\n */\r\n public Unsubscribe(id: number): void {\r\n let index = this.callbacks.findIndex(x => x._id == id);\r\n if (index > -1) {\r\n this.callbacks.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Triggers this event with optional data.\r\n * This will call all subscribed callbacks.\r\n * @param data \r\n */\r\n public Trigger(data?: TArgs): void {\r\n let callbacks = this.callbacks;\r\n for (let i = 0; i < callbacks.length; i++) {\r\n let callback = callbacks[i];\r\n if (callback.callback) {\r\n callback.callback(data);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clears all subscriptions.\r\n */\r\n public Clear(): void {\r\n this.callbacks = [];\r\n }\r\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}","/**\r\n * Controls the flow of method calls.\r\n * If you have a method that may be called often, but you don't want it to run often, use this.\r\n */\r\nexport class DelayQueue {\r\n // The callback is the method we want to control queue for.\r\n private callback: () => void;\r\n // Millisecond delay.\r\n public delay: number = 200;\r\n // Date-time stamp for the last callback call.\r\n private lastCallTime: number = <any>null;\r\n // The delay timeout for calling update.\r\n private delayTimeout: any;\r\n\r\n constructor(callback: () => void, delay: number = 200) {\r\n this.callback = callback;\r\n this.delay = delay;\r\n }\r\n\r\n /**\r\n * Request a call on the callback.\r\n * @param force If true, the callback will be called immediately.\r\n */\r\n public Call(force: boolean = false): void {\r\n if (this.lastCallTime == null) {\r\n force = true;\r\n }\r\n if (force) {\r\n let endDate = new Date().getTime();\r\n this.doCall(endDate);\r\n }\r\n else {\r\n const endDate = new Date().getTime();\r\n const seconds = (endDate - this.lastCallTime) / 1000;\r\n const delay = this.delay / 1000;\r\n if (seconds > delay) {\r\n this.doCall(endDate);\r\n }\r\n else if (this.delayTimeout == null) {\r\n const diff = (delay - seconds) * 1000;\r\n this.delayTimeout = setTimeout(() => {\r\n this.delayTimeout = null;\r\n this.Call();\r\n }, diff + 0.02);\r\n }\r\n }\r\n }\r\n\r\n private doCall(endDate: number): void {\r\n if (this.delayTimeout != null) {\r\n clearTimeout(this.delayTimeout);\r\n this.delayTimeout = null;\r\n }\r\n this.lastCallTime = endDate;\r\n this.callback();\r\n }\r\n\r\n /**\r\n * Dispose of this object.\r\n */\r\n public Dispose(): void {\r\n if (this.delayTimeout != null) {\r\n clearTimeout(this.delayTimeout);\r\n this.delayTimeout = null;\r\n }\r\n }\r\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 export function ToDate(utc: IUTC): Date {\n return new Date(utc.y, utc.m - 1, utc.d, utc.hh, utc.mm, utc.ss, 0);\n }\n\n export function FromDate(date: Date): IUTC {\n return {\n y: date.getUTCFullYear(),\n m: date.getUTCMonth() + 1,\n d: date.getUTCDate(),\n hh: date.getUTCHours(),\n mm: date.getUTCMinutes(),\n ss: date.getUTCSeconds()\n };\n }\n}","/**\r\n * A simple LRU cache implementation.\r\n * LRU cache is a cache that evicts the least recently used item when it is full.\r\n */\r\nexport class LRUCache<TKey, TValue> {\r\n private readonly capacity: number;\r\n private readonly cache: Map<TKey, TValue>;\r\n\r\n constructor(capacity: number) {\r\n this.capacity = capacity;\r\n this.cache = new Map<TKey, TValue>();\r\n }\r\n\r\n /**\r\n * Get a value from the cache.\r\n * @param key \r\n * @returns \r\n */\r\n public Get(key: TKey): TValue | undefined {\r\n const value = this.cache.get(key);\r\n if (value) {\r\n this.cache.delete(key);\r\n this.cache.set(key, value);\r\n }\r\n return value;\r\n }\r\n\r\n /**\r\n * Set a value in the cache.\r\n * @param key \r\n * @param value \r\n */\r\n public Set(key: TKey, value: TValue): void {\r\n if (this.cache.size >= this.capacity) {\r\n const leastRecentlyUsedKey = this.cache.keys().next().value;\r\n this.cache.delete(leastRecentlyUsedKey);\r\n }\r\n this.cache.set(key, value);\r\n }\r\n\r\n public Entries(): IterableIterator<[TKey, TValue]> {\r\n return this.cache.entries();\r\n }\r\n\r\n public Clear() {\r\n this.cache.clear();\r\n }\r\n}\r\n","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\ntype Type = EntityAttachmentType.EType | string;\r\n\r\n/**\r\n * Describes the \"Entity Attachment Type\" concept within Nextspace.\r\n * It is a record that describes the purpose of an attachment.\r\n */\r\nexport namespace EntityAttachmentType {\r\n /**\r\n * Returns cache identifier for an attachment type by ID.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"123\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param id \r\n * @returns \r\n */\r\n export function GetCacheKey(id: Type): string {\r\n return Api.ECacheKey.AttachmentType + Api.ECacheKey.Id + id;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of attachment types.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param typeId \r\n * @returns \r\n */\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.AttachmentType;\r\n }\r\n\r\n /**\r\n * Describes an attachment type record.\r\n */\r\n export interface IType {\r\n // Attachment type description.\r\n Description: string;\r\n // Attachment type ID.\r\n ID: string | EType;\r\n // Human readable attachment type name.\r\n Name: string;\r\n }\r\n\r\n // Known attachment types.\r\n export enum EType {\r\n // Attachments with this type will appear in the media tab within the entity details.\r\n Photo = \"photo\",\r\n Document = \"document\"\r\n }\r\n\r\n /**\r\n * Deletes an attachment type.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // The attachment type ID to delete.\r\n attachmentTypeId: Type,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, attachmentTypeId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!id) {\r\n throw(\"Type ID is required.\");\r\n }\r\n await api.DELETE(`entityAttachmentType/${id}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(id));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Creates or updates an attachment type.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // The attachment type to create or update.\r\n attachmentType: IType,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n attachmentType: IType\r\n }> {\r\n let { api, attachmentType: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data?.ID) {\r\n throw(\"Type ID is required.\");\r\n }\r\n const res = await api.POST(`entityAttachmentType/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n attachmentType: res\r\n };\r\n }\r\n\r\n /**\r\n * Gets a list of all attachment types.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n reqParams?: Api.IReqParams\r\n }): Promise<{\r\n // The list of attachment types.\r\n attachmentTypes: IType[]\r\n }> {\r\n let { api, reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`entityAttachmentTypes`, Api.PrepReqParams(reqParams));\r\n res({\r\n attachmentTypes: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ClientFile } from \"../client-file/client-file\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { EntityAttachmentType } from \"./entity-attachment-type\";\r\n\r\ntype Type = EntityAttachmentType.EType | string;\r\n\r\n/**\r\n * Describes the \"Entity Attachment\" concept within Nextspace.\r\n * An entity attachment is an arbitrary file record that is linked to an entity record.\r\n * The same file can be attached to multiple entities.\r\n */\r\nexport namespace EntityAttachment {\r\n /**\r\n * Returns cache identifier for an attachment by ID.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"123\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param id \r\n * @returns \r\n */\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.Attachment + Api.ECacheKey.Id + id;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of attachments for an entity.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param typeId \r\n * @returns \r\n */\r\n export function GetListCacheKey(entityId: string): string {\r\n return Api.ECacheKey.Attachment + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n /**\r\n * Describes an attachment record.\r\n */\r\n export interface IAttachment {\r\n // Attachment ID.\r\n ID: number;\r\n // Associated client file record.\r\n ClientFile?: ClientFile.IFile;\r\n // Associated client file ID.\r\n \"ClientFile.ID\": string;\r\n // Display order among sibling attachments.\r\n DisplayOrder?: number;\r\n // Entity this attachment is associated with.\r\n \"Entity.ID\": string;\r\n // Attachment type ID.\r\n \"EntityAttachmentType.ID\": Type;\r\n // @deprecated. Use attachment types as groups.\r\n Group?: string;\r\n }\r\n\r\n /**\r\n * Updates one or many attachment records.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // The entity ID the record is associated with.\r\n entityId: string,\r\n // Attachments to update.\r\n attachments: IAttachment[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n attachments: IAttachment[]\r\n }> {\r\n let { api, attachments, req, entityId } = params;\r\n if (!attachments?.length) {\r\n return Promise.resolve({\r\n attachments: []\r\n });\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const res = await api.POST(`entity/${entityId}/attachments`, {\r\n attachments\r\n }, Api.PrepReqParams(req));\r\n for (let i = 0; i < attachments.length; i++) {\r\n if (attachments[i].ID) {\r\n api.Cache.Remove(GetCacheKey(attachments[i].ID));\r\n }\r\n }\r\n await api.Cache.Remove(GetListCacheKey(entityId));\r\n return {\r\n attachments: res.attachments\r\n };\r\n }\r\n\r\n /**\r\n * Updates the display order of attachments.\r\n * @param params \r\n */\r\n export async function UpdateOrder(params: {\r\n api?: BruceApi.Api,\r\n // The entity ID the record is associated with.\r\n entityId: string,\r\n // The attachment type ID.\r\n attachmentTypeId: Type,\r\n // Attachments to update.\r\n attachments: IAttachment[],\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityId, attachmentTypeId: typeId, attachments, req: reqParams } = params;\r\n if (!entityId || !typeId) {\r\n throw(\"Entity ID and Type ID are required.\");\r\n }\r\n if (!attachments?.length) {\r\n return Promise.resolve();\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const reqData = {\r\n \t\"DisplayOrder.Start\": 0,\r\n \t\"ClientFile.ID\": attachments.map(x => x[\"ClientFile.ID\"])\r\n };\r\n await api.POST(`entity/${entityId}/attachments/${typeId}/setOrder`, reqData, Api.PrepReqParams(reqParams));\r\n for (let i = 0; i < attachments.length; i++) {\r\n api.Cache.Remove(GetCacheKey(attachments[i].ID));\r\n }\r\n await api.Cache.RemoveByStartsWith(GetListCacheKey(entityId));\r\n }\r\n\r\n /**\r\n * Deletes an attachment record.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n entityId: string,\r\n attachmentId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, attachmentId, entityId, req } = params;\r\n if (!attachmentId || !entityId) {\r\n throw(\"Entity id and attachment id.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`entity/${entityId}/attachments/${attachmentId}`, Api.PrepReqParams(req));\r\n await api.Cache.Remove(GetCacheKey(attachmentId));\r\n await api.Cache.Remove(GetListCacheKey(params.entityId));\r\n }\r\n\r\n /**\r\n * Gets a list of attachments for an entity.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetListByEntityId(params: {\r\n api?: BruceApi.Api,\r\n // The entity ID to get attachments for.\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of attachments.\r\n attachments: IAttachment[]\r\n }> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`entity/${entityId}/attachments`, Api.PrepReqParams(reqParams));\r\n res({\r\n attachments: (data.attachments ? data.attachments : data.Items)\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(entityId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Uploads a file as an attachment to an entity.\r\n * This will create a client file record for the file.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Upload(params: {\r\n api?: BruceApi.Api,\r\n // The file to upload.\r\n file: Blob,\r\n // The entity ID to attach the file to.\r\n entityId: string,\r\n // The attachment type ID.\r\n attachmentTypeId: Type,\r\n req?: Api.IUploadReqParams\r\n }): Promise<{\r\n // The created attachment record.\r\n attachment: IAttachment\r\n }> {\r\n let { api, file, entityId, attachmentTypeId: typeId, req: reqParams } = params;\r\n if (!entityId || !typeId || !file) {\r\n throw(\"Entity ID, Type ID, and File are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const url = `entity/${entityId}/attachment/${typeId}`;\r\n const res = await api.UPLOAD(url, file, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetListCacheKey(entityId));\r\n return {\r\n attachment: res\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Entity Comment\" concept within Nextspace.\r\n * An entity comment is a user written message that is linked to an entity record.\r\n * \r\n * @deprecated: The Navigator now uses Entity records directly.\r\n * a utility is being made to manage those records.\r\n */\r\nexport namespace EntityComment {\r\n /**\r\n * Returns cache identifier for a comment by ID.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"123\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param id \r\n * @returns \r\n */\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.Comment + Api.ECacheKey.Id + id;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of comments for an entity.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param entityId \r\n * @returns \r\n */\r\n export function GetListCacheKey(entityId: string): string {\r\n return Api.ECacheKey.Comment + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n /**\r\n * Describes a comment record.\r\n */\r\n export interface IComment {\r\n // Comment text.\r\n Comment: string;\r\n // User who created the comment.\r\n \"Created.ByUser.ID\": string;\r\n // Date the comment was created.\r\n \"Created.Date\": UTC.IUTC;\r\n // Comment ID.\r\n ID: number;\r\n // Cache of the number of replies to this comment.\r\n // Real number is calculated by traversing child comments.\r\n RepliesCount: number;\r\n // Comment this comment is a reply to.\r\n \"ReplyTo.Comment.ID\": number;\r\n // Target we're commenting on. Typically an entity ID.\r\n \"TargetObject.ID\": string;\r\n // Type of target we're commenting on. Typically an entity type ID.\r\n \"TargetObject.Type\": string;\r\n }\r\n\r\n /**\r\n * Creates or updates a comment.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // The comment to create or update.\r\n comment: IComment,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The created or updated comment.\r\n comment: IComment\r\n }> {\r\n let { api, comment: data, req: reqParams } = params;\r\n if (!data?.[\"TargetObject.ID\"]) {\r\n throw(\"TargetObject.ID (entity id) is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const url = `entity/${data[\"TargetObject.ID\"]}/comment` + (data.ID == null ? \"\" : \"/\" + data.ID);\r\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ID));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Comment + Api.ECacheKey.Entity);\r\n\r\n return {\r\n comment: res\r\n };\r\n }\r\n\r\n /**\r\n * Deletes a comment.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // The entity ID to delete the comment from.\r\n entityId: string,\r\n // The comment ID to delete.\r\n commentId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityId, commentId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!commentId) {\r\n throw(\"Comment ID is required.\");\r\n }\r\n await api.DELETE(`entity/${entityId}/comment/${commentId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(commentId));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Comment + Api.ECacheKey.Entity);\r\n }\r\n\r\n /**\r\n * Gets a list of comments for an entity.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetListByEntityId(params: {\r\n api?: BruceApi.Api,\r\n // The entity ID to get comments for.\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of comments.\r\n comments: IComment[]\r\n }> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`entity/${entityId}/comments`, Api.PrepReqParams(reqParams));\r\n res({\r\n comments: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(entityId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Entity Link\" concept within Nextspace.\r\n * An entity link is an external URL linked to an entity record.\r\n */\r\nexport namespace EntityLink {\r\n /**\r\n * Returns cache identifier for a link record.\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 id \r\n * @returns \r\n */\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.Link + Api.ECacheKey.Id + id;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of links for an entity.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param entityId \r\n * @returns \r\n */\r\n export function GetListCacheKey(entityId: string): string {\r\n return Api.ECacheKey.Link + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n /**\r\n * Describes a link record.\r\n */\r\n export interface ILink {\r\n // Human readable name of the link.\r\n DisplayName: string;\r\n // Link ID.\r\n ID?: number;\r\n // ID of the entity this link is linked to.\r\n \"Entity.ID\": string;\r\n // URL of the link.\r\n URL: string;\r\n }\r\n\r\n /**\r\n * Creates or updates a link record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // Link record to create or update.\r\n link: ILink,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The link record.\r\n link: ILink\r\n }> {\r\n let { api, link: data, req: reqParams } = params;\r\n if (!data?.[\"Entity.ID\"]) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const url = `entity/${data[\"Entity.ID\"]}/link` + (data.ID == null ? \"\" : \"/\" + data.ID);\r\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(<number>data.ID));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Link + Api.ECacheKey.Entity);\r\n\r\n return {\r\n link: res\r\n };\r\n }\r\n\r\n /**\r\n * Deletes a link record.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // The entity ID to delete the link from.\r\n entityId: string,\r\n // The link ID to delete.\r\n linkId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityId, linkId, req: reqParams } = params;\r\n if (!linkId || !entityId) {\r\n throw(\"Link ID and Entity ID are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n \r\n await api.DELETE(`entity/${entityId}/link/${linkId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(linkId));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Link + Api.ECacheKey.Entity);\r\n }\r\n\r\n /**\r\n * Returns a list of links for an entity.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetListByEntityId(params: {\r\n api?: BruceApi.Api,\r\n // The entity ID to get links for.\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of links.\r\n links: ILink[]\r\n }> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(entityId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`entity/${entityId}/links`, Api.PrepReqParams(reqParams));\r\n res({\r\n links: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(entityId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ClientFile } from \"../client-file/client-file\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Entity LOD\" concept within Nextspace.\r\n * LOD stands for Level of Detail.\r\n * An lod record is a possible 2d/3d visualization of the entity record.\r\n * The most common kind is a GLB.\r\n */\r\nexport namespace EntityLod {\r\n /**\r\n * Returns cache identifier for an entity lod record.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param url \r\n * @returns \r\n */\r\n export function GetCacheKey(url: string): string {\r\n return Api.ECacheKey.Lod + Api.ECacheKey.Id + url;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of entity lods.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"abc\", \"def\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param typeId \r\n * @param group \r\n * @returns \r\n */\r\n export function GetTypeListKey(typeId: string, group: string): string {\r\n return Api.ECacheKey.Lod + Api.ECacheKey.EntityType + typeId + Api.ECacheKey.Id + group;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of entity lods.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param entityId \r\n * @returns \r\n */\r\n export function GetEntityListKey(entityId: string): string {\r\n return Api.ECacheKey.Lod + Api.ECacheKey.Entity + entityId;\r\n }\r\n\r\n /**\r\n * Describes an entity lod record.\r\n * This is a 2d/3d visualization of the entity record.\r\n * The most common kind is a GLB.\r\n */\r\n export interface ILod {\r\n // Corresponding client file record.\r\n ClientFile?: ClientFile.IFile;\r\n // ID of the related client file record.\r\n \"ClientFile.ID\": string;\r\n // ID of the related entity record.\r\n \"Entity.ID\": string;\r\n // ID of the lod category.\r\n \"LODCategory.Key\": string;\r\n // Level of detail. 0 is the highest.\r\n Level: number;\r\n // LOD group within its entity type.\r\n Group?: string;\r\n }\r\n\r\n /**\r\n * Describes an entity lod record update.\r\n */\r\n export interface IEntityLodUpdate {\r\n // ID of the related client file record.\r\n \"ClientFile.ID\": string;\r\n // ID of the lod category.\r\n \"LODCategory.Key\": string;\r\n // Level of detail. 0 is the highest.\r\n Level: number;\r\n }\r\n\r\n /**\r\n * Returns a url for an entity lod record file.\r\n * @param params \r\n * @returns \r\n */\r\n export function GetUrl(params: {\r\n api?: BruceApi.Api,\r\n // ID of the related entity record.\r\n entityId: string,\r\n // ID of the lod category.\r\n categoryId: string,\r\n // Level of detail. 0 is the highest.\r\n level: number,\r\n // Whether to use strict mode.\r\n // When not strict it will find the closest level of detail available.\r\n strict?: boolean\r\n }): {\r\n // Url for the entity lod record file.\r\n url: string\r\n } {\r\n let { api, entityId, categoryId, level, strict } = params;\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!categoryId) {\r\n categoryId = \"GLB\";\r\n }\r\n if (!level) {\r\n level = 0;\r\n }\r\n\r\n let url: string = api.GetBaseUrl() + `entity/${entityId}/lod/${categoryId}/${level}`;\r\n if (strict) {\r\n url = url + \"?strict=true\";\r\n }\r\n return {\r\n url: url\r\n };\r\n }\r\n\r\n /**\r\n * Returns the client file id for an entity lod record file.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetUrlFileId(params: {\r\n api?: BruceApi.Api,\r\n // Url for the entity lod record file.\r\n url: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // ID of the related client file record.\r\n clientFileId: string\r\n }> {\r\n let { api, url, req: reqParams } = params;\r\n if (!url) {\r\n throw(\"Url is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(url), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const record: ILod = await api.get(url, Api.PrepReqParams(reqParams));\r\n res({\r\n clientFileId: record[\"ClientFile.ID\"]\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(url),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Returns lods for a specified filter.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetLods(params: {\r\n api?: BruceApi.Api,\r\n // Filter for the lods to return.\r\n filter: Filter.IListParams,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of lods matching the specified filter.\r\n lods: Filter.IListResItem[]\r\n }> {\r\n let { api, filter, req: reqParams } = params;\r\n if (!filter?.Items?.length) {\r\n return Promise.resolve({\r\n lods: []\r\n });\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const data = await api.POST(\"entity/getlods\", filter, reqParams);\r\n return {\r\n lods: data.Items\r\n };\r\n }\r\n\r\n /**\r\n * Returns all lods for a specified entity.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetEntityLods(params: {\r\n api?: BruceApi.Api,\r\n // ID of the related entity record.\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of lods for the specified entity.\r\n lods: ILod[]\r\n }> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!entityId) {\r\n throw(\"Entity id is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetEntityListKey(entityId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req = api.GET(`entity/${entityId}/lods?includeClientFiles=yes`, Api.PrepReqParams(reqParams));\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n lods: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetEntityListKey(entityId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns lods for a specified entity type.\r\n * @param params\r\n */\r\n export async function GetTypeLods(params: {\r\n api?: BruceApi.Api,\r\n // ID of the related entity type record.\r\n entityTypeId: string,\r\n // LOD group within its entity type.\r\n group?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of lods for the specified entity type.\r\n lods: ILod[]\r\n }> {\r\n let { api, entityTypeId: typeId, group, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!group) {\r\n group = \"DEFAULT\";\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetTypeListKey(typeId, group), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const url = `entityType/${typeId}/lods?includeClientFiles=yes` + (group ? \"&group=\" + group : \"\");\r\n const req = api.GET(url, Api.PrepReqParams(reqParams));\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n lods: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetTypeListKey(typeId, group),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Updates an entity lod record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // ID of the related entity record.\r\n entityId: string,\r\n req?: Api.IReqParams\r\n } & IEntityLodUpdate): Promise<void> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!params[\"ClientFile.ID\"] || !params[\"LODCategory.Key\"] || (!params.Level && params.Level !== 0)) {\r\n throw(\"ClientFile.ID, LODCategory.Key and Level are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const res = await api.POST(`entity/${entityId}/lod/${params[\"LODCategory.Key\"]}/${params.Level}`, {\r\n \"Level\": params.Level,\r\n \"ClientFile.ID\": params[\"ClientFile.ID\"]\r\n }, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetEntityListKey(entityId));\r\n return res;\r\n }\r\n\r\n /**\r\n * Deletes an entity lod record.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // ID of the related entity record.\r\n entityId: string,\r\n // ID of the related lod category record.\r\n lodCategoryId: string,\r\n // Level of detail. 0 is the highest.\r\n level: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, entityId, lodCategoryId, level, req: reqParams } = params;\r\n if (!entityId || !lodCategoryId) {\r\n throw(\"Entity ID and LOD Category ID are required.\");\r\n }\r\n level = +level;\r\n if (isNaN(level)) {\r\n throw(\"Level is required. It must be a number.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.POST(`entity/${entityId}/deleteLODs`, {\r\n Items: [{ \"LODCategory.Key\": lodCategoryId, \"Level\": level }]\r\n }, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetEntityListKey(entityId));\r\n }\r\n\r\n /**\r\n * Describes a filter for getting entity lods.\r\n */\r\n export namespace Filter {\r\n export interface IListParamsItem {\r\n // ID of the related entity record.\r\n \"entityId\": string,\r\n // ID of the related lod category record.\r\n \"categoryId\": string,\r\n // LOD group within its entity type.\r\n \"group\"?: string,\r\n // Level of detail. 0 is the highest.\r\n \"level\"?: number\r\n }\r\n\r\n export interface IListParams {\r\n // Whether to use strict mode.\r\n // When not strict it will find the closest level of detail available.\r\n \"strict\": boolean,\r\n // Whether to traverse external sources. This is much slower.\r\n \"externalSources\": boolean,\r\n // List of entity lod filter items.\r\n \"Items\": IListParamsItem[]\r\n }\r\n\r\n export interface IListResItem {\r\n // ID of the lod client file.\r\n clientFileId: string;\r\n // ID of the related entity record.\r\n entityId: string;\r\n // Client account ID where the lod client file is stored.\r\n accountId: string;\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Entity LOD Category\" concept within Nextspace.\r\n * An LOD category is a level of categorization for LODs.\r\n * This is typically used to group LODs by their extension.\r\n */\r\nexport namespace EntityLodCategory {\r\n /**\r\n * Returns cache identifier for an entity lod category record.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param id \r\n * @returns \r\n */\r\n export function GetCacheKey(id: string): string {\r\n return Api.ECacheKey.LodCategory + Api.ECacheKey.Id + id;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of entity lod categories.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @returns \r\n */\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.LodCategory;\r\n }\r\n\r\n /**\r\n * Describes an entity lod category record.\r\n */\r\n export interface ICategory {\r\n // Description of the category.\r\n Description?: string;\r\n // Unique identifier for the category.\r\n // This is case-insensitive.\r\n Key: string;\r\n // Name of the category.\r\n Name: string;\r\n }\r\n\r\n /**\r\n * Returns a list of entity lod categories.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of entity lod categories.\r\n categories: ICategory[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"lodCategories\", Api.PrepReqParams(reqParams));\r\n res({\r\n categories: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Returns an entity lod category record matching the specified id.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // The id of the entity lod category record to return.\r\n categoryId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity lod category record.\r\n category: ICategory\r\n }> {\r\n let { api, categoryId: id, req: reqParams } = params;\r\n if (!id) {\r\n throw(\"Lod category id is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\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 req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`lodCategory/${id}`, Api.PrepReqParams(reqParams));\r\n res({\r\n category: 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: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Deletes an entity lod category record matching the specified id.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // The id of the entity lod category record to delete.\r\n categoryId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, categoryId: id, req: reqParams } = params;\r\n if (!id) {\r\n throw(\"Lod category id is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`lodCategory/${id}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(id));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Creates or updates an entity lod category record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // The entity lod category record to create or update.\r\n category: ICategory,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity lod category record.\r\n category: ICategory\r\n }> {\r\n let { api, category: data, req: reqParams } = params;\r\n if (!data.Key || !data.Name) {\r\n throw(\"Lod category key and name are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const res = await api.POST(`lodCategory/${data.Key}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.Key));\r\n api.Cache.Remove(GetListCacheKey());\r\n\r\n return {\r\n category: res\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\n\r\n/**\r\n * Describes the \"Entity Relationship Type\" concept within Nextspace.\r\n * A relationship type record describes the purpose of a relationship.\r\n */\r\nexport namespace EntityRelationType {\r\n /**\r\n * Returns cache identifier for an entity relation type record.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param id \r\n * @returns \r\n */\r\n export function GetCacheKey(id: string): string {\r\n return Api.ECacheKey.RelationType + Api.ECacheKey.Id + id;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of entity relation types.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @returns \r\n */\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.RelationType;\r\n }\r\n\r\n /**\r\n * Describes an entity relation type record.\r\n */\r\n export interface IType {\r\n // ID of the relation type.\r\n ID: string;\r\n // Name of the \"parent to child\" direction.\r\n ForwardName: string;\r\n // Name of the \"child to parent\" direction.\r\n ReverseName: string;\r\n // Name of the relationship type as a whole.\r\n Name: string;\r\n // If the drawn direction should be flipped.\r\n // A drawn direction is the 3D parabola that is drawn between related entities.\r\n FlipDisplayDirection?: boolean;\r\n // Style ID for the rendered relationship.\r\n EntityDisplaySettingID?: string;\r\n // ID of the entity type used to define the schema.\r\n \"Relation.EntityType.ID\"?: string;\r\n }\r\n\r\n /**\r\n * Gets a single entity relation type record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the entity relation type.\r\n relationTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity relation type record.\r\n relationType: IType\r\n }> {\r\n let { api, relationTypeId: typeId, req: reqParams } = params;\r\n if (!typeId) {\r\n throw(\"Type ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const key = GetCacheKey(typeId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`entityRelationType/${typeId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n relationType: 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,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Deletes an entity relation type record.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // ID of the entity relation type.\r\n relationTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, relationTypeId: typeId, req: reqParams } = params;\r\n if (!typeId) {\r\n throw(\"Type ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`entityRelationType/${typeId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(typeId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Gets a list of entity relation type records.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of entity relation type records.\r\n relationTypes: IType[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"entityRelationTypes\", Api.PrepReqParams(reqParams));\r\n res({\r\n relationTypes: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Creates or updates an entity relation type record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // Entity relation type record to create or update.\r\n relationType: IType,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity relation type record.\r\n relationType: IType\r\n }> {\r\n let { api, relationType: data, req: reqParams } = params;\r\n if (!data?.ForwardName || !data?.ReverseName) {\r\n throw(\"Forward and reverse names are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data.ID) {\r\n data.ID = ObjectUtils.UId();\r\n }\r\n const res = await api.POST(`entityRelationType/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n relationType: res\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Entity } from \"./entity\";\r\n\r\n/**\r\n * Describes the \"Entity Relationship\" concept within Nextspace.\r\n * An entity relationship is an arbitrary link between two entity records.\r\n * The relationship can have a \"data entity\" linked to it as well for the relationship to store arbitrary data about itself.\r\n */\r\nexport namespace EntityRelation {\r\n /**\r\n * Returns cache identifier for an entity relation record.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\", \"def\", \"ghi\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param id \r\n * @returns \r\n */\r\n export function GetCacheKey(entityA: string, entityB: string, typeId: string): string {\r\n return `${Api.ECacheKey.Relation}${Api.ECacheKey.Id}${entityA}${Api.ECacheKey.Id}${entityB}${Api.ECacheKey.Id}${typeId}`;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of entity relations.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param id \r\n * @returns \r\n */\r\n export function GetEntityCacheKey(entityId: string): string {\r\n return Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of entity relations.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\", {...});\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param id \r\n * @returns \r\n */\r\n export function GetListCacheKey(entityId: string, params: IListParams): string {\r\n return Api.ECacheKey.Relation + Api.ECacheKey.RelationType +\r\n Api.ECacheKey.Id + params.relationTypeId +\r\n Api.ECacheKey.Id + params.oneWayOnly +\r\n Api.ECacheKey.Id + params.loadEntityData +\r\n Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n /**\r\n * Describes an entity relation record.\r\n */\r\n export interface IRelation {\r\n // ID of the principal (parent) entity.\r\n \"Principal.Entity.ID\": string;\r\n // ID of the related (child) entity.\r\n \"Related.Entity.ID\": string;\r\n // Related entity data.\r\n RelatedEntity?: Entity.IEntity;\r\n // Principal entity data.\r\n PrincipalEntity?: Entity.IEntity;\r\n // ID of the relation type.\r\n \"Relation.Type.ID\": string;\r\n // Relation type data.\r\n RelationType?: any;\r\n // ID of the data entity.\r\n // The data entity is where the relationship attribute data is stored.\r\n \"Data.Entity.ID\"?: string;\r\n }\r\n\r\n export interface IListParams {\r\n // ID of the relation type.\r\n relationTypeId?: string;\r\n // If the relation should be one-way only.\r\n // If false only child relationships will be loaded for the entity.\r\n oneWayOnly?: boolean;\r\n // If entity data should be loaded for the related entities.\r\n loadEntityData?: boolean;\r\n }\r\n\r\n /**\r\n * Creates a new entity relation.\r\n * @param params \r\n */\r\n export async function Create(params: {\r\n api?: BruceApi.Api,\r\n // Entity relation data.\r\n relation: IRelation,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, relation: data, req: reqParams } = params;\r\n if (!data[\"Principal.Entity.ID\"] || !data[\"Related.Entity.ID\"] || !data[\"Relation.Type.ID\"]) {\r\n throw(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const reqData = {\r\n \"Related.Entity.ID\": [data[\"Related.Entity.ID\"]]\r\n };\r\n const url = `entity/${data[\"Principal.Entity.ID\"]}/relation/${data[\"Relation.Type.ID\"]}/add`;\r\n await api.POST(url, reqData, Api.PrepReqParams(reqParams));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Principal.Entity.ID\"]);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Related.Entity.ID\"]);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType);\r\n if (data[\"Data.Entity.ID\"]) {\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + data[\"Data.Entity.ID\"]);\r\n }\r\n }\r\n\r\n /**\r\n * Deletes an entity relation.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // ID of the principal (parent) entity.\r\n principalEntityId: string,\r\n // ID of the related (child) entity.\r\n relatedEntityId: string,\r\n // ID of the relation type.\r\n relationTypeId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, principalEntityId, relatedEntityId, relationTypeId, req: reqParams } = params;\r\n if (!principalEntityId || !relatedEntityId || !relationTypeId) {\r\n throw new Error(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const url = `entity/${principalEntityId}/relation/${relationTypeId}/delete`;\r\n await api.POST(url, {\r\n \"Related.Entity.ID\": [relatedEntityId]\r\n }, Api.PrepReqParams(reqParams));\r\n\r\n // Remove related cache entries\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + principalEntityId);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + relatedEntityId);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType + Api.ECacheKey.Id + relationTypeId);\r\n }\r\n\r\n /**\r\n * Updates an entity relation.\r\n * Eg: data entity ID was changed.\r\n * @param params \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // Entity relation data.\r\n relation: IRelation,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, relation: data, req: reqParams } = params;\r\n if (!data[\"Principal.Entity.ID\"] || !data[\"Related.Entity.ID\"] || !data[\"Relation.Type.ID\"]) {\r\n throw(\"Principal Entity ID, Related Entity ID, and Relation Type ID are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const url = `entity/${data[\"Principal.Entity.ID\"]}/otherEntityID/${data[\"Related.Entity.ID\"]}/relation/${data[\"Relation.Type.ID\"]}/update`;\r\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Principal.Entity.ID\"]);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Id + data[\"Related.Entity.ID\"]);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.RelationType + Api.ECacheKey.Id + data[\"Relation.Type.ID\"]);\r\n if (data[\"Data.Entity.ID\"]) {\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Relation + Api.ECacheKey.Entity + Api.ECacheKey.Id + data[\"Data.Entity.ID\"]);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a list of relationships for an entity.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n // ID of the entity to get relationships for.\r\n entityId: string,\r\n // Filter parameters.\r\n filter: IListParams,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of entity relations.\r\n relations: IRelation[]\r\n }> {\r\n let { api, entityId, filter, req: reqParams } = params;\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n filter = {\r\n relationTypeId: \"\",\r\n oneWayOnly: false,\r\n loadEntityData: false,\r\n ...filter\r\n }\r\n const cache = await api.GetCacheItem(GetListCacheKey(entityId, filter), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n let url = `entity/${entityId}/relations`;\r\n if (filter.relationTypeId) {\r\n url += \"/\" + filter.relationTypeId;\r\n }\r\n url += `?Oneway=${filter.oneWayOnly}&LoadInfo=${filter.loadEntityData}`;\r\n const data = await api.GET(url, Api.PrepReqParams(reqParams));\r\n res({\r\n relations: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(entityId, filter),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Returns an entity relationship by the data entity ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetByDataEntityId(params: {\r\n api?: BruceApi.Api,\r\n // ID of the data entity.\r\n entityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity relation record.\r\n relation: IRelation\r\n }> {\r\n let { api, entityId, req: reqParams } = params;\r\n if (!entityId) {\r\n throw(\"Entity ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetEntityCacheKey(entityId), 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 = await api.GET(`entity/relation/${entityId}/dataentity`, Api.PrepReqParams(reqParams));\r\n res({\r\n relation: 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: GetEntityCacheKey(entityId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { IDictionary } from \"../common/dictionary\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n/**\r\n * Describes the \"Entity Source\" concept within Nextspace.\r\n * An entity source is a record which links an arbitrary source id to a Nextspace entity id.\r\n * For example an OSM building id to a Nextspace entity id.\r\n */\r\nexport namespace EntitySource {\r\n /**\r\n * Returns cache identifier for an entity source record.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(1, \"def\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param sourceId\r\n * @param sourceKey \r\n * @returns \r\n */\r\n export function GetCacheKey(sourceId: number, sourceKey: string): string {\r\n return `${Api.ECacheKey.EntitySource}${Api.ECacheKey.Id}${sourceId}${Api.ECacheKey.Id}${sourceKey}`;\r\n }\r\n\r\n /**\r\n * Describes an entity source record.\r\n */\r\n export interface ISource {\r\n // ID of the data source.\r\n \"Source.ID\": number;\r\n // ID of the Nextspace entity.\r\n \"Entity.ID\": string;\r\n // Key of the external source entity.\r\n \"SourceRecord.Key\": string;\r\n }\r\n\r\n /**\r\n * Returns an entity source record for the given source id and source key.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the data source.\r\n sourceId: number,\r\n // ID of the external source entity.\r\n sourceKey: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity source record.\r\n source: ISource\r\n }> {\r\n let { api, sourceId, sourceKey, req: reqParams } = params;\r\n if (!sourceId || !sourceKey) {\r\n throw(\"Source ID and Source Key are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const res = await GetListByKeys({\r\n api: api,\r\n sourceId: sourceId,\r\n sourceKeys: [sourceKey],\r\n req: reqParams\r\n })\r\n return {\r\n source: res.sources?.length ? res.sources[0] : null\r\n };\r\n }\r\n\r\n /**\r\n * Returns a list of entity source records for the given source id and source keys.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetListByKeys(params: {\r\n api?: BruceApi.Api,\r\n // ID of the data source.\r\n sourceId: number,\r\n // Array of external source IDs.\r\n sourceKeys: string[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Array of entity source records.\r\n sources: ISource[]\r\n }> {\r\n let { api, sourceId, sourceKeys, req: reqParams } = params;\r\n if (!sourceId) {\r\n throw(\"Source ID is required.\");\r\n }\r\n if (!sourceKeys?.length) {\r\n return Promise.resolve({\r\n sources: []\r\n });\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const reqKeys: string[] = [];\r\n const reqs: Promise<ISource>[] = [];\r\n for (let i = 0; i < sourceKeys.length; i++) {\r\n const sourceKey = sourceKeys[i];\r\n const cache = await api.GetCacheItem(GetCacheKey(sourceId, sourceKey), reqParams);\r\n if (cache?.found) {\r\n reqs.push(cache.data);\r\n }\r\n else {\r\n reqKeys.push(sourceKey);\r\n }\r\n }\r\n if (reqKeys.length) {\r\n const prom: Promise<ISource[]> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.POST(`entitysource/${sourceId}`, { SourceRecordKeys: reqKeys }, Api.PrepReqParams(reqParams));\r\n res(data.Items);\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n for (let i = 0; i < reqKeys.length; i++) {\r\n const req: Promise<ISource> = new Promise(async (res, rej) => {\r\n try {\r\n const sources = await prom;\r\n res(<ISource>sources.find((s: ISource) => s[\"SourceRecord.Key\"] === reqKeys[i]));\r\n }\r\n catch (e) {\r\n rej(<any>e);\r\n }\r\n });\r\n reqs.push(req);\r\n }\r\n }\r\n return {\r\n sources: (await Promise.all(reqs)).filter(x => !!x)\r\n };\r\n }\r\n\r\n /**\r\n * Returns a mapping of entity source records for the given source id and source keys.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetEntityIdsBySourceKeys(params: {\r\n api?: BruceApi.Api,\r\n // ID of the data source.\r\n sourceId: number,\r\n // Array of external source IDs.\r\n sourceKeys: string[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Source key to entity id mapping.\r\n idMapping: IDictionary<string>\r\n }> {\r\n let { api, sourceId, sourceKeys, req: reqParams } = params;\r\n if (!sourceId) {\r\n throw(\"Source ID and Source Keys are required.\");\r\n }\r\n if (!sourceKeys?.length) {\r\n return Promise.resolve({\r\n idMapping: {}\r\n });\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const result: IDictionary<string> = {};\r\n if (sourceKeys.length > 0) {\r\n const {sources} = await GetListByKeys({\r\n api,\r\n sourceId,\r\n sourceKeys,\r\n req: reqParams\r\n });\r\n for (let i = 0; i < sources.length; i++) {\r\n const source = sources[i];\r\n for (let i = 0; i < sourceKeys.length; i++) {\r\n const key = sourceKeys[i];\r\n if (key == source[\"SourceRecord.Key\"]) {\r\n result[key] = source[\"Entity.ID\"];\r\n }\r\n }\r\n }\r\n }\r\n return {\r\n idMapping: result\r\n };\r\n }\r\n\r\n /**\r\n * Creates a new entity source record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function CreateLink(params: {\r\n api?: BruceApi.Api\r\n // Entity source record.\r\n source: ISource\r\n }): Promise<{\r\n // Created entity source record.\r\n source: ISource\r\n }> {\r\n let {source, api} = params;\r\n if (!source[\"Entity.ID\"] || !source[\"Source.ID\"] || !source[\"SourceRecord.Key\"]) {\r\n throw(\"Entity ID, Source ID and Source Key are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const res = await api.POST(\"entitysource\", source);\r\n const cacheKey = GetCacheKey(source[\"Source.ID\"], source[\"SourceRecord.Key\"]);\r\n await api.Cache.Remove(cacheKey);\r\n return {\r\n source: res\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Entity Tag\" concept within Nextspace.\r\n * An entity tag is used to categorize an entity record.\r\n * Entity tags can be used in filters, or to restrict entity access.\r\n */\r\nexport namespace EntityTag {\r\n /**\r\n * Returns cache identifier for an entity tag record.\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 tagId \r\n * @returns \r\n */\r\n export function GetCacheKey(tagId: number): string {\r\n return `${Api.ECacheKey.Tag}${Api.ECacheKey.Id}${tagId}`;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of entity tags.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param entityTypeId \r\n * @returns \r\n */\r\n export function GetListCacheKey(entityTypeId?: string): string {\r\n if (entityTypeId) {\r\n return Api.ECacheKey.Tag + Api.ECacheKey.EntityType + Api.ECacheKey.Id + entityTypeId;\r\n }\r\n return Api.ECacheKey.Tag;\r\n }\r\n\r\n /**\r\n * Describes an entity tag record.\r\n */\r\n export interface ITag {\r\n // ID of the tag.\r\n ID: number;\r\n // Human readable name of the tag.\r\n Name?: string;\r\n // Description of the tag.\r\n Description?: string;\r\n // If tag access (and tagged entity access) should be restricted.\r\n // When a tag is restricted a user must have the \"Layer_<tag_id>\" permission to view the tag.\r\n IsAccessRestricted?: boolean;\r\n // If the tag is restricted to a specific entity type.\r\n \"EntityType.ID\"?: string;\r\n // Colour of the tag to use when styling entities or displaying a tag icon.\r\n Color?: string;\r\n // Parent tag ID.\r\n // Purely for organizational purposes.\r\n \"Parent.Layer.ID\"?: number;\r\n }\r\n\r\n /**\r\n * Returns an entity tag record for the given tag id.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tag.\r\n tagId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity tag record.\r\n tag: ITag\r\n }> {\r\n let { api, tagId, req: reqParams } = params;\r\n if (!tagId) {\r\n throw(\"Tag ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const {tags} = await GetListByIds({\r\n api,\r\n tagIds: [tagId],\r\n req: reqParams\r\n });\r\n return {\r\n tag: tags.length ? tags[0] : null\r\n };\r\n }\r\n\r\n /**\r\n * Returns a list of entity tag records for the given tag ids.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetListByIds(params: {\r\n api?: BruceApi.Api,\r\n // Array of tag IDs.\r\n tagIds: number[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Array of entity tag records.\r\n tags: ITag[]\r\n }> {\r\n let { api, tagIds, req: reqParams } = params;\r\n if (!tagIds.length) {\r\n return Promise.resolve({\r\n tags: []\r\n });\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const reqIds: number[] = [];\r\n const reqs: Promise<{ tag: ITag }>[] = [];\r\n for (let i = 0; i < tagIds.length; i++) {\r\n const tagId = tagIds[i];\r\n const cache = await api.GetCacheItem(GetCacheKey(tagId), reqParams);\r\n if (cache?.found) {\r\n reqs.push(cache.data);\r\n }\r\n else {\r\n reqIds.push(tagId);\r\n }\r\n }\r\n if (reqIds.length) {\r\n const prom: Promise<ITag[]> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.POST(\"layers/get\", { layerIds: reqIds }, Api.PrepReqParams(reqParams));\r\n res(data.Items);\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n for (let i = 0; i < reqIds.length; i++) {\r\n const id = reqIds[i];\r\n const req: Promise<{ tag: ITag }> = new Promise(async (res, rej) => {\r\n try {\r\n const tags = await prom;\r\n const tag = tags.find((t: ITag) => t.ID === id);\r\n res({\r\n tag: tag\r\n });\r\n }\r\n catch (e) {\r\n rej(<any>e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(id),\r\n value: req,\r\n req: reqParams\r\n });\r\n reqs.push(req);\r\n }\r\n }\r\n return {\r\n tags: (await Promise.all(reqs)).map(x => x?.tag).filter(x => !!x)\r\n };\r\n }\r\n\r\n /**\r\n * Returns a list of entity tag records.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n // ID of the entity type to filter by.\r\n entityTypeId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Array of entity tag records.\r\n tags: ITag[]\r\n }> {\r\n let { api, entityTypeId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(entityTypeId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(entityTypeId ? `entityType/${entityTypeId}/layers` : \"layers\", Api.PrepReqParams(reqParams));\r\n res({\r\n tags: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(entityTypeId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Deletes an entity tag record.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tag.\r\n tagId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, tagId, req: reqParams } = params;\r\n if (!tagId) {\r\n throw(\"Tag ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`layer/${tagId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(tagId));\r\n await api.Cache.RemoveByStartsWith(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Creates or updates an entity tag record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // Entity tag record.\r\n tag: ITag,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Entity tag record.\r\n tag: ITag\r\n }> {\r\n let { api, tag: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n \r\n const url = data.ID ? `layer/${data.ID}` : \"layer\";\r\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ID));\r\n await api.Cache.RemoveByStartsWith(GetListCacheKey());\r\n return {\r\n tag: res\r\n };\r\n }\r\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\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { Carto } from \"../common/carto\";\r\nimport { Transform } from \"../common/transform\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { MathUtils } from \"../util/math-utils\";\r\nimport { Entity } from \"./entity\";\r\n\r\n/**\r\n * This is a utility to help calculate and manage UCS coordinates for entities.\r\n */\r\nexport namespace EntityCoords {\r\n export const UCS_ENTITY_TYPE_ID = \"Bruce_UCS_Type\";\r\n\r\n /**\r\n * Returns cache identifier for a UCS by entity id.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"123\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param entityId \r\n * @returns \r\n */\r\n export function GetCacheKey(entityId: string): string {\r\n return Api.ECacheKey.EntityCoords + Api.ECacheKey.Entity + Api.ECacheKey.Id + entityId;\r\n }\r\n\r\n /**\r\n * Describes a UCS record.\r\n */\r\n export interface IUcs {\r\n // Human readable name of the UCS.\r\n name: string;\r\n // ID of the UCS entity.\r\n \"Entity.ID\": string;\r\n // UCS location.\r\n location: Carto.ICarto;\r\n // UCS transform.\r\n transform: Transform.ITransform;\r\n }\r\n\r\n /**\r\n * Describes an expanded entity record with UCS information.\r\n */\r\n export interface IEntityCoords extends Entity.IEntity {\r\n ucs?: IUcs;\r\n }\r\n\r\n /**\r\n * Params for shifting an entity to be relative to a point.\r\n */\r\n export interface IRelToPointParams {\r\n // Point to be relative to.\r\n point: Carto.ICarto;\r\n // If this is a test. Tests are not saved.\r\n test: boolean;\r\n // Human readable name of the UCS.\r\n name?: string;\r\n }\r\n\r\n /**\r\n * Params for shifting an entity to be relative to an EPSG.\r\n */\r\n export interface IRelToEpsgParams {\r\n // EPSG to be relative to.\r\n epsg: number;\r\n // If this is a test. Tests are not saved.\r\n test: boolean;\r\n // Human readable name of the UCS.\r\n name?: string;\r\n }\r\n\r\n /**\r\n * Params for shifting an entity to be relative to a UCS.\r\n */\r\n export interface IRelToUcsParams {\r\n // UCS to be relative to.\r\n ucsId: string;\r\n // If this is a test. Tests are not saved.\r\n test: boolean;\r\n // Human readable name of the UCS.\r\n name?: boolean;\r\n }\r\n\r\n /**\r\n * Returns an entity's location with expanded UCS information.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetEntityCoords(params: {\r\n api?: BruceApi.Api,\r\n // Entity to get UCS for. Typically the root entity of a hierarchy.\r\n rootEntityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The UCS information for the entity.\r\n coords: IEntityCoords\r\n }> {\r\n let { api, rootEntityId: entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(entityId), 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 = await api.GET(`entity/${entityId}/ucs`, reqParams);\r\n res({\r\n coords: data\r\n });\r\n } catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(entityId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns coordinates for an entity when relative to a point.\r\n * @param params \r\n * @returns \r\n */\r\n export async function EntityRelativeToPoint(params: {\r\n api?: BruceApi.Api,\r\n // Entity to get UCS for. Typically the root entity of a hierarchy.\r\n rootEntityId: string,\r\n req?: Api.IReqParams\r\n } & IRelToPointParams): Promise<{\r\n // The UCS information for the entity.\r\n coords: IEntityCoords\r\n }> {\r\n let { api, rootEntityId: entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!params.test) {\r\n await UnlinkCoords({\r\n api,\r\n rootEntityId: entityId,\r\n req: reqParams\r\n });\r\n }\r\n const point = params.point;\r\n const name = params.name || `${MathUtils.Round(point.latitude, 4)}, ${MathUtils.Round(point.longitude, 4)}`;\r\n const res = await api.POST(`entity/${entityId}/ucs`, {\r\n \"ucs\": {\r\n \"Entity.ID\": null,\r\n \"name\": name,\r\n \"location\": {\r\n \"latitude\": point.latitude,\r\n \"longitude\": point.longitude,\r\n \"altitude\": point.altitude,\r\n \"coordinates\": {\r\n \"Entity.ID\": entityId\r\n }\r\n }\r\n },\r\n \"test\": params.test\r\n }, reqParams);\r\n if (!params.test) {\r\n api.Cache.Remove(GetCacheKey(entityId));\r\n }\r\n return {\r\n coords: res\r\n };\r\n }\r\n\r\n /**\r\n * Returns coordinates for an entity when relative to an EPSG.\r\n * @param params \r\n * @returns \r\n */\r\n export async function EntityRelativeToEpsg(params: {\r\n api?: BruceApi.Api,\r\n // Entity to get UCS for. Typically the root entity of a hierarchy.\r\n rootEntityId: string,\r\n req?: Api.IReqParams\r\n } & IRelToEpsgParams): Promise<{\r\n // The UCS information for the entity.\r\n coords: IEntityCoords\r\n }> {\r\n let { api, rootEntityId: entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!params.test) {\r\n await UnlinkCoords({\r\n api,\r\n rootEntityId: entityId,\r\n req: reqParams\r\n });\r\n }\r\n const epsg = params.epsg;\r\n const name = params.name ?? \"EPSG: \" + epsg;\r\n const res = await api.POST(`entity/${entityId}/ucs`, {\r\n \"ucs\": {\r\n \"Entity.ID\": null,\r\n \"name\": name,\r\n \"location\": {\r\n \"coordinates\": {\r\n \"SRID\": \"EPSG:\" + epsg,\r\n \"Entity.ID\": entityId\r\n }\r\n }\r\n },\r\n \"test\": params.test\r\n }, reqParams);\r\n if (!params.test) {\r\n api.Cache.Remove(GetCacheKey(entityId));\r\n }\r\n return {\r\n coords: res\r\n };\r\n }\r\n\r\n /**\r\n * Returns coordinates for an entity when relative to a UCS.\r\n * @param params \r\n * @returns \r\n */\r\n export async function EntityRelativeToUcs(params: {\r\n api?: BruceApi.Api,\r\n // Entity to get UCS for. Typically the root entity of a hierarchy.\r\n rootEntityId: string,\r\n req?: Api.IReqParams\r\n } & IRelToUcsParams): Promise<{\r\n // The UCS information for the entity.\r\n coords: IEntityCoords\r\n }> {\r\n let { api, rootEntityId: entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!params.test) {\r\n await UnlinkCoords({\r\n api,\r\n rootEntityId: entityId,\r\n req: reqParams\r\n });\r\n }\r\n const ucsId = params.ucsId;\r\n const res = await api.POST(`entity/${entityId}/ucs`, {\r\n \"ucs\": {\r\n \"Entity.ID\": ucsId\r\n },\r\n \"test\": params.test\r\n }, reqParams);\r\n if (!params.test) {\r\n api.Cache.Remove(GetCacheKey(entityId));\r\n }\r\n return {\r\n coords: res\r\n };\r\n }\r\n\r\n /**\r\n * Unlinks UCS coordinates from an entity.\r\n * @param params \r\n * @returns \r\n */\r\n export async function UnlinkCoords(params: {\r\n api?: BruceApi.Api,\r\n // Entity to get UCS for. Typically the root entity of a hierarchy.\r\n rootEntityId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, rootEntityId: entityId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n return api.DELETE(`entity/${entityId}/ucs`, reqParams);\r\n }\r\n}","/**\r\n * Deprecated settings for entity types.\r\n * We now store selection settings within project views.\r\n */\r\nexport namespace EntityTypeVisualSettings {\r\n export enum EAction {\r\n LeftClick = \"LeftClick.CustomForm.ID\",\r\n RightClick = \"RightClick.CustomForm.ID\",\r\n DoubleClick = \"DoubleClick.CustomForm.ID\",\r\n MouseHover = \"MouseHover.CustomForm.ID\"\r\n }\r\n\r\n export interface ISettings {\r\n // Custom forms to display when a certain action is performed on related entities.\r\n // If the form is set to 0, that means use the default panel instead of a form.\r\n // When the form value is -1 that means don't display anything.\r\n CustomForms?: {\r\n // Default is 0.\r\n [EAction.LeftClick]?: number,\r\n // Default is -1.\r\n [EAction.RightClick]?: number,\r\n // Default is -1.\r\n [EAction.MouseHover]?: number,\r\n // Default is -1.\r\n [EAction.DoubleClick]?: number\r\n }\r\n }\r\n}","/**\r\n * Describes an entity type schema attribute.\r\n */\r\nexport namespace EntityAttribute {\r\n export enum EType {\r\n // Arbitrary text attribute.\r\n String = \"String\",\r\n // Floating point number attribute.\r\n Double = \"Double\",\r\n // Whole number attribute.\r\n Integer = \"Integer\",\r\n // iso8601 date time string.\r\n Datetime = \"Datetime\",\r\n // Group of attributes.\r\n Structure = \"Structure\",\r\n // Nextspace vector geometry.\r\n Geometry = \"Geometry\",\r\n // True/false attribute.\r\n Boolean = \"Boolean\"\r\n }\r\n\r\n /**\r\n * Describes an entity attribute.\r\n * This sits within an entity type schema.\r\n */\r\n export interface IAttribute {\r\n // The attribute JSON key.\r\n Key: string;\r\n // The attribute human readable name.\r\n Name?: string;\r\n // The attribute type.\r\n Type?: EType;\r\n // If this attribute is indexed or not.\r\n // Indexed attributes can be searched on.\r\n IsIndexed?: boolean;\r\n // If this attribute is important or not.\r\n // This indicates it should be displayed in tables and lists.\r\n IsImportant?: boolean;\r\n // If this attribute is an array or not.\r\n // @warning, low support.\r\n IsArray?: boolean;\r\n // If this attribute is a structure, this is the structure definition.\r\n Structure?: IAttribute[];\r\n // (Optional) The max-size of a string attribute.\r\n // @warning, this will limit the column size.\r\n // @deprecated, use metadata.\r\n Size?: number;\r\n // Metadata for displaying the attributes.\r\n Metadata?: IMetadata;\r\n // Family attributes are shared across all entities of a type instead of having a per-entity definition.\r\n // @warning, low support.\r\n IsFamilyAttribute?: boolean;\r\n // If this attribute has a default value.\r\n // This will pre-populate for new entities on entity creation.\r\n // @warning, low support.\r\n IsFamilyAttributeDefault?: boolean;\r\n // TODO: document.\r\n Sources?: string[];\r\n }\r\n\r\n /**\r\n * Describes additional metadata for an attribute.\r\n */\r\n export interface IMetadata {\r\n // Dictionary will let the user select from a set of attribute values.\r\n dictionary?: IDictionary;\r\n // Default is infinite.\r\n // Only applies to string attributes.\r\n maxLength?: number;\r\n // Number min/max.\r\n // Only applies to number attributes.\r\n min?: number;\r\n max?: number;\r\n // Units to display alongside the value.\r\n // Only applies to number attributes.\r\n unit?: string;\r\n }\r\n \r\n /**\r\n * Describes a dictionary of values for an attribute.\r\n */\r\n export interface IDictionary {\r\n // Default is false.\r\n enabled?: boolean;\r\n // The source entity type for retrieving the dictionary values.\r\n entityTypeId?: string;\r\n // The attribute path to retrieve the dictionary values from.\r\n attrPath?: string;\r\n }\r\n\r\n /**\r\n * Returns an attribute from a provided hierarchy of attributes.\r\n * Eg: Use the path: [\"Bruce\", \"ID\"] to find the \"ID\" attribute.\r\n * @param items \r\n * @param path \r\n * @returns \r\n */\r\n export function GetAttribute(items: IAttribute[], path: string[]): IAttribute {\r\n if (!items || !path || !path.length) {\r\n return null;\r\n }\r\n const key = path[0];\r\n const item = items.find((i) => i.Key === key);\r\n if (!item || !item.Structure || !path.length) {\r\n return item;\r\n }\r\n return GetAttribute(item.Structure, path.slice(1));\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\n\r\n/**\r\n * Utility for uploading files.\r\n */\r\nexport namespace Uploader {\r\n export const MIN_LARGE_FILE_SIZE = 100000000; // 100MB.\r\n\r\n export interface IProgress {\r\n percent: number;\r\n uploaded: boolean;\r\n }\r\n\r\n /**\r\n * Uploads a file to the server.\r\n * @param params \r\n * @returns \r\n */\r\n export async function DoMultiPartUpload(params: {\r\n // File to upload.\r\n file: File,\r\n // API to use for upload.\r\n api?: BruceApi.Api,\r\n // URL suffix to use for upload.\r\n // This is appended to the API's base url.\r\n urlSuffix: string,\r\n req?: Api.IUploadReqParams,\r\n // Callback for progress updates.\r\n onProgress?: (progress: IProgress) => void\r\n }) {\r\n let { file, api, urlSuffix: url, req, onProgress } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const FILE_PORTION_SIZE = 100000000; // 100MB.\r\n let fileSize = file.size;\r\n let fileOffset = 0;\r\n let filePartsCount = fileSize / FILE_PORTION_SIZE;\r\n let t = Math.trunc(filePartsCount);\r\n filePartsCount = filePartsCount > t ? t + 1 : t;\r\n let filePartIndex = 1;\r\n let uploadToken = ObjectUtils.UId();\r\n let data: any;\r\n while (fileOffset < fileSize) {\r\n let partSize = Math.min(FILE_PORTION_SIZE, fileSize - fileOffset);\r\n let retryCount: number = 5;\r\n let retryWait: number = 1000;\r\n while (retryCount > 0) {\r\n try {\r\n const blob = file.slice(fileOffset, fileOffset + partSize);\r\n const formData = new FormData();\r\n formData.append(\"originalFileName\", file.name);\r\n formData.append(\"token\", uploadToken);\r\n formData.append(\"count\", \"\" + filePartsCount);\r\n formData.append(\"part\", \"\" + filePartIndex);\r\n formData.append(\"file\", blob);\r\n const reqParams = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n reqParams.formData = formData;\r\n reqParams.onProgress = (progress: ProgressEvent) => {\r\n const sofar = fileOffset + progress.loaded;\r\n const percent = Math.round ((sofar / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n data = await api.UPLOAD(url, blob, reqParams)\r\n retryCount = 0;\r\n }\r\n catch (up) {\r\n retryCount -= 1;\r\n if (retryCount <= 0) {\r\n throw up;\r\n }\r\n await new Promise((res) => setTimeout(res, retryWait));\r\n retryWait = retryWait * 2;\r\n }\r\n }\r\n fileOffset += partSize;\r\n filePartIndex++;\r\n }\r\n onProgress?.({\r\n percent: 100,\r\n uploaded: true\r\n });\r\n return data;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Uploader } from \"../internal/uploader\";\r\n\r\n/**\r\n * Describes the \"Client File\" concept within Nextspace.\r\n * A client file is a record of a file uploaded to Bruce.\r\n */\r\nexport namespace ClientFile {\r\n /**\r\n * Returns cache identifier for a client file by ID.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"123\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param fileId \r\n * @returns \r\n */\r\n export function GetCacheKey(fileId: string): string {\r\n return `${Api.ECacheKey.ClientFile}${Api.ECacheKey.Id}${fileId}`;\r\n }\r\n\r\n /**\r\n * Describes a client file record.\r\n */\r\n export interface IFile {\r\n // The ID of the file.\r\n ID: string;\r\n // The file's extension.\r\n // Currently a mess with conflicting records with and without the dot.\r\n FileExt: string;\r\n // The file's mime type.\r\n MIMEType: string;\r\n // The file's original name. This includes the extension.\r\n OriginalFileName: string;\r\n // The file's size in bytes.\r\n OriginalLength: number;\r\n // The user's ID who uploaded the file.\r\n \"UploadedByUser.ID\": string;\r\n // An optional category for the file.\r\n // Some Nextspace default purposes have additional meaning.\r\n Purpose: Purpose;\r\n // UTC date/time when the file was uploaded.\r\n UploadedTimeUTC: UTC.IUTC;\r\n }\r\n\r\n // Client file purpose. This is an optional level of categorization for a file.\r\n export type Purpose = string | EPurpose;\r\n export enum EPurpose {\r\n // Use this purpose for uploading bookmark thumbnail images.\r\n // This will allow lower level privileges to upload (small) bookmark thumbnails.\r\n BookmarkThumbnail = \"Bookmark Thumbnail\"\r\n }\r\n\r\n /**\r\n * Returns the URL for a client file.\r\n * @param params \r\n * @returns \r\n */\r\n export function GetUrl(params: {\r\n api?: BruceApi.Api,\r\n // The related client file ID.\r\n fileId: string\r\n }): string {\r\n let { api, fileId } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n return `${api.GetBaseUrl()}file/${fileId}`;\r\n }\r\n\r\n /**\r\n * Returns the URL for a client file with the extension.\r\n * @param params \r\n * @returns \r\n */\r\n export function GetUrlWithExt(params: {\r\n api?: BruceApi.Api,\r\n // The related client file record.\r\n file: IFile\r\n }): string {\r\n let { api, file } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n return `${api.GetBaseUrl()}file/${file.ID}${file.FileExt ? file.FileExt : \"\"}`;\r\n }\r\n\r\n /**\r\n * Returns a client file record by ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n fileId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n clientFile: IFile\r\n }> {\r\n let { api, fileId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!fileId) {\r\n throw(\"File ID is required.\");\r\n }\r\n const key = GetCacheKey(fileId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`file/${fileId}/details`, Api.PrepReqParams(reqParams));\r\n res({\r\n clientFile: 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,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Deletes one or many client file records by IDs.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n fileIds: string[],\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, fileIds, req: reqParams } = params;\r\n if (!fileIds.length) {\r\n return Promise.resolve();\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n const data = {\r\n Items: fileIds\r\n };\r\n await api.POST(\"deleteFiles\", data, Api.PrepReqParams(reqParams));\r\n for (let i = 0; i < fileIds.length; i++) {\r\n const key = GetCacheKey(fileIds[i]);\r\n api.Cache.Remove(key);\r\n }\r\n }\r\n\r\n /**\r\n * Uploads a file and creates a new client file record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Upload(params: {\r\n api?: BruceApi.Api,\r\n file: File,\r\n purpose?: string,\r\n onProgress?: (progress: Uploader.IProgress) => void,\r\n req?: Api.IUploadReqParams\r\n }): Promise<{\r\n clientFile: IFile\r\n }> {\r\n let { api, file, purpose, req, onProgress } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!file) {\r\n throw(\"File is required.\");\r\n }\r\n const size = file?.size;\r\n if (!size) {\r\n throw(\"You cannot upload a 0byte sized file.\");\r\n }\r\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n let clientFile: IFile;\r\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\r\n clientFile = await Uploader.DoMultiPartUpload({\r\n api,\r\n file,\r\n urlSuffix: \"fileUpload\",\r\n req,\r\n onProgress\r\n });\r\n // TODO: Check if we can add it to the request like the small file upload.\r\n if (clientFile?.ID && purpose) {\r\n await UpdatePurpose({\r\n api,\r\n fileId: clientFile.ID,\r\n purpose,\r\n req\r\n })\r\n }\r\n }\r\n else {\r\n req.onProgress = (progress: ProgressEvent) => {\r\n const percent = Math.round ((progress.loaded / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n if (purpose) {\r\n req.formData = {\r\n Purpose: purpose\r\n };\r\n }\r\n clientFile = await api.UPLOAD(\"file/uploadNew\", file, req);\r\n }\r\n onProgress?.({\r\n percent: 100,\r\n uploaded: true\r\n });\r\n return {\r\n clientFile\r\n };\r\n }\r\n\r\n /**\r\n * Updates the purpose of a client file.\r\n * @param params \r\n */\r\n export async function UpdatePurpose(params: {\r\n api?: BruceApi.Api,\r\n fileId: string,\r\n purpose: string,\r\n req?: Api.IReqParams\r\n }) {\r\n let { api, fileId, purpose, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!purpose) {\r\n purpose = \"\";\r\n }\r\n await api.POST(\"file/updatepurpose/\" + fileId + \"/?Purpose=\" + purpose, {\r\n Purpose: purpose\r\n }, Api.PrepReqParams(reqParams));\r\n const cacheKey = GetCacheKey(fileId);\r\n api.Cache.RemoveByContains(cacheKey);\r\n }\r\n\r\n /**\r\n * Uploads a temp file.\r\n * This will return a temp file ID.\r\n * @param params\r\n * @returns\r\n */\r\n export async function UploadTemp(params: {\r\n api?: BruceApi.Api,\r\n file: File,\r\n onProgress?: (progress: Uploader.IProgress) => void,\r\n req?: Api.IUploadReqParams\r\n }): Promise<{\r\n tempFileId: string\r\n }> {\r\n let { api, file, req, onProgress } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!file) {\r\n throw(\"File is required.\");\r\n }\r\n const size = file?.size;\r\n if (!size) {\r\n throw(\"You cannot upload a 0byte sized file.\");\r\n }\r\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n let tempFile: any;\r\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\r\n tempFile = await Uploader.DoMultiPartUpload({\r\n api,\r\n file,\r\n urlSuffix: \"tempFileUpload\",\r\n req,\r\n onProgress\r\n });\r\n }\r\n else {\r\n req.onProgress = (progress: ProgressEvent) => {\r\n const percent = Math.round ((progress.loaded / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n tempFile = await api.UPLOAD(\"file/uploadTemp\", file, req);\r\n }\r\n onProgress?.({\r\n percent: 100,\r\n uploaded: true\r\n });\r\n return {\r\n tempFileId: tempFile[\"TempFile.ID\"]\r\n };\r\n }\r\n\r\n /**\r\n * Filter definitions for requesting a list of client files.\r\n */\r\n export namespace Filter {\r\n export enum EColumn {\r\n ID = \"id\",\r\n Name = \"name\",\r\n DateTime = \"datetime\",\r\n MIMEType = \"mimeType\",\r\n Size = \"size\",\r\n User = \"user\",\r\n Extension = \"extension\"\r\n }\r\n\r\n export enum ESortOrder {\r\n ASC = \"asc\",\r\n DEC = \"desc\"\r\n }\r\n\r\n export enum ERowOperator {\r\n AND = \"AND\",\r\n OR = \"OR\"\r\n }\r\n\r\n export interface IRow {\r\n column: EColumn;\r\n value: any;\r\n valueOperator: string;\r\n includes: boolean;\r\n rowOperator: ERowOperator;\r\n rows?: IRow[];\r\n }\r\n }\r\n\r\n export interface IFilter {\r\n PageSize?: number;\r\n PageIndex?: number;\r\n OrderBy?: Filter.EColumn;\r\n SortOrder?: Filter.ESortOrder;\r\n Purpose?: string;\r\n FilterRows?: Filter.IRow[];\r\n }\r\n\r\n /**\r\n * Returns a list of client files matching the filter.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n filter: IFilter,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n clientFiles: IFile[],\r\n // Total available matching the filter.\r\n // This is not the total returned in the current page.\r\n totalCount: number\r\n }> {\r\n let { api, filter, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const data = await api.POST(\"files/filtered\", filter, Api.PrepReqParams(reqParams));\r\n return {\r\n clientFiles: data.Items,\r\n totalCount: data.TotalCount\r\n };\r\n }\r\n\r\n /**\r\n * Utility for processing client files.\r\n * Commonly used to convert a file to a different format. Eg: FBX to GLB.\r\n */\r\n export namespace Processor {\r\n /**\r\n * Describes the result of a file processing operation.\r\n */\r\n export interface IResult {\r\n success: boolean;\r\n clientFileId: string;\r\n clientFileName: string;\r\n }\r\n\r\n /**\r\n * The desired file format to convert to.\r\n */\r\n export enum EConvertExt {\r\n // Recommended.\r\n GLB = \".glb\",\r\n // Unstable.\r\n SKP = \".skp\",\r\n }\r\n\r\n export async function ConvertFormat(params: {\r\n api?: BruceApi.Api,\r\n // ID of client file we're processing.\r\n fileId: string,\r\n // The desired file format to convert to.\r\n // If not specified, the file will be converted to GLB.\r\n ext?: EConvertExt | string,\r\n req?: Api.IReqParams\r\n }): Promise<IResult> {\r\n let { api, fileId: clientFileId, ext, req: reqParams } = params;\r\n if (!clientFileId) {\r\n throw(\"Client File ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!ext) {\r\n ext = EConvertExt.GLB;\r\n }\r\n \r\n return api.POST(\"convertFileToFile\", {\r\n clientFileId: clientFileId,\r\n destinationFormat: ext,\r\n operations: []\r\n }, reqParams);\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\ntype Id = ProgramKey.EProgramId | string;\r\n\r\n/**\r\n * Describes the \"Program Key\" concept within Nextspace.\r\n * A program key is an access token for an arbitrary software.\r\n */\r\nexport namespace ProgramKey {\r\n /**\r\n * Returns cache identifier for a program key.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param programId\r\n * @returns \r\n */\r\n export function GetCacheKey(programId: string): string {\r\n return Api.ECacheKey.ProgramKey + Api.ECacheKey.Id + programId;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of program keys.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @returns\r\n */\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.ProgramKey;\r\n }\r\n\r\n /**\r\n * Known program IDs that Nextspace applications will reference.\r\n */\r\n export enum EProgramId {\r\n // Cesium Ion token. Used for Cesium World Terrain and Bing Maps within CesiumJS.\r\n CesiumIon = \"CesiumIon\",\r\n // Bing Maps key. Used for Bing Maps within Unreal.\r\n BingMaps = \"BingMaps\",\r\n // Mapbox key. Used for Mapbox within CesiumJS and Unreal.\r\n Mapbox = \"Mapbox\",\r\n // Google Maps key. Used for Google Maps 3D tileset for CesiumJS and Unreal.\r\n Google = \"Google\"\r\n }\r\n\r\n /**\r\n * Describes a program key record.\r\n */\r\n export interface IKey {\r\n // ID of the program key record.\r\n ProgramId: Id;\r\n // The program key.\r\n Key: string;\r\n // If access to the plugin should be restricted.\r\n // When a plugin is restricted a user must have the \"ProgramKey_<pluginId>\" permission.\r\n IsAccessRestricted?: boolean;\r\n }\r\n\r\n /**\r\n * Returns a program key record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the program key record.\r\n programId: Id,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The program key record.\r\n programKey: IKey\r\n }> {\r\n let { api, programId, req: reqParams } = params;\r\n if (!programId) {\r\n throw(\"Program ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n // Our API throws an error when a key is not set which is a bit annoying.\r\n // Since we only use these keys for a few specific things we'll just request the list and avoid the error.\r\n // If this becomes useful for more things we'll make requesting a key that doesn't exist just return empty JSON.\r\n\r\n const prom = await GetList({\r\n api,\r\n req: reqParams\r\n });\r\n const key = prom.programKeys.find(k => k.ProgramId === programId);\r\n \r\n\r\n // const key = GetCacheKey(programId);\r\n // const cache = await api.GetCacheItem(key, 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 = await api.GET(`programkey/${programId}`, Api.PrepReqParams(reqParams));\r\n // res({\r\n // programKey: 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,\r\n // value: prom,\r\n // req: reqParams\r\n // });\r\n\r\n return {\r\n programKey: key\r\n };\r\n }\r\n\r\n /**\r\n * Returns a list of program key records.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of program key records.\r\n programKeys: IKey[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"programkeys\", Api.PrepReqParams(reqParams));\r\n res({\r\n programKeys: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Deletes a program key record.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // ID of the program key record.\r\n programId: Id,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, programId, req: reqParams } = params;\r\n if (!programId) {\r\n throw(\"Program ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`programkey/${programId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(programId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Creates or updates a program key record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // The program key record.\r\n programKey: IKey,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The program key record.\r\n programKey: IKey\r\n }> {\r\n let { api, programKey: data, req: reqParams } = params;\r\n if (!data?.ProgramId) {\r\n throw(\"Program ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const res = await api.POST(\"programkey\", data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ProgramId));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n programKey: res\r\n };\r\n }\r\n}","import { Style } from \"../bruce-models\";\r\n\r\n/**\r\n * Describes an expectation on what should be rendered for a menu item-\r\n * between a min-max distance of an entity to the camera.\r\n */\r\nexport namespace ZoomControl {\r\n /**\r\n * Available display types for a menu item.\r\n */\r\n export enum EDisplayType {\r\n // Hidden means it will not be rendered.\r\n Hidden = \"hidden\",\r\n // Point will try render a point based on any available Entity data.\r\n Point = \"point\",\r\n // Geometry means it will try render multi-geometry, polygon, polyline, or point in order of priority.\r\n Geometry = \"geometry\",\r\n // 3D means it will try render 3D model, multi-geometry, polygon, polyline, or point in order of priority.\r\n Model3D = \"3d\"\r\n }\r\n\r\n /**\r\n * Describes a menu item's zoom control row.\r\n * Typically there is an array of these for a menu item.\r\n */\r\n export interface IItem {\r\n // The minimum distance in meters from the camera to enable this item.\r\n MinZoom?: number,\r\n // The maximum distance in meters from the camera to enable this item.\r\n MaxZoom?: number,\r\n // The display type to use for this item.\r\n DisplayType?: EDisplayType,\r\n // The style to use for this item.\r\n StyleID?: number,\r\n Style?: Style.IEntitySettings;\r\n // The LOD category to use for this item.\r\n LODCategoryID?: string,\r\n // The LOD level to use for this item.\r\n LODLevel?: number | string;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { PendingAction } from \"../server/pending-action\";\r\nimport { GlobalApi } from \"../api/global-api\";\r\nimport { Transform } from \"../common/transform\";\r\nimport { Carto } from \"../common/carto\";\r\nimport { Bounds } from \"../common/bounds\";\r\nimport { Uploader } from \"../internal/uploader\";\r\nimport { IDictionary } from \"../common/dictionary\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\ntype Settings = Tileset.Settings.IPointcloud |\r\n Tileset.Settings.ICad |\r\n Tileset.Settings.IEntitiesMap |\r\n Tileset.Settings.IEntities |\r\n Tileset.Settings.IExternalMap |\r\n Tileset.Settings.IExternalTerrain |\r\n Tileset.Settings.IMap |\r\n Tileset.Settings.ITerrain;\r\n\r\n/**\r\n * Describes the \"Tileset\" concept in Nextspace.\r\n *\r\n * Tilesets come in three possible variants,\r\n * 1- A set of instructions to generate a tileset.\r\n * 2- Settings to load a tileset hosted elsewhere.\r\n * 3- A set of user-provided files to serve.\r\n *\r\n * Read the individual tileset-type settings for each variant.\r\n */\r\nexport namespace Tileset {\r\n /**\r\n * Returns cache identifier for a tileset.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\", false);\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param tilesetId\r\n * @param loadFiles\r\n * @returns \r\n */\r\n export function GetCacheKey(tilesetId: string, loadFiles: boolean): string {\r\n return `${Api.ECacheKey.Tileset}${Api.ECacheKey.Id}${tilesetId}${Api.ECacheKey.Id}${loadFiles}`;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of tilesets.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @returns\r\n */\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.Tileset;\r\n }\r\n\r\n /**\r\n * Describes a tileset record.\r\n */\r\n export interface ITileset {\r\n // ID of the tileset record.\r\n id: string;\r\n // Human readable name of the tileset.\r\n name: string;\r\n // Type of the tileset.\r\n type: EType;\r\n // Root file name. Default = \"tileset.json\".\r\n rootFileName?: string;\r\n // Tileset settings.\r\n settings?: Settings;\r\n // Array of files that make up the tileset.\r\n fileIds?: string[];\r\n // Date/time the tileset was created.\r\n creationTime?: UTC.IUTC;\r\n // Date/time the tileset was last modified.\r\n modificationTime?: UTC.IUTC;\r\n // Version of the tileset. This is bumped on regeneration.\r\n generateVersion?: number;\r\n // If deletion is locked. If locked the deleting will throw an error.\r\n isDeleteDisabled?: boolean;\r\n // URL to load the tileset with.\r\n loadUrl?: string;\r\n // If access to the tileset should be restricted.\r\n // When a tileset is restricted a user must have the \"Tileset_<tilesetId>\" permission.\r\n isRestricted?: boolean;\r\n }\r\n\r\n /**\r\n * Available tileset types.\r\n */\r\n export enum EType {\r\n PointCloud = \"POINT_CLOUD\",\r\n GeoMap = \"GEO_MAP\", // Previously gtfRasterMaps.\r\n EntitiesMap = \"ENTITIES_MAP\", // Previously rasterMap.\r\n EntitiesSet = \"ENTITIES_SET\", // Previously dynamic.\r\n Cad = \"MODEL\", // Generated CAD tileset from entity id.\r\n Terrain = \"GEO_TERR\",\r\n ExternalTerrain = \"EXTERNAL_TERR\",\r\n ExternalGeoMap = \"EXTERNAL_MAP\",\r\n LegacyEntitiesSet = \"D\",\r\n LegacyStatic = \"S\",\r\n LegacyExternal = \"X\"\r\n }\r\n\r\n /**\r\n * Available tileset pivot types.\r\n */\r\n export enum EPivot {\r\n // Leaves the pivot as is. This will use the root entity's defined position.\r\n // Recommended.\r\n None = \"none\",\r\n // Moves pivot to the center of the bounding box.\r\n Box = \"box\",\r\n // Moves pivot to the graphical center.\r\n // This will try ignore anomalies.\r\n Weight = \"weight\",\r\n // @deprecated.\r\n UCS = \"ucs\"\r\n }\r\n\r\n /**\r\n * Returns a tileset record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tileset record.\r\n tilesetId: string,\r\n // If the tileset files should be loaded.\r\n // Recommended to be false.\r\n loadFiles?: boolean,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The tileset record.\r\n tileset: ITileset\r\n }> {\r\n let { api, tilesetId, loadFiles, req: reqParams } = params;\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(tilesetId, loadFiles), 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 = await api.GET(`tileset/get/${tilesetId}?noFiles=${Boolean(loadFiles) ? 0 : 1}`, reqParams);\r\n res({\r\n tileset: 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(tilesetId, loadFiles),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns tileset types for given tileset ids.\r\n * @param params\r\n * @deprecated Just use GetList and Get to find the type from the tileset record.\r\n * @returns\r\n */\r\n export async function GetTypes(params: {\r\n api?: BruceApi.Api,\r\n tilesetIds: string[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Tileset id -> type mapping.\r\n typeMapping: IDictionary<EType>\r\n }> {\r\n // UPDATE: This was corrected, this will be removed.\r\n // Our api is auto-converting legacy types right now which makes it impossible to know what they are.\r\n // This uses the legacy end-point which doesn't do that...\r\n let { api, tilesetIds, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const mapping = {};\r\n if (tilesetIds.length == 1) {\r\n const tileset = await api.GET(\"ui.tileset/\" + tilesetIds[0], Api.PrepReqParams(reqParams));\r\n if (tileset) {\r\n mapping[tilesetIds[0]] = tileset.Type;\r\n }\r\n }\r\n else if (tilesetIds.length > 1) {\r\n const tilesets = await api.GET(\"ui.tilesets\", Api.PrepReqParams(reqParams));\r\n for (const tileset of tilesets) {\r\n if (tilesetIds.indexOf(tileset.ID) >= 0) {\r\n mapping[tileset.ID] = tileset.Type;\r\n }\r\n }\r\n }\r\n return {\r\n typeMapping: mapping\r\n };\r\n }\r\n\r\n /**\r\n * Returns a list of tileset records.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of tileset records.\r\n tilesets: ITileset[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"tileset/getList\", reqParams)\r\n res({\r\n tilesets: 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: GetListCacheKey(),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Deletes a tileset record.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tileset record to delete.\r\n tilesetId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, tilesetId, req: reqParams } = params;\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`tileset/delete/${tilesetId}`, reqParams);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset + Api.ECacheKey.Id + tilesetId);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset);\r\n }\r\n\r\n /**\r\n * Creates or updates a tileset record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // Tileset record to create or update.\r\n tileset: ITileset,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The tileset record.\r\n tileset: ITileset\r\n }> {\r\n let { api, tileset: data, req: reqParams } = params;\r\n if (!data?.name || !data?.type) {\r\n throw(\"Tileset name and type are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n let isNew = !data.id;\r\n if (isNew) {\r\n const res: ITileset = await api.GET(`tileset/new?type=${data.type}&name=${Api.Encode(data.name)}`, reqParams);\r\n data = {\r\n ...res,\r\n ...data,\r\n settings: {\r\n ...res.settings,\r\n ...data.settings\r\n },\r\n id: res.id\r\n }\r\n }\r\n await api.POST(`tileset/update/${data.id}`, data, Api.PrepReqParams(reqParams));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset + Api.ECacheKey.Id + data.id);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.Tileset);\r\n return {\r\n tileset: data\r\n };\r\n }\r\n\r\n /**\r\n * Uploads a file to a tileset.\r\n * @param params \r\n */\r\n export async function UploadFile(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tileset to upload to.\r\n tilesetId: string,\r\n // File to upload.\r\n file: File,\r\n // (Optional) Progress callback.\r\n onProgress?: (progress: Uploader.IProgress) => void,\r\n req?: Api.IUploadReqParams\r\n }): Promise<void> {\r\n let { api, file, req, tilesetId, onProgress } = params;\r\n if (!tilesetId || !file) {\r\n throw(\"Tileset ID and file are required.\");\r\n }\r\n const size = file?.size;\r\n if (!size) {\r\n throw(\"You cannot upload a 0byte sized file.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\r\n await Uploader.DoMultiPartUpload({\r\n api,\r\n file,\r\n urlSuffix: `tileset/uploadFileEx/${tilesetId}/add`,\r\n req,\r\n onProgress\r\n });\r\n }\r\n else {\r\n req.onProgress = (progress: ProgressEvent) => {\r\n const percent = Math.round ((progress.loaded / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n await api.UPLOAD(`tileset/uploadFile/${tilesetId}/files`, file, req);\r\n }\r\n api.Cache.Remove(GetCacheKey(tilesetId, true));\r\n onProgress?.({\r\n percent: 100,\r\n uploaded: true\r\n });\r\n }\r\n\r\n /**\r\n * Deletes a file from a tileset.\r\n * @param params \r\n */\r\n export async function DeleteFile(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tileset to delete from.\r\n tilesetId: string,\r\n // Name of the file to delete.\r\n file: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, tilesetId, file, req: reqParams } = params;\r\n if (!tilesetId || !file) {\r\n throw(\"Tileset ID and file are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`tileset/deleteFile/${tilesetId}/files/${file}`, reqParams);\r\n api.Cache.Remove(GetCacheKey(tilesetId, true));\r\n }\r\n\r\n /**\r\n * Uploads a file to a tileset.\r\n * Src files are used to generate tilesets.\r\n * @param params \r\n * @returns \r\n */\r\n export async function UploadSrcFile(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tileset to upload to.\r\n tilesetId: string,\r\n // File to upload.\r\n file: File,\r\n // (Optional) Progress callback.\r\n onProgress?: (progress: Uploader.IProgress) => void,\r\n req?: Api.IUploadReqParams\r\n }): Promise<void> {\r\n let { api, file, req, tilesetId, onProgress } = params;\r\n if (!tilesetId || !file) {\r\n throw(\"Tileset ID and file are required.\");\r\n }\r\n const size = file?.size;\r\n if (!size) {\r\n throw(\"You cannot upload a 0byte sized file.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n if (size > Uploader.MIN_LARGE_FILE_SIZE) {\r\n await Uploader.DoMultiPartUpload({\r\n api,\r\n file,\r\n urlSuffix: `tileset/uploadFileEx/${tilesetId}/src`,\r\n req,\r\n onProgress\r\n });\r\n }\r\n else {\r\n req.onProgress = (progress: ProgressEvent) => {\r\n const percent = Math.round ((progress.loaded / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n await api.UPLOAD(`tileset/uploadFile/${tilesetId}/src`, file, req);\r\n }\r\n api.Cache.Remove(GetCacheKey(tilesetId, true));\r\n onProgress?.({\r\n percent: 100,\r\n uploaded: true\r\n });\r\n return;\r\n }\r\n\r\n /**\r\n * Deletes a file from a tileset.\r\n * Src files are used to generate tilesets.\r\n * @param params \r\n */\r\n export async function DeleteSrcFile(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tileset to delete from.\r\n tilesetId: string,\r\n // Name of the file to delete.\r\n file: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, tilesetId, file, req: reqParams } = params;\r\n if (!tilesetId || !file) {\r\n throw(\"Tileset ID and file are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`tileset/deleteFile/${tilesetId}/src/${file}`, reqParams);\r\n api.Cache.Remove(GetCacheKey(tilesetId, true));\r\n }\r\n\r\n /**\r\n * Returns file url for a file + tileset.\r\n * @param params \r\n * @returns \r\n */\r\n export function GetFileUrl(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tileset.\r\n tilesetId: string,\r\n // Name of the file.\r\n file: string\r\n }): string {\r\n let { api, tilesetId, file } = params;\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!file) {\r\n file = \"\";\r\n }\r\n return api.GetBaseUrl() + `tileset/getFile/${tilesetId}/files/${file}`;\r\n }\r\n\r\n /**\r\n * Returns file url for a src file + tileset.\r\n * @param params \r\n * @returns \r\n */\r\n export function GetSrcFileUrl(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tileset.\r\n tilesetId: string,\r\n // Name of the file.\r\n file: string\r\n }): string {\r\n let { api, tilesetId, file } = params;\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!file) {\r\n file = \"\";\r\n }\r\n return api.GetBaseUrl() + `tileset/getFile/${tilesetId}/src/${file}`;\r\n }\r\n\r\n /**\r\n * Returns file url for a file + tileset.\r\n * @param params \r\n * @returns \r\n */\r\n export function GetPublicFileUrl(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tileset.\r\n tilesetId: string,\r\n // Default = false.\r\n viaCdn?: boolean,\r\n // (Optional) Cache killing token to append to the request url.\r\n viaCdnCacheToken?: number | string,\r\n file: string\r\n }): string {\r\n let { api, tilesetId, file, viaCdn, viaCdnCacheToken } = params;\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!file) {\r\n file = \"\";\r\n }\r\n const cdnBaseUrl = viaCdn ? api.GetCdnBaseUrl() : null;\r\n if (cdnBaseUrl) {\r\n if (!viaCdnCacheToken) {\r\n viaCdnCacheToken = 0;\r\n }\r\n return cdnBaseUrl + `tileset/file/${tilesetId}/${file}?accountId=${api.AccountId}&cacheToken=${viaCdnCacheToken}`;\r\n }\r\n else {\r\n return api.GetBaseUrl() + `tileset/file/${tilesetId}/${file}`;\r\n }\r\n }\r\n\r\n /**\r\n * Calls the generate end-point for a tileset.\r\n * The requirements for successful generation are based on the type of tileset.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Generate(params: {\r\n api?: BruceApi.Api,\r\n // ID of the tileset to generate.\r\n tilesetId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // ID of the pending action to monitor.\r\n pendingActionId: number\r\n }> {\r\n let { api, tilesetId, req: reqParams } = params;\r\n if (!tilesetId) {\r\n throw(\"Tileset ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const res: PendingAction.IAction = await api.GET(`tileset/generate/${tilesetId}`, Api.PrepReqParams(reqParams));\r\n return {\r\n pendingActionId: res.ID\r\n };\r\n }\r\n\r\n /**\r\n * Utils for publishing the tileset to other Nextspace accounts.\r\n */\r\n export namespace Publish {\r\n export function GetCacheKey(accountId: string, tilesetId?: string): string {\r\n if (!tilesetId) {\r\n tilesetId = \"\";\r\n }\r\n return Api.ECacheKey.PublishTileset + Api.ECacheKey.Id + accountId + Api.ECacheKey.Id + tilesetId;\r\n }\r\n\r\n export function GetAccessAllowedCacheKey(tilesetId: string, sourceAccountId: string, forAccountId: string) {\r\n return Api.ECacheKey.PublishTileset + Api.ECacheKey.TilesetAccess + Api.ECacheKey.Id + tilesetId + Api.ECacheKey.Id + sourceAccountId + Api.ECacheKey.Id + forAccountId;\r\n }\r\n\r\n export interface IPublish {\r\n ID?: number;\r\n Name: string;\r\n \"Tileset.ID\"?: string;\r\n \"PublishedBy.ClientAccount.ID\"?: string;\r\n \"PublishedBy.User.ID\"?: string;\r\n \"Published.DateTime\"?: UTC.IUTC;\r\n IsPublic: boolean;\r\n \"EnabledFor.ClientAccount.ID\"?: string[];\r\n }\r\n\r\n export async function Update(params: {\r\n api?: GlobalApi.Api,\r\n published: IPublish,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n published: IPublish\r\n }> {\r\n let { api, published: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGlobalApi();\r\n }\r\n\r\n if (!data?.[\"Tileset.ID\"] || !data?.[\"PublishedBy.ClientAccount.ID\"] || !data?.[\"PublishedBy.User.ID\"]) {\r\n throw(\"Tileset ID, client account ID, and user ID are required.\");\r\n }\r\n if (!data.ID) {\r\n data.ID = 0;\r\n }\r\n const res: IPublish = await api.POST(`tileset/${data.ID}`, data, reqParams);\r\n const req = {\r\n \"ClientAccount.ID\": data[\"EnabledFor.ClientAccount.ID\"]\r\n };\r\n data.ID = res.ID;\r\n await api.POST(`tileset/${data.ID}/enableForAccounts`, req, reqParams);\r\n await api.Cache.Remove(GetCacheKey(data[\"PublishedBy.ClientAccount.ID\"], data[\"Tileset.ID\"]));\r\n await api.Cache.Remove(GetCacheKey(data[\"PublishedBy.ClientAccount.ID\"]));\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.PublishTileset + Api.ECacheKey.TilesetAccess);\r\n return {\r\n published: data\r\n };\r\n }\r\n\r\n export async function Get(params: {\r\n api?: GlobalApi.Api,\r\n accountId: string,\r\n tilesetId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n published: IPublish\r\n }> {\r\n let { api, accountId, tilesetId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGlobalApi();\r\n }\r\n\r\n if (!accountId || !tilesetId) {\r\n throw(\"Client account ID and tileset ID are required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetCacheKey(accountId, tilesetId), 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 = await api.GET(`tilesetByPublisher/${accountId}/${tilesetId}`, reqParams);\r\n res({\r\n published: 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(accountId, tilesetId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n export async function GetList(params: {\r\n api?: GlobalApi.Api,\r\n accountId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n published: IPublish[]\r\n }> {\r\n let { api, accountId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGlobalApi();\r\n }\r\n\r\n if (!accountId) {\r\n throw(\"Client account ID is required.\");\r\n }\r\n const cache = await api.GetCacheItem(GetCacheKey(accountId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`tilesets/enabledForAccount/${accountId}`, reqParams);\r\n res({\r\n published: data.Items\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(accountId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Returns if a given tileset is allowed to be loaded for a given account.\r\n * @param params \r\n */\r\n export async function IsAccessAllowed(params: {\r\n // Tileset + account from which to load.\r\n tilesetId: string,\r\n sourceAccountId: string,\r\n api?: GlobalApi.Api,\r\n // Account we're loading in.\r\n forAccountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<boolean> {\r\n let { tilesetId, sourceAccountId, api, forAccountId, req } = params;\r\n if (!forAccountId) {\r\n forAccountId = ENVIRONMENT.PARAMS.accountId;\r\n }\r\n // Null source account id means it's a tileset from within the same account.\r\n // We also don't want to bother looking for records if we're loading in our own account.\r\n if (forAccountId == sourceAccountId || !sourceAccountId) {\r\n return true;\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGlobalApi();\r\n }\r\n req = Api.PrepReqParams(req);\r\n const key = GetAccessAllowedCacheKey(tilesetId, sourceAccountId, forAccountId);\r\n const cacheData = await api.GetCacheItem(key, req);\r\n if (cacheData?.found) {\r\n return cacheData.data;\r\n }\r\n const prom: Promise<boolean> = new Promise(async (res, rej) => {\r\n try {\r\n // We try find the published record for the tileset.\r\n // If it doesn't exist, then it's not published.\r\n const {published} = await GetList({\r\n accountId: forAccountId,\r\n api: api,\r\n });\r\n const tileset = published.find(x => x[\"Tileset.ID\"] == tilesetId && x[\"PublishedBy.ClientAccount.ID\"] == sourceAccountId);\r\n res(tileset != null);\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: key,\r\n value: prom,\r\n req: req\r\n });\r\n return prom;\r\n }\r\n }\r\n\r\n export namespace Settings {\r\n export interface ICad {\r\n rootEntityId: string;\r\n entityTypeId: string;\r\n styleId?: number;\r\n lodKey?: string;\r\n movePivot?: Tileset.EPivot;\r\n ucsId?: number;\r\n epsg?: number;\r\n thumbFileId?: string;\r\n location?: Carto.ICarto;\r\n offset?: any;\r\n transform?: Transform.ITransform;\r\n doubleSided?: boolean;\r\n b3dmFileSize?: number;\r\n maximumScreenSpaceError?: number;\r\n }\r\n\r\n export enum EMapTileSize {\r\n IMG_256 = 256,\r\n IMG_512 = 512,\r\n IMG_1024 = 1024,\r\n IMG_2048 = 2048\r\n }\r\n\r\n export interface IEntitiesMap {\r\n imageSize: EMapTileSize;\r\n levelMin: number;\r\n levelMax: number;\r\n entityTypeId: string;\r\n styleId: number;\r\n filter: any;\r\n boundaries: Bounds.IBounds;\r\n }\r\n\r\n export interface IEntities {\r\n zoomControl?: any[];\r\n boundaries?: Bounds.IBounds;\r\n filter?: any;\r\n altitudeRefType?: string;\r\n terrainSource?: string;\r\n terrainUri?: string;\r\n doubleSided?: boolean;\r\n entityTypeId?: string;\r\n styleId?: number;\r\n }\r\n\r\n export enum EExternalMapType {\r\n TileMapImagery = \"TileMapImagery\",\r\n OpenStreetMapImagery = \"OpenStreetMapImagery\",\r\n MapBoxImagery = \"MapBoxImagery\",\r\n CesiumIon = \"CesiumIon\",\r\n CustomTemplate = \"Static\"\r\n }\r\n\r\n export interface IExternalMap {\r\n url?: string;\r\n mapType?: EExternalMapType;\r\n fileExtension?: string;\r\n externalId?: number | string;\r\n styleId?: string;\r\n account?: string;\r\n key?: string;\r\n iconClientFileId?: string;\r\n }\r\n\r\n export interface IExternalTerrain {\r\n requestVertexNormals?: boolean;\r\n url?: string;\r\n }\r\n\r\n export interface IMap {\r\n sourceFileId: string;\r\n imageSize: number;\r\n levelMin: number;\r\n levelMax: number;\r\n boundaries?: Bounds.IBounds;\r\n }\r\n\r\n export interface IPointcloud {\r\n sourceFileIds: string[];\r\n location: Carto.ICarto;\r\n transform: Transform.ITransform;\r\n pntFileSize?: number;\r\n epsg?: number;\r\n attenuation?: boolean;\r\n attenuationMax?: number;\r\n movePivot?: Tileset.EPivot;\r\n maximumScreenSpaceError?: number;\r\n }\r\n\r\n export interface ITerrain {\r\n sourceFileId?: string;\r\n startLevel?: number;\r\n }\r\n }\r\n}","import {IDictionary} from \"../bruce-models\";\r\nimport { Entity } from \"../entity/entity\";\r\nimport { Tileset } from \"../tileset/tileset\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\nimport { ZoomControl } from \"./zoom-control\";\r\n\r\n/**\r\n * Describes a menu item found in project views.\r\n * Menu items are used to dictate what data to load in a scene.\r\n * A menu item may be a container for other items.\r\n */\r\nexport namespace MenuItem {\r\n /**\r\n * Possible types of menu items.\r\n */\r\n export enum EType {\r\n None = \"NONE\",\r\n Entities = \"BruceEntity\",\r\n Entity = \"SingleEntity\",\r\n Osm = \"OSMBuildingsTileset\",\r\n CadTileset = \"ModelTileset\",\r\n ArbTileset = \"ArbitraryTileset\",\r\n IonTileset = \"Cesium3DTileset\",\r\n Kml = \"StaticKML\",\r\n EntityTileset = \"EntitiesTileset\",\r\n EntityRaster = \"RasterEntitiesTileset\",\r\n PointCloud = \"PointCloudTileset\",\r\n EntitiesLoaded = \"LoadedEntities\",\r\n EntitiesIds = \"EntitiesIds\",\r\n // Deprecated. Use Relationships instead.\r\n Relations = \"Relations\",\r\n Relationships = \"Relationships\",\r\n GooglePhotoTileset = \"GooglePhotoTileset\"\r\n }\r\n\r\n /**\r\n * @derepcated.\r\n */\r\n export interface ILegend {\r\n model3d: boolean;\r\n point: boolean;\r\n polygon: boolean;\r\n polylines: boolean;\r\n tileset3d: boolean;\r\n }\r\n\r\n /**\r\n * Settings related to how authoring for a menu item should behave.\r\n */\r\n export interface IAuthorSettings {\r\n // If true, the clicked entity will be read and used to update the authored entity.\r\n readClickedEntity?: boolean;\r\n // Optional relationship type to use when relating to the clicked entity.\r\n clickedRelationTypeId?: string;\r\n // If set, specified attributes will be copied between the clicked and authored entities.\r\n copyClickedAttrMapping?: {\r\n // String is a wrapped path, check PathUtils.\r\n fromPathStr: string;\r\n toPathStr: string;\r\n }[];\r\n }\r\n\r\n /**\r\n * Describes a menu item found in project views.\r\n */\r\n export interface IItem {\r\n // Unique id for this menu item.\r\n id: string;\r\n // Human readable name for this menu item.\r\n Caption: string;\r\n // If the item's type is null or None then it is a container for other items.\r\n Children?: IItem[];\r\n // The type of menu item.\r\n Type: EType;\r\n // If true, the menu item's children will be hidden from UI.\r\n hideChildren?: boolean;\r\n // @deprecated.\r\n legend?: ILegend;\r\n // If true, the menu item will allow the user to author entities in the scene.\r\n // This is only available for certain menu item types.\r\n authoringEnabled?: boolean;\r\n // Settings related to how authoring for a menu item should behave.\r\n authoring?: IAuthorSettings;\r\n // @deprecated.\r\n LabelColor?: string;\r\n // Priority in relation to other menu items.\r\n // Higher number priority graphics take priority over lower number priority graphics.\r\n // This is important of two of the same entity are rendered between different menu items.\r\n renderPriority?: number;\r\n // Default = false.\r\n cdnEnabled?: boolean;\r\n // Used to kill cache. Default = 0.\r\n // Tilesets have their own counter within their records.\r\n // This is used for non-tileset items.\r\n cdnCounter?: number;\r\n }\r\n\r\n /**\r\n * Creates a menu item for a single entity.\r\n * @param entityId \r\n * @param typeId \r\n * @param styleId \r\n * @returns \r\n */\r\n export function CreateFromEntityId(entityId: string, typeId: string, styleId?: number): IItem {\r\n return <Item.IEntity>{\r\n id: ObjectUtils.UId(),\r\n Type: EType.Entity,\r\n Caption: \"Generated Entity Menu Item\",\r\n BruceEntity: {\r\n \"EntityType.ID\": typeId,\r\n EntityId: entityId\r\n },\r\n CameraZoomSettings: [\r\n {\r\n DisplayType: ZoomControl.EDisplayType.Model3D,\r\n MaxZoom: 1000000,\r\n MinZoom: 0,\r\n StyleID: styleId\r\n }\r\n ]\r\n };\r\n }\r\n\r\n /**\r\n * Creates a menu item for an entity type.\r\n * @param typeId \r\n * @param styleId \r\n * @returns \r\n */\r\n export function CreateFromTypeId(typeId: string, styleId?: number): IItem {\r\n return <Item.IEntities>{\r\n id: ObjectUtils.UId(),\r\n Type: EType.Entities,\r\n Caption: \"Generated Entity Type Menu Item\",\r\n BruceEntity: {\r\n \"EntityType.ID\": typeId\r\n },\r\n CameraZoomSettings: [\r\n {\r\n DisplayType: ZoomControl.EDisplayType.Model3D,\r\n MaxZoom: 100000,\r\n MinZoom: 0,\r\n StyleID: styleId\r\n }\r\n ]\r\n };\r\n }\r\n\r\n /**\r\n * Creates a menu item for a tileset.\r\n * @param tilesetId \r\n * @param type \r\n * @returns \r\n */\r\n export function CreateFromTilesetId(tilesetId: string, type: Tileset.EType): IItem {\r\n if (type === Tileset.EType.Cad) {\r\n return <Item.ICadTileset>{\r\n\t id: ObjectUtils.UId(),\r\n\t Type: EType.CadTileset,\r\n Caption: \"Generated CAD Menu Item\",\r\n\t FlyTo: false,\r\n\t\t\t\ttileset: {\r\n\t\t\t\t\tTilesetID: tilesetId\r\n\t\t\t\t}\r\n };\r\n }\r\n else if (type == Tileset.EType.EntitiesSet) {\r\n return <Item.IEntitiesTileset>{\r\n id: ObjectUtils.UId(),\r\n Type: EType.EntityTileset,\r\n Caption: \"Generated Entities Menu Item\",\r\n FlyTo: false,\r\n tileset: {\r\n TilesetID: tilesetId\r\n }\r\n };\r\n }\r\n else if (type == Tileset.EType.PointCloud) {\r\n return <Item.IPointcloud>{\r\n id: ObjectUtils.UId(),\r\n Type: EType.PointCloud,\r\n Caption: \"Generated Point Cloud Menu Item\",\r\n FlyTo: false,\r\n tileset: {\r\n TilesetID: tilesetId\r\n }\r\n };\r\n }\r\n else if (type == Tileset.EType.EntitiesMap) {\r\n return <Item.IEntitiesRaster>{\r\n id: ObjectUtils.UId(),\r\n Type: EType.EntityRaster,\r\n Caption: \"Generated Entities Menu Item\",\r\n tileset: {\r\n TilesetID: tilesetId\r\n }\r\n };\r\n }\r\n throw(\"Tileset type not supported.\");\r\n }\r\n\r\n export namespace Item {\r\n /**\r\n * Tileset load information.\r\n */\r\n export interface ITileset {\r\n // Failsafe. Not recommended to use.\r\n TilesetURL?: string;\r\n // Client account ID where the tileset is hosted.\r\n // If unspecified then it will assume the same account as the project view.\r\n ClientAccountID?: string;\r\n // Tileset ID.\r\n TilesetID?: string;\r\n }\r\n\r\n /**\r\n * Settings related to how entity clustering should behave.\r\n */\r\n export interface IClustering {\r\n // Minimum distance to an entity for it to cluster.\r\n // bruce-cesium/point-clustering.ts will have 5000 as default.\r\n minDistance?: number;\r\n // Minimum total loaded for the menu item for clustering to kick in.\r\n // bruce-cesium/point-clustering.ts will have 0 as default.\r\n // It will always try to cluster when points are near each-other and camera is far away.\r\n minTotalCount?: number;\r\n // TODO: Zoom control-like settings for clustering.\r\n // Between x and y meters the points should cluster with z distance.\r\n // Eg: \"Between 5,000 and 15,000 meters the points should cluster within 500 meters.\"\r\n }\r\n\r\n /**\r\n * Menu item for loading Nextspace vector or 3D model entities.\r\n */\r\n export interface IEntities extends IItem {\r\n Type: EType.Entities;\r\n BruceEntity: {\r\n // Entity type ID to filter against.\r\n \"EntityType.ID\": string;\r\n // Entity attribute filter.\r\n Filter?: IDictionary<string>;\r\n // If true, menu item will display individual sub-items for tags.\r\n ExpandLayers?: boolean;\r\n // If ExpandLayers = true, this is the saved sub-items to render.\r\n // If this is null or empty, that means there is nothing to render for this menu item.\r\n SelectedExpandLayers?: number[];\r\n };\r\n // Zoom control to dictate how entities look at different distances from the camera.\r\n CameraZoomSettings?: ZoomControl.IItem[];\r\n\r\n // If true, menu item will render point and icon entities as clustered points when close together.\r\n enableClustering?: boolean;\r\n clustering?: IClustering;\r\n\r\n // If BruceEntity.ExpandLayers = true,\r\n // this will dictate if camera should be used to scan for tags in view.\r\n filterLayersByCameraLocation?: boolean;\r\n showAllLayersExcludeBelow?: boolean;\r\n layers?: number[];\r\n extLayers?: {\r\n ID: number,\r\n checked: boolean\r\n }[];\r\n }\r\n\r\n /**\r\n * Menu item for loading a single Nextspace vector or 3D model entity.\r\n */\r\n export interface IEntity extends IItem {\r\n Type: EType.Entity;\r\n BruceEntity: {\r\n // Entity type ID to filter against.\r\n \"EntityType.ID\"?: string;\r\n // Entity ID to load.\r\n EntityId: string;\r\n };\r\n // Zoom control to dictate how entities look at different distances from the camera.\r\n CameraZoomSettings?: ZoomControl.IItem[];\r\n showAllLayers?: boolean;\r\n showAllLayersExcludeBelow?: boolean;\r\n }\r\n\r\n /**\r\n * Menu item for loading a legacy tileset.\r\n */\r\n export interface IArbTileset extends IItem {\r\n Type: EType.ArbTileset | EType.IonTileset;\r\n // @deprecated\r\n FlyTo?: boolean;\r\n BruceEntity?: {\r\n // Preferred entity type ID for making new entity records.\r\n // When a graphic is selected in UI and no record is found, this type ID will be used as the suggested type.\r\n \"EntityType.ID\"?: string;\r\n };\r\n // Tileset load information.\r\n tileset?: ITileset;\r\n // Style mapping between entity type IDs to style IDs.\r\n StyleMapping?: any[];\r\n // Fallback style ID when no mapped style is found.\r\n styleId?: number;\r\n // If true, the menu item will apply styles to the tileset.\r\n ApplyStyles?: boolean;\r\n // If set, an ion asset is loaded in place of a Nextspace tileset.\r\n IonResource?: {\r\n AssetID: string | number;\r\n // If not supplied then the client account default is used.\r\n AccessToken?: string;\r\n }\r\n }\r\n export interface IIonTileset extends IArbTileset {}\r\n\r\n /**\r\n * Menu item for loading a CAD tileset.\r\n */\r\n export interface ICadTileset extends IItem {\r\n Type: EType.CadTileset;\r\n // Tileset load information.\r\n tileset: ITileset;\r\n // @deprecated\r\n FlyTo?: boolean;\r\n // Style mapping between entity type IDs to style IDs.\r\n StyleMapping?: any[];\r\n // Setting for how the style colours should be blended.\r\n StyleBlending?: {\r\n // Hightlight = 0, replace = 1, mix = 2.\r\n blendMode: 0 | 1 | 2;\r\n // 1 = 100% new colour. 0 = original colour.\r\n blendPercent: number;\r\n };\r\n // Fallback style ID when no mapped style is found.\r\n styleId?: number;\r\n BruceEntity?: {\r\n // Optional restriction.\r\n // When not null, only entities matching supplied ids will be visible.\r\n EntityIds?: string[];\r\n // Optional styling.\r\n // When entity ids are set, other entities can optionally be \"ghosts\".\r\n // This means they will be available but at low opacity.\r\n Ghosts?: boolean;\r\n }\r\n }\r\n\r\n /**\r\n * Menu item for loading a point cloud tileset.\r\n */\r\n export interface IPointcloud extends IItem {\r\n Type: EType.PointCloud;\r\n // @deprecated\r\n FlyTo?: boolean;\r\n // Tileset load information.\r\n tileset: ITileset;\r\n }\r\n\r\n /**\r\n * Menu item for loading a raster tileset.\r\n * This is deprecated and unsupported in the latest web-Navigator.\r\n * If needed, load through the imagery panel.\r\n */\r\n export interface IEntitiesRaster extends IItem {\r\n Type: EType.EntityRaster;\r\n tileset: ITileset;\r\n }\r\n\r\n /**\r\n * Menu item for loading a Cesium OSM tileset.\r\n */\r\n export interface IOsm extends IItem {\r\n Type: EType.Osm;\r\n BruceEntity?: {\r\n // Preferred entity type ID for making new entity records.\r\n // When a graphic is selected in UI and no record is found, this type ID will be used as the suggested type.\r\n \"EntityType.ID\"?: string;\r\n // Source record for loading and saving the mapping between OSM IDs and Nextspace IDs.\r\n SourceId: string;\r\n };\r\n // If enabled then pending OSM buildings will be partially transparent.\r\n // A building is considered pending while it hasn't checked for a corresponding Nextspace ID.\r\n ghostLoading?: boolean;\r\n }\r\n\r\n /**\r\n * Menu item for loading a static KML file.\r\n */\r\n export interface IKml extends IItem {\r\n Type: EType.Kml;\r\n // Array of KML files to load.\r\n KML?: {\r\n // KML file to load.\r\n ClientFile?: {\r\n ID: string;\r\n },\r\n // Arbitrarily hosted file to load instead of a client file.\r\n fileUrl?: string;\r\n }[]\r\n }\r\n\r\n /**\r\n * Menu item for loading a tileset made from entities.\r\n */\r\n export interface IEntitiesTileset extends IItem {\r\n Type: EType.EntityTileset;\r\n // @deprecated\r\n FlyTo: boolean;\r\n // Tileset load information.\r\n tileset: ITileset;\r\n // Point cloud settings as this tileset can include point clouds and 3d models.\r\n // The use-case is that this tileset is made from entities and what the user wants to show between bookmarks is different.\r\n // Bookmarks have \"menuItemAlternations\" to have different settings for menu items per bookmark.\r\n attenuation?: boolean;\r\n attenuationMax?: number;\r\n }\r\n\r\n /**\r\n * Menu item that loads preloaded entity records.\r\n */\r\n export interface IEntitiesLoaded extends MenuItem.IItem {\r\n Type: EType.EntitiesLoaded;\r\n BruceEntity: {\r\n // TODO: is this needed?\r\n \"EntityType.ID\"?: string;\r\n // Array of entity records to load.\r\n Entities: Entity.IEntity[];\r\n };\r\n // Zoom control to dictate how entities look at different distances from the camera.\r\n CameraZoomSettings?: ZoomControl.IItem[];\r\n }\r\n\r\n /**\r\n * Menu item that loads specific entity ids.\r\n */\r\n export interface IEntityIds extends MenuItem.IItem {\r\n Type: EType.EntitiesIds;\r\n BruceEntity: {\r\n // Array of entity ids to load.\r\n EntityIds: string[];\r\n };\r\n // Zoom control to dictate how entities look at different distances from the camera.\r\n CameraZoomSettings?: ZoomControl.IItem[];\r\n\r\n // If true, menu item will render point and icon entities as clustered points when close together.\r\n // Default = false.\r\n enableClustering?: boolean;\r\n clustering?: IClustering;\r\n }\r\n\r\n /**\r\n * Auto-generated menu item when entity-relationships are marked to be rendered.\r\n * @deprecated, use IRelationships instead.\r\n */\r\n export interface ILegacyRelationships extends MenuItem.IItem {\r\n Type: EType.Relations;\r\n BruceEntity?: {\r\n EntityIds?: string[];\r\n },\r\n }\r\n\r\n /**\r\n * Describes a relationship group to render.\r\n */\r\n export interface IRenderedRelations {\r\n // Entities to drawn relationships for.\r\n // Downstream relationships will be drawn for these entities.\r\n entityIds: string[];\r\n // The relationship type to render for the ids.\r\n relationTypeId: string;\r\n }\r\n\r\n /**\r\n * Auto-generated menu item when entity-relationships are marked to be rendered.\r\n */\r\n export interface IRelationships extends MenuItem.IItem {\r\n Type: EType.Relationships;\r\n // Relationships to render.\r\n // This is an entityIds -> relationship type grouping.\r\n // The relationships will be drawn downstream only.\r\n relations?: IRenderedRelations[];\r\n }\r\n\r\n export interface IGooglePhotoTileset extends IItem {\r\n Type: EType.GooglePhotoTileset;\r\n // Css color string to apply to the tileset.\r\n // This follows Cesium logic for when color is pure white,\r\n // that means don't apply colour and only apply alpha.\r\n colorMask?: string;\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { Camera } from \"../common/camera\";\r\nimport { IDictionary } from \"../common/dictionary\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Markup } from \"../markup/markup\";\r\nimport { Section } from \"../common/section\";\r\nimport { MenuItem } from \"./menu-item\";\r\nimport { ProjectViewTile } from \"./project-view-tile\";\r\n\r\n/**\r\n * Describe the \"Project View Bookmark\" concept within Nextspace.\r\n * This is referred to as \"slides\" in older code.\r\n *\r\n * A bookmark is a snapshot of what should be displayed and how in a particular project view.\r\n */\r\nexport namespace ProjectViewBookmark {\r\n /**\r\n * Returns cache identifier for a bookmark.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\", \"def\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param viewId\r\n * @param bookmarkId\r\n * @returns \r\n */\r\n export function GetCacheKey(viewId: string, bookmarkId: string): string {\r\n return `${Api.ECacheKey.ProjectViewBookmark}${Api.ECacheKey.Id}${viewId}${Api.ECacheKey.Id}${bookmarkId}`;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of bookmarks.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param viewId\r\n * @returns\r\n */\r\n export function GetListCacheKey(viewId: string): string {\r\n return `${Api.ECacheKey.ProjectViewBookmark}${Api.ECacheKey.Id}${viewId}`;\r\n }\r\n\r\n // This is the expected default version for the DataVersion value.\r\n // This value should NOT be changed without looking at our API and seeing what the default value is.\r\n export const DEFAULT_DATA_VERSION = 2;\r\n\r\n /**\r\n * Describes a bookmark record.\r\n */\r\n export interface IBookmark {\r\n // ID of the bookmark record.\r\n ID?: string;\r\n // Human readable title of the bookmark.\r\n Title?: string;\r\n // Human readable description of the bookmark.\r\n Note?: string;\r\n // ID of the client file used for the bookmark thumbnail.\r\n // Must be set. Use an empty string if no thumbnail is desired.\r\n \"Screenshot.ClientFile.ID\"?: string;\r\n // ID of the associated project view.\r\n \"UI.View.ID\"?: string;\r\n // ID of the user who created the bookmark.\r\n \"Created.ByUser.ID\"?: string;\r\n // Date/time the bookmark was created.\r\n \"Created.Date\"?: UTC.IUTC;\r\n // Bookmark grouping ID.\r\n \"UI.SlideGroup.ID\"?: number;\r\n // This is the version of the data in the bookmark.\r\n // This is used to determine how to parse the bookmark's settings.\r\n // 1 - 10,000 are reserved for Nextspace use.\r\n DataVersion: number;\r\n // Display order related to sibling bookmarks.\r\n DisplayOrder?: number;\r\n // Settings for the bookmark.\r\n Settings?: ISettings;\r\n // Bookmark camera position.\r\n Camera?: ICamera;\r\n // Clipping planes to apply to terrain/entities in the scene.\r\n // A clipping plane is associated with a tileset by root entity id.\r\n sections?: Section.ISection[];\r\n }\r\n\r\n /**\r\n * These are the base settings expected in any bookmark data-version.\r\n * The only exception is data-version = 1 which is our deprecated legacy format.\r\n */\r\n export interface ISettings {\r\n menuItemIds?: string[];\r\n // This is a map of menu item ids to their alternations.\r\n // An alternation is a menu item that has varied settings to the base menu item.\r\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.\r\n menuItemAlternations?: IDictionary<MenuItem.IItem>;\r\n // Array of entity ids for which to draw labels for.\r\n // If empty, no labels are drawn.\r\n labelledEntityIds?: string[];\r\n // Bookmark-wide relationships to render.\r\n // The lines will render regardless of entities being rendered.\r\n renderedRelations?: MenuItem.Item.IRenderedRelations[];\r\n groundOcclusion?: boolean;\r\n // Null = use default, empty array = no imagery.\r\n imagery?: ProjectViewTile.IBookmarkImagery[];\r\n terrain?: ProjectViewTile.IBookmarkTerrain;\r\n // Css color string to apply to the base globe.\r\n globeColor?: string;\r\n // 0 = 0%, 1 = 100%. Default is 100%.\r\n globeAlpha?: number;\r\n // If true, the globe will be hidden. Default is false.\r\n globeHidden?: boolean;\r\n markup?: Markup.IMarkup;\r\n shadows?: IShadows;\r\n ambientOcclusion?: IAmbientOcclusion;\r\n lighting?: ILighting;\r\n quality?: IQuality;\r\n // iso8601 date time string.\r\n dateTime?: string;\r\n // Entity id -> opacity. Where 1 = 100% opacity.\r\n entityOpacityMap?: IDictionary<number>;\r\n // Null = use default, empty array = deselect.\r\n // If default is null then selected ids should not be altered.\r\n selectedEntityIds?: string[];\r\n hiddenEntityIds?: string[];\r\n isolatedEntityIds?: string[];\r\n // This enables lighting that makes terrain elevation apparent.\r\n hillShades?: boolean;\r\n // This is a list of entity ids that are refreshed every x seconds.\r\n // We'll enforce about 200 maximum ids. Refresh every 2 - 5 seconds.\r\n liveEntityIds?: string[];\r\n // This will enable the wireframe view for the terrain provider.\r\n terrainWireframe?: boolean;\r\n // A bit of an awkward transition from the old system.\r\n // We render \"all\" relationships for given entity ids.\r\n // This will create a menu item under the hood, later we will use menu items directly.\r\n // @deprecated, use 'renderedRelations' instead.\r\n renderedEntityRelations?: string[];\r\n }\r\n\r\n /**\r\n * Describes the shadows settings for a bookmark.\r\n */\r\n export interface IShadows {\r\n // If true, shadows are enabled.\r\n enabled: boolean;\r\n // If true, shadow edges are softened.\r\n soften: boolean;\r\n // Pixel size determines shadow quality.\r\n // This typically increments in sets of 1024.\r\n pixelSize: number;\r\n // Darkness of shadows.\r\n // Default is \"0.3\".\r\n darkness: number;\r\n }\r\n\r\n /**\r\n * Describes the ambient occlusion settings for a bookmark.\r\n */\r\n export interface IAmbientOcclusion {\r\n // If true, ambient occlusion is enabled.\r\n enabled: boolean;\r\n intensity: number;\r\n lengthCap: number;\r\n bias: number;\r\n blurStepSize: number;\r\n stepSize: number;\r\n }\r\n\r\n /**\r\n * Describes the lighting settings for a bookmark.\r\n */\r\n export interface ILighting {\r\n // Colour of the sun.\r\n color: string;\r\n // Intensity of the sun.\r\n intensity: number;\r\n }\r\n\r\n /**\r\n * Describes the quality settings for a bookmark.\r\n */\r\n export interface IQuality {\r\n // If true, \"smooth rendering\" is enabled.\r\n fxaa: boolean;\r\n }\r\n\r\n /**\r\n * Describes the camera settings for a bookmark.\r\n */\r\n export interface ICamera {\r\n // Meters relative to ground.\r\n altitude: number;\r\n // In degrees.\r\n latitude: number;\r\n longitude: number;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n // Milliseconds transition from current position to bookmark.\r\n transition?: number;\r\n // If frustum is different between two bookmarks, transition should be instant.\r\n cameraFrustum?: Camera.EFrustum;\r\n }\r\n\r\n /**\r\n * Gets a bookmark record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the associated project view.\r\n viewId: string,\r\n // Bookmark record ID.\r\n bookmarkId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Bookmark record.\r\n bookmark: IBookmark\r\n }> {\r\n let { api, viewId, bookmarkId, req: reqParams } = params;\r\n if (!viewId || !bookmarkId) {\r\n throw(\"View ID and Bookmark ID are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n \r\n const key = GetCacheKey(viewId, bookmarkId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`ui.view/${viewId}/slide/${bookmarkId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n bookmark: 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,\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Deletes a bookmark record.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // ID of the associated project view.\r\n viewId: string,\r\n // Bookmark record ID.\r\n bookmarkId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, viewId, bookmarkId, req: reqParams } = params;\r\n if (!viewId || !bookmarkId) {\r\n throw(\"View ID and Bookmark ID are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`ui.view/${viewId}/slide/${bookmarkId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(viewId, bookmarkId));\r\n api.Cache.Remove(GetListCacheKey(viewId));\r\n }\r\n\r\n /**\r\n * Gets a list of bookmark records.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n // ID of the associated project view.\r\n viewId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of bookmark records.\r\n bookmarks: IBookmark[]\r\n }> {\r\n let { api, viewId, req: reqParams } = params;\r\n if (!viewId) {\r\n throw(\"View ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(viewId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`ui.view/${viewId}/slides`, Api.PrepReqParams(reqParams));;\r\n const items = data.Items ? data.Items : [];\r\n // Cache individual items.\r\n // Maybe better to load list cache when getting 1 slide and seeing if it's in there.\r\n // WARNING: Right now the data matches, in the future the list may contain a shortened result.\r\n for (let i = 0; i < items.length; i++) {\r\n const item = items[i] as ProjectViewBookmark.IBookmark;\r\n const prom = new Promise((res) => {\r\n res({\r\n bookmark: item\r\n });\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKey(viewId, item.ID),\r\n value: prom,\r\n req: reqParams\r\n });\r\n }\r\n res({\r\n bookmarks: items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(viewId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Creates or updates a bookmark record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // ID of the associated project view.\r\n viewId: string,\r\n // Bookmark record.\r\n bookmark: IBookmark,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Bookmark record.\r\n bookmark: IBookmark\r\n }> {\r\n let { api, viewId, bookmark: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data?.Title) {\r\n data.Title = data.ID;\r\n }\r\n const res = await api.POST(`ui.view/${viewId}/slide/${data.ID ? data.ID : \"\"}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(viewId, <string>data.ID));\r\n api.Cache.Remove(GetListCacheKey(viewId));\r\n return {\r\n bookmark: res\r\n };\r\n }\r\n\r\n /**\r\n * Sets the order of bookmarks within a project view.\r\n * @param params \r\n */\r\n export async function SetOrder(params: {\r\n api?: BruceApi.Api,\r\n // ID of the associated project view.\r\n viewId: string,\r\n // List of bookmark IDs in the order they should be displayed.\r\n bookmarkIds: string[],\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, viewId, bookmarkIds, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const reqData = {\r\n \t\"UISlide.ID\": bookmarkIds,\r\n \t\"DisplayOrder.Start\": 0\r\n };\r\n await api.POST(`ui.view/${viewId}/slides/setOrder`, reqData, Api.PrepReqParams(reqParams));\r\n await api.Cache.RemoveByStartsWith(GetListCacheKey(viewId));\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { MenuItem } from \"./menu-item\";\r\nimport { ProjectViewTile } from \"./project-view-tile\";\r\nimport { ProjectViewBookmark } from \"./project-view-bookmark\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { ProjectViewSelection } from \"./project-view-selection\";\r\n\r\n/**\r\n * Describes the \"Project View\" concept within Nextspace.\r\n * A project view is a collection of settings for a visualization application we support.\r\n * It will describe what panels to show and how, it will also describe all possible ways data can be displayed.\r\n */\r\nexport namespace ProjectView {\r\n /**\r\n * Returns cache identifier for a project view.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param viewId\r\n * @returns \r\n */\r\n export function GetCacheKey(viewId: string): string {\r\n return `${Api.ECacheKey.ProjectView}${Api.ECacheKey.Id}${viewId}`;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of project views.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @returns\r\n */\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.ProjectView;\r\n }\r\n\r\n // This is the expected default version for the DataVersion value.\r\n // This value should NOT be changed without looking at our API and seeing what the default value is.\r\n export const DEFAULT_DATA_VERSION = 2;\r\n\r\n /**\r\n * Describes a project view record.\r\n */\r\n export interface IView {\r\n // ID of the project view.\r\n ID?: string;\r\n // Human readable name of the project view.\r\n Name: string;\r\n // Human readable description of the project view.\r\n Description?: string;\r\n // ID of the user that created the project view.\r\n \"CreatedByUser.ID\"?: string;\r\n // Date/time the project view was created.\r\n CreatedTime?: UTC.IUTC;\r\n // ID of the default bookmark to load.\r\n DefaultUISlideID?: string;\r\n // Version of the UI that created this project view.\r\n // Set to -1 if unknown.\r\n CreatedByUIVersion?: string;\r\n // Version to help parse the data.\r\n DataVersion: number;\r\n // Admin only property for what email should be the project view's support line.\r\n SupportEmail?: string;\r\n // Settings for the project view.\r\n Settings?: ISettings;\r\n // If true, this view is considered the default for the account.\r\n // Operator may use this project view to load default settings.\r\n IsDefault?: boolean;\r\n // TODO: document.\r\n Feature?: string[];\r\n }\r\n\r\n /**\r\n * These are the base settings expected in any project view data-version.\r\n * The only exception is data-version = 1 which is our deprecated legacy format.\r\n */\r\n export interface ISettings {\r\n // Menu item structure that defines how and what to load in the scene.\r\n menuItems?: MenuItem.IItem[];\r\n // If true, anonymous users won't be able to access the view.\r\n IsLoginRequired?: boolean;\r\n // If true, users must have the permission \"Permission.EPermPrefix.ACCESS_PROJECT_VIEW + view.ID\" to access the view.\r\n IsRestricted?: boolean;\r\n // Per project view branding to compliment the account branding.\r\n branding?: IBranding\r\n // Describes settings for entity selection for a project view record.\r\n selection?: ProjectViewSelection.ISelection;\r\n // Imagery and terrains that non-admin users can select from.\r\n // Sources used in bookmarks will automatically be added to this list.\r\n imageries?: ProjectViewTile.IViewImagery[];\r\n terrains?: ProjectViewTile.IViewTerrain[];\r\n // Defaults are values to apply for bookmarks when either the bookmark-\r\n // is missing or the value is missing in the bookmark settings.\r\n defaults?: {\r\n camera?: ProjectViewBookmark.ICamera;\r\n settings?: ProjectViewBookmark.ISettings;\r\n };\r\n // Describes how to present contact information to the users.\r\n // The contact email is set in \"view.SupportEmail\". Only an admin can read or write this value.\r\n contact?: IContact;\r\n plugins?: IPlugins;\r\n // Default is yellow at 0.5 opacity.\r\n selectionColor?: string;\r\n // Presentation mode settings.\r\n present?: IPresent;\r\n }\r\n \r\n /**\r\n * Per project view branding to compliment the account branding.\r\n */\r\n export interface IBranding {\r\n // Client file id for the project view's banner.\r\n // In Navigator this is found within the Navigator's dashboard.\r\n bannerFileId?: string;\r\n }\r\n\r\n /**\r\n * Presentation mode settings.\r\n */\r\n export interface IPresent {\r\n // Time in milliseconds to hold bookmarks before moving to the next bookmark.\r\n // This is a default time and can be overridden by the bookmark's duration.\r\n bookmarkDuration?: number;\r\n }\r\n\r\n /**\r\n * Describes how to present contact information to the users.\r\n */\r\n export interface IContact {\r\n // Default = false.\r\n // Indicates if the user should be able to reach support.\r\n enabled: boolean;\r\n // Description to display in the support dialog.\r\n // Null = application's default text.\r\n description?: string;\r\n // FontAwesome icon to use for the support dialog button.\r\n // Null = application's default icon.\r\n icon?: string;\r\n }\r\n\r\n /**\r\n * Describes the plugins enabled for a project view.\r\n */\r\n export interface IPlugins {\r\n // Enabled plugin ids.\r\n enabledIds: string[];\r\n }\r\n\r\n /**\r\n * Gets a project view record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the project view to get.\r\n viewId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Project view record.\r\n view: IView\r\n }> {\r\n let { api, viewId, req: reqParams } = params;\r\n if (!viewId) {\r\n throw(\"View ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const key = GetCacheKey(viewId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`ui.view/${viewId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n view: 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,\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 project views.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of project views.\r\n views: IView[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), 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 = await api.GET(\"ui.view/list\", Api.PrepReqParams(reqParams));\r\n res({\r\n views: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Deletes a project view.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // ID of the project view to delete.\r\n viewId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, viewId, req: reqParams } = params;\r\n if (!viewId) {\r\n throw(\"View ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`ui.view/${viewId}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(viewId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Creates or updates a project view.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // Project view record to create or update.\r\n view: IView,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Project view record.\r\n view: IView\r\n }> {\r\n let { api, view: data, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!data) {\r\n data = <any>{};\r\n }\r\n const isNew = !data.ID;\r\n if (!data.ID) {\r\n data.ID = ObjectUtils.UId();\r\n }\r\n if (!data.Name) {\r\n data.Name = data.ID;\r\n }\r\n if (!data.CreatedByUIVersion) {\r\n data.CreatedByUIVersion = \"-1\";\r\n }\r\n if (isNew) {\r\n data = await api.POST(`ui.view/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n }\r\n else {\r\n data = await api.PUT(`ui.view/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n }\r\n api.Cache.Remove(GetCacheKey(<string>data.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n view: data\r\n };\r\n }\r\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}","\r\n/**\r\n * A tile is an imagery or terrain tileset definition.\r\n */\r\nexport namespace ProjectViewTile {\r\n export type MapTileId = string | EDefaultImagery;\r\n export type TerrainTileId = string | EDefaultTerrain;\r\n\r\n /**\r\n * Base information for loading an imagery or terrain tileset record.\r\n */\r\n export interface ITileMeta {\r\n // Null = using a default tile.\r\n // (Not the same as a template account one. Default means we don't have a database record of it.).\r\n accountId?: string;\r\n tilesetId: string;\r\n }\r\n\r\n /**\r\n * Definition for a project view terrain.\r\n */\r\n export interface IViewTerrain extends ITileMeta {\r\n tilesetId: TerrainTileId;\r\n }\r\n\r\n /**\r\n * Definition for a project view imagery.\r\n */\r\n export interface IViewImagery extends ITileMeta {\r\n tilesetId: MapTileId;\r\n }\r\n\r\n /**\r\n * Definition for a bookmark imagery.\r\n */\r\n export interface IBookmarkImagery extends IViewImagery {\r\n // 0 - 1, 1 = 100% opacity.\r\n // Default = 1.\r\n alpha?: number;\r\n // Default = 1.\r\n brightness?: number;\r\n // Default = 1.\r\n saturation?: number;\r\n // Default = 1.\r\n contrast?: number;\r\n // Default = 1.\r\n gamma?: number;\r\n // Default = 0.\r\n hue?: number;\r\n }\r\n\r\n /**\r\n * Definition for a bookmark terrain.\r\n */\r\n export interface IBookmarkTerrain extends IViewTerrain {\r\n\r\n }\r\n\r\n /**\r\n * Available imagery defaults.\r\n */\r\n export enum EDefaultImagery {\r\n BingMapsAerial = \"bingmapsaerial\",\r\n BingMapsAerialWithLabels = \"bingmapsaerialwithlabels\",\r\n BingMapsRoads = \"bingmapsroads\",\r\n MapboxSatellite = \"mapboxsatellite\",\r\n MapBoxStreets = \"mapboxstreets\",\r\n MapBoxStreetsClassic = \"mapboxstreetsclassic\",\r\n EsriWorldImagery = \"esriworldimagery\",\r\n EsriWorldStreetMap = \"esriworldstreetmap\",\r\n EsriNationalGeographic = \"esrinationalgeographic\",\r\n OpenStreetMap = \"openstreetmap\",\r\n LINZ = \"linz\",\r\n StamenWaterColor = \"stamenwatercolor\",\r\n StamenToner = \"stamentoner\",\r\n Grid = \"grid\"\r\n }\r\n\r\n /**\r\n * Definition for a default imagery.\r\n */\r\n export interface IDefaultImagery {\r\n id: EDefaultImagery;\r\n name: string;\r\n iconUrl?: string;\r\n }\r\n\r\n /**\r\n * Prepared array for UI.\r\n * TODO: Im not happy with icon urls sitting in the code. I'd prefer we ship these icons in the library as files.\r\n */\r\n export const DefaultImagery: IDefaultImagery[] = [\r\n {\r\n id: EDefaultImagery.BingMapsAerial,\r\n name: \"Bing Maps Aerial\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingAerial.png\"\r\n },\r\n {\r\n id: EDefaultImagery.BingMapsAerialWithLabels,\r\n name: \"Bing Maps Aerial with Labels\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingAerialLabels.png\"\r\n },\r\n {\r\n id: EDefaultImagery.BingMapsRoads,\r\n name: \"Bing Maps Roads\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/bingRoads.png\"\r\n },\r\n {\r\n id: EDefaultImagery.MapboxSatellite,\r\n name: \"Mapbox Satellite\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxSatellite.png\"\r\n },\r\n {\r\n id: EDefaultImagery.MapBoxStreets,\r\n name: \"Mapbox Streets\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxTerrain.png\"\r\n },\r\n {\r\n id: EDefaultImagery.MapBoxStreetsClassic,\r\n name: \"Mapbox Streets Classic\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/mapboxStreets.png\"\r\n },\r\n {\r\n id: EDefaultImagery.EsriWorldImagery,\r\n name: \"Esri World Imagery\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriWorldImagery.png\"\r\n },\r\n {\r\n id: EDefaultImagery.EsriWorldStreetMap,\r\n name: \"Esri World Street Map\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriWorldStreetMap.png\"\r\n },\r\n {\r\n id: EDefaultImagery.EsriNationalGeographic,\r\n name: \"Esri National Geographic\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/esriNationalGeographic.png\"\r\n },\r\n {\r\n id: EDefaultImagery.OpenStreetMap,\r\n name: \"Open Street Map\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/openStreetMap.png\"\r\n },\r\n {\r\n id: EDefaultImagery.LINZ,\r\n name: \"LINZ\",\r\n iconUrl: \"https://template.ui.nextspace.host/media/linz.jpg\"\r\n },\r\n {\r\n id: EDefaultImagery.StamenWaterColor,\r\n name: \"Stamen Water Color\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/stamenWatercolor.png\"\r\n },\r\n {\r\n id: EDefaultImagery.StamenToner,\r\n name: \"Stamen Toner\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/ImageryProviders/stamenToner.png\"\r\n },\r\n {\r\n id: EDefaultImagery.Grid,\r\n name: \"Grid\",\r\n iconUrl: \"https://template.api.nextspace-uat.net/file/2885d8df-028b-4f5c-80b3-2634f7e7cf69.png\"\r\n }\r\n ];\r\n\r\n /**\r\n * Available terrain defaults.\r\n */\r\n export enum EDefaultTerrain {\r\n CesiumWorldTerrain = \"cesiumworldterrain\",\r\n FlatTerrain = \"flatterrain\",\r\n LINZ = \"linz\"\r\n }\r\n\r\n /**\r\n * Definition for a default terrain.\r\n */\r\n export interface IDefaultTerrain {\r\n id: EDefaultTerrain;\r\n name: string;\r\n iconUrl?: string;\r\n }\r\n\r\n /**\r\n * Prepared array for UI.\r\n * TODO: Im not happy with icon urls sitting in the code. I'd prefer we ship these icons in the library as files.\r\n */\r\n export const DefaultTerrains: IDefaultTerrain[] = [\r\n {\r\n id: EDefaultTerrain.CesiumWorldTerrain,\r\n name: \"Cesium World Terrain\",\r\n iconUrl: \"https://template.ui.nextspace.host/Default/media/Cesium/TerrainProviders/CesiumWorldTerrain.png\"\r\n },\r\n {\r\n id: EDefaultTerrain.LINZ,\r\n name: \"LINZ\",\r\n iconUrl: \"https://template.ui.nextspace.host/media/linz.jpg\"\r\n },\r\n {\r\n id: EDefaultTerrain.FlatTerrain,\r\n name: \"Flat Terrain\",\r\n }\r\n ]\r\n}","import { MenuItem } from \"./menu-item\";\r\nimport { ProjectView as PV } from \"./project-view\";\r\nimport { ProjectViewLegacyTile } from \"./project-view-legacy-tile\";\r\n\r\n/**\r\n * Deprecated Project View record.\r\n * This was used in the legacy web Navigator.\r\n */\r\nexport namespace ProjectViewLegacy {\r\n export const DATA_VERSION = 1;\r\n\r\n export interface IShadowSettings {\r\n IsShadowEnabled?: boolean;\r\n IsShadowSoft?: boolean;\r\n ShadowSampleSize?: number;\r\n }\r\n\r\n export interface ISettings extends PV.ISettings {\r\n BookmarkTransitionSpeed?: number;\r\n Camera?: any;\r\n CameraFrustum?: number;\r\n CesiumMapSources?: ProjectViewLegacyTile.IMapSource[];\r\n CesiumTerrainSources?: ProjectViewLegacyTile.ITerrainSource[];\r\n ControlsSettings?: any;\r\n DefaultMapTiles?: string;\r\n DefaultTerrain?: string;\r\n DisplayTimeline?: boolean;\r\n GroundOcclusion?: boolean;\r\n Extensions?: any;\r\n GlobeColor?: string;\r\n SelectionHighlightColor?: string;\r\n LayersMenu?: MenuItem.IItem[];\r\n OASettings?: any;\r\n LogoImage?: any;\r\n LegendImage?: any;\r\n TilesetBackfaceCulling?: boolean;\r\n TopPanelComponents?: string[];\r\n LeftPanelComponents?: string[];\r\n PostProcessFXAA?: boolean;\r\n Shadows?: boolean;\r\n CustomFormSettings?: any;\r\n PreloadEntityTypes?: boolean;\r\n ClickActions?: any;\r\n Shadow?: {\r\n StaticCamera?: IShadowSettings;\r\n MovingCamera?: IShadowSettings;\r\n }\r\n }\r\n\r\n export interface IView extends PV.IView {\r\n Settings: ISettings;\r\n }\r\n}","import { Camera } from \"../common/camera\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { Markup } from \"../markup/markup\";\r\n\r\n/**\r\n * Deprecated Project View Bookmark record.\r\n * This was used in the legacy web Navigator.\r\n */\r\nexport namespace ProjectViewLegacyBookmark {\r\n export const DATA_VERSION = 1;\r\n\r\n export interface IBookmark {\r\n ID?: string;\r\n Title?: string;\r\n Camera?: ICamera;\r\n Settings?: ISettings;\r\n \"Screenshot.ClientFile.ID\"?: string;\r\n \"UI.View.ID\"?: string;\r\n \"Created.ByUser.ID\"?: string;\r\n \"Created.Date\"?: UTC.IUTC;\r\n DataVersion: number;\r\n DisplayOrder?: number;\r\n }\r\n\r\n export interface IBookmarkImagery {\r\n title: string;\r\n contrast: number;\r\n hue: number;\r\n saturation: number;\r\n gamma: number;\r\n brightness: number;\r\n alpha: number;\r\n }\r\n\r\n export interface ISettings {\r\n selectedItemIds?: string[];\r\n order?: number;\r\n hiddenEntityIds?: string[];\r\n drawnRelationEntityIDs?: string[];\r\n imagery?: IBookmarkImagery[];\r\n terrain?: string;\r\n globeColor?: string;\r\n shadows?: boolean;\r\n groundOcclusion?: boolean;\r\n ambientOcclusion?: boolean;\r\n markup?: Markup.IMarkup;\r\n cameraFrustum?: Camera.EFrustum;\r\n displayTimeline?: boolean;\r\n timelineSettings?: any;\r\n }\r\n\r\n /**\r\n * Lat,lon is in degrees.\r\n * Altitude is meters relative to ground.\r\n * Heading, pitch, roll are in radians.\r\n */\r\n export interface ICamera {\r\n position: {\r\n latitude: number;\r\n longitude: number;\r\n height: number;\r\n };\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Pending Action\" concept within Nextspace.\r\n * A pending action is a record of a server-side background process.\r\n * This record is used to monitor its progress and completion state.\r\n */\r\nexport namespace PendingAction {\r\n /**\r\n * Describes a pending action record.\r\n */\r\n export interface IAction {\r\n // ID of the pending action record.\r\n ID: number;\r\n // ID of the application that created the pending action.\r\n \"CreatedBy.Application\": string;\r\n // Date/time the pending action was created.\r\n \"Created.Time\": UTC.IUTC;\r\n // ID of the user that created the pending action.\r\n \"CreatedByUser.ID\": string;\r\n // Result string is a stringified JSON object.\r\n // This is not always the case so please check the data before parsing it.\r\n Result: string;\r\n // Progress % of the pending action.\r\n Progress: number;\r\n // Date/time the pending action was marked as done.\r\n \"Completed.Time\": UTC.IUTC;\r\n // Description on why the pending action was started.\r\n Description: string;\r\n // Status of the pending action.\r\n Status: EStatus;\r\n // Date/time the pending action was last updated.\r\n lastUpdated: UTC.IUTC;\r\n }\r\n\r\n /**\r\n * Available pending action statuses.\r\n */\r\n export enum EStatus {\r\n InProgress = \"IN_PROGRESS\",\r\n Cancelled = \"CANCELLED\",\r\n Complete = \"COMPLETE\",\r\n Failed = \"FAILED\"\r\n }\r\n\r\n /**\r\n * Describes a pending action message record.\r\n */\r\n export interface IMessage {\r\n // ID of the pending action record.\r\n \"PendingAction.ID\": number;\r\n // ID of the message record.\r\n ID: number;\r\n // ID of the application that created the message.\r\n \"CreatedBy.Application\": string;\r\n // Date/time the message was created.\r\n \"Created.Time\": UTC.IUTC;\r\n // Message type. Certain types can be hidden from end-users as they are only used for debugging.\r\n \"Message.Type\": EMessageType | string;\r\n // Message text.\r\n Message: string;\r\n }\r\n\r\n /**\r\n * Available message types.\r\n */\r\n export enum EMessageType {\r\n Warn = \"WARNING\",\r\n Error = \"ERROR\",\r\n Status = \"STATUS\",\r\n Info = \"INFO\"\r\n }\r\n\r\n /**\r\n * Returns a pending action record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the pending action record.\r\n actionId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The pending action record.\r\n action: IAction\r\n }> {\r\n let { api, actionId, req: reqParams } = params;\r\n if (!actionId) {\r\n throw(\"Action ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const data = await api.GET(`pendingAction/${actionId}`, Api.PrepReqParams(reqParams));\r\n return {\r\n action: data\r\n }\r\n }\r\n\r\n /**\r\n * Returns a list of pending action records.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetRelevantList(params: {\r\n api?: BruceApi.Api,\r\n // Reduces the list to only very recent actions.\r\n // It is recommended to first get the list with stricter=false, then get the list with stricter=true,\r\n // if you're monitoring the running actions.\r\n stricter?: boolean,\r\n reqParams?: Api.IReqParams\r\n }): Promise<{\r\n // The list of pending action records.\r\n actions: IAction[]\r\n }> {\r\n let { api, stricter, reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const data = await api.GET(`pendingActions/important?Update=${Boolean(stricter)}`, Api.PrepReqParams(reqParams));\r\n return {\r\n actions: data.Items\r\n };\r\n }\r\n\r\n /**\r\n * Returns a list of pending action record messages.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetMessages(params: {\r\n api?: BruceApi.Api,\r\n // ID of the pending action record.\r\n actionId: number,\r\n // Sort order of the messages.\r\n // Default is Asc.\r\n order?: Api.ESortOrder,\r\n // Index of the first message to return.\r\n // Default is 0.\r\n startIndex?: number,\r\n // Amount of messages to return.\r\n // Default is 500.\r\n amount?: number,\r\n // Types of messages to return.\r\n types?: EMessageType[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of pending action record messages.\r\n messages: IMessage[]\r\n }> {\r\n let { api, actionId, order, startIndex, amount, req: reqParams, types } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (amount == null) {\r\n amount = 500;\r\n }\r\n if (startIndex == null) {\r\n startIndex = 0;\r\n }\r\n if (order == null) {\r\n order = Api.ESortOrder.Asc;\r\n }\r\n let args = `?SortOrder=${order == Api.ESortOrder.Desc ? \"DESC\" : \"ASC\"}&PageSize=${amount}&PageIndex=${startIndex}`;\r\n if (types?.length) {\r\n for (let i = 0; i < types.length; i++) {\r\n args += `&Type=${types[i]}`;\r\n }\r\n }\r\n const data = await api.GET(`pendingAction/${actionId}/progressMessages` + args, Api.PrepReqParams(reqParams));\r\n return {\r\n messages: data.Items\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { Calculator } from \"../calculator/calculator\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Describes the \"Style\" concept within Nextspace.\r\n * A legacy way of referring to styles is \"entity display settings\".\r\n *\r\n * A style is a collection of settings (which can be calculations to perform on entity data) that\r\n * describe how an entity should be displayed.\r\n */\r\nexport namespace Style {\r\n /**\r\n * Returns cache identifier for a style.\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 id\r\n * @returns \r\n */\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.Style + Api.ECacheKey.Id + id;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of styles.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @returns\r\n */\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.Style;\r\n }\r\n\r\n /**\r\n * Types of styles available.\r\n * The type will dictate what settings are available.\r\n */\r\n export enum EType {\r\n Entity = \"ENTITY\",\r\n EntityRelationship = \"ENTITY_RELATIONSHIP\"\r\n }\r\n\r\n /**\r\n * Available types of points.\r\n * Default is POINT.\r\n */\r\n export enum EPointType {\r\n // Render a sphere with a fixed pixel size.\r\n Point = \"POINT\",\r\n // Render an icon.\r\n Icon = \"ICON\",\r\n // Render a cylinder with a fixed meter size.\r\n Cylinder = \"CYLINDER\"\r\n }\r\n\r\n /**\r\n * Settings for rendering points\r\n */\r\n export interface IPointSettings {\r\n // The type of point. This helps dictate what settings are relevant.\r\n // The default when unspecific will be \"POINT\".\r\n Type: EPointType;\r\n // The type of point. This helps dictate what settings are relevant.\r\n // The default when unspecific will be \"POINT\".\r\n color: Calculator.IField[];\r\n // The size in pixels of the point.\r\n // This is only relevant for \"POINT\" types. For \"ICON\" types the size is dictated by the icon image itself.\r\n // This must resolve in a number to be valid, otherwise it'll default to the application's default value.\r\n size: Calculator.IField[];\r\n // Client file ID of the icon to load.\r\n // This is to use in place of an icon URL.\r\n iconId: string;\r\n // The url to load an icon from.\r\n // This is only relevant for \"ICON\" types.\r\n iconUrl: Calculator.IField[];\r\n // The scale factor of the icon.\r\n // This is only relevant for \"ICON\" types.\r\n // For example a 50x50 icon with a scale of 2 will render as 100x100 on the screen.\r\n // This must resolve in a number to be valid, otherwise it'll default to the application's default value.\r\n iconScale: Calculator.IField[];\r\n // This dictates what the altitude value of an Entity should mean.\r\n // For example if you set this to be clamp-to-ground then the altitude value will be ignored.\r\n // Default is clamped to ground.\r\n altitudeOption?: any;\r\n // Indicates if depth-test should be disabled which forces the point to render above all other entities.\r\n // This is currently for icon points exclusively.\r\n renderOnTop?: boolean;\r\n // To review.\r\n CylinderFillColor?: Calculator.IField[];\r\n CylinderFillExtrusion?: Calculator.IField[];\r\n CylinderRadius?: Calculator.IField[];\r\n CylinderBorderEnabled?: boolean;\r\n CylinderBorderExtrusion?: Calculator.IField[];\r\n CylinderBorderWidth?: Calculator.IField[];\r\n CylinderBorderColor?: Calculator.IField[];\r\n // To remove.\r\n ClusterNearbyEntities?: boolean;\r\n MinimumEntitiesCountForClustering?: Calculator.IField[];\r\n }\r\n\r\n /**\r\n * Settings for rendering polygons.\r\n */\r\n export interface IPolygonSettings {\r\n // If the polygon should be extruded.\r\n useExtrusion: boolean;\r\n // The height of the extrusion in meters.\r\n // This must resolve into a number to be valid, otherwise it will not extrude.\r\n extrusionPath: Calculator.IField[];\r\n // The colour of the fill.\r\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\r\n fillColor: Calculator.IField[];\r\n // The colour of the outline.\r\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\r\n lineColor: Calculator.IField[];\r\n // Width of outline in meters.\r\n // This must resolve into a number to be valid, otherwise it'll default to the application's default value.\r\n lineWidth: Calculator.IField[];\r\n // Default is \"m\".\r\n // When units are in px the lines will draw as Cesium Polyline graphics, for meters corridors are used.\r\n // Meters are more stable and will reduce crashes. Pixels have better FPS.\r\n lineWidthUnits?: \"px\" | \"m\";\r\n // Dictates what the altitude value of an Entity should mean.\r\n // When not set to \"clamp-to-ground\" each individual's altitude will be used.\r\n // Default is clamped to ground.\r\n altitudeOption?: any;\r\n // The z index will dictate what vector appears on top vertically.\r\n // It is only applied when the altitude option is set to \"clamped-to-ground\".\r\n // For example a higher z index will appear on top of a lower z index.\r\n zIndex?: Calculator.IField[];\r\n // If the polygon should be draped over the terrain or tilesets + terrain.\r\n // Default is just terrain.\r\n drapeOver?: \"TERRAIN\" | \"ALL\";\r\n }\r\n\r\n /**\r\n * Settings for rendering polylines.\r\n */\r\n export interface IPolylineSettings {\r\n // The colour of the line.\r\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\r\n lineColor: Calculator.IField[];\r\n // The width of the line in either pixels or meters based on the units specified.\r\n // This must resolve into a number to be valid, otherwise it'll default to the application's default value.\r\n lineWidth: Calculator.IField[];\r\n // Default is \"px\" for backward compatibility.\r\n // When units are in px the lines will draw as Cesium Polyline graphics, for meters corridors are used.\r\n // Meters are more stable and will reduce crashes. Pixels have better FPS.\r\n lineWidthUnits?: \"px\" | \"m\";\r\n // Polylines do not support relative to ground positioning.\r\n // When set to \"absolute\" then each point's altitude will be used rather than clamping to the ground.\r\n // Default is clamped to ground.\r\n altitudeOption?: any;\r\n // The z index will dictate what vector appears on top vertically.\r\n // It is only applied when the altitude option is set to \"clamped-to-ground\".\r\n // For example a higher z index will appear on top of a lower z index.\r\n zIndex?: Calculator.IField[];\r\n // If the polyline should be draped over the terrain or tilesets + terrain.\r\n // Default is just terrain.\r\n drapeOver?: \"TERRAIN\" | \"ALL\";\r\n }\r\n\r\n /**\r\n * Settings for rendering 3d models.\r\n */\r\n export interface IModelSettings {\r\n // Indicates if the 3D model should be coloured by the Style.\r\n // Default is false.\r\n customize: boolean;\r\n // The colour to apply to the model if customize is set to true.\r\n // This must resolve into a css colour string to be valid, otherwise it'll default to the application's default value.\r\n fillColor: Calculator.IField[];\r\n // The model's scale factor.\r\n // This is multiplied against the Entity's transform scale.\r\n // For example if the Entity has a scale of 2 and this resolves to 3 then the final scale will be 6.\r\n // This must resolve into a number to be valid, otherwise it'll default to the application's default value (1).\r\n scale: Calculator.IField[];\r\n // Dictates how the colour specified should be applied to the model.\r\n fillColorBlendMode?: any;\r\n // If blend is set to \"Mix\" then this will dictate how much of the source colour should be used.\r\n // This is value between 0 and 1, default is \"0.5\". 1 means only the applied colour is used.\r\n fillColorBlendAmount?: number;\r\n // Dictates what the altitude value of an Entity should mean.\r\n // Default is relative to ground.\r\n altitudeOption?: any;\r\n }\r\n\r\n /**\r\n * Settings for rendering entities.\r\n */\r\n export interface IEntitySettings {\r\n // Settings are split up by the visual's type.\r\n pointStyle?: IPointSettings;\r\n polygonStyle?: IPolygonSettings;\r\n polylineStyle?: IPolylineSettings;\r\n // 3D model styling is used for both Tileset Entities and 3D model Entities.\r\n modelStyle?: IModelSettings;\r\n }\r\n\r\n /**\r\n * Settings for rendering entity relationships.\r\n */\r\n export interface IRelationSettings {\r\n // The colour of the parabola line.\r\n lineColor?: Calculator.IField[];\r\n // The width of the parabola line in pixels.\r\n lineWidth?: Calculator.IField[];\r\n // The height fraction to define the vertex height.\r\n // For example a \"0.25\" ratio means the height is 1/4 of the distance. A \"0\" ratio results in a straight line. \r\n heightDistanceRatio?: Calculator.IField[];\r\n // The duration of the animation in seconds.\r\n duration?: Calculator.IField[];\r\n }\r\n\r\n export type Settings = IEntitySettings | IRelationSettings;\r\n\r\n /**\r\n * Describes a style record.\r\n */\r\n export interface IStyle {\r\n // ID of the style record.\r\n ID: number;\r\n // Human readable name of the style.\r\n Name: string;\r\n // Settings based on the style's type.\r\n Settings: Settings;\r\n // Type of style.\r\n Type: EType;\r\n }\r\n\r\n /**\r\n * Returns a list of styles.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of styles.\r\n styles: IStyle[]\r\n }> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const res: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"ui.entityDisplaySettings\", Api.PrepReqParams(reqParams));\r\n res({\r\n styles: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: res,\r\n req: reqParams\r\n });\r\n return res;\r\n }\r\n\r\n /**\r\n * Returns a style.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the style record.\r\n styleId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The style record.\r\n style: IStyle\r\n }> {\r\n let { api, styleId: id, req: reqParams } = params;\r\n if (!id) {\r\n throw(\"Style ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\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 = await api.GET(`ui.entityDisplaySetting/${id}`, Api.PrepReqParams(reqParams));\r\n res({\r\n style: 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 * Creates or updates a style.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: BruceApi.Api,\r\n // The style record to create or update.\r\n style: IStyle,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The style record.\r\n style: IStyle\r\n }> {\r\n let { api, style: data, req: reqParams } = params;\r\n if (!data?.Name) {\r\n throw(\"Style name is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!data.ID) {\r\n data.ID = 0;\r\n }\r\n const res = await api.POST(`ui.entityDisplaySetting/${data.ID}`, data, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(data.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n return {\r\n style: res\r\n };\r\n }\r\n\r\n /**\r\n * Deletes a style.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: BruceApi.Api,\r\n // ID of the style record to delete.\r\n styleId: number,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, styleId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!id) {\r\n throw(\"Style ID is required.\");\r\n }\r\n await api.DELETE(`ui.entityDisplaySetting/${id}`, Api.PrepReqParams(reqParams));\r\n api.Cache.Remove(GetCacheKey(id));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n}","/**\r\n * Permissions in Nextspace are arbitrary strings with meaning in specific contexts.\r\n * This is a list of known permissions.\r\n */\r\nexport namespace Permission {\r\n export type Perm = EPerm | string;\r\n\r\n /**\r\n * Standalone permissions.\r\n */\r\n export enum EPerm {\r\n // Provides full access to a specific client account.\r\n ADMIN = \"ADMIN\",\r\n // Provides read-only access to a specific client account.\r\n ADMIN_VIEW = \"ADMIN_VIEW\",\r\n // Provides login access to a specific client account.\r\n // Login and read-only differ in that certain data is restricted to administrator users or users with specific permissions.\r\n LOGIN = \"LOGIN\",\r\n // Access to deleting arbitrary entity types.\r\n DELETE_ENTITY_TYPE = \"DELETE_ENTITY_TYPE\",\r\n // Access to creating and updating arbitrary entity types.\r\n CREATE_ENTITY_TYPE = \"CREATE_ENTITY_TYPE\",\r\n UPDATE_ENTITY_TYPE = \"UPDATE_ENTITY_TYPE\"\r\n }\r\n\r\n /**\r\n * Permissions that are suffixed with another value.\r\n * Eg: \"UIVIEW_\" will get the view's ID appended to it and be used as a permission to access the view.\r\n */\r\n export enum EPermPrefix {\r\n // Access to a specific view.\r\n ACCESS_PROJECT_VIEW = \"UIVIEW_\",\r\n // Editing capability for a specific view's bookmarks.\r\n MANAGE_PROJECT_VIEW_BOOKMARKS = \"UIVIEW_MANAGE_BOOKMARKS_\",\r\n // Access to a specific tileset.\r\n ACCESS_TILESET = \"TILESET_\"\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Permission } from \"./permission\";\r\nimport { User } from \"./user\";\r\n\r\n/**\r\n * Describes the \"Session\" concept within Nextspace.\r\n * A session is a set of settings produced from a user or access token login.\r\n * The session describes what the access should be allowed to do.\r\n */\r\nexport namespace Session {\r\n /**\r\n * Returns cache identifier for a session.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param sessionId\r\n * @returns \r\n */\r\n function GetCacheKey(sessionId: string): string {\r\n return `${Api.ECacheKey.Session}${Api.ECacheKey.Id}${sessionId}`;\r\n }\r\n\r\n /**\r\n * Describes a session record.\r\n */\r\n export interface ISession {\r\n // Loaded account-level permissions.\r\n AccessPermissions: IAccountPermissions;\r\n // Loaded super-level permissions.\r\n HypeportalAccessPermisssions?: ISuperPermissions;\r\n // The account ID that was logged in.\r\n \"ClientAccount.ID\": string;\r\n // The session ID.\r\n ID: string;\r\n // The session's logged in IP.\r\n IP: string;\r\n // The session's last access time.\r\n LastAccessTime: UTC.IUTC;\r\n // The session's logged in user.\r\n User: User.IUser;\r\n }\r\n\r\n /**\r\n * Describes a set of permissions for an account.\r\n */\r\n export interface IAccountPermissions {\r\n // The account ID that these permissions are for.\r\n \"ClientAccount.ID\"?: string;\r\n // Array of permissions that are enabled.\r\n EnabledFeatures?: Permission.Perm[];\r\n // Array of user groups that the user belongs to.\r\n UserGroups?: string[];\r\n }\r\n\r\n /**\r\n * Describes a set of permissions for a super user.\r\n */\r\n export interface ISuperPermissions {\r\n // Array of permissions that are enabled.\r\n EnabledFeatures?: Permission.Perm[];\r\n // Array of user groups that the user belongs to.\r\n UserGroups?: string[];\r\n }\r\n\r\n /**\r\n * Gets a session record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: GuardianApi.Api,\r\n // If none is specified it'll return an anonymous session.\r\n sessionId?: string,\r\n // Optional param to specify the account ID to get permissions for.\r\n // If not specified, the session's original logged in account will be used.\r\n accountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The session record.\r\n session: ISession\r\n }> {\r\n let { api, sessionId, req: reqParams, accountId } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const key = GetCacheKey(sessionId);\r\n const cache = await api.GetCacheItem(key, 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 = await api.GET(`session/${sessionId}${accountId ? `?account=${accountId}`: \"\"}`, reqParams);\r\n res({\r\n session: 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,\r\n value: prom,\r\n req: reqParams,\r\n duration: 5000\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Request to login or to swap existing session to a different account.\r\n * If api is already logged in, pass account param to swap the session.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Login(params: {\r\n api?: GuardianApi.Api,\r\n // The username to login with.\r\n username?: string,\r\n // The password to login with.\r\n password?: string,\r\n // The account ID to login into.\r\n accountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Session record.\r\n session: ISession\r\n }> {\r\n let { api, username, password, accountId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const data: any = await api.POST(\"login\", {\r\n account: accountId ? accountId : \"\",\r\n login: username,\r\n password: password\r\n }, reqParams);\r\n const session: ISession = data?.Session;\r\n const ssid = session?.ID;\r\n\r\n api.SetSessionId(ssid);\r\n api.Cache.Remove(GetCacheKey(ssid));\r\n\r\n return {\r\n session: session\r\n };\r\n }\r\n\r\n /**\r\n * Request to logout and void a session.\r\n * This will use the sessionId set within the provided api instance.\r\n * @param params \r\n */\r\n export async function Logout(params: {\r\n api?: GuardianApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const ssid = api.GetSessionId();\r\n if (ssid) {\r\n await api.POST(\"logout\", null, reqParams);\r\n api.SetSessionId(<any>null);\r\n api.Cache.Remove(GetCacheKey(ssid));\r\n }\r\n }\r\n\r\n /**\r\n * Returns if a permission is enabled for a session.\r\n * This check is case-insensitive.\r\n * Please use 'IsAccountAdmin' and 'IsSuperAdmin' when needed as they cover all account-level perms.\r\n * @param params \r\n * @returns \r\n */\r\n export function IsPermEnabled(params: {\r\n // The session to check.\r\n session: ISession,\r\n // The client account ID to check.\r\n accountId: string,\r\n // The permission to check.\r\n perm: string\r\n }): boolean {\r\n let { session, accountId, perm } = params;\r\n if (!perm) {\r\n throw(\"Perm is required.\");\r\n }\r\n perm = perm.toLocaleUpperCase();\r\n const perms = <User.IAccessPermission>session?.User?.AccessPermissions?.find(x => x[\"ClientAccount.ID\"] == accountId);\r\n if (!perms) {\r\n return false;\r\n }\r\n if (!perms.UserGroups) {\r\n perms.UserGroups = [];\r\n }\r\n for (let i = 0; i < perms.UserGroups.length; i++) {\r\n const group = perms.UserGroups[i];\r\n if (typeof group != \"string\") {\r\n const features = group.Features;\r\n if (features && features.findIndex(x => x.toLocaleUpperCase() == perm) > -1) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns if a super permission is enabled for a session.\r\n * This check is case-insensitive.\r\n * Please use 'IsSuperAdmin' when needed as it covers all perms.\r\n * @param params \r\n * @returns \r\n */\r\n export function IsSuperPermEnabled(params: {\r\n session: ISession,\r\n perm: string\r\n }): boolean {\r\n let { session, perm } = params;\r\n if (!perm) {\r\n throw(\"Perm is required.\");\r\n }\r\n perm = perm.toLocaleUpperCase();\r\n const accessPerms = session?.HypeportalAccessPermisssions?.EnabledFeatures ?? [];\r\n return accessPerms.findIndex(x => x.toLocaleUpperCase() == perm) > -1;\r\n }\r\n\r\n /**\r\n * Returns if a session is an account admin.\r\n * Please use 'IsSuperAdmin' when needed as it covers all perms.\r\n * @param params \r\n * @returns \r\n */\r\n export function IsAccountAdmin(params: {\r\n // The session to check.\r\n session: ISession,\r\n // The client account ID to check.\r\n accountId: string\r\n }): boolean {\r\n return IsPermEnabled({\r\n perm: Permission.EPerm.ADMIN,\r\n accountId: params.accountId,\r\n session: params.session\r\n });\r\n }\r\n\r\n /**\r\n * Returns if a session is a super admin.\r\n * @param params \r\n * @returns \r\n */\r\n export function IsSuperAdmin(params: {\r\n // The session to check.\r\n session: ISession\r\n }): boolean {\r\n return IsSuperPermEnabled({\r\n session: params.session,\r\n perm: Permission.EPerm.ADMIN\r\n });\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Permission } from \"./permission\";\r\nimport { User } from \"./user\";\r\n\r\n/**\r\n * Describes the \"User Group\" concept within Nextspace.\r\n * A user group is a collection of permissions (\"Features\") and what users should be in the group.\r\n */\r\nexport namespace UserGroup {\r\n /**\r\n * Describes a user group record.\r\n */\r\n export interface IGroup {\r\n // The account ID that this group is for.\r\n \"ClientAccount.ID\"?: string;\r\n // Array of permissions that are enabled when being in this group.\r\n \"Features\": Permission.Perm[];\r\n // The group ID.\r\n \"ID\": string;\r\n // Human readable name for the group.\r\n \"Name\"?: string;\r\n }\r\n\r\n /**\r\n * Returns a user group by its name.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetByName(params: {\r\n api?: GuardianApi.Api, \r\n // The account ID that this group is for.\r\n accountId: string, \r\n // Name to search for.\r\n name: string, \r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The user group record.\r\n group: IGroup\r\n }> {\r\n let { api, accountId, name, req: reqParams } = params;\r\n if (!name || !accountId) {\r\n throw(\"Name and AccountID are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const data = await api.GET(`account/${accountId}/userGroupByName/${name}`, reqParams);\r\n return {\r\n group: data\r\n };\r\n }\r\n\r\n /**\r\n * Returns all users in a user group.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetUsers(params: {\r\n api?: GuardianApi.Api, \r\n // The account ID that this group is for.\r\n accountId: string, \r\n // The group ID.\r\n groupId: string, \r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The users in the group.\r\n users: User.IUser[]\r\n }> {\r\n let { api, accountId, groupId: id, req: reqParams } = params;\r\n if (!accountId || !id) {\r\n throw(\"AccountID and ID are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const data = await api.GET(`userGroup/${accountId}/${id}/users`, reqParams);\r\n return {\r\n users: data.Items\r\n };\r\n }\r\n\r\n /**\r\n * Returns list of user groups that have a specific permission enabled.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetListByPerm(params: {\r\n api?: GuardianApi.Api,\r\n // The account ID that this group is for.\r\n accountId: string, \r\n // The permission to search for.\r\n perm: Permission.Perm,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The user groups that have the permission enabled.\r\n groups: IGroup[]\r\n }> {\r\n let { api, accountId, perm, req: reqParams } = params;\r\n if (!accountId || !perm) {\r\n throw(\"AccountID and Perm are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const data = await api.GET(`userGroupsByFeature/${accountId}/${perm}`, reqParams);\r\n return {\r\n groups: data.Items\r\n };\r\n }\r\n\r\n /**\r\n * Returns all user groups for an account.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: GuardianApi.Api,\r\n // The account ID that this group is for.\r\n accountId: string, \r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The user groups for the account.\r\n groups: IGroup[]\r\n }> {\r\n let { api, accountId, req: reqParams } = params;\r\n if (!accountId) {\r\n throw(\"AccountID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const data = await api.GET(`userGroups/${accountId}`, reqParams);\r\n return {\r\n groups: data.Items\r\n };\r\n }\r\n\r\n /**\r\n * Deletes a user group.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Delete(params: {\r\n api?: GuardianApi.Api, \r\n // The account ID that this group is for.\r\n accountId: string, \r\n // The group ID.\r\n groupId: string, \r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, accountId, groupId: id, req: reqParams } = params;\r\n if (!accountId || !id) {\r\n throw(\"AccountID and ID are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n return api.DELETE(`account/${accountId}/userGroupID/${id}`, reqParams);\r\n }\r\n\r\n /**\r\n * Creates or updates a user group.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: GuardianApi.Api, \r\n // The user group to create or update.\r\n group: IGroup, \r\n reqParams?: Api.IReqParams\r\n }): Promise<{\r\n // The user group record.\r\n group: IGroup\r\n }> {\r\n let { api, group: data, reqParams } = params;\r\n if (!data.Name || !data[\"ClientAccount.ID\"]) {\r\n throw(\"User group name and client account ID are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.POST(`userGroup${data.ID ? (\"/\" + data.ID) : \"\"}`, data, reqParams);\r\n return {\r\n group: res\r\n };\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { UserGroup } from \"./user-group\";\r\n\r\n/**\r\n * Describes the \"User\" concept within Nextspace.\r\n * A user is either a login-user or an access-token.\r\n *\r\n * You cannot login using an access-token, but both concepts are-\r\n * treated the same way in terms of permissions and user groups.\r\n */\r\nexport namespace User {\r\n /**\r\n * Returns cache identifier for a user.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\", \"def\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param userId\r\n * @param accountId\r\n * @returns \r\n */\r\n export function GetCacheKey(userId: string, accountId?: string): string {\r\n if (!accountId) {\r\n accountId = \"\";\r\n }\r\n return Api.ECacheKey.User + Api.ECacheKey.Id + userId + Api.ECacheKey.Id + accountId;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a user.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\", \"def\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param email\r\n * @param accountId\r\n * @returns \r\n */\r\n export function GetEmailCacheKey(email: string, accountId?: string): string {\r\n if (!accountId) {\r\n accountId = \"\";\r\n }\r\n return Api.ECacheKey.User + Api.ECacheKey.UserEmail + email + Api.ECacheKey.Id + accountId;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a user's settings.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\", \"def\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param userId\r\n * @param appId\r\n * @returns \r\n */\r\n export function GetSettingsCacheKey(userId: string, appId: string): string {\r\n return Api.ECacheKey.User + Api.ECacheKey.UserSettings + userId + Api.ECacheKey.Id + appId;\r\n }\r\n\r\n /**\r\n * Describes a user record.\r\n */\r\n export interface IUser {\r\n // Enabled access permissions.\r\n AccessPermissions?: IAccessPermission[];\r\n // User's email address.\r\n Email?: string;\r\n // User's username.\r\n Login?: string;\r\n // User's full name.\r\n FullName?: string;\r\n // User's ID.\r\n ID?: string;\r\n // Indicates if the user is activated.\r\n // This is deprecated and is being replaced by a flags for email and mobile verification statuses.\r\n IsActivated?: boolean;\r\n // Indicates if the user is disabled.\r\n IsDisabled?: boolean;\r\n // Indicates if the user's password needs to be changed.\r\n IsPasswordChangeRequired?: boolean;\r\n // User's mobile number.\r\n Mobile?: string;\r\n // User's password.\r\n // Is not available when reading the record.\r\n // Set to change the password.\r\n Password?: string;\r\n // User's type. Eg: access token instead of a login user.\r\n Type?: EType;\r\n }\r\n\r\n /**\r\n * Available user types.\r\n */\r\n export enum EType {\r\n // Typical user. Login to gain access to a session.\r\n User = \"LOGIN_USER\",\r\n // Access token. Used to gain access to related permissions.\r\n AccessToken = \"ACCESS_TOKEN\"\r\n }\r\n\r\n /**\r\n * Describes a set of permissions for an account.\r\n */\r\n export interface IAccessPermission {\r\n // The account ID that these permissions are for.\r\n \"ClientAccount.ID\": string;\r\n // Array of associated user groups.\r\n \"UserGroup.ID\"?: string[];\r\n \"UserGroups\"?: UserGroup.IGroup[];\r\n }\r\n\r\n /**\r\n * Gets a user record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: GuardianApi.Api,\r\n // The user ID.\r\n userId: string,\r\n // The account ID that this user is for.\r\n accountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The user record.\r\n user: IUser\r\n }> {\r\n let { api, userId: id, accountId, req: reqParams } = params;\r\n if (!id) {\r\n throw(\"ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(id, <string>accountId), 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 = await api.GET(`user/${id}${accountId ? `?clientAccountID=${accountId}` : \"\"}`, reqParams)\r\n res({\r\n user: 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, <string>accountId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Updates a user record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: GuardianApi.Api,\r\n // The user to update.\r\n user: IUser,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The updated user record.\r\n user: IUser\r\n }> {\r\n let { api, user: data, req: reqParams } = params;\r\n if (!data?.ID || !data?.Type) {\r\n throw(\"ID and Type are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n // When getting a user it is structured slightly different to when we update it.\r\n // We can make up the difference here.\r\n if (data.AccessPermissions?.length) {\r\n for (let i = 0; i < data.AccessPermissions.length; i++) {\r\n const perm = data.AccessPermissions[i];\r\n if (!perm[\"UserGroup.ID\"] && perm.UserGroups) {\r\n perm[\"UserGroup.ID\"] = [];\r\n for (let j = 0; j < perm.UserGroups.length; j++) {\r\n perm[\"UserGroup.ID\"].push(perm.UserGroups[j].ID);\r\n }\r\n }\r\n }\r\n }\r\n const res = await api.POST(`user/${data.ID}`, data, reqParams);\r\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + data.ID);\r\n if (data.Type == EType.AccessToken) {\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\r\n }\r\n else if (data.Type == EType.User) {\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.User + Api.ECacheKey.Account);\r\n }\r\n return {\r\n user: res\r\n };\r\n }\r\n\r\n /**\r\n * Loads settings for a given user + app.\r\n * The session's account id is used to separate settings between accounts.\r\n * @param params\r\n */\r\n export async function GetSettings(params: {\r\n api?: GuardianApi.Api,\r\n // The user ID.\r\n userId: string,\r\n // The app ID.\r\n appId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The settings record.\r\n settings: any\r\n }> {\r\n let { api, userId, appId, req } = params;\r\n if (!userId || !appId) {\r\n throw(\"UserId and appId are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetSettingsCacheKey(userId, appId), req);\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 = await api.GET(`user/${userId}/application/${appId}/settings`);\r\n const settings = data?.Settings ? data.Settings : {};\r\n res({\r\n settings: settings\r\n });\r\n }\r\n catch (e) {\r\n // It will complain if an app id hasn't been used yet.\r\n // We need to suppress that error.\r\n if (e && typeof e == \"object\") {\r\n if (e.ERROR && typeof e.ERROR == \"object\" && e.ERROR.Type == \"NotFound\") {\r\n res({\r\n settings: {}\r\n });\r\n return;\r\n }\r\n }\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetSettingsCacheKey(userId, appId),\r\n value: prom,\r\n req: req\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Updates settings for a given accId + user + app.\r\n * The settings update will replace the existing record, please ensure to merge with existing settings.\r\n * AccountId is optional and will use a globally shared record if not provided.\r\n * @param params\r\n */\r\n export async function UpdateSettings(params: {\r\n api?: GuardianApi.Api,\r\n // The client account's ID.\r\n accId?: string,\r\n // The user ID.\r\n userId: string,\r\n // The app ID.\r\n appId: string,\r\n // The settings to update.\r\n settings: any,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, accId, userId, appId, settings, req } = params;\r\n if (!userId || !appId) {\r\n throw(\"UserId and appId are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const postBody = {\r\n Settings: settings == null ? {} : settings,\r\n Application: appId,\r\n ClientAccountID: accId,\r\n UserID: userId\r\n };\r\n const prom = api.POST(`user/${userId}/application/${appId}/settings`, postBody, req);\r\n api.Cache.Remove(GetSettingsCacheKey(userId, appId));\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns if a username is available.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetUsernameAvailable(params: {\r\n api?: GuardianApi.Api,\r\n // The username to check.\r\n username: string,\r\n // The user ID to exclude from the check.\r\n // This is useful when updating a user's username.\r\n excludeUserId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Indicates if the username is available.\r\n isAvailable: boolean\r\n }> {\r\n let { api, username, excludeUserId, req: reqParams } = params;\r\n if (!username) {\r\n throw(\"Username is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const req = api.GET(`user/loginavailable/${username}${excludeUserId ? \"?excludeUserId=\" + excludeUserId : \"\"}`, reqParams);\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n isAvailable: data.IsAvailable\r\n });\r\n }\r\n catch (e) {\r\n rej(<any>e);\r\n }\r\n });\r\n return prom;\r\n }\r\n\r\n export namespace LoginUser {\r\n /**\r\n * Returns cache identifier for a list of users.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param accountId \r\n * @returns \r\n */\r\n export function GetListCacheKey(accountId: string): string {\r\n return Api.ECacheKey.User + Api.ECacheKey.Account + Api.ECacheKey.Id + accountId;\r\n }\r\n\r\n /**\r\n * Returns a user by their email address.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetByEmail(params: {\r\n api?: GuardianApi.Api,\r\n // The email address to search for.\r\n email: string,\r\n // An account ID to filter against.\r\n accountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The user record.\r\n user: IUser\r\n }> {\r\n let { api, email, accountId, req: reqParams } = params;\r\n if (!email) {\r\n throw(\"Email is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetEmailCacheKey(email, <string>accountId), 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 = await api.GET(`userByEmail/${email}${accountId ? `?clientAccountID=${accountId}` : \"\"}`, reqParams);\r\n res({\r\n user: 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: GetEmailCacheKey(email, <string>accountId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns a list of users for an account.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: GuardianApi.Api,\r\n // The account ID to get users for.\r\n accountId: string,\r\n // Indicates if the list should exclude the client account's users.\r\n exclusive?: boolean,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of users.\r\n users: IUser[]\r\n }> {\r\n let { api, accountId, exclusive, req: reqParams } = params;\r\n if (!accountId) {\r\n throw(\"Client account ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n if (!exclusive) {\r\n exclusive = false;\r\n }\r\n\r\n const cache = exclusive ? null : await api.GetCacheItem(GetListCacheKey(accountId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`users?clientAccountID=${accountId}${exclusive ? \"&allExcludingClientAccount=true\" : \"\" }`, reqParams);\r\n res({\r\n users: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n req.then(async (data) => {\r\n const users = data.users;\r\n for (let i = 0; i < users.length; i++) {\r\n await api.SetCacheItem({\r\n key: GetCacheKey(<string>users[i].ID, accountId),\r\n value: {\r\n user: users[i]\r\n },\r\n req: reqParams\r\n });\r\n }\r\n });\r\n if (!exclusive) {\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(accountId),\r\n value: req,\r\n req: reqParams\r\n });\r\n }\r\n return req;\r\n }\r\n\r\n /**\r\n * Sends a signup email to the specified email address.\r\n * @param params\r\n * @returns\r\n */\r\n export async function Signup(params: {\r\n api?: GuardianApi.Api,\r\n // The email address to send the signup email to.\r\n email: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, email, req: reqParams } = params;\r\n if (!email) {\r\n throw(\"Email is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n return api.POST(\"clientaccount/signup\", {\r\n Email: email\r\n }, reqParams);\r\n }\r\n\r\n /**\r\n * Sends a new signup email using a previous one's expired code.\r\n * @param params\r\n * @returns\r\n */\r\n export async function SignupResend(params: {\r\n api?: GuardianApi.Api,\r\n // The expired activation code.\r\n expiredCode: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, expiredCode, req: reqParams } = params;\r\n if (!expiredCode) {\r\n throw(\"Expired activation code is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n return api.POST(`clientaccount/signup/resend?activationKey=${Api.Encode(expiredCode)}`, null, reqParams);\r\n }\r\n\r\n /**\r\n * Completes signup using user data and a signup code.\r\n * @param params\r\n * @returns\r\n */\r\n export async function SignupComplete(params: {\r\n api?: GuardianApi.Api,\r\n // The signup code.\r\n code: string,\r\n // The user data to complete the signup with.\r\n user: IUser,\r\n // The account ID to complete the signup for.\r\n accountId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The user record.\r\n user: IUser\r\n }> {\r\n let { api, code, user: data, accountId, req: reqParams } = params;\r\n if (!code || !data?.Login || !data?.Password) {\r\n throw(\"Login, password, and activation code are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n data = JSON.parse(JSON.stringify(data));\r\n data.IsActivated = true;\r\n data.IsDisabled = false;\r\n (<any>data).key = code;\r\n const res: IUser = await api.POST(`UserActivate/${accountId ? accountId : \"\"}`, data, reqParams);\r\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + res.ID);\r\n if (data.Email) {\r\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.UserEmail + data.Email);\r\n }\r\n return {\r\n user: res\r\n };\r\n }\r\n\r\n /**\r\n * Sends a password reset email to the specified email address.\r\n * @param params\r\n * @returns user id associated with provided email.\r\n */\r\n export async function ForgotPassword(params: {\r\n api?: GuardianApi.Api,\r\n // AccountId the user is associated with.\r\n // This dictates the email template to use.\r\n accountId: string,\r\n // The email address to send the password reset email to.\r\n email: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The user ID associated with the provided email.\r\n userId: string\r\n }> {\r\n let { api, accountId, email, req: reqParams } = params;\r\n if (!accountId || !email) {\r\n throw(\"Account ID and email are required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const req = api.POST(`UserForgotPassword/${accountId}`, {\r\n Email: email\r\n }, reqParams);\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n userId: data.ID\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Completes password reset using a password reset code and new password.\r\n * @param params\r\n * @returns\r\n */\r\n export async function ForgotPasswordComplete(params: {\r\n api?: GuardianApi.Api,\r\n // The password reset code.\r\n code: string,\r\n // The associated user ID.\r\n userId: string,\r\n // The new password.\r\n password: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The related user record.\r\n user: IUser\r\n }> {\r\n let { api, code, userId, password, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const {user} = await Get({\r\n api: api,\r\n userId: userId,\r\n accountId: \"\",\r\n req: reqParams\r\n });\r\n const res = await api.POST(\"UserSetNameAndPassword\", {\r\n ID: userId,\r\n Email: user.Email,\r\n ActivationCode: code,\r\n Password: password,\r\n FullName: user.FullName\r\n }, reqParams);\r\n return {\r\n user: res\r\n };\r\n }\r\n }\r\n\r\n export namespace AccessToken {\r\n /**\r\n * Returns cache identifier for a list of users.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param accountId \r\n * @returns \r\n */\r\n export function GetListCacheKey(accountId: string): string {\r\n return Api.ECacheKey.AccessToken + Api.ECacheKey.Account + Api.ECacheKey.Id + accountId;\r\n }\r\n\r\n /**\r\n * Returns a list of access tokens for an account.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: GuardianApi.Api,\r\n // The account ID to get access tokens for.\r\n accountId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of access tokens.\r\n users: IUser[]\r\n }> {\r\n let { api, accountId, 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(accountId), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n const req: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"usersByClientAccount/accessTokens\", reqParams);\r\n res({\r\n users: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n req.then(async (data) => {\r\n const users = data.tokens;\r\n for (let i = 0; i < users.length; i++) {\r\n await api.SetCacheItem({\r\n key: GetCacheKey(<string>users[i].ID, accountId),\r\n value: {\r\n user: users[i]\r\n },\r\n req: reqParams\r\n });\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(accountId),\r\n value: req,\r\n req: reqParams\r\n });\r\n return req;\r\n }\r\n\r\n /**\r\n * Deletes an access token.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n api?: GuardianApi.Api,\r\n // The access token ID.\r\n tokenId: string,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { api, tokenId: id, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n await api.DELETE(`accessToken/${id}`, reqParams);\r\n api.Cache.RemoveByContains(Api.ECacheKey.User + Api.ECacheKey.Id + id);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\r\n }\r\n\r\n /**\r\n * Creates a new access token.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Create(params: {\r\n api?: GuardianApi.Api,\r\n // The access token to create.\r\n token: IUser,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The created access token.\r\n user: IUser\r\n }> {\r\n let { api, token: data, req: reqParams } = params;\r\n if (!data) {\r\n data = {};\r\n }\r\n if (data.Type == EType.User) {\r\n throw(\"User type is not allowed.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n if (!data.Type) {\r\n data.Type = EType.AccessToken;\r\n }\r\n\r\n data = await api.POST(\"accessToken\", data, reqParams);\r\n await api.Cache.RemoveByStartsWith(Api.ECacheKey.AccessToken + Api.ECacheKey.Account);\r\n return {\r\n user: data\r\n };\r\n }\r\n }\r\n}","\r\nimport { Api } from \"../api/api\";\r\nimport { GuardianApi } from \"../api/guardian-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { User } from \"../user/user\";\r\n\r\n/**\r\n * An account-invite is an invitation to a user to join a client account.\r\n * New users to Nextspace will setup their user account within the invitation process.\r\n */\r\nexport namespace AccountInvite {\r\n /**\r\n * Describes an account-invite record.\r\n */\r\n export interface IInvite {\r\n ID: number;\r\n // Client account the invite is for.\r\n \"Account.ID\": string;\r\n // User the invite is for.\r\n \"Invited.User.ID\": string;\r\n // User that created the invite.\r\n \"InvitedBy.User.ID\": string;\r\n // Date/time the invite was created.\r\n CreatedDate: UTC.IUTC;\r\n // How the user was invited. Eg: Email, SMS, Manual.\r\n InviteMethod: EInviteMethod;\r\n // Indicates if the invite has expired.\r\n IsExpired: boolean;\r\n // Status of the invite. Eg: Sent, Accepted, Denied, Cancelled.\r\n Status: EStatus;\r\n }\r\n\r\n /**\r\n * Possible invite statuses.\r\n */\r\n export enum EStatus {\r\n Denied = \"Denied\",\r\n Cancelled = \"Cancelled\",\r\n Sent = \"Sent\",\r\n NotSent = \"NotSent\",\r\n Accepted = \"Accepted\"\r\n }\r\n\r\n /**\r\n * Possible invite methods.\r\n */\r\n export enum EInviteMethod {\r\n // Email invites are sent to a user's email address.\r\n // An email invite will validate the user's email address.\r\n Email = \"Email\",\r\n // Manual invites are links that are manually passed to a user.\r\n // A manual invite will not validate the user's email address or mobile number.\r\n Manual = \"Manual\",\r\n // TODO: Implement SMS invites.\r\n SMS = \"SMS\"\r\n }\r\n\r\n /**\r\n * Returns an invite matching a provided invite code.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetByCode(params: {\r\n api?: GuardianApi.Api,\r\n code: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n invite: IInvite\r\n }> {\r\n let { api, code, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.GET(`invite/code?inviteCode=${code}`, Api.PrepReqParams(req));\r\n return res;\r\n }\r\n\r\n /**\r\n * Returns a list of invites matching provided criteria.\r\n * For example you can get a list of invites for a specific account or user (or both).\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: GuardianApi.Api,\r\n // Client account ID to get invites for.\r\n accountId?: string,\r\n // User ID to get invites for.\r\n userId?: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n invites: IInvite[],\r\n warnings?: string[]\r\n }> {\r\n let { api, accountId, userId, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const urlParams = new URLSearchParams();\r\n if (accountId) {\r\n urlParams.append(\"accountId\", accountId);\r\n }\r\n if (userId) {\r\n urlParams.append(\"userId\", userId);\r\n }\r\n const res = await api.GET(\"invites?\" + urlParams.toString(), Api.PrepReqParams(req));\r\n return res;\r\n }\r\n\r\n /**\r\n * Updates an invite's status.\r\n * Once an invite is accepted or denied it cannot be changed.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n api?: GuardianApi.Api,\r\n code: string,\r\n status: string,\r\n user?: User.IUser,\r\n req?: Api.IReqParams\r\n }) {\r\n let { api, code, status, user, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.POST(\"invite/update\", {\r\n InviteCode: code,\r\n Status: status,\r\n User: user\r\n }, Api.PrepReqParams(req));\r\n return res;\r\n }\r\n\r\n /**\r\n * Creates a new invite.\r\n * Please validate the response invitation records to ensure the desired contact method was used and worked.\r\n * Eg: It will tell you if the email was sent successfully.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Create(params: {\r\n api?: GuardianApi.Api,\r\n accountId: string,\r\n login?: string,\r\n userId?: string,\r\n email?: string,\r\n mobile?: string,\r\n emailTemplateKey?: string,\r\n groupIds?: string[],\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Array of warnings that may have occurred during the invite process.\r\n warnings?: string[],\r\n // The user record for the user that was invited.\r\n user: User.IUser,\r\n // The invite record for the contact method used.\r\n invite: IInvite,\r\n // If SMS or Email are used, an additional invite record is generated for the manual invite.\r\n manualInvite?: IInvite\r\n manualInviteCode?: string\r\n }> {\r\n let { api, accountId, login, userId, email, mobile, emailTemplateKey, groupIds, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetGuardianApi();\r\n }\r\n\r\n const res = await api.POST(\"invite/new\", {\r\n accountId,\r\n login,\r\n email,\r\n mobile,\r\n userId,\r\n groupIds,\r\n emailTemplateKey\r\n }, Api.PrepReqParams(req));\r\n return res;\r\n }\r\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 {\r\n /**\r\n * Returns a url-safe string that is human readable.\r\n * Eg: 'My Project View!' into 'My-Project-View'.\r\n * @param str \r\n * @returns \r\n */\r\n export function ToHumanReadable(str: string) {\r\n str = str.replace(/[^a-zA-Z0-9]/gi, \"-\");\r\n // Dedupe underscores.\r\n str = str.replace(/-+/g, \"-\");\r\n // Trim underscores.\r\n str = str.replace(/^-+|-+$/g, \"\");\r\n return str;\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Entity as E } from \"../entity/entity\";\r\n\r\n/**\r\n * Describes the \"Data Lab\" concept within Nextspace.\r\n * Data lab is a query tool that allows users to search for entities.\r\n * Data lab queries can be saved for reuse.\r\n */\r\nexport namespace DataLab {\r\n export enum EReqKey {\r\n Primary = \"PrimarySelection\",\r\n Secondary = \"SecondarySelection\"\r\n }\r\n\r\n // WIP.\r\n export interface IQuery {\r\n [EReqKey.Primary]: {\r\n Items: any[]\r\n },\r\n [EReqKey.Secondary]?: any,\r\n Action?: string,\r\n PrimaryEntityTypeID?: string;\r\n PrimaryEntityID?: string;\r\n }\r\n\r\n /**\r\n * Runs a DataLab query.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Run(params: {\r\n api?: BruceApi.Api,\r\n // The query to run.\r\n query: IQuery, \r\n // Key to identify if this is a primary or secondary selection.\r\n // A secondary selection builds upon or references a primary selection.\r\n // Default is Primary.\r\n key?: EReqKey, \r\n // The number of entities to skip.\r\n // Default is 0.\r\n skip?: number, \r\n // The number of entities to load.\r\n // Default is 50.\r\n load?: number, \r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of entities matching the query.\r\n entities: E.IEntity[]\r\n }> \r\n {\r\n let { api, query, key, skip, load, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!key) {\r\n key = EReqKey.Primary;\r\n }\r\n if (!skip) {\r\n skip = 0;\r\n }\r\n if (!load) {\r\n load = 50;\r\n }\r\n const req = api.POST(`entities/datalab/getMatchingEntities/${key}?skip=${skip}&load=${load}`, \r\n query, \r\n Api.PrepReqParams(reqParams)\r\n );\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n entities: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n return prom;\r\n }\r\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\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { ClientFile } from \"../client-file/client-file\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\n/**\r\n * Imported file records are created when a file is imported into Nextspace.\r\n * The associated file may be attached to the record.\r\n */\r\nexport namespace ImportedFile {\r\n /**\r\n * Returns cache identifier for a imported file record.\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 fileId \r\n * @returns \r\n */\r\n export function GetCacheKey(fileId: number): string {\r\n return Api.ECacheKey.ImportedFile + Api.ECacheKey.Id + fileId;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a imported file record.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param rootId \r\n * @returns \r\n */\r\n export function GetCacheKeyByRootId(rootId: string): string {\r\n return Api.ECacheKey.ImportedFile + Api.ECacheKey.Id + rootId;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of imported files.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey(\"CAD\", 0);\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param type\r\n * @param pageIndex\r\n * @returns\r\n */\r\n export function GetListCacheKey(type: EFileType, pageIndex: number): string {\r\n return Api.ECacheKey.ImportedFile + type + pageIndex;\r\n }\r\n\r\n /**\r\n * Describes an imported file record.\r\n */\r\n export interface IFile {\r\n // ID of the imported file record.\r\n ID: number;\r\n // ID of the user that imported the file.\r\n \"ImportedBy.User.ID\": string;\r\n // Date and time the file was imported.\r\n \"Imported.DateTime\": any;\r\n // Entity type ID if relevant.\r\n \"EntityType.ID\"?: string;\r\n // Root entity ID if relevant.\r\n \"RootEntity.ID\"?: string;\r\n // Data source ID if relevant.\r\n \"Source.ID\"?: number;\r\n // Pending action ID if available.\r\n \"PendingAction.ID\"?: number;\r\n // Count of new entities created.\r\n NewEntitiesCount?: number;\r\n // Count of updated entities.\r\n UpdatedEntitiesCount?: number;\r\n // ID of the client file record. May not exist.\r\n \"ClientFile.ID\"?: string;\r\n // Client file record for the imported file.\r\n ClientFile?: ClientFile.IFile;\r\n }\r\n\r\n /**\r\n * Known file types we can filter against.\r\n */\r\n export enum EFileType {\r\n CAD = \"CAD\",\r\n All = \"All\"\r\n }\r\n\r\n /**\r\n * Returns a list of imported files.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n // The type of file to filter against.\r\n fileType?: EFileType,\r\n // The page index to return.\r\n pageIndex?: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of imported files.\r\n importedFiles: IFile[]\r\n }> {\r\n let { api, fileType: type, pageIndex, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!type) {\r\n type = EFileType.All;\r\n }\r\n if (!pageIndex) {\r\n pageIndex = 0;\r\n }\r\n const cache = await api.GetCacheItem(GetListCacheKey(type, pageIndex), reqParams);\r\n if (cache?.found) {\r\n return cache.data;\r\n }\r\n\r\n let first = true;\r\n let url = \"entityImportFiles\";\r\n if (type != EFileType.All) {\r\n url += \"?FileType=\" + type;\r\n first = false;\r\n }\r\n if (pageIndex > 0) {\r\n url += (first ? \"?\" : \"&\") + \"pageIndex=\" + pageIndex;\r\n }\r\n const req = api.GET(url, Api.PrepReqParams(reqParams));\r\n const prom: Promise<any> = new Promise(async (res, rej) => {\r\n try {\r\n const data = await req;\r\n res({\r\n importedFiles: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(type, pageIndex),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns a list of imported files for a root entity.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetListByRootId(params: {\r\n api?: BruceApi.Api,\r\n // The root entity ID to filter against.\r\n rootId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The list of imported files.\r\n importedFiles: IFile[]\r\n }> {\r\n let { api, rootId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKeyByRootId(rootId), 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 = await api.GET(`entityImportFiles?Entity.ID=${rootId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n importedFiles: data.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetCacheKeyByRootId(rootId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns an imported file record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // The ID of the imported file record.\r\n importedFileId: number,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // The imported file record.\r\n importedFile: IFile\r\n }> {\r\n let { api, importedFileId: fileId, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(fileId), 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 = await api.GET(`entityImportFile/${fileId}`, Api.PrepReqParams(reqParams));\r\n res({\r\n importedFile: 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(fileId),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n}","import { Cartes, EntityAttachmentType } from \"../bruce-models\";\r\n\r\n/**\r\n * Description of a \"Markup\" which is stored in bookmark records.\r\n */\r\nexport namespace Markup {\r\n /**\r\n * Describes a markup that is embedded in a bookmark.\r\n */\r\n export interface IMarkup {\r\n // Array of HTML divs to render.\r\n // These are used for text boxes, and shapes.\r\n divs?: Div.IDiv[];\r\n // Array of lines to render.\r\n // These can be used for callout lines, lines that connect between divs, etc.\r\n vectors?: (Line.ILine | FreePaint.IPaint)[];\r\n // Array of cesium entities to render.\r\n cesiumObjects?: (Polygon.IPolygon | Polyline.IPolyline | Circle.ICircle | Walkscore.IWalkscore)[];\r\n // Width/height of the markup in pixels.\r\n // This is used to scale against the viewer's screen size.\r\n width?: number;\r\n height?: number;\r\n // @Deprecated.\r\n defaultCameraPos?: any;\r\n // Default = true.\r\n visible?: boolean;\r\n }\r\n\r\n /**\r\n * Base of all markup elements.\r\n */\r\n export interface IElement {\r\n // Unique id of the element within the markup.\r\n // Warning: IAnchor elements are not elements and do not have an id.\r\n // Anchors only exist as sub elements to other items.\r\n id: string;\r\n // Human readable name for the element.\r\n // This is presented in editing screens to help differentiate elements.\r\n name?: string;\r\n // Default = true.\r\n visible?: boolean;\r\n // The screen position of the original drawn element.\r\n // Used to determine if anything needs to change based on viewer's screen size.\r\n screenWidth?: number;\r\n screenHeight?: number;\r\n }\r\n\r\n export namespace Div {\r\n // Types of div that can be created.\r\n export enum EType {\r\n // Default, no special handling.\r\n Default = \"default\",\r\n // Callout, assumes it will be positioned in 3d space.\r\n // Assumes existence of line that is used to anchor it.\r\n Callout = \"callout\"\r\n }\r\n\r\n export interface IDiv extends IElement {\r\n // Type of div. Determines how it is rendered / positioned.\r\n type?: EType;\r\n // The div's content.\r\n contentRows: IRow[];\r\n // Css box shadow.\r\n boxShadow?: IBoxShadow;\r\n // Css border radius.\r\n borderRadius?: number;\r\n // If the border radius should be in pixels or percent.\r\n borderUsingPercent?: boolean;\r\n // Css border color.\r\n borderColor?: string;\r\n // Css border width.\r\n borderWidth?: number;\r\n // Screen x/y position in pixels.\r\n x: number;\r\n y: number;\r\n // Width/height in pixels.\r\n width: number;\r\n height: number;\r\n // Default is absolute. When fixed the UI panels won't shift the div.\r\n position?: \"absolute\" | \"fixed\";\r\n }\r\n\r\n // Describes css box shadow.\r\n export interface IBoxShadow {\r\n horizontal: number;\r\n vertical: number;\r\n blur: number;\r\n spread: number;\r\n color: string;\r\n }\r\n\r\n // Describes a content row.\r\n export interface IRow {\r\n items: IRowItem[];\r\n height: number;\r\n }\r\n\r\n // Describes expected content of a row cell.\r\n export enum EItemType {\r\n // Default, no special handling.\r\n Default = \"DEFAULT\",\r\n // Embed, assume content is html.\r\n // Make it take over the whole cell instead of padding it and such.\r\n Embed = \"EMBED\",\r\n // Content is expected to be an SVG or font-awesome icon.\r\n Icon = \"ICON\",\r\n // Content is expected to be an image.\r\n Image = \"IMAGE\",\r\n // No content. Only a shape.\r\n None = \"NONE\"\r\n }\r\n\r\n export interface IRowItem {\r\n // Text or HTML to display.\r\n text?: string;\r\n // Embedded HTML to render when item type is \"EMBED\".\r\n // Different to text as text will be auto-cleaned.\r\n embedRaw?: string;\r\n // Embedded ICON to render when item type is \"ICON\".\r\n // Icon is expected to be a font-awesome icon.\r\n icon?: string;\r\n // Action ot perform when this cell is clicked.\r\n action?: ItemAction.IItemAction;\r\n // Background image to use.\r\n bgImage?: IRowItemImage;\r\n // Css background color.\r\n backgroundColor?: string;\r\n // Css font color.\r\n fontColor?: string;\r\n // Css font size.\r\n fontSize?: number;\r\n // Css horizontal text alignment.\r\n textAlign?: string;\r\n // Css vertical text alignment.\r\n verticalAlign?: string;\r\n // Padding in pixels to apply to all 4 sides.\r\n // @deprecated, use innerPadding instead.\r\n padding?: number;\r\n // Css padding to apply.\r\n innerPadding?: string;\r\n // Css text shadow.\r\n textShadow?: ITextShadow;\r\n // Expected content type. Dictates if special handling is needed.\r\n contentType?: EItemType;\r\n // Width of the cell in percent of total row width.\r\n width?: number;\r\n }\r\n\r\n // Describes a cell's background image.\r\n export interface IRowItemImage {\r\n // Client file id of the image.\r\n FileID?: string;\r\n // If the markup's entity's default image should be used.\r\n UseEntityDefault?: boolean;\r\n }\r\n\r\n // Describes css text shadow.\r\n export interface ITextShadow {\r\n horizontal: number;\r\n vertical: number;\r\n blur: number;\r\n color: string;\r\n }\r\n\r\n export namespace ItemAction {\r\n export interface IActionLinkParams {\r\n // URL to open.\r\n // URL may be a path to the markup's entity's attribute data.\r\n // If \"${\" and \"}\" exist in the URL, then it has entity attribute data.\r\n URL?: string;\r\n // If the URL should be opened in a new tab.\r\n openInNewTab?: boolean;\r\n // If the markup should be closed when the link is opened.\r\n closeMarkupOnOpen?: boolean;\r\n }\r\n \r\n export interface IActionBookmarkParams {\r\n // Id of the bookmark to enable.\r\n // Assumes view id matches currently rendering view.\r\n bookmarkID?: string;\r\n }\r\n\r\n export interface IActionInfoViewParams {\r\n\r\n }\r\n\r\n export interface IActionRelationParams {\r\n\r\n }\r\n\r\n export interface IActionGalleryParams {\r\n documentType?: EntityAttachmentType.EType | string;\r\n }\r\n\r\n export interface IItemAction {\r\n type: ItemAction.EType;\r\n params: IActionLinkParams | IActionInfoViewParams | IActionRelationParams | IActionGalleryParams;\r\n }\r\n\r\n // Types of actions that can be performed when a cell is clicked.\r\n // Null = \"NONE\".\r\n export enum EType {\r\n None = \"NONE\",\r\n // Open a link specified in params.\r\n OpenLink = \"LINK\",\r\n // Open the markup's entity's details panel.\r\n OpenInfoView = \"INFOVIEW\",\r\n // Open the markup's entity's gallery popup.\r\n OpenEntityGallery = \"GALLERY\",\r\n // Toggle visibility of the markup's entity's relationships.\r\n ToggleRelationships = \"RELATIONSHIPS\",\r\n // Dictates this cell can be used to drag the div around.\r\n Draggable = \"DRAGABBLE\",\r\n // Closes the markup.\r\n Close = \"CLOSE\",\r\n // Opens a bookmark specified in params.\r\n OpenBookmark = \"BOOKMARK\"\r\n }\r\n }\r\n\r\n export const DEFAULT: IDiv = {\r\n contentRows: [\r\n {\r\n height: 100,\r\n items: [\r\n {\r\n contentType: EItemType.Default,\r\n text: \"Type here...\",\r\n width: 100,\r\n backgroundColor: \"white\",\r\n fontColor: \"black\",\r\n textAlign: \"center\",\r\n verticalAlign: \"center\",\r\n fontSize: 15\r\n }\r\n ]\r\n }\r\n ],\r\n height: null,\r\n width: null,\r\n id: null,\r\n x: null,\r\n y: null,\r\n borderColor: \"black\",\r\n borderWidth: 1,\r\n borderUsingPercent: false,\r\n borderRadius: 8,\r\n type: EType.Default\r\n };\r\n }\r\n\r\n export namespace Line {\r\n // Describes a line end's head.\r\n export enum ELineHead {\r\n None = \"NONE\",\r\n Circle = \"CIRCLE\",\r\n Arrow = \"ARROW\"\r\n }\r\n\r\n export interface ILine extends IElement {\r\n pathType: \"LINE\";\r\n // SVG path string.\r\n path: string;\r\n // SVG transform string.\r\n transform: string;\r\n // Snaps determine where the ends of the line snap to.\r\n // This can be 3d positions, screen positions or links to markup DIVs.\r\n // Calculated positions of the snaps will then alter the path of the line.\r\n snaps: IAnchor[];\r\n // Css color of the line.\r\n brushColor?: string;\r\n // Css stroke width of the line.\r\n brushSize?: number;\r\n // Determines if the line should angle towards its destination instead of being straight.\r\n angled?: boolean;\r\n // Backwards compatibility.\r\n // Use brushHead on anchors instead when available.\r\n brushHead?: ELineHead;\r\n // Css color of the brush head.\r\n outlineColor?: string;\r\n }\r\n\r\n // Dictates where on a DIV an anchor should snap to.\r\n export enum EAnchorDivSide {\r\n TopLeft = 0,\r\n TopRight = 1,\r\n BottomLeft = 2,\r\n BottomRight = 3,\r\n Center = 4,\r\n CenterLeft = 5,\r\n CenterRight = 6,\r\n CenterTop = 7,\r\n CenterBottom = 8\r\n }\r\n\r\n // Dictates what end of the line an anchor should render on.\r\n export enum EAnchorLineSide {\r\n Start = 0,\r\n End = 1,\r\n }\r\n\r\n export interface IAnchor {\r\n // Id of markup DIV that this anchor is attached to.\r\n id?: string;\r\n // Side of the markup DIV we are attached to.\r\n snapPosition?: EAnchorDivSide;\r\n // Side of the line we are attached to.\r\n side?: EAnchorLineSide;\r\n // How the anchor should be drawn in the context of a line.\r\n brushHead?: ELineHead;\r\n // Css fill color.\r\n fill?: string;\r\n // Determines size of anchor's \"ARROW\" head.\r\n size?: number;\r\n // Multiplied by \"size\" to determine size of anchor \"CIRCLE\" head.\r\n outlineFactor?: number;\r\n // Css stroke color.\r\n stroke?: string;\r\n // 3d world position.\r\n cartesian?: Cartes.ICartes3;\r\n // 2d screen position.\r\n screenPos?: Cartes.ICartes2;\r\n // If the anchor's position should be relative to the markup's entity.\r\n positionFromEntity?: boolean;\r\n }\r\n\r\n export const DEFAULT: ILine = {\r\n brushColor: \"rgba(255, 255, 255, 1)\",\r\n brushSize: 4,\r\n path: null,\r\n pathType: \"LINE\",\r\n transform: null,\r\n snaps: null,\r\n id: null\r\n };\r\n }\r\n\r\n export namespace FreePaint {\r\n // Describes a free-paint end's head.\r\n export enum EPaintHead {\r\n None = \"NONE\",\r\n Circle = \"CIRCLE\",\r\n Arrow = \"ARROW\"\r\n }\r\n\r\n export interface IPaint extends IElement {\r\n pathType: \"PLAIN\";\r\n // SVG path string.\r\n path: string;\r\n // SVG transform string.\r\n transform: string;\r\n // Css color of the line.\r\n brushColor?: string;\r\n // Css stroke width of the line.\r\n brushSize?: number;\r\n // Style of the ends of the free-paint.\r\n brushHead?: EPaintHead;\r\n // Css color of the brush head if one is used.\r\n // Eg arrow or circle heads.\r\n outlineColor?: string;\r\n }\r\n\r\n export const DEFAULT: IPaint = {\r\n brushColor: \"rgba(255, 255, 255, 1)\",\r\n brushSize: 4,\r\n path: null,\r\n pathType: \"PLAIN\",\r\n transform: null,\r\n id: null\r\n };\r\n }\r\n\r\n export namespace Polygon {\r\n // Determines if terrain and 3d models should be overlapped or not.\r\n export enum EClassificationType {\r\n // 3d models and terrain are overlapped.\r\n Both = \"BOTH\",\r\n // Only terrain is overlapped.\r\n Terrain = \"TERRAIN\"\r\n }\r\n\r\n export interface IPolygon extends IElement {\r\n type: \"POLYGON\";\r\n // 3d positions of the polygon.\r\n positions: Cartes.ICartes3[];\r\n // Css color of the polygon.\r\n color?: string;\r\n // Css color of the polygon's outline.\r\n outlineColor?: string;\r\n // Width of the polygon's outline in pixels.\r\n outlineWidth?: number;\r\n // Height of the polygon in meters.\r\n extrudedHeight?: number;\r\n // Determines if terrain and 3d models should be overlapped or not.\r\n classificationType?: EClassificationType;\r\n // Determines how many times to run Chaikin's algorithm on the polygon.\r\n // Null or 0 means no smoothing.\r\n smoothen?: number;\r\n }\r\n\r\n export const DEFAULT: IPolygon = {\r\n type: \"POLYGON\",\r\n id: null,\r\n positions: null,\r\n color: \"rgba(254, 234, 57, 0.54)\",\r\n outlineColor: \"rgba(215, 215, 215, 0)\",\r\n outlineWidth: 2,\r\n extrudedHeight: 0,\r\n classificationType: EClassificationType.Both,\r\n smoothen: 0\r\n };\r\n }\r\n\r\n export namespace Polyline {\r\n export interface IPolyline extends IElement {\r\n type: \"POLYLINE\";\r\n // 3d positions of the polyline.\r\n positions: Cartes.ICartes3[];\r\n // Css color of the polyline.\r\n color?: string;\r\n // Width of the polyline in pixels.\r\n outlineWidth?: number;\r\n // Determines how many times to run Chaikin's algorithm on the polygon.\r\n // Null or 0 means no smoothing.\r\n smoothen?: number;\r\n }\r\n\r\n export const DEFAULT: IPolyline = {\r\n type: \"POLYLINE\",\r\n id: null,\r\n positions: null,\r\n color: \"rgba(254, 234, 57, 0.54)\",\r\n outlineWidth: 4,\r\n smoothen: 0\r\n };\r\n }\r\n\r\n export namespace Circle {\r\n export interface ICircle extends IElement {\r\n type: \"CIRCLE\",\r\n // 3d position of the circle.\r\n position: Cartes.ICartes3;\r\n // Radius of the circle in meters.\r\n radius: number;\r\n // Css color of the circle.\r\n color?: string;\r\n // Width of the outline in meters.\r\n outlineWidth?: number;\r\n // Height of the circle in meters.\r\n extrudedHeight?: number;\r\n // Height of the circle's outline in meters.\r\n outlineExtrusion?: number;\r\n // Css color of the circle's outline.\r\n outlineColor?: string;\r\n }\r\n\r\n export const DEFAULT: ICircle = {\r\n type: \"CIRCLE\",\r\n id: null,\r\n position: null,\r\n radius: 50,\r\n color: \"rgba(254, 234, 57, 0.54)\"\r\n };\r\n }\r\n\r\n export namespace Walkscore {\r\n export interface IWalkscore extends IElement {\r\n type: \"WALKSCORE\";\r\n // 3d position of the walkscore.\r\n cartesian: Cartes.ICartes3;\r\n // Walkscore value out of 100.\r\n details: number;\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { UTC } from \"../common/utc\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\nimport { Uploader } from \"../internal/uploader\";\r\nimport { ObjectUtils } from \"../util/object-utils\";\r\n\r\nexport namespace Plugin {\r\n /**\r\n * Returns cache identifier for a plugin.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetCacheKey(\"abc\");\r\n * api.Cache.Remove(key);\r\n * }\r\n * @param pluginId\r\n * @returns \r\n */\r\n export function GetCacheKey(pluginId: string): string {\r\n return `${Api.ECacheKey.Plugin}${Api.ECacheKey.Id}${pluginId}`;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of plugins.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @returns\r\n */\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.Plugin;\r\n }\r\n\r\n /**\r\n * Describes a plugin record.\r\n */\r\n export interface IPlugin {\r\n // ID of the plugin.\r\n ID: string,\r\n // Human readable name of the plugin.\r\n Name: string,\r\n // Version of the plugin. This is bumped when you upload a new code bundle.\r\n Version: number,\r\n // Icon to display for the plugin.\r\n // This is a font-awesome icon.\r\n Icon: string,\r\n // Location where the plugin can be used.\r\n // This is specific to various applications.\r\n Location: string,\r\n // If access to the plugin should be restricted.\r\n // When a plugin is restricted a user must have the \"Plugin_<pluginId>\" permission.\r\n IsAccessRestricted: boolean,\r\n // If the plugin requires a user to be logged in to use it.\r\n IsLoginRequired: boolean,\r\n // Last date/time the plugin was updated.\r\n \"LastUpdated.Date\": UTC.IUTC,\r\n // Date/time the plugin was created.\r\n \"Created.Date\": UTC.IUTC\r\n }\r\n\r\n /**\r\n * Returns a plugin record.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n api?: BruceApi.Api,\r\n // ID of the plugin to get.\r\n pluginId: string,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // Plugin record.\r\n plugin: IPlugin\r\n }> {\r\n let { api, pluginId, req } = params;\r\n if (!pluginId) {\r\n throw (\"Plugin ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetCacheKey(pluginId), req);\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 = await api.GET(`ui.plugin/${pluginId}`, Api.PrepReqParams(req));\r\n res({\r\n plugin: 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(pluginId),\r\n value: prom,\r\n req: req\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns a list of plugins.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<{\r\n // List of plugins.\r\n plugins: IPlugin[]\r\n }> {\r\n let { api, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const cache = await api.GetCacheItem(GetListCacheKey(), req);\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 = await api.GET(\"ui.plugins\", Api.PrepReqParams(req));\r\n res({\r\n plugins: data.Items\r\n })\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n await api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: prom,\r\n req: req\r\n });\r\n return prom;\r\n }\r\n\r\n /**\r\n * Returns a URL to load a plugin.\r\n * @param params \r\n * @returns \r\n */\r\n export function GetLoadUrl(params: {\r\n api?: BruceApi.Api,\r\n // ID of the plugin to load.\r\n pluginId: string,\r\n // Version of the plugin to load.\r\n cacheKey?: number | string\r\n }): {\r\n // URL to load the plugin.\r\n indexFileUrl: string\r\n } {\r\n let { api, pluginId, cacheKey } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n if (!cacheKey) {\r\n cacheKey = 0;\r\n }\r\n return {\r\n indexFileUrl: `${api.GetBaseUrl()}ui.plugin/${pluginId}/file/index.jsc?version=${cacheKey}`\r\n };\r\n }\r\n\r\n /**\r\n * Creates or updates a plugin.\r\n * @param params \r\n */\r\n export async function Update(params: {\r\n // Plugin to create or update.\r\n plugin: IPlugin,\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { plugin, api, req } = params;\r\n if (!plugin.Name) {\r\n throw(\"Plugin name is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!plugin.ID) {\r\n plugin.ID = ObjectUtils.UId();\r\n }\r\n await api.POST(`ui.plugin/${plugin.ID}`, plugin, Api.PrepReqParams(req));\r\n api.Cache.Remove(GetCacheKey(plugin.ID));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Deletes a plugin.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n // ID of the plugin to delete.\r\n pluginId: string,\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }): Promise<void> {\r\n let { pluginId, api, req } = params;\r\n if (!pluginId) {\r\n throw(\"Plugin ID is required.\");\r\n }\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n await api.DELETE(`ui.plugin/${pluginId}`, Api.PrepReqParams(req));\r\n api.Cache.Remove(GetCacheKey(pluginId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Warning: This will replace the contents of your plugin.\r\n * Upload only ZIP files.\r\n * @param params \r\n */\r\n export async function Upload(params: {\r\n pluginId: string,\r\n api?: BruceApi.Api,\r\n file: File,\r\n onProgress?: (progress: Uploader.IProgress) => void,\r\n req?: Api.IUploadReqParams\r\n }): Promise<void> {\r\n let { pluginId, api, file, onProgress, req } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n if (!pluginId || !file) {\r\n throw(\"Plugin ID and file are required.\");\r\n }\r\n req = Api.PrepReqParams(req) as Api.IUploadReqParams;\r\n req.onProgress = (progress: ProgressEvent) => {\r\n const percent = Math.round ((progress.loaded / file.size) * 100);\r\n onProgress?.({\r\n percent: percent,\r\n uploaded: false\r\n });\r\n };\r\n await api.UPLOAD(`ui.plugin/${pluginId}/file`, file, req);\r\n api.Cache.Remove(GetCacheKey(pluginId));\r\n api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Returns a run function to call that'll load a plugin within your provided container element.\r\n * The run function will return a dispose function to call to remove the plugin.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetRunFunction(params: {\r\n // If container does not have an HTML ID, one will be assigned to it.\r\n containerId?: string;\r\n container?: HTMLElement;\r\n\r\n // Arbitrary params to pass into the plugin.\r\n pluginParams?: any;\r\n \r\n // Params required to get the plugin load file.\r\n api?: BruceApi.Api,\r\n // Either plugin or plugin ID must be supplied.\r\n pluginId?: string,\r\n plugin?: Plugin.IPlugin\r\n }): Promise<{\r\n // Function to run to initialize the plugin.\r\n // This function will run eval on a generated script within your container.\r\n // It will return a dispose function to call.\r\n run: () => () => void\r\n }> {\r\n let { containerId, container, pluginParams, pluginId, plugin, api } = params;\r\n if (!containerId && container) {\r\n containerId = container.id;\r\n if (!containerId) {\r\n containerId = ObjectUtils.UId();\r\n container.id = containerId;\r\n }\r\n }\r\n if (!plugin && pluginId) {\r\n plugin = (await Plugin.Get({\r\n pluginId,\r\n api\r\n })).plugin;\r\n }\r\n if (plugin && !pluginId) {\r\n pluginId = plugin.ID;\r\n }\r\n const { indexFileUrl } = GetLoadUrl({\r\n api,\r\n pluginId,\r\n cacheKey: plugin.Version\r\n });\r\n\r\n let fileContent = await fetch(indexFileUrl).then((res) => res.text());\r\n const start = fileContent.indexOf(\"{\");\r\n const end = fileContent.lastIndexOf(\"}\");\r\n fileContent = fileContent.substring(start + 1, end);\r\n\r\n const paramsId = ObjectUtils.UId();\r\n window[paramsId] = pluginParams ? pluginParams : {};\r\n const disposeId = ObjectUtils.UId();\r\n const elementId = ObjectUtils.UId();\r\n\r\n let script = `\r\n function run() {\r\n ${fileContent}\r\n\r\n const paramsId = \"${paramsId}\";\r\n const containerId = \"${containerId}\";\r\n let container;\r\n if (containerId) {\r\n container = document.getElementById(\"${containerId}\");\r\n }\r\n\r\n let pluginHTML = null;\r\n if (container) {\r\n pluginHTML = document.createElement(\"div\");\r\n pluginHTML.id = \"${elementId}\";\r\n container.appendChild(pluginHTML);\r\n }\r\n\r\n {TEMPLATE_CODE}\r\n const params = window[\"${paramsId}\"];\r\n\r\n window[\"${disposeId}\"] = Run({\r\n element: pluginHTML,\r\n container: container,\r\n pluginParams: params\r\n });\r\n }\r\n run();\r\n `;\r\n if (script.includes(\"var template\")) {\r\n script = script.replace(\"{TEMPLATE_CODE}\", `\r\n if (pluginHTML && template) {\r\n pluginHTML.innerHTML = template;\r\n }\r\n `);\r\n }\r\n else {\r\n script = script.replace(\"{TEMPLATE_CODE}\", \"\");\r\n }\r\n\r\n return {\r\n run: () => {\r\n const eval2 = eval;\r\n eval2(script);\r\n\r\n // Ensure a function is returned, even if the plugin is not configured properly to return one.\r\n if (!window[disposeId] || typeof window[disposeId] !== \"function\") {\r\n window[disposeId] = () => {\r\n console.warn(\"Plugin called to be disposed but no dispose function was found.\");\r\n };\r\n }\r\n const callDispose = window[disposeId];\r\n return () => {\r\n if (elementId) {\r\n const element = document.getElementById(elementId);\r\n if (element && element.parentElement) {\r\n element.parentElement.removeChild(element);\r\n }\r\n }\r\n callDispose();\r\n };\r\n }\r\n }\r\n }\r\n}","import { Api } from \"../api/api\";\r\nimport { BruceApi } from \"../api/bruce-api\";\r\nimport { EntityAttribute } from \"../entity/entity-attribute\";\r\nimport { ENVIRONMENT } from \"../environment\";\r\n\r\nexport namespace DataSource {\r\n /**\r\n * Returns cache identifier for a data source 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 id \r\n * @returns \r\n */\r\n export function GetCacheKey(id: number): string {\r\n return Api.ECacheKey.DataSource + Api.ECacheKey.Id + id;\r\n }\r\n\r\n /**\r\n * Returns cache identifier for a list of data sources.\r\n * Example: {\r\n * const api: BruceApi.Api = ...;\r\n * const key = GetListCacheKey();\r\n * api.Cache.Remove(key);\r\n * }\r\n * @returns\r\n */\r\n export function GetListCacheKey(): string {\r\n return Api.ECacheKey.DataSource;\r\n }\r\n\r\n /**\r\n * Describes a data source record.\r\n */\r\n export interface ISource {\r\n // Not set for new records.\r\n ID?: number;\r\n // Human readable data source name.\r\n Name: string;\r\n // The data source baseurl.\r\n URL?: string;\r\n // The kind of data source this is.\r\n // This helps guide the Nextspace API and UI on how to use this data source.\r\n Type?: Type;\r\n // Data boundaries in degrees if known.\r\n MinLatitude?: number;\r\n MaxLatitude?: number;\r\n MinLongitude?: number;\r\n MaxLongitude?: number;\r\n // Data schema for the external source.\r\n DataSchema?: EntityAttribute.IAttribute;\r\n // Settings for the external source.\r\n Parameters?: object;\r\n }\r\n\r\n // Known data source types.\r\n export enum EType {\r\n // A data source that is simply a mapping between external IDs and internal IDs.\r\n // This is used by the Cesium OSM source for example.\r\n IDMapping = \"IDMapping\"\r\n }\r\n export type Type = EType | string;\r\n\r\n /**\r\n * Creates or updates a data source.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Update(params: {\r\n // The data source to create or update.\r\n source: ISource,\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }) {\r\n let { source: data, api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n const url = `source` + (data.ID == null ? \"\" : \"/\" + data.ID);\r\n const res = await api.POST(url, data, Api.PrepReqParams(reqParams));\r\n await api.Cache.Remove(GetCacheKey(<number>data.ID));\r\n await api.Cache.Remove(GetListCacheKey());\r\n\r\n return {\r\n source: res\r\n };\r\n }\r\n\r\n /**\r\n * Deletes a data source.\r\n * @param params \r\n */\r\n export async function Delete(params: {\r\n // The ID of the data source to delete.\r\n id: number,\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }) {\r\n let { id, api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n await api.DELETE(`source/${id}`, Api.PrepReqParams(reqParams));\r\n await api.Cache.Remove(GetCacheKey(id));\r\n await api.Cache.Remove(GetListCacheKey());\r\n }\r\n\r\n /**\r\n * Gets a data source by ID.\r\n * @param params \r\n * @returns \r\n */\r\n export async function Get(params: {\r\n // The ID of the data source to get.\r\n id: number,\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }) {\r\n let { id, api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n reqParams = Api.PrepReqParams(reqParams);\r\n const cacheData = await api.GetCacheItem(GetCacheKey(id), reqParams);\r\n if (cacheData?.found) {\r\n return cacheData.data;\r\n }\r\n\r\n const prom = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(`source/${id}`, Api.PrepReqParams(reqParams));\r\n res({\r\n source: data\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n 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 * Gets a list of data sources.\r\n * @param params \r\n * @returns \r\n */\r\n export async function GetList(params: {\r\n api?: BruceApi.Api,\r\n req?: Api.IReqParams\r\n }) {\r\n let { api, req: reqParams } = params;\r\n if (!api) {\r\n api = ENVIRONMENT.Api().GetBruceApi();\r\n }\r\n\r\n reqParams = Api.PrepReqParams(reqParams);\r\n const cacheData = await api.GetCacheItem(GetListCacheKey(), reqParams);\r\n if (cacheData?.found) {\r\n return cacheData.data;\r\n }\r\n \r\n const prom = new Promise(async (res, rej) => {\r\n try {\r\n const data = await api.GET(\"sources\", Api.PrepReqParams(reqParams))\r\n res({\r\n sources: data?.Items\r\n });\r\n }\r\n catch (e) {\r\n rej(e);\r\n }\r\n });\r\n api.SetCacheItem({\r\n key: GetListCacheKey(),\r\n value: prom,\r\n req: reqParams\r\n });\r\n return prom;\r\n }\r\n}","export * from \"./ann-document/ann-document\";\r\n\r\nexport * from \"./custom-form/custom-form\";\r\nexport * from \"./custom-form/custom-form-content\";\r\n\r\nexport * from \"./api/abstract-api\";\r\nexport * from \"./api/api\";\r\nexport * from \"./api/bruce-api\";\r\nexport * from \"./api/global-api\";\r\nexport * from \"./api/guardian-api\";\r\nexport * from \"./api/api-getters\";\r\n\r\nexport * from \"./calculator/calculator\";\r\n\r\nexport * from \"./common/bounds\";\r\nexport * from \"./common/bruce-event\";\r\nexport * from \"./common/cache\";\r\nexport * from \"./common/camera\";\r\nexport * from \"./common/cartes\";\r\nexport * from \"./common/carto\";\r\nexport * from \"./common/color\";\r\nexport * from \"./common/delay-queue\";\r\nexport * from \"./common/dictionary\";\r\nexport * from \"./common/geometry\";\r\nexport * from \"./common/transform\";\r\nexport * from \"./common/utc\";\r\nexport * from \"./common/bruce-variable\";\r\nexport * from \"./common/lru-cache\";\r\nexport * from \"./common/section\";\r\n\r\nexport * from \"./entity/entity-attachment-type\";\r\nexport * from \"./entity/entity-attachment\";\r\nexport * from \"./entity/entity-comment\";\r\nexport * from \"./entity/entity-link\";\r\nexport * from \"./entity/entity-lod\";\r\nexport * from \"./entity/entity-lod-category\";\r\nexport * from \"./entity/entity-relation-type\";\r\nexport * from \"./entity/entity-relation\";\r\nexport * from \"./entity/entity-source\";\r\nexport * from \"./entity/entity-tag\";\r\nexport * from \"./entity/entity-type\";\r\nexport * from \"./entity/entity\";\r\nexport * from \"./entity/entity-coords\";\r\nexport * from \"./entity/entity-type-visual-settings\";\r\nexport * from \"./entity/entity-attribute\";\r\n\r\nexport * from \"./client-file/client-file\";\r\n\r\nexport * from \"./program-key/program-key\";\r\n\r\nexport * from \"./project/zoom-control\";\r\nexport * from \"./project/menu-item\";\r\nexport * from \"./project/project-view-bookmark\";\r\nexport * from \"./project/project-view\";\r\nexport * from \"./project/project-view-legacy-tile\";\r\nexport * from \"./project/project-view-tile\";\r\nexport * from \"./project/project-view-selection\";\r\nexport * from \"./project/project-view-legacy\";\r\nexport * from \"./project/project-view-legacy-bookmark\";\r\n\r\nexport * from \"./server/pending-action\";\r\nexport * from \"./server/message-broker\";\r\nexport * from \"./server/hosting-location\";\r\n\r\nexport * from \"./style/style\";\r\n\r\nexport * from \"./tileset/tileset\";\r\n\r\nexport * from \"./user/permission\";\r\nexport * from \"./user/session\";\r\nexport * from \"./user/user-group\";\r\nexport * from \"./user/user\";\r\n\r\nexport * from \"./account/account\";\r\nexport * from \"./account/account-settings\";\r\nexport * from \"./account/account-invite\";\r\n\r\nexport * from \"./util/encrypt-utils\";\r\nexport * from \"./util/math-utils\";\r\nexport * from \"./util/object-utils\";\r\nexport * from \"./util/path-utils\";\r\nexport * from \"./util/url-utils\";\r\n\r\nexport * from \"./data-lab/data-lab\";\r\n\r\nexport * from \"./import/import-cad\";\r\nexport * from \"./import/import-csv\";\r\nexport * from \"./import/import-json\";\r\nexport * from \"./import/import-kml\";\r\nexport * from \"./import/imported-file\";\r\n\r\nexport * from \"./markup/markup\";\r\nexport * from \"./internal/uploader\";\r\nexport * from \"./plugin/plugin\";\r\nexport * from \"./environment\";\r\nexport * from \"./data-source/data-source\";\r\n\r\nexport const VERSION = \"3.2.1\";"],"names":["Api","A"],"mappings":"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"}