@neuralinnovations/dataisland-sdk 0.0.1-dev2 → 0.0.1-dev20

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 (286) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +306 -1
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +3 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/package.json +100 -0
  8. package/dist/src/appBuilder.d.ts +44 -0
  9. package/dist/src/appBuilder.d.ts.map +1 -0
  10. package/dist/src/appBuilder.js +10 -0
  11. package/dist/src/appBuilder.js.map +1 -0
  12. package/dist/src/commands/startCommandHandler.d.ts +7 -0
  13. package/dist/src/commands/startCommandHandler.d.ts.map +1 -0
  14. package/dist/src/commands/startCommandHandler.js +17 -0
  15. package/dist/src/commands/startCommandHandler.js.map +1 -0
  16. package/dist/src/context.d.ts +23 -0
  17. package/dist/src/context.d.ts.map +1 -0
  18. package/dist/src/context.js +31 -0
  19. package/dist/src/context.js.map +1 -0
  20. package/dist/src/credentials.d.ts +28 -0
  21. package/dist/src/credentials.d.ts.map +1 -0
  22. package/dist/src/credentials.js +70 -0
  23. package/dist/src/credentials.js.map +1 -0
  24. package/dist/src/dataIslandApp.d.ts +50 -0
  25. package/dist/src/dataIslandApp.d.ts.map +1 -0
  26. package/dist/src/dataIslandApp.js +10 -0
  27. package/dist/src/dataIslandApp.js.map +1 -0
  28. package/dist/src/disposable.d.ts +84 -0
  29. package/dist/src/disposable.d.ts.map +1 -0
  30. package/dist/src/disposable.js +147 -0
  31. package/dist/src/disposable.js.map +1 -0
  32. package/dist/src/dto/accessGroupResponse.d.ts +27 -0
  33. package/dist/src/dto/accessGroupResponse.d.ts.map +1 -0
  34. package/dist/src/dto/accessGroupResponse.js +3 -0
  35. package/dist/src/dto/accessGroupResponse.js.map +1 -0
  36. package/dist/src/dto/chatResponse.d.ts +78 -0
  37. package/dist/src/dto/chatResponse.d.ts.map +1 -0
  38. package/dist/src/dto/chatResponse.js +45 -0
  39. package/dist/src/dto/chatResponse.js.map +1 -0
  40. package/dist/src/dto/userInfoResponse.d.ts +42 -0
  41. package/dist/src/dto/userInfoResponse.d.ts.map +1 -0
  42. package/dist/src/dto/userInfoResponse.js +3 -0
  43. package/dist/src/dto/userInfoResponse.js.map +1 -0
  44. package/dist/src/dto/workspacesResponse.d.ts +43 -0
  45. package/dist/src/dto/workspacesResponse.d.ts.map +1 -0
  46. package/dist/src/dto/workspacesResponse.js +3 -0
  47. package/dist/src/dto/workspacesResponse.js.map +1 -0
  48. package/dist/src/events.d.ts +17 -0
  49. package/dist/src/events.d.ts.map +1 -0
  50. package/dist/src/events.js +52 -0
  51. package/dist/src/events.js.map +1 -0
  52. package/dist/src/index.d.ts +58 -0
  53. package/dist/src/index.d.ts.map +1 -0
  54. package/dist/src/index.js +91 -0
  55. package/dist/src/index.js.map +1 -0
  56. package/dist/src/internal/app.impl.d.ts +28 -0
  57. package/dist/src/internal/app.impl.d.ts.map +1 -0
  58. package/dist/src/internal/app.impl.js +151 -0
  59. package/dist/src/internal/app.impl.js.map +1 -0
  60. package/dist/src/internal/appBuilder.impl.d.ts +27 -0
  61. package/dist/src/internal/appBuilder.impl.d.ts.map +1 -0
  62. package/dist/src/internal/appBuilder.impl.js +71 -0
  63. package/dist/src/internal/appBuilder.impl.js.map +1 -0
  64. package/dist/src/internal/createApp.impl.d.ts +4 -0
  65. package/dist/src/internal/createApp.impl.d.ts.map +1 -0
  66. package/dist/src/internal/createApp.impl.js +11 -0
  67. package/dist/src/internal/createApp.impl.js.map +1 -0
  68. package/dist/src/internal/registry.d.ts +66 -0
  69. package/dist/src/internal/registry.d.ts.map +1 -0
  70. package/dist/src/internal/registry.js +114 -0
  71. package/dist/src/internal/registry.js.map +1 -0
  72. package/dist/src/middleware.d.ts +5 -0
  73. package/dist/src/middleware.d.ts.map +1 -0
  74. package/dist/src/middleware.js +3 -0
  75. package/dist/src/middleware.js.map +1 -0
  76. package/dist/src/services/commandService.d.ts +18 -0
  77. package/dist/src/services/commandService.d.ts.map +1 -0
  78. package/dist/src/services/commandService.js +40 -0
  79. package/dist/src/services/commandService.js.map +1 -0
  80. package/dist/src/services/credentialService.d.ts +9 -0
  81. package/dist/src/services/credentialService.d.ts.map +1 -0
  82. package/dist/src/services/credentialService.js +26 -0
  83. package/dist/src/services/credentialService.js.map +1 -0
  84. package/dist/src/services/middlewareService.d.ts +9 -0
  85. package/dist/src/services/middlewareService.d.ts.map +1 -0
  86. package/dist/src/services/middlewareService.js +34 -0
  87. package/dist/src/services/middlewareService.js.map +1 -0
  88. package/dist/src/services/organizationService.d.ts +10 -0
  89. package/dist/src/services/organizationService.d.ts.map +1 -0
  90. package/dist/src/services/organizationService.js +19 -0
  91. package/dist/src/services/organizationService.js.map +1 -0
  92. package/dist/src/services/requestBuilder.d.ts +17 -0
  93. package/dist/src/services/requestBuilder.d.ts.map +1 -0
  94. package/dist/src/services/requestBuilder.js +104 -0
  95. package/dist/src/services/requestBuilder.js.map +1 -0
  96. package/dist/src/services/responseUtils.d.ts +6 -0
  97. package/dist/src/services/responseUtils.d.ts.map +1 -0
  98. package/dist/src/services/responseUtils.js +32 -0
  99. package/dist/src/services/responseUtils.js.map +1 -0
  100. package/dist/src/services/rpcService.d.ts +77 -0
  101. package/dist/src/services/rpcService.d.ts.map +1 -0
  102. package/dist/src/services/rpcService.js +125 -0
  103. package/dist/src/services/rpcService.js.map +1 -0
  104. package/dist/src/services/service.d.ts +21 -0
  105. package/dist/src/services/service.d.ts.map +1 -0
  106. package/dist/src/services/service.js +41 -0
  107. package/dist/src/services/service.js.map +1 -0
  108. package/dist/src/services/userProfileService.d.ts +8 -0
  109. package/dist/src/services/userProfileService.d.ts.map +1 -0
  110. package/dist/src/services/userProfileService.js +32 -0
  111. package/dist/src/services/userProfileService.js.map +1 -0
  112. package/dist/src/storages/chats/answer.d.ts +40 -0
  113. package/dist/src/storages/chats/answer.d.ts.map +1 -0
  114. package/dist/src/storages/chats/answer.impl.d.ts +24 -0
  115. package/dist/src/storages/chats/answer.impl.d.ts.map +1 -0
  116. package/dist/src/storages/chats/answer.impl.js +130 -0
  117. package/dist/src/storages/chats/answer.impl.js.map +1 -0
  118. package/dist/src/storages/chats/answer.js +14 -0
  119. package/dist/src/storages/chats/answer.js.map +1 -0
  120. package/dist/src/storages/chats/chat.d.ts +39 -0
  121. package/dist/src/storages/chats/chat.d.ts.map +1 -0
  122. package/dist/src/storages/chats/chat.impl.d.ts +24 -0
  123. package/dist/src/storages/chats/chat.impl.d.ts.map +1 -0
  124. package/dist/src/storages/chats/chat.impl.js +98 -0
  125. package/dist/src/storages/chats/chat.impl.js.map +1 -0
  126. package/dist/src/storages/chats/chat.js +12 -0
  127. package/dist/src/storages/chats/chat.js.map +1 -0
  128. package/dist/src/storages/chats/chats.d.ts +40 -0
  129. package/dist/src/storages/chats/chats.d.ts.map +1 -0
  130. package/dist/src/storages/chats/chats.impl.d.ts +18 -0
  131. package/dist/src/storages/chats/chats.impl.d.ts.map +1 -0
  132. package/dist/src/storages/chats/chats.impl.js +102 -0
  133. package/dist/src/storages/chats/chats.impl.js.map +1 -0
  134. package/dist/src/storages/chats/chats.js +16 -0
  135. package/dist/src/storages/chats/chats.js.map +1 -0
  136. package/dist/src/storages/files/file.d.ts +31 -0
  137. package/dist/src/storages/files/file.d.ts.map +1 -0
  138. package/dist/src/storages/files/file.impl.d.ts +21 -0
  139. package/dist/src/storages/files/file.impl.d.ts.map +1 -0
  140. package/dist/src/storages/files/file.impl.js +64 -0
  141. package/dist/src/storages/files/file.impl.js.map +1 -0
  142. package/dist/src/storages/files/file.js +11 -0
  143. package/dist/src/storages/files/file.js.map +1 -0
  144. package/dist/src/storages/files/files.d.ts +34 -0
  145. package/dist/src/storages/files/files.d.ts.map +1 -0
  146. package/dist/src/storages/files/files.impl.d.ts +22 -0
  147. package/dist/src/storages/files/files.impl.d.ts.map +1 -0
  148. package/dist/src/storages/files/files.impl.js +140 -0
  149. package/dist/src/storages/files/files.impl.js.map +1 -0
  150. package/dist/src/storages/files/files.js +20 -0
  151. package/dist/src/storages/files/files.js.map +1 -0
  152. package/dist/src/storages/files/filesPage.d.ts +28 -0
  153. package/dist/src/storages/files/filesPage.d.ts.map +1 -0
  154. package/dist/src/storages/files/filesPage.impl.d.ts +15 -0
  155. package/dist/src/storages/files/filesPage.impl.d.ts.map +1 -0
  156. package/dist/src/storages/files/filesPage.impl.js +38 -0
  157. package/dist/src/storages/files/filesPage.impl.js.map +1 -0
  158. package/dist/src/storages/files/filesPage.js +10 -0
  159. package/dist/src/storages/files/filesPage.js.map +1 -0
  160. package/dist/src/storages/groups/groups.d.ts +91 -0
  161. package/dist/src/storages/groups/groups.d.ts.map +1 -0
  162. package/dist/src/storages/groups/groups.impl.d.ts +58 -0
  163. package/dist/src/storages/groups/groups.impl.d.ts.map +1 -0
  164. package/dist/src/storages/groups/groups.impl.js +275 -0
  165. package/dist/src/storages/groups/groups.impl.js.map +1 -0
  166. package/dist/src/storages/groups/groups.js +26 -0
  167. package/dist/src/storages/groups/groups.js.map +1 -0
  168. package/dist/src/storages/organizations/organization.d.ts +54 -0
  169. package/dist/src/storages/organizations/organization.d.ts.map +1 -0
  170. package/dist/src/storages/organizations/organization.impl.d.ts +32 -0
  171. package/dist/src/storages/organizations/organization.impl.d.ts.map +1 -0
  172. package/dist/src/storages/organizations/organization.impl.js +120 -0
  173. package/dist/src/storages/organizations/organization.impl.js.map +1 -0
  174. package/dist/src/storages/organizations/organization.js +18 -0
  175. package/dist/src/storages/organizations/organization.js.map +1 -0
  176. package/dist/src/storages/organizations/organizations.d.ts +46 -0
  177. package/dist/src/storages/organizations/organizations.d.ts.map +1 -0
  178. package/dist/src/storages/organizations/organizations.impl.d.ts +38 -0
  179. package/dist/src/storages/organizations/organizations.impl.d.ts.map +1 -0
  180. package/dist/src/storages/organizations/organizations.impl.js +151 -0
  181. package/dist/src/storages/organizations/organizations.impl.js.map +1 -0
  182. package/dist/src/storages/organizations/organizations.js +20 -0
  183. package/dist/src/storages/organizations/organizations.js.map +1 -0
  184. package/dist/src/storages/user/userProfile.d.ts +32 -0
  185. package/dist/src/storages/user/userProfile.d.ts.map +1 -0
  186. package/dist/src/storages/user/userProfile.impl.d.ts +13 -0
  187. package/dist/src/storages/user/userProfile.impl.d.ts.map +1 -0
  188. package/dist/src/storages/user/userProfile.impl.js +51 -0
  189. package/dist/src/storages/user/userProfile.impl.js.map +1 -0
  190. package/dist/src/storages/user/userProfile.js +12 -0
  191. package/dist/src/storages/user/userProfile.js.map +1 -0
  192. package/dist/src/storages/workspaces/workspace.d.ts +44 -0
  193. package/dist/src/storages/workspaces/workspace.d.ts.map +1 -0
  194. package/dist/src/storages/workspaces/workspace.impl.d.ts +23 -0
  195. package/dist/src/storages/workspaces/workspace.impl.d.ts.map +1 -0
  196. package/dist/src/storages/workspaces/workspace.impl.js +98 -0
  197. package/dist/src/storages/workspaces/workspace.impl.js.map +1 -0
  198. package/dist/src/storages/workspaces/workspace.js +18 -0
  199. package/dist/src/storages/workspaces/workspace.js.map +1 -0
  200. package/dist/src/storages/workspaces/workspaces.d.ts +47 -0
  201. package/dist/src/storages/workspaces/workspaces.d.ts.map +1 -0
  202. package/dist/src/storages/workspaces/workspaces.impl.d.ts +33 -0
  203. package/dist/src/storages/workspaces/workspaces.impl.d.ts.map +1 -0
  204. package/dist/src/storages/workspaces/workspaces.impl.js +157 -0
  205. package/dist/src/storages/workspaces/workspaces.impl.js.map +1 -0
  206. package/dist/src/storages/workspaces/workspaces.js +19 -0
  207. package/dist/src/storages/workspaces/workspaces.js.map +1 -0
  208. package/dist/src/unitTest.d.ts +12 -0
  209. package/dist/src/unitTest.d.ts.map +1 -0
  210. package/dist/src/unitTest.js +44 -0
  211. package/dist/src/unitTest.js.map +1 -0
  212. package/index.d.ts +1 -0
  213. package/index.js +1 -0
  214. package/package.json +43 -4
  215. package/src/appBuilder.ts +6 -6
  216. package/src/commands/startCommandHandler.ts +2 -2
  217. package/src/context.ts +5 -4
  218. package/src/credentials.ts +29 -7
  219. package/src/{appSdk.ts → dataIslandApp.ts} +7 -7
  220. package/src/disposable.ts +20 -8
  221. package/src/dto/accessGroupResponse.ts +35 -0
  222. package/src/dto/chatResponse.ts +103 -0
  223. package/src/dto/userInfoResponse.ts +15 -3
  224. package/src/dto/workspacesResponse.ts +49 -0
  225. package/src/events.ts +13 -13
  226. package/src/index.ts +41 -20
  227. package/src/internal/app.impl.ts +28 -31
  228. package/src/internal/appBuilder.impl.ts +16 -16
  229. package/src/internal/createApp.impl.ts +5 -5
  230. package/src/internal/registry.ts +54 -6
  231. package/src/services/commandService.ts +3 -3
  232. package/src/services/credentialService.ts +3 -3
  233. package/src/services/middlewareService.ts +4 -4
  234. package/src/services/organizationService.ts +18 -116
  235. package/src/services/requestBuilder.ts +40 -15
  236. package/src/services/responseUtils.ts +32 -0
  237. package/src/services/rpcService.ts +28 -11
  238. package/src/services/service.ts +10 -8
  239. package/src/services/userProfileService.ts +18 -66
  240. package/src/storages/chats/answer.impl.ts +186 -0
  241. package/src/storages/chats/answer.ts +55 -0
  242. package/src/storages/chats/chat.impl.ts +126 -0
  243. package/src/storages/chats/chat.ts +49 -0
  244. package/src/storages/chats/chats.impl.ts +142 -0
  245. package/src/storages/chats/chats.ts +47 -0
  246. package/src/storages/files/file.impl.ts +87 -0
  247. package/src/storages/files/file.ts +40 -0
  248. package/src/storages/files/files.impl.ts +191 -0
  249. package/src/storages/files/files.ts +39 -0
  250. package/src/storages/files/filesPage.impl.ts +37 -0
  251. package/src/storages/files/filesPage.ts +33 -0
  252. package/src/storages/groups/groups.impl.ts +363 -0
  253. package/src/storages/groups/groups.ts +106 -0
  254. package/src/storages/organizations/organization.impl.ts +163 -0
  255. package/src/storages/organizations/organization.ts +67 -0
  256. package/src/storages/organizations/organizations.impl.ts +197 -0
  257. package/src/storages/{organizations.ts → organizations/organizations.ts} +8 -28
  258. package/src/storages/user/userProfile.impl.ts +56 -0
  259. package/src/storages/{userProfile.ts → user/userProfile.ts} +2 -2
  260. package/src/storages/workspaces/workspace.impl.ts +129 -0
  261. package/src/storages/workspaces/workspace.ts +54 -0
  262. package/src/storages/workspaces/workspaces.impl.ts +212 -0
  263. package/src/storages/workspaces/workspaces.ts +53 -0
  264. package/src/unitTest.ts +12 -1
  265. package/.browserslistrc +0 -5
  266. package/.editorconfig +0 -22
  267. package/.eslintrc.json +0 -44
  268. package/.github/workflows/publish-npm.yml +0 -28
  269. package/.prettierignore +0 -1
  270. package/.prettierrc +0 -11
  271. package/.yarnrc +0 -2
  272. package/babel.config.js +0 -6
  273. package/jest.config.ts +0 -199
  274. package/jest.setup.ts +0 -2
  275. package/src/services/organizationImpl.ts +0 -51
  276. package/src/services/organizationsImpl.ts +0 -55
  277. package/src/types.ts +0 -86
  278. package/test/commands.test.ts +0 -24
  279. package/test/disposable.test.ts +0 -39
  280. package/test/events.test.ts +0 -151
  281. package/test/index.test.ts +0 -163
  282. package/test/registry.test.ts +0 -44
  283. package/test/services.test.ts +0 -56
  284. package/test/setup.ts +0 -2
  285. package/test/unitTest.test.ts +0 -21
  286. package/tsconfig.json +0 -31
@@ -1,9 +1,9 @@
1
- import { Service } from './service'
2
- import { type Middleware } from '../middleware'
3
- import { type Disposable } from '../disposable'
1
+ import { Service } from "./service"
2
+ import { type Middleware } from "../middleware"
3
+ import { type Disposable } from "../disposable"
4
4
 
5
5
  export class MiddlewareService extends Service {
6
- _middlewares: Middleware[] = []
6
+ private _middlewares: Middleware[] = []
7
7
 
8
8
  public useMiddleware(middleware: Middleware): Disposable {
9
9
  this._middlewares.push(middleware)
@@ -1,126 +1,28 @@
1
- import { Service } from './service'
2
- import {
3
- OrganizationEvent,
4
- OrganizationId,
5
- Organizations
6
- } from '../storages/organizations'
7
- import { OrganizationDto, UserSettings } from '../dto/userInfoResponse'
8
- import { RpcService } from './rpcService'
9
- import { OrganizationImpl } from './organizationImpl'
10
- import { OrganizationsImpl } from './organizationsImpl'
1
+ import { Service } from "./service"
2
+ import { Organizations } from "../storages/organizations/organizations"
3
+ import { OrganizationDto, UserSettings } from "../dto/userInfoResponse"
4
+ import { OrganizationsImpl } from "../storages/organizations/organizations.impl"
11
5
 
12
6
  export class OrganizationService extends Service {
13
- private impl: OrganizationsImpl = new OrganizationsImpl(this)
7
+ private _impl?: OrganizationsImpl
8
+
9
+ private get impl(): OrganizationsImpl {
10
+ return this._impl ?? (this._impl = new OrganizationsImpl(this.context))
11
+ }
14
12
 
15
13
  get organizations(): Organizations {
16
14
  return this.impl
17
15
  }
18
16
 
19
- initFrom(
20
- settings: UserSettings,
17
+ async initFrom(
21
18
  adminInOrganization: string[],
22
- organizations: OrganizationDto[]
23
- ) {
24
- this.impl.currentOrganizationId = settings.activeOrganizationId
25
- for (const organization of organizations) {
26
- const org = new OrganizationImpl(this, this.impl).initFrom(
27
- organization,
28
- adminInOrganization.includes(organization.id)
29
- )
30
- // add organization to collection
31
- this.impl.organizations.push(org)
32
-
33
- // dispatch event, organization added
34
- this.impl.dispatch({
35
- type: OrganizationEvent.ADDED,
36
- data: org
37
- })
38
- }
39
- }
40
-
41
- async deleteOrganization(id: OrganizationId): Promise<void> {
42
- if (id === undefined || id === null) {
43
- throw new Error('Organization delete, id is undefined or null')
44
- }
45
- if (id.length === 0 || id.trim().length === 0) {
46
- throw new Error('Organization delete, id is empty')
47
- }
48
- if (!this.impl.contains(id)) {
49
- throw new Error(`Organization delete, id: ${id} is not found`)
50
- }
51
- const response = await this.resolve(RpcService)
52
- ?.requestBuilder('/api/v1/Organizations')
53
- .searchParam('id', id)
54
- .sendDelete()
55
- if (!response?.ok) {
56
- let text: string = ''
57
- try {
58
- text = (await response?.text()) ?? ''
59
- } catch (e) {
60
- console.error(e)
61
- }
62
-
63
- throw new Error(
64
- `Organization delete, response is not ok, status: ${response?.status},${response?.statusText} ${text}`
65
- )
66
- }
67
- const org = <OrganizationImpl>this.impl.get(id)
68
- const index = this.impl.organizations.indexOf(org)
69
- if (index < 0) {
70
- throw new Error('Organization delete, index is not found')
71
- }
72
-
73
- // remove organization from collection
74
- this.impl.organizations.splice(index, 1)
75
-
76
- // dispatch event, organization removed
77
- this.impl.dispatch({
78
- type: OrganizationEvent.REMOVED,
79
- data: org
80
- })
81
-
82
- // dispose organization
83
- org.dispose()
84
- }
85
-
86
- async createOrganization(
87
- name: string,
88
- description: string
89
- ): Promise<OrganizationImpl> {
90
- if (name === undefined || name === null) {
91
- throw new Error('Organization create, name is undefined or null')
92
- }
93
- if (description === undefined || description === null) {
94
- throw new Error('Organization create, description is undefined or null')
95
- }
96
- if (name.length === 0 || name.trim().length === 0) {
97
- throw new Error('Organization create, name is empty')
98
- }
99
- const response = await this.resolve(RpcService)
100
- ?.requestBuilder('api/v1/Organizations')
101
- .sendPost({
102
- profile: {
103
- name: name,
104
- description: description
105
- }
106
- })
107
- if (!response?.ok) {
108
- throw new Error('Organization create, response is not ok')
109
- }
110
- const content = (await response.json())['organization'] as OrganizationDto
111
-
112
- // create organization and init from content
113
- const org = new OrganizationImpl(this, this.impl).initFrom(content, true)
114
-
115
- // add organization to collection
116
- this.impl.organizations.push(org)
117
-
118
- // dispatch event, organization added
119
- this.impl.dispatch({
120
- type: OrganizationEvent.ADDED,
121
- data: org
122
- })
123
-
124
- return org
19
+ organizations: OrganizationDto[],
20
+ settings?: UserSettings | null
21
+ ): Promise<void> {
22
+ await this.impl.internalInitFrom(
23
+ adminInOrganization,
24
+ organizations,
25
+ settings
26
+ )
125
27
  }
126
28
  }
@@ -48,18 +48,42 @@ export class RequestBuilder {
48
48
  return this
49
49
  }
50
50
 
51
- public async sendPost(body?: BodyInit | null | object): Promise<Response> {
51
+ public async sendPostFormData(body: FormData): Promise<Response> {
52
52
  const url = this._url
53
+
54
+ // set search params
53
55
  url.search = this._searchParams.toString()
54
- if (body !== undefined && body !== null && typeof body === 'object') {
55
- body = JSON.stringify(body)
56
+
57
+ // create request
58
+ const req = new Request(url, {
59
+ method: "POST",
60
+ headers: this._headers,
61
+ body
62
+ })
63
+
64
+ // discard content type
65
+ const reqAny = req as any
66
+ reqAny.discardContentType = true
67
+
68
+ return await this._request(
69
+ req
70
+ )
71
+ }
72
+
73
+ public async sendPostJson(body: object | null | undefined): Promise<Response> {
74
+ const url = this._url
75
+ url.search = this._searchParams.toString()
76
+ let json: string | null | undefined = null
77
+ if (body !== undefined && body !== null && typeof body === "object") {
78
+ json = JSON.stringify(body)
56
79
  }
80
+ const request = new Request(url, {
81
+ method: "POST",
82
+ headers: this._headers,
83
+ body: json
84
+ })
57
85
  return await this._request(
58
- new Request(url, {
59
- method: 'POST',
60
- headers: this._headers,
61
- body
62
- })
86
+ request
63
87
  )
64
88
  }
65
89
 
@@ -68,7 +92,7 @@ export class RequestBuilder {
68
92
  url.search = this._searchParams.toString()
69
93
  return await this._request(
70
94
  new Request(url, {
71
- method: 'GET',
95
+ method: "GET",
72
96
  headers: this._headers
73
97
  })
74
98
  )
@@ -79,23 +103,24 @@ export class RequestBuilder {
79
103
  url.search = this._searchParams.toString()
80
104
  return await this._request(
81
105
  new Request(url, {
82
- method: 'DELETE',
106
+ method: "DELETE",
83
107
  headers: this._headers
84
108
  })
85
109
  )
86
110
  }
87
111
 
88
- public async sendPut(body?: BodyInit | null | object): Promise<Response> {
112
+ public async sendPutJson(body: object | null | undefined): Promise<Response> {
89
113
  const url = this._url
90
114
  url.search = this._searchParams.toString()
91
- if (body !== undefined && body !== null && typeof body === 'object') {
92
- body = JSON.stringify(body)
115
+ let json: string | null | undefined = null
116
+ if (body !== undefined && body !== null && typeof body === "object") {
117
+ json = JSON.stringify(body)
93
118
  }
94
119
  return await this._request(
95
120
  new Request(url, {
96
- method: 'PUT',
121
+ method: "PUT",
97
122
  headers: this._headers,
98
- body
123
+ body: json
99
124
  })
100
125
  )
101
126
  }
@@ -0,0 +1,32 @@
1
+ export class ResponseUtils {
2
+ public static isOk(response?: Response | null): boolean {
3
+ return response !== undefined && response !== null && response.ok
4
+ }
5
+
6
+ public static isFail(response?: Response | null): boolean {
7
+ return !ResponseUtils.isOk(response)
8
+ }
9
+
10
+ public static async throwError(
11
+ message: string,
12
+ response: Response | undefined | null
13
+ ): Promise<void> {
14
+ if (response === undefined) {
15
+ throw new Error(`${message}. Response is undefined`)
16
+ }
17
+ if (response === null) {
18
+ throw new Error(`${message}. Response is null`)
19
+ }
20
+ let errorBody: string = ""
21
+ if (response) {
22
+ try {
23
+ errorBody = (await response.text()) ?? ""
24
+ } catch (e) {
25
+ console.error(e)
26
+ }
27
+ }
28
+ throw new Error(
29
+ `${message}. Response fail. Status: ${response?.status},${response?.statusText}, body: ${errorBody}`
30
+ )
31
+ }
32
+ }
@@ -1,6 +1,6 @@
1
- import { Service, type ServiceContext } from './service'
2
- import { MiddlewareService } from './middlewareService'
3
- import { RequestBuilder } from './requestBuilder'
1
+ import { Service, type ServiceContext } from "./service"
2
+ import { MiddlewareService } from "./middlewareService"
3
+ import { RequestBuilder } from "./requestBuilder"
4
4
 
5
5
  /**
6
6
  * Options for the RpcService.
@@ -14,6 +14,7 @@ export interface RequestOptions {
14
14
  * RPC service.
15
15
  */
16
16
  export class RpcService extends Service {
17
+
17
18
  constructor(
18
19
  serviceContext: ServiceContext,
19
20
  /**
@@ -32,6 +33,22 @@ export class RpcService extends Service {
32
33
  }
33
34
  ) {
34
35
  super(serviceContext)
36
+
37
+ serviceContext.onRegister = async () => {
38
+ serviceContext.resolve(MiddlewareService)?.useMiddleware((req, next) => {
39
+ if (!req.headers.has("accept")) {
40
+ req.headers.set("accept", "text/plain")
41
+ }
42
+
43
+ if ((req as any).discardContentType) {
44
+ delete (req as any).discardContentType
45
+ } else {
46
+ req.headers.set("content-type", "application/json")
47
+ }
48
+
49
+ return next(req)
50
+ })
51
+ }
35
52
  }
36
53
 
37
54
  /**
@@ -55,10 +72,10 @@ export class RpcService extends Service {
55
72
  if (this.options !== undefined && this.options.urlBuilder !== undefined) {
56
73
  return this.options.urlBuilder(path)
57
74
  }
58
- if (this.host.endsWith('/') && path.startsWith('/')) {
75
+ if (this.host.endsWith("/") && path.startsWith("/")) {
59
76
  return new URL(`${this.host}${path.slice(1)}`)
60
77
  }
61
- if (!this.host.endsWith('/') && !path.startsWith('/')) {
78
+ if (!this.host.endsWith("/") && !path.startsWith("/")) {
62
79
  return new URL(`${this.host}/${path}`)
63
80
  }
64
81
  return new URL(`${this.host}${path}`)
@@ -87,35 +104,35 @@ export class RpcService extends Service {
87
104
  /**
88
105
  * Send a POST request.
89
106
  * @param path
90
- * @param body
107
+ * @param body JSON object
91
108
  * @param options
92
109
  */
93
110
  async post(
94
111
  path: string,
95
- body?: BodyInit | null,
112
+ body: object | null | undefined,
96
113
  options?: RequestOptions
97
114
  ): Promise<Response> {
98
115
  return this.requestBuilder(path)
99
116
  .searchParams(options?.searchParams)
100
117
  .headers(options?.headers)
101
- .sendPost(body)
118
+ .sendPostJson(body)
102
119
  }
103
120
 
104
121
  /**
105
122
  * Send a PUT request.
106
123
  * @param path
107
- * @param body
124
+ * @param body JSON object
108
125
  * @param options
109
126
  */
110
127
  async put(
111
128
  path: string,
112
- body?: BodyInit | null,
129
+ body: object | null | undefined,
113
130
  options?: RequestOptions
114
131
  ): Promise<Response> {
115
132
  return this.requestBuilder(path)
116
133
  .searchParams(options?.searchParams)
117
134
  .headers(options?.headers)
118
- .sendPut(body)
135
+ .sendPutJson(body)
119
136
  }
120
137
 
121
138
  /**
@@ -1,12 +1,13 @@
1
- import { type Context } from '../context'
2
- import { type Constructor } from '../internal/registry'
3
- import { type DisposableContainer, type Lifetime } from '../disposable'
1
+ import { type Context } from "../context"
2
+ import { type Constructor } from "../internal/registry"
3
+ import { type DisposableContainer, type Lifetime } from "../disposable"
4
4
 
5
5
  export class ServiceContext {
6
6
  constructor(
7
7
  public readonly context: Context,
8
8
  private readonly disposableContainer: DisposableContainer
9
- ) {}
9
+ ) {
10
+ }
10
11
 
11
12
  public get lifetime(): Lifetime {
12
13
  return this.disposableContainer.lifetime
@@ -16,15 +17,15 @@ export class ServiceContext {
16
17
  return this.context.resolve(type)
17
18
  }
18
19
 
19
- public async onRegister(): Promise<void> {
20
+ public onRegister: () => Promise<void> = async (): Promise<void> => {
20
21
  await Promise.resolve()
21
22
  }
22
23
 
23
- public async onStart(): Promise<void> {
24
+ public onStart: () => Promise<void> = async (): Promise<void> => {
24
25
  await Promise.resolve()
25
26
  }
26
27
 
27
- public onUnregister(): void {
28
+ public onUnregister: () => void = (): void => {
28
29
  // do nothing
29
30
  }
30
31
  }
@@ -42,5 +43,6 @@ export abstract class Service {
42
43
  return this.serviceContext.context
43
44
  }
44
45
 
45
- public constructor(private readonly serviceContext: ServiceContext) {}
46
+ public constructor(private readonly serviceContext: ServiceContext) {
47
+ }
46
48
  }
@@ -1,62 +1,10 @@
1
- import { Service } from './service'
2
- import { RpcService } from './rpcService'
3
- import { UserEvent, UserProfile } from '../storages/userProfile'
4
- import { UserInfoResponse } from '../dto/userInfoResponse'
5
- import { OrganizationService } from './organizationService'
6
-
7
- class UserProfileImpl extends UserProfile {
8
- private content?: UserInfoResponse
9
-
10
- get id(): string {
11
- if (this.content) {
12
- return this.content.user.id
13
- }
14
- throw new Error('The profile is not loaded.')
15
- }
16
-
17
- get name(): string {
18
- if (this.content) {
19
- return this.content.user.profile.name
20
- }
21
- throw new Error('The profile is not loaded.')
22
- }
23
-
24
- get email(): string {
25
- if (this.content) {
26
- return this.content.user.profile.email
27
- }
28
- throw new Error('The profile is not loaded.')
29
- }
30
-
31
- get isDeleted(): boolean {
32
- if (this.content) {
33
- return this.content.user.isDeleted
34
- }
35
- throw new Error('The profile is not loaded.')
36
- }
37
-
38
- get createdAt(): Date {
39
- if (this.content) {
40
- return new Date(this.content.user.created_at)
41
- }
42
- throw new Error('The profile is not loaded.')
43
- }
44
-
45
- get modifiedAt(): Date {
46
- if (this.content) {
47
- return new Date(this.content.user.modified_at)
48
- }
49
- throw new Error('The profile is not loaded.')
50
- }
51
-
52
- initFrom(content: UserInfoResponse) {
53
- this.content = content
54
- this.dispatch({
55
- type: UserEvent.CHANGED,
56
- data: this
57
- })
58
- }
59
- }
1
+ import { Service } from "./service"
2
+ import { RpcService } from "./rpcService"
3
+ import { UserProfile } from "../storages/user/userProfile"
4
+ import { UserInfoResponse } from "../dto/userInfoResponse"
5
+ import { OrganizationService } from "./organizationService"
6
+ import { UserProfileImpl } from "../storages/user/userProfile.impl"
7
+ import { ResponseUtils } from "./responseUtils"
60
8
 
61
9
  export class UserProfileService extends Service {
62
10
  private readonly impl: UserProfileImpl = new UserProfileImpl()
@@ -65,22 +13,26 @@ export class UserProfileService extends Service {
65
13
  return this.impl
66
14
  }
67
15
 
68
- async fetch(fireError: boolean = true) {
16
+ async fetch() {
69
17
  const rpc = this.resolve(RpcService) as RpcService
70
- const response = await rpc.requestBuilder('api/v1/Users/self2').sendGet()
71
- if (fireError && !response.ok) {
72
- throw new Error('Failed to fetch user profile.')
18
+ const response = await rpc.requestBuilder("api/v1/Users/self2").sendGet()
19
+ if (ResponseUtils.isFail(response)) {
20
+ await ResponseUtils.throwError("Failed to fetch user profile", response)
73
21
  }
74
22
  const content = (await response.json()) as UserInfoResponse
23
+
24
+ // init user profile from the server's response
75
25
  this.impl.initFrom(content)
76
26
 
77
27
  const organizationService = this.resolve(
78
28
  OrganizationService
79
29
  ) as OrganizationService
80
- organizationService.initFrom(
81
- content.user.settings,
30
+
31
+ // init organization service from user profile
32
+ await organizationService.initFrom(
82
33
  content.adminInOrganization,
83
- content.organizations
34
+ content.organizations,
35
+ content.user.settings
84
36
  )
85
37
  }
86
38
  }