@gyldendalas/gyldendal-divine-api 0.0.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.
package/dist/index.cjs ADDED
@@ -0,0 +1,403 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ TaggingService: () => TaggingService,
34
+ UserFolders: () => UserFolders,
35
+ UserSettings: () => UserSettings
36
+ });
37
+ module.exports = __toCommonJS(index_exports);
38
+
39
+ // src/services/base_service.ts
40
+ var HTTPError = class extends Error {
41
+ response;
42
+ constructor(message, response) {
43
+ super();
44
+ this.message = message;
45
+ this.response = response;
46
+ }
47
+ };
48
+ var BaseService = class {
49
+ bearerToken;
50
+ apiKey;
51
+ serviceUrl;
52
+ environment;
53
+ myAccountId;
54
+ baseDomain;
55
+ constructor({
56
+ bearerToken = void 0,
57
+ apiKey = void 0,
58
+ serviceUrl = void 0,
59
+ environment = "production",
60
+ myAccountId = "SYSTIMEMYACCOUNT",
61
+ baseDomain = "systime.dk"
62
+ }) {
63
+ this.bearerToken = bearerToken;
64
+ this.apiKey = apiKey;
65
+ this.serviceUrl = serviceUrl;
66
+ this.environment = environment;
67
+ this.myAccountId = myAccountId;
68
+ this.baseDomain = baseDomain;
69
+ }
70
+ discoverUrlPrefix() {
71
+ throw new Error("Method not implemented.");
72
+ }
73
+ getUrlPrefix() {
74
+ if (this.serviceUrl) {
75
+ return this.serviceUrl;
76
+ }
77
+ return this.discoverUrlPrefix();
78
+ }
79
+ async addAuthHeaders(requestHeaders) {
80
+ if (this.bearerToken) {
81
+ requestHeaders.set("Authorization", `Bearer ${this.bearerToken}`);
82
+ } else if (this.apiKey) {
83
+ requestHeaders.set("x-api-key", this.apiKey);
84
+ }
85
+ return requestHeaders;
86
+ }
87
+ async getAsync({
88
+ url,
89
+ headers,
90
+ timeout
91
+ }) {
92
+ const method = "GET";
93
+ const response = await this.callAsync({ url, body: null, method, headers, timeout });
94
+ return response.json();
95
+ }
96
+ async putAsync({
97
+ url,
98
+ headers,
99
+ body,
100
+ timeout
101
+ }) {
102
+ const method = "PUT";
103
+ const response = await this.callAsync({ url, body, method, headers, timeout });
104
+ return response.json();
105
+ }
106
+ async deleteAsync({
107
+ url,
108
+ headers,
109
+ timeout
110
+ }) {
111
+ const method = "DELETE";
112
+ const response = await this.callAsync({ url, body: null, method, headers, timeout });
113
+ return response.json();
114
+ }
115
+ async callAsync({
116
+ url,
117
+ body,
118
+ method,
119
+ headers,
120
+ timeout
121
+ }) {
122
+ if (!headers) {
123
+ headers = new Headers();
124
+ }
125
+ headers = await this.addAuthHeaders(headers);
126
+ const response = await fetch(url, {
127
+ method,
128
+ body,
129
+ headers,
130
+ signal: AbortSignal.timeout(timeout)
131
+ });
132
+ if (!response.ok) {
133
+ throw new HTTPError(`Got ${response.status} while calling ${response.url}`, response);
134
+ }
135
+ return response;
136
+ }
137
+ };
138
+ var base_service_default = BaseService;
139
+
140
+ // src/services/tagging_service.ts
141
+ var TaggingService = class extends base_service_default {
142
+ discoverUrlPrefix() {
143
+ switch (this.environment) {
144
+ case "local":
145
+ return "http://localhost:4000";
146
+ case "production":
147
+ return `https://tagging.services.${this.baseDomain}`;
148
+ case "staging":
149
+ return `https://${this.environment}-tagging.services.${this.baseDomain}`;
150
+ default:
151
+ throw new Error(`Unknown environment: ${this.environment}`);
152
+ }
153
+ }
154
+ async getTagsByValue({
155
+ identity,
156
+ resource_type,
157
+ resource_name,
158
+ tag_value,
159
+ timeout = 3e3
160
+ }) {
161
+ const url = `${this.getUrlPrefix()}/tags/by_value/${tag_value}/${identity}${resource_type ? `/${resource_type}` : ""}${resource_name ? `/${resource_name}` : ""}`;
162
+ const headers = new Headers();
163
+ return await this.getAsync({ url, headers, timeout });
164
+ }
165
+ async getTagsByName({
166
+ identity,
167
+ resource_type,
168
+ resource_name,
169
+ tag_name,
170
+ timeout = 3e3
171
+ }) {
172
+ const url = `${this.getUrlPrefix()}/tags/by_name/${identity}${resource_type ? `/${resource_type}` : ""}${resource_name ? `/${resource_name}` : ""}${tag_name ? `/${tag_name}` : ""}`;
173
+ const headers = new Headers();
174
+ return await this.getAsync({ url, headers, timeout });
175
+ }
176
+ async createTag({
177
+ tag,
178
+ timeout = 3e3
179
+ }) {
180
+ const url = `${this.getUrlPrefix()}/tags`;
181
+ const headers = new Headers();
182
+ headers.append("Content-Type", "application/json");
183
+ return await this.putAsync({ url, headers, body: JSON.stringify(tag), timeout });
184
+ }
185
+ async deleteTag({
186
+ identity,
187
+ resource_type,
188
+ resource_name,
189
+ tag_name,
190
+ timeout = 3e3
191
+ }) {
192
+ const url = `${this.getUrlPrefix()}/tags/by_name/${identity}${resource_type ? `/${resource_type}` : ""}${resource_name ? `/${resource_name}` : ""}${tag_name ? `/${tag_name}` : ""}`;
193
+ const headers = new Headers();
194
+ await this.deleteAsync({ url, headers, timeout });
195
+ }
196
+ };
197
+ var tagging_service_default = TaggingService;
198
+
199
+ // src/services/user_settings.ts
200
+ var UserSettings = class extends base_service_default {
201
+ discoverUrlPrefix() {
202
+ switch (this.environment) {
203
+ case "local":
204
+ return "http://localhost:4000";
205
+ case "production":
206
+ return `https://user-settings-service.services.${this.baseDomain}`;
207
+ case "staging":
208
+ return `https://${this.environment}-user-settings-service.services.${this.baseDomain}`;
209
+ default:
210
+ throw new Error(`Unknown environment: ${this.environment}`);
211
+ }
212
+ }
213
+ async getSettings({
214
+ isbn,
215
+ timeout = 5e3
216
+ }) {
217
+ const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;
218
+ const headers = new Headers();
219
+ return await this.getAsync({ url, headers, timeout });
220
+ }
221
+ async setSettings({
222
+ isbn,
223
+ settings,
224
+ timeout = 5e3
225
+ }) {
226
+ const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;
227
+ const headers = new Headers();
228
+ headers.set("Content-Type", "application/json");
229
+ return await this.putAsync({ url, headers, body: JSON.stringify(settings), timeout });
230
+ }
231
+ };
232
+
233
+ // src/services/highlevel/tagging/user_folders.ts
234
+ var import_crypto = __toESM(require("crypto"), 1);
235
+ var UserFolders = class extends tagging_service_default {
236
+ identity = void 0;
237
+ async getIdentity() {
238
+ if (this.identity) {
239
+ return this.identity;
240
+ }
241
+ if (this.bearerToken) {
242
+ const tokenParts = this.bearerToken.split(".");
243
+ const payload = Buffer.from(tokenParts[1], "base64").toString();
244
+ const payloadObject = JSON.parse(payload);
245
+ return `user_${payloadObject.authns}_${payloadObject.user}`;
246
+ }
247
+ throw new Error("The UserFolders service must be invoked with a valid bearer token");
248
+ }
249
+ async createFolder({
250
+ folder_name,
251
+ parent_folder_uuid,
252
+ timeout = 3e3
253
+ }) {
254
+ const tag = await this.createTag(
255
+ {
256
+ tag: {
257
+ identity: await this.getIdentity(),
258
+ resource_type: "myaccount_user_folder",
259
+ resource_name: import_crypto.default.randomUUID(),
260
+ tag_name: Buffer.from(folder_name).toString("base64"),
261
+ tag_value: parent_folder_uuid ?? "-"
262
+ },
263
+ timeout
264
+ }
265
+ );
266
+ return { name: folder_name, uuid: tag["resource_name"], parent: parent_folder_uuid };
267
+ }
268
+ async listFolders({
269
+ parent_folder_uuid,
270
+ timeout = 3e3
271
+ }) {
272
+ let tags;
273
+ if (parent_folder_uuid) {
274
+ tags = await this.getTagsByValue(
275
+ {
276
+ identity: await this.getIdentity(),
277
+ resource_type: "myaccount_user_folder",
278
+ tag_value: parent_folder_uuid,
279
+ timeout
280
+ }
281
+ );
282
+ } else {
283
+ tags = await this.getTagsByName(
284
+ {
285
+ identity: await this.getIdentity(),
286
+ resource_type: "myaccount_user_folder",
287
+ timeout
288
+ }
289
+ );
290
+ }
291
+ let folders = [];
292
+ for (const tag of tags) {
293
+ folders.push(
294
+ {
295
+ name: Buffer.from(tag["tag_name"], "base64").toString(),
296
+ uuid: tag["resource_name"],
297
+ parent: tag["tag_value"] === "-" ? void 0 : tag["tag_value"]
298
+ }
299
+ );
300
+ }
301
+ return folders;
302
+ }
303
+ async getFolderContent({
304
+ folder_uuid,
305
+ timeout = 3e3
306
+ }) {
307
+ let tags = await this.getTagsByValue(
308
+ {
309
+ identity: await this.getIdentity(),
310
+ tag_value: folder_uuid,
311
+ timeout
312
+ }
313
+ );
314
+ let content = [];
315
+ for (const tag of tags) {
316
+ if (tag["resource_type"] === "myaccount_user_folder") {
317
+ content.push(
318
+ {
319
+ type: tag["resource_type"],
320
+ identifier: tag["resource_name"],
321
+ folder_uuid: tag["tag_value"]
322
+ }
323
+ );
324
+ } else {
325
+ let folder = {
326
+ name: Buffer.from(tag["tag_name"], "base64").toString(),
327
+ uuid: tag["resource_name"],
328
+ parent: tag["tag_value"]
329
+ };
330
+ content.push(folder);
331
+ }
332
+ }
333
+ return content;
334
+ }
335
+ async addInternetbookToFolder({
336
+ folder_uuid,
337
+ isbn,
338
+ timeout = 3e3
339
+ }) {
340
+ return await this.addContentToFolder(
341
+ {
342
+ folder_uuid,
343
+ resource_name: isbn,
344
+ resource_type: "internetbook",
345
+ timeout
346
+ }
347
+ );
348
+ }
349
+ /**
350
+ * This is a generic function for creating folder content elements.
351
+ **/
352
+ async addContentToFolder({
353
+ folder_uuid,
354
+ resource_name,
355
+ resource_type,
356
+ timeout = 3e3
357
+ }) {
358
+ await this.createTag(
359
+ {
360
+ tag: {
361
+ identity: await this.getIdentity(),
362
+ resource_type,
363
+ resource_name,
364
+ tag_name: "MYACCOUNT_USER_FOLDER",
365
+ tag_value: folder_uuid
366
+ },
367
+ timeout
368
+ }
369
+ );
370
+ return { type: resource_type, identifier: resource_name, folder_uuid };
371
+ }
372
+ async deleteFolder({
373
+ folder_uuid,
374
+ timeout = 3e3
375
+ }) {
376
+ await this.deleteTag(
377
+ {
378
+ identity: await this.getIdentity(),
379
+ resource_type: "myaccount_user_folder",
380
+ resource_name: folder_uuid,
381
+ timeout
382
+ }
383
+ );
384
+ }
385
+ async deleteAllFolders({
386
+ timeout = 3e3
387
+ }) {
388
+ await this.deleteTag(
389
+ {
390
+ identity: await this.getIdentity(),
391
+ resource_type: "myaccount_user_folder",
392
+ timeout
393
+ }
394
+ );
395
+ }
396
+ };
397
+ // Annotate the CommonJS export names for ESM import in node:
398
+ 0 && (module.exports = {
399
+ TaggingService,
400
+ UserFolders,
401
+ UserSettings
402
+ });
403
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/services/base_service.ts","../src/services/tagging_service.ts","../src/services/user_settings.ts","../src/services/highlevel/tagging/user_folders.ts"],"sourcesContent":["export * from 'services/tagging_service.js';\nexport * from 'services/user_settings.js';\nexport * from 'services/highlevel/tagging/user_folders.js';\n","class HTTPError extends Error {\n public response: Response;\n \n constructor(message: string, response: Response) {\n super();\n this.message = message;\n this.response = response;\n }\n}\n\nexport class BaseService {\n public bearerToken: string | undefined;\n public apiKey: string | undefined;\n public serviceUrl: string | undefined;\n public environment: string;\n public myAccountId: string;\n public baseDomain: string;\n\n constructor({\n bearerToken = undefined,\n apiKey = undefined,\n serviceUrl = undefined,\n environment = 'production',\n myAccountId = 'SYSTIMEMYACCOUNT',\n baseDomain = 'systime.dk',\n } : {\n bearerToken?: string,\n apiKey?: string,\n serviceUrl?: string,\n environment: string,\n myAccountId: string,\n baseDomain?: string\n }) {\n this.bearerToken = bearerToken;\n this.apiKey = apiKey;\n this.serviceUrl = serviceUrl;\n this.environment = environment;\n this.myAccountId = myAccountId;\n this.baseDomain = baseDomain;\n }\n\n protected discoverUrlPrefix(): string {\n throw new Error('Method not implemented.');\n }\n\n public getUrlPrefix(): string {\n // If the URL has been explicitly set, return it.\n if (this.serviceUrl) {\n return this.serviceUrl;\n }\n return this.discoverUrlPrefix()\n }\n\n public async addAuthHeaders(requestHeaders: Headers): Promise<Headers> {\n if (this.bearerToken) {\n requestHeaders.set('Authorization', `Bearer ${this.bearerToken}`);\n } else if (this.apiKey) {\n requestHeaders.set('x-api-key', this.apiKey);\n }\n return requestHeaders;\n }\n\n async getAsync(\n {\n url,\n headers,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n timeout: number\n }\n ): Promise<object> {\n const method = 'GET';\n const response = await this.callAsync({ url, body: null, method, headers, timeout });\n return response.json();\n }\n\n async putAsync(\n {\n url,\n headers,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<object> {\n const method = 'PUT';\n const response = await this.callAsync({ url, body, method, headers, timeout });\n return response.json();\n }\n\n async deleteAsync(\n {\n url,\n headers,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n timeout: number\n }\n ): Promise<object> {\n const method = 'DELETE';\n const response = await this.callAsync({ url, body: null, method, headers, timeout });\n return response.json();\n }\n\n async callAsync(\n {\n url,\n body,\n method,\n headers,\n timeout\n }:\n {\n url: URL | string,\n body: string | null | undefined,\n method: string,\n headers: Headers | undefined | null,\n timeout: number\n }\n ): Promise<Response> {\n if (!headers) {\n headers = new Headers();\n }\n\n headers = await this.addAuthHeaders(headers);\n const response = await fetch(url, {\n\t method: method,\n body: body,\n headers: headers,\n signal: AbortSignal.timeout(timeout)\n });\n\n if (!response.ok) {\n\t\t\t\t\tthrow new HTTPError(`Got ${response.status} while calling ${response.url}`, response);\n }\n return response;\n }\n}\nexport default BaseService;\n","import BaseService from './base_service.js';\n\ninterface Tag {\n identity: string;\n resource_type: string;\n resource_name: string;\n tag_name: string;\n tag_value: string;\n}\n\nexport class TaggingService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'local':\n return 'http://localhost:4000';\n case 'production':\n return `https://tagging.services.${this.baseDomain}`;\n case 'staging':\n return `https://${this.environment}-tagging.services.${this.baseDomain}`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async getTagsByValue(\n {\n identity,\n resource_type,\n resource_name,\n tag_value,\n timeout = 3000\n }:\n {\n tag_value: string,\n identity: string,\n resource_type?: string,\n resource_name?: string,\n timeout?: number\n }\n ): Promise<Tag[]> {\n const url = `${this.getUrlPrefix()}/tags/by_value/${tag_value}/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n return await this.getAsync({url, headers, timeout}) as Tag[];\n }\n\n async getTagsByName(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n resource_type?: string,\n resource_name?: string,\n tag_name?: string,\n timeout?: number\n }\n ): Promise<Tag[]> {\n const url = `${this.getUrlPrefix()}/tags/by_name/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n return await this.getAsync({url, headers, timeout}) as Tag[];\n }\n\n async createTag(\n {\n tag,\n timeout = 3000\n }:\n {\n tag: Tag,\n timeout?: number\n }\n ): Promise<Tag> {\n const url = `${this.getUrlPrefix()}/tags`;\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n return await this.putAsync({url, headers, body: JSON.stringify(tag), timeout}) as Tag;\n }\n\n async deleteTag(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n resource_type?: string,\n resource_name?: string,\n tag_name?: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/tags/by_name/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n await this.deleteAsync({url, headers, timeout});\n }\n}\n\nexport default TaggingService;\n","import BaseService from './base_service.js';\n\nexport class UserSettings extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'local':\n return 'http://localhost:4000';\n case 'production':\n return `https://user-settings-service.services.${this.baseDomain}`;\n case 'staging':\n return `https://${this.environment}-user-settings-service.services.${this.baseDomain}`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n\n async getSettings(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<object> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n return await this.getAsync({url, headers, timeout});\n }\n\n async setSettings(\n {\n isbn,\n settings,\n timeout = 5000\n }: \n {\n isbn: string,\n settings: object,\n timeout?: number\n }\n ): Promise<object> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n return await this.putAsync({url, headers, body: JSON.stringify(settings), timeout});\n }\n}\n\nexport default UserSettings;\n","import crypto from 'crypto';\nimport TaggingService from '../../tagging_service.js';\n\ninterface FolderObject {}\n\ninterface Folder extends FolderObject {\n name: string;\n uuid: string;\n parent?: string;\n}\n\ninterface FolderContent extends FolderObject {\n type: string;\n identifier: string;\n folder_uuid: string;\n}\n\n/**\n * UserFolders is a service that allows users to create folders in their account. It's built on top of the Tagging service.\n * Folders are created with a name and an optional parent folder. If no parent folder is provided, the folder is created at the root level.\n * Folders are created with a unique UUID that can be used to reference the folder in future requests. The folder name is stored as a base64 encoded string.\n**/\nexport class UserFolders extends TaggingService {\n private identity?: string = undefined;\n \n async getIdentity() : Promise<string> {\n if (this.identity) {\n return this.identity;\n }\n\n if (this.bearerToken) {\n const tokenParts = this.bearerToken.split('.');\n const payload = Buffer.from(tokenParts[1], 'base64').toString();\n const payloadObject = JSON.parse(payload);\n // The identity is the keyword user, the user's authns and the ekeysuserid (user) concatenated with an underscore\n // This value is enforced by the Tagging service and this is the only identity\n // that the Service will accept when invoked with a user specific bearer token.\n return `user_${payloadObject.authns}_${payloadObject.user}`;\n }\n\n throw new Error('The UserFolders service must be invoked with a valid bearer token');\n }\n\n async createFolder(\n {\n folder_name,\n parent_folder_uuid,\n timeout = 3000\n }:\n {\n folder_name: string,\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder> {\n const tag = await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: crypto.randomUUID(),\n tag_name: Buffer.from(folder_name).toString('base64'),\n tag_value: parent_folder_uuid ?? '-',\n },\n timeout\n }\n );\n return {name: folder_name, uuid: tag['resource_name'], parent: parent_folder_uuid} as Folder;\n }\n\n async listFolders(\n {\n parent_folder_uuid,\n timeout = 3000\n }:\n {\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder[]> {\n let tags;\n if (parent_folder_uuid) {\n tags = await this.getTagsByValue(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n tag_value: parent_folder_uuid,\n timeout\n }\n );\n } else {\n tags = await this.getTagsByName(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n }\n\n let folders = [];\n\n for (const tag of tags) {\n folders.push(\n {\n name: Buffer.from(tag['tag_name'], 'base64').toString(),\n uuid: tag['resource_name'],\n parent: tag['tag_value'] === '-' ? undefined : tag['tag_value']\n } as Folder\n );\n }\n\n return folders;\n }\n\n async getFolderContent(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<FolderObject[]> {\n let tags = await this.getTagsByValue(\n {\n identity: await this.getIdentity(),\n tag_value: folder_uuid,\n timeout\n }\n );\n\n let content = [];\n\n for (const tag of tags) {\n if (tag['resource_type'] === 'myaccount_user_folder') {\n content.push(\n {\n type: tag['resource_type'],\n identifier: tag['resource_name'],\n folder_uuid: tag['tag_value']\n } as FolderContent\n );\n } else {\n let folder = {\n name: Buffer.from(tag['tag_name'], 'base64').toString(),\n uuid: tag['resource_name'],\n parent: tag['tag_value']\n } as Folder\n content.push(folder);\n }\n }\n\n return content;\n }\n\n async addInternetbookToFolder(\n {\n folder_uuid,\n isbn,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n isbn: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n return await this.addContentToFolder(\n {\n folder_uuid,\n resource_name: isbn,\n resource_type: 'internetbook',\n timeout\n },\n );\n }\n\n /**\n * This is a generic function for creating folder content elements.\n **/\n async addContentToFolder(\n {\n folder_uuid,\n resource_name,\n resource_type,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n resource_name: string,\n resource_type: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: resource_type,\n resource_name: resource_name,\n tag_name: 'MYACCOUNT_USER_FOLDER',\n tag_value: folder_uuid,\n },\n timeout\n }\n );\n return {type: resource_type, identifier: resource_name, folder_uuid} as FolderContent;\n }\n\n async deleteFolder(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n timeout\n }\n );\n }\n\n async deleteAllFolders(\n {\n timeout = 3000\n }:\n {\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n }\n}\n\nexport default UserFolders;\n"],"mappings":"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","names":["crypto"]}
@@ -0,0 +1,149 @@
1
+ declare class BaseService {
2
+ bearerToken: string | undefined;
3
+ apiKey: string | undefined;
4
+ serviceUrl: string | undefined;
5
+ environment: string;
6
+ myAccountId: string;
7
+ baseDomain: string;
8
+ constructor({ bearerToken, apiKey, serviceUrl, environment, myAccountId, baseDomain, }: {
9
+ bearerToken?: string;
10
+ apiKey?: string;
11
+ serviceUrl?: string;
12
+ environment: string;
13
+ myAccountId: string;
14
+ baseDomain?: string;
15
+ });
16
+ protected discoverUrlPrefix(): string;
17
+ getUrlPrefix(): string;
18
+ addAuthHeaders(requestHeaders: Headers): Promise<Headers>;
19
+ getAsync({ url, headers, timeout }: {
20
+ url: URL | string;
21
+ headers: Headers | undefined | null;
22
+ timeout: number;
23
+ }): Promise<object>;
24
+ putAsync({ url, headers, body, timeout }: {
25
+ url: URL | string;
26
+ headers: Headers | undefined | null;
27
+ body: string | null | undefined;
28
+ timeout: number;
29
+ }): Promise<object>;
30
+ deleteAsync({ url, headers, timeout }: {
31
+ url: URL | string;
32
+ headers: Headers | undefined | null;
33
+ timeout: number;
34
+ }): Promise<object>;
35
+ callAsync({ url, body, method, headers, timeout }: {
36
+ url: URL | string;
37
+ body: string | null | undefined;
38
+ method: string;
39
+ headers: Headers | undefined | null;
40
+ timeout: number;
41
+ }): Promise<Response>;
42
+ }
43
+
44
+ interface Tag {
45
+ identity: string;
46
+ resource_type: string;
47
+ resource_name: string;
48
+ tag_name: string;
49
+ tag_value: string;
50
+ }
51
+ declare class TaggingService extends BaseService {
52
+ discoverUrlPrefix(): string;
53
+ getTagsByValue({ identity, resource_type, resource_name, tag_value, timeout }: {
54
+ tag_value: string;
55
+ identity: string;
56
+ resource_type?: string;
57
+ resource_name?: string;
58
+ timeout?: number;
59
+ }): Promise<Tag[]>;
60
+ getTagsByName({ identity, resource_type, resource_name, tag_name, timeout }: {
61
+ identity: string;
62
+ resource_type?: string;
63
+ resource_name?: string;
64
+ tag_name?: string;
65
+ timeout?: number;
66
+ }): Promise<Tag[]>;
67
+ createTag({ tag, timeout }: {
68
+ tag: Tag;
69
+ timeout?: number;
70
+ }): Promise<Tag>;
71
+ deleteTag({ identity, resource_type, resource_name, tag_name, timeout }: {
72
+ identity: string;
73
+ resource_type?: string;
74
+ resource_name?: string;
75
+ tag_name?: string;
76
+ timeout?: number;
77
+ }): Promise<void>;
78
+ }
79
+
80
+ declare class UserSettings extends BaseService {
81
+ discoverUrlPrefix(): string;
82
+ getSettings({ isbn, timeout }: {
83
+ isbn: string;
84
+ timeout?: number;
85
+ }): Promise<object>;
86
+ setSettings({ isbn, settings, timeout }: {
87
+ isbn: string;
88
+ settings: object;
89
+ timeout?: number;
90
+ }): Promise<object>;
91
+ }
92
+
93
+ interface FolderObject {
94
+ }
95
+ interface Folder extends FolderObject {
96
+ name: string;
97
+ uuid: string;
98
+ parent?: string;
99
+ }
100
+ interface FolderContent extends FolderObject {
101
+ type: string;
102
+ identifier: string;
103
+ folder_uuid: string;
104
+ }
105
+ /**
106
+ * UserFolders is a service that allows users to create folders in their account. It's built on top of the Tagging service.
107
+ * Folders are created with a name and an optional parent folder. If no parent folder is provided, the folder is created at the root level.
108
+ * Folders are created with a unique UUID that can be used to reference the folder in future requests. The folder name is stored as a base64 encoded string.
109
+ **/
110
+ declare class UserFolders extends TaggingService {
111
+ private identity?;
112
+ getIdentity(): Promise<string>;
113
+ createFolder({ folder_name, parent_folder_uuid, timeout }: {
114
+ folder_name: string;
115
+ parent_folder_uuid?: string;
116
+ timeout?: number;
117
+ }): Promise<Folder>;
118
+ listFolders({ parent_folder_uuid, timeout }: {
119
+ parent_folder_uuid?: string;
120
+ timeout?: number;
121
+ }): Promise<Folder[]>;
122
+ getFolderContent({ folder_uuid, timeout }: {
123
+ folder_uuid: string;
124
+ timeout?: number;
125
+ }): Promise<FolderObject[]>;
126
+ addInternetbookToFolder({ folder_uuid, isbn, timeout }: {
127
+ folder_uuid: string;
128
+ isbn: string;
129
+ timeout?: number;
130
+ }): Promise<FolderContent>;
131
+ /**
132
+ * This is a generic function for creating folder content elements.
133
+ **/
134
+ addContentToFolder({ folder_uuid, resource_name, resource_type, timeout }: {
135
+ folder_uuid: string;
136
+ resource_name: string;
137
+ resource_type: string;
138
+ timeout?: number;
139
+ }): Promise<FolderContent>;
140
+ deleteFolder({ folder_uuid, timeout }: {
141
+ folder_uuid: string;
142
+ timeout?: number;
143
+ }): Promise<void>;
144
+ deleteAllFolders({ timeout }: {
145
+ timeout?: number;
146
+ }): Promise<void>;
147
+ }
148
+
149
+ export { TaggingService, UserFolders, UserSettings };
@@ -0,0 +1,149 @@
1
+ declare class BaseService {
2
+ bearerToken: string | undefined;
3
+ apiKey: string | undefined;
4
+ serviceUrl: string | undefined;
5
+ environment: string;
6
+ myAccountId: string;
7
+ baseDomain: string;
8
+ constructor({ bearerToken, apiKey, serviceUrl, environment, myAccountId, baseDomain, }: {
9
+ bearerToken?: string;
10
+ apiKey?: string;
11
+ serviceUrl?: string;
12
+ environment: string;
13
+ myAccountId: string;
14
+ baseDomain?: string;
15
+ });
16
+ protected discoverUrlPrefix(): string;
17
+ getUrlPrefix(): string;
18
+ addAuthHeaders(requestHeaders: Headers): Promise<Headers>;
19
+ getAsync({ url, headers, timeout }: {
20
+ url: URL | string;
21
+ headers: Headers | undefined | null;
22
+ timeout: number;
23
+ }): Promise<object>;
24
+ putAsync({ url, headers, body, timeout }: {
25
+ url: URL | string;
26
+ headers: Headers | undefined | null;
27
+ body: string | null | undefined;
28
+ timeout: number;
29
+ }): Promise<object>;
30
+ deleteAsync({ url, headers, timeout }: {
31
+ url: URL | string;
32
+ headers: Headers | undefined | null;
33
+ timeout: number;
34
+ }): Promise<object>;
35
+ callAsync({ url, body, method, headers, timeout }: {
36
+ url: URL | string;
37
+ body: string | null | undefined;
38
+ method: string;
39
+ headers: Headers | undefined | null;
40
+ timeout: number;
41
+ }): Promise<Response>;
42
+ }
43
+
44
+ interface Tag {
45
+ identity: string;
46
+ resource_type: string;
47
+ resource_name: string;
48
+ tag_name: string;
49
+ tag_value: string;
50
+ }
51
+ declare class TaggingService extends BaseService {
52
+ discoverUrlPrefix(): string;
53
+ getTagsByValue({ identity, resource_type, resource_name, tag_value, timeout }: {
54
+ tag_value: string;
55
+ identity: string;
56
+ resource_type?: string;
57
+ resource_name?: string;
58
+ timeout?: number;
59
+ }): Promise<Tag[]>;
60
+ getTagsByName({ identity, resource_type, resource_name, tag_name, timeout }: {
61
+ identity: string;
62
+ resource_type?: string;
63
+ resource_name?: string;
64
+ tag_name?: string;
65
+ timeout?: number;
66
+ }): Promise<Tag[]>;
67
+ createTag({ tag, timeout }: {
68
+ tag: Tag;
69
+ timeout?: number;
70
+ }): Promise<Tag>;
71
+ deleteTag({ identity, resource_type, resource_name, tag_name, timeout }: {
72
+ identity: string;
73
+ resource_type?: string;
74
+ resource_name?: string;
75
+ tag_name?: string;
76
+ timeout?: number;
77
+ }): Promise<void>;
78
+ }
79
+
80
+ declare class UserSettings extends BaseService {
81
+ discoverUrlPrefix(): string;
82
+ getSettings({ isbn, timeout }: {
83
+ isbn: string;
84
+ timeout?: number;
85
+ }): Promise<object>;
86
+ setSettings({ isbn, settings, timeout }: {
87
+ isbn: string;
88
+ settings: object;
89
+ timeout?: number;
90
+ }): Promise<object>;
91
+ }
92
+
93
+ interface FolderObject {
94
+ }
95
+ interface Folder extends FolderObject {
96
+ name: string;
97
+ uuid: string;
98
+ parent?: string;
99
+ }
100
+ interface FolderContent extends FolderObject {
101
+ type: string;
102
+ identifier: string;
103
+ folder_uuid: string;
104
+ }
105
+ /**
106
+ * UserFolders is a service that allows users to create folders in their account. It's built on top of the Tagging service.
107
+ * Folders are created with a name and an optional parent folder. If no parent folder is provided, the folder is created at the root level.
108
+ * Folders are created with a unique UUID that can be used to reference the folder in future requests. The folder name is stored as a base64 encoded string.
109
+ **/
110
+ declare class UserFolders extends TaggingService {
111
+ private identity?;
112
+ getIdentity(): Promise<string>;
113
+ createFolder({ folder_name, parent_folder_uuid, timeout }: {
114
+ folder_name: string;
115
+ parent_folder_uuid?: string;
116
+ timeout?: number;
117
+ }): Promise<Folder>;
118
+ listFolders({ parent_folder_uuid, timeout }: {
119
+ parent_folder_uuid?: string;
120
+ timeout?: number;
121
+ }): Promise<Folder[]>;
122
+ getFolderContent({ folder_uuid, timeout }: {
123
+ folder_uuid: string;
124
+ timeout?: number;
125
+ }): Promise<FolderObject[]>;
126
+ addInternetbookToFolder({ folder_uuid, isbn, timeout }: {
127
+ folder_uuid: string;
128
+ isbn: string;
129
+ timeout?: number;
130
+ }): Promise<FolderContent>;
131
+ /**
132
+ * This is a generic function for creating folder content elements.
133
+ **/
134
+ addContentToFolder({ folder_uuid, resource_name, resource_type, timeout }: {
135
+ folder_uuid: string;
136
+ resource_name: string;
137
+ resource_type: string;
138
+ timeout?: number;
139
+ }): Promise<FolderContent>;
140
+ deleteFolder({ folder_uuid, timeout }: {
141
+ folder_uuid: string;
142
+ timeout?: number;
143
+ }): Promise<void>;
144
+ deleteAllFolders({ timeout }: {
145
+ timeout?: number;
146
+ }): Promise<void>;
147
+ }
148
+
149
+ export { TaggingService, UserFolders, UserSettings };
package/dist/index.js ADDED
@@ -0,0 +1,364 @@
1
+ // src/services/base_service.ts
2
+ var HTTPError = class extends Error {
3
+ response;
4
+ constructor(message, response) {
5
+ super();
6
+ this.message = message;
7
+ this.response = response;
8
+ }
9
+ };
10
+ var BaseService = class {
11
+ bearerToken;
12
+ apiKey;
13
+ serviceUrl;
14
+ environment;
15
+ myAccountId;
16
+ baseDomain;
17
+ constructor({
18
+ bearerToken = void 0,
19
+ apiKey = void 0,
20
+ serviceUrl = void 0,
21
+ environment = "production",
22
+ myAccountId = "SYSTIMEMYACCOUNT",
23
+ baseDomain = "systime.dk"
24
+ }) {
25
+ this.bearerToken = bearerToken;
26
+ this.apiKey = apiKey;
27
+ this.serviceUrl = serviceUrl;
28
+ this.environment = environment;
29
+ this.myAccountId = myAccountId;
30
+ this.baseDomain = baseDomain;
31
+ }
32
+ discoverUrlPrefix() {
33
+ throw new Error("Method not implemented.");
34
+ }
35
+ getUrlPrefix() {
36
+ if (this.serviceUrl) {
37
+ return this.serviceUrl;
38
+ }
39
+ return this.discoverUrlPrefix();
40
+ }
41
+ async addAuthHeaders(requestHeaders) {
42
+ if (this.bearerToken) {
43
+ requestHeaders.set("Authorization", `Bearer ${this.bearerToken}`);
44
+ } else if (this.apiKey) {
45
+ requestHeaders.set("x-api-key", this.apiKey);
46
+ }
47
+ return requestHeaders;
48
+ }
49
+ async getAsync({
50
+ url,
51
+ headers,
52
+ timeout
53
+ }) {
54
+ const method = "GET";
55
+ const response = await this.callAsync({ url, body: null, method, headers, timeout });
56
+ return response.json();
57
+ }
58
+ async putAsync({
59
+ url,
60
+ headers,
61
+ body,
62
+ timeout
63
+ }) {
64
+ const method = "PUT";
65
+ const response = await this.callAsync({ url, body, method, headers, timeout });
66
+ return response.json();
67
+ }
68
+ async deleteAsync({
69
+ url,
70
+ headers,
71
+ timeout
72
+ }) {
73
+ const method = "DELETE";
74
+ const response = await this.callAsync({ url, body: null, method, headers, timeout });
75
+ return response.json();
76
+ }
77
+ async callAsync({
78
+ url,
79
+ body,
80
+ method,
81
+ headers,
82
+ timeout
83
+ }) {
84
+ if (!headers) {
85
+ headers = new Headers();
86
+ }
87
+ headers = await this.addAuthHeaders(headers);
88
+ const response = await fetch(url, {
89
+ method,
90
+ body,
91
+ headers,
92
+ signal: AbortSignal.timeout(timeout)
93
+ });
94
+ if (!response.ok) {
95
+ throw new HTTPError(`Got ${response.status} while calling ${response.url}`, response);
96
+ }
97
+ return response;
98
+ }
99
+ };
100
+ var base_service_default = BaseService;
101
+
102
+ // src/services/tagging_service.ts
103
+ var TaggingService = class extends base_service_default {
104
+ discoverUrlPrefix() {
105
+ switch (this.environment) {
106
+ case "local":
107
+ return "http://localhost:4000";
108
+ case "production":
109
+ return `https://tagging.services.${this.baseDomain}`;
110
+ case "staging":
111
+ return `https://${this.environment}-tagging.services.${this.baseDomain}`;
112
+ default:
113
+ throw new Error(`Unknown environment: ${this.environment}`);
114
+ }
115
+ }
116
+ async getTagsByValue({
117
+ identity,
118
+ resource_type,
119
+ resource_name,
120
+ tag_value,
121
+ timeout = 3e3
122
+ }) {
123
+ const url = `${this.getUrlPrefix()}/tags/by_value/${tag_value}/${identity}${resource_type ? `/${resource_type}` : ""}${resource_name ? `/${resource_name}` : ""}`;
124
+ const headers = new Headers();
125
+ return await this.getAsync({ url, headers, timeout });
126
+ }
127
+ async getTagsByName({
128
+ identity,
129
+ resource_type,
130
+ resource_name,
131
+ tag_name,
132
+ timeout = 3e3
133
+ }) {
134
+ const url = `${this.getUrlPrefix()}/tags/by_name/${identity}${resource_type ? `/${resource_type}` : ""}${resource_name ? `/${resource_name}` : ""}${tag_name ? `/${tag_name}` : ""}`;
135
+ const headers = new Headers();
136
+ return await this.getAsync({ url, headers, timeout });
137
+ }
138
+ async createTag({
139
+ tag,
140
+ timeout = 3e3
141
+ }) {
142
+ const url = `${this.getUrlPrefix()}/tags`;
143
+ const headers = new Headers();
144
+ headers.append("Content-Type", "application/json");
145
+ return await this.putAsync({ url, headers, body: JSON.stringify(tag), timeout });
146
+ }
147
+ async deleteTag({
148
+ identity,
149
+ resource_type,
150
+ resource_name,
151
+ tag_name,
152
+ timeout = 3e3
153
+ }) {
154
+ const url = `${this.getUrlPrefix()}/tags/by_name/${identity}${resource_type ? `/${resource_type}` : ""}${resource_name ? `/${resource_name}` : ""}${tag_name ? `/${tag_name}` : ""}`;
155
+ const headers = new Headers();
156
+ await this.deleteAsync({ url, headers, timeout });
157
+ }
158
+ };
159
+ var tagging_service_default = TaggingService;
160
+
161
+ // src/services/user_settings.ts
162
+ var UserSettings = class extends base_service_default {
163
+ discoverUrlPrefix() {
164
+ switch (this.environment) {
165
+ case "local":
166
+ return "http://localhost:4000";
167
+ case "production":
168
+ return `https://user-settings-service.services.${this.baseDomain}`;
169
+ case "staging":
170
+ return `https://${this.environment}-user-settings-service.services.${this.baseDomain}`;
171
+ default:
172
+ throw new Error(`Unknown environment: ${this.environment}`);
173
+ }
174
+ }
175
+ async getSettings({
176
+ isbn,
177
+ timeout = 5e3
178
+ }) {
179
+ const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;
180
+ const headers = new Headers();
181
+ return await this.getAsync({ url, headers, timeout });
182
+ }
183
+ async setSettings({
184
+ isbn,
185
+ settings,
186
+ timeout = 5e3
187
+ }) {
188
+ const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;
189
+ const headers = new Headers();
190
+ headers.set("Content-Type", "application/json");
191
+ return await this.putAsync({ url, headers, body: JSON.stringify(settings), timeout });
192
+ }
193
+ };
194
+
195
+ // src/services/highlevel/tagging/user_folders.ts
196
+ import crypto from "crypto";
197
+ var UserFolders = class extends tagging_service_default {
198
+ identity = void 0;
199
+ async getIdentity() {
200
+ if (this.identity) {
201
+ return this.identity;
202
+ }
203
+ if (this.bearerToken) {
204
+ const tokenParts = this.bearerToken.split(".");
205
+ const payload = Buffer.from(tokenParts[1], "base64").toString();
206
+ const payloadObject = JSON.parse(payload);
207
+ return `user_${payloadObject.authns}_${payloadObject.user}`;
208
+ }
209
+ throw new Error("The UserFolders service must be invoked with a valid bearer token");
210
+ }
211
+ async createFolder({
212
+ folder_name,
213
+ parent_folder_uuid,
214
+ timeout = 3e3
215
+ }) {
216
+ const tag = await this.createTag(
217
+ {
218
+ tag: {
219
+ identity: await this.getIdentity(),
220
+ resource_type: "myaccount_user_folder",
221
+ resource_name: crypto.randomUUID(),
222
+ tag_name: Buffer.from(folder_name).toString("base64"),
223
+ tag_value: parent_folder_uuid ?? "-"
224
+ },
225
+ timeout
226
+ }
227
+ );
228
+ return { name: folder_name, uuid: tag["resource_name"], parent: parent_folder_uuid };
229
+ }
230
+ async listFolders({
231
+ parent_folder_uuid,
232
+ timeout = 3e3
233
+ }) {
234
+ let tags;
235
+ if (parent_folder_uuid) {
236
+ tags = await this.getTagsByValue(
237
+ {
238
+ identity: await this.getIdentity(),
239
+ resource_type: "myaccount_user_folder",
240
+ tag_value: parent_folder_uuid,
241
+ timeout
242
+ }
243
+ );
244
+ } else {
245
+ tags = await this.getTagsByName(
246
+ {
247
+ identity: await this.getIdentity(),
248
+ resource_type: "myaccount_user_folder",
249
+ timeout
250
+ }
251
+ );
252
+ }
253
+ let folders = [];
254
+ for (const tag of tags) {
255
+ folders.push(
256
+ {
257
+ name: Buffer.from(tag["tag_name"], "base64").toString(),
258
+ uuid: tag["resource_name"],
259
+ parent: tag["tag_value"] === "-" ? void 0 : tag["tag_value"]
260
+ }
261
+ );
262
+ }
263
+ return folders;
264
+ }
265
+ async getFolderContent({
266
+ folder_uuid,
267
+ timeout = 3e3
268
+ }) {
269
+ let tags = await this.getTagsByValue(
270
+ {
271
+ identity: await this.getIdentity(),
272
+ tag_value: folder_uuid,
273
+ timeout
274
+ }
275
+ );
276
+ let content = [];
277
+ for (const tag of tags) {
278
+ if (tag["resource_type"] === "myaccount_user_folder") {
279
+ content.push(
280
+ {
281
+ type: tag["resource_type"],
282
+ identifier: tag["resource_name"],
283
+ folder_uuid: tag["tag_value"]
284
+ }
285
+ );
286
+ } else {
287
+ let folder = {
288
+ name: Buffer.from(tag["tag_name"], "base64").toString(),
289
+ uuid: tag["resource_name"],
290
+ parent: tag["tag_value"]
291
+ };
292
+ content.push(folder);
293
+ }
294
+ }
295
+ return content;
296
+ }
297
+ async addInternetbookToFolder({
298
+ folder_uuid,
299
+ isbn,
300
+ timeout = 3e3
301
+ }) {
302
+ return await this.addContentToFolder(
303
+ {
304
+ folder_uuid,
305
+ resource_name: isbn,
306
+ resource_type: "internetbook",
307
+ timeout
308
+ }
309
+ );
310
+ }
311
+ /**
312
+ * This is a generic function for creating folder content elements.
313
+ **/
314
+ async addContentToFolder({
315
+ folder_uuid,
316
+ resource_name,
317
+ resource_type,
318
+ timeout = 3e3
319
+ }) {
320
+ await this.createTag(
321
+ {
322
+ tag: {
323
+ identity: await this.getIdentity(),
324
+ resource_type,
325
+ resource_name,
326
+ tag_name: "MYACCOUNT_USER_FOLDER",
327
+ tag_value: folder_uuid
328
+ },
329
+ timeout
330
+ }
331
+ );
332
+ return { type: resource_type, identifier: resource_name, folder_uuid };
333
+ }
334
+ async deleteFolder({
335
+ folder_uuid,
336
+ timeout = 3e3
337
+ }) {
338
+ await this.deleteTag(
339
+ {
340
+ identity: await this.getIdentity(),
341
+ resource_type: "myaccount_user_folder",
342
+ resource_name: folder_uuid,
343
+ timeout
344
+ }
345
+ );
346
+ }
347
+ async deleteAllFolders({
348
+ timeout = 3e3
349
+ }) {
350
+ await this.deleteTag(
351
+ {
352
+ identity: await this.getIdentity(),
353
+ resource_type: "myaccount_user_folder",
354
+ timeout
355
+ }
356
+ );
357
+ }
358
+ };
359
+ export {
360
+ TaggingService,
361
+ UserFolders,
362
+ UserSettings
363
+ };
364
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/services/base_service.ts","../src/services/tagging_service.ts","../src/services/user_settings.ts","../src/services/highlevel/tagging/user_folders.ts"],"sourcesContent":["class HTTPError extends Error {\n public response: Response;\n \n constructor(message: string, response: Response) {\n super();\n this.message = message;\n this.response = response;\n }\n}\n\nexport class BaseService {\n public bearerToken: string | undefined;\n public apiKey: string | undefined;\n public serviceUrl: string | undefined;\n public environment: string;\n public myAccountId: string;\n public baseDomain: string;\n\n constructor({\n bearerToken = undefined,\n apiKey = undefined,\n serviceUrl = undefined,\n environment = 'production',\n myAccountId = 'SYSTIMEMYACCOUNT',\n baseDomain = 'systime.dk',\n } : {\n bearerToken?: string,\n apiKey?: string,\n serviceUrl?: string,\n environment: string,\n myAccountId: string,\n baseDomain?: string\n }) {\n this.bearerToken = bearerToken;\n this.apiKey = apiKey;\n this.serviceUrl = serviceUrl;\n this.environment = environment;\n this.myAccountId = myAccountId;\n this.baseDomain = baseDomain;\n }\n\n protected discoverUrlPrefix(): string {\n throw new Error('Method not implemented.');\n }\n\n public getUrlPrefix(): string {\n // If the URL has been explicitly set, return it.\n if (this.serviceUrl) {\n return this.serviceUrl;\n }\n return this.discoverUrlPrefix()\n }\n\n public async addAuthHeaders(requestHeaders: Headers): Promise<Headers> {\n if (this.bearerToken) {\n requestHeaders.set('Authorization', `Bearer ${this.bearerToken}`);\n } else if (this.apiKey) {\n requestHeaders.set('x-api-key', this.apiKey);\n }\n return requestHeaders;\n }\n\n async getAsync(\n {\n url,\n headers,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n timeout: number\n }\n ): Promise<object> {\n const method = 'GET';\n const response = await this.callAsync({ url, body: null, method, headers, timeout });\n return response.json();\n }\n\n async putAsync(\n {\n url,\n headers,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<object> {\n const method = 'PUT';\n const response = await this.callAsync({ url, body, method, headers, timeout });\n return response.json();\n }\n\n async deleteAsync(\n {\n url,\n headers,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n timeout: number\n }\n ): Promise<object> {\n const method = 'DELETE';\n const response = await this.callAsync({ url, body: null, method, headers, timeout });\n return response.json();\n }\n\n async callAsync(\n {\n url,\n body,\n method,\n headers,\n timeout\n }:\n {\n url: URL | string,\n body: string | null | undefined,\n method: string,\n headers: Headers | undefined | null,\n timeout: number\n }\n ): Promise<Response> {\n if (!headers) {\n headers = new Headers();\n }\n\n headers = await this.addAuthHeaders(headers);\n const response = await fetch(url, {\n\t method: method,\n body: body,\n headers: headers,\n signal: AbortSignal.timeout(timeout)\n });\n\n if (!response.ok) {\n\t\t\t\t\tthrow new HTTPError(`Got ${response.status} while calling ${response.url}`, response);\n }\n return response;\n }\n}\nexport default BaseService;\n","import BaseService from './base_service.js';\n\ninterface Tag {\n identity: string;\n resource_type: string;\n resource_name: string;\n tag_name: string;\n tag_value: string;\n}\n\nexport class TaggingService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'local':\n return 'http://localhost:4000';\n case 'production':\n return `https://tagging.services.${this.baseDomain}`;\n case 'staging':\n return `https://${this.environment}-tagging.services.${this.baseDomain}`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async getTagsByValue(\n {\n identity,\n resource_type,\n resource_name,\n tag_value,\n timeout = 3000\n }:\n {\n tag_value: string,\n identity: string,\n resource_type?: string,\n resource_name?: string,\n timeout?: number\n }\n ): Promise<Tag[]> {\n const url = `${this.getUrlPrefix()}/tags/by_value/${tag_value}/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n return await this.getAsync({url, headers, timeout}) as Tag[];\n }\n\n async getTagsByName(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n resource_type?: string,\n resource_name?: string,\n tag_name?: string,\n timeout?: number\n }\n ): Promise<Tag[]> {\n const url = `${this.getUrlPrefix()}/tags/by_name/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n return await this.getAsync({url, headers, timeout}) as Tag[];\n }\n\n async createTag(\n {\n tag,\n timeout = 3000\n }:\n {\n tag: Tag,\n timeout?: number\n }\n ): Promise<Tag> {\n const url = `${this.getUrlPrefix()}/tags`;\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n return await this.putAsync({url, headers, body: JSON.stringify(tag), timeout}) as Tag;\n }\n\n async deleteTag(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n resource_type?: string,\n resource_name?: string,\n tag_name?: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/tags/by_name/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n await this.deleteAsync({url, headers, timeout});\n }\n}\n\nexport default TaggingService;\n","import BaseService from './base_service.js';\n\nexport class UserSettings extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'local':\n return 'http://localhost:4000';\n case 'production':\n return `https://user-settings-service.services.${this.baseDomain}`;\n case 'staging':\n return `https://${this.environment}-user-settings-service.services.${this.baseDomain}`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n\n async getSettings(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<object> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n return await this.getAsync({url, headers, timeout});\n }\n\n async setSettings(\n {\n isbn,\n settings,\n timeout = 5000\n }: \n {\n isbn: string,\n settings: object,\n timeout?: number\n }\n ): Promise<object> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n return await this.putAsync({url, headers, body: JSON.stringify(settings), timeout});\n }\n}\n\nexport default UserSettings;\n","import crypto from 'crypto';\nimport TaggingService from '../../tagging_service.js';\n\ninterface FolderObject {}\n\ninterface Folder extends FolderObject {\n name: string;\n uuid: string;\n parent?: string;\n}\n\ninterface FolderContent extends FolderObject {\n type: string;\n identifier: string;\n folder_uuid: string;\n}\n\n/**\n * UserFolders is a service that allows users to create folders in their account. It's built on top of the Tagging service.\n * Folders are created with a name and an optional parent folder. If no parent folder is provided, the folder is created at the root level.\n * Folders are created with a unique UUID that can be used to reference the folder in future requests. The folder name is stored as a base64 encoded string.\n**/\nexport class UserFolders extends TaggingService {\n private identity?: string = undefined;\n \n async getIdentity() : Promise<string> {\n if (this.identity) {\n return this.identity;\n }\n\n if (this.bearerToken) {\n const tokenParts = this.bearerToken.split('.');\n const payload = Buffer.from(tokenParts[1], 'base64').toString();\n const payloadObject = JSON.parse(payload);\n // The identity is the keyword user, the user's authns and the ekeysuserid (user) concatenated with an underscore\n // This value is enforced by the Tagging service and this is the only identity\n // that the Service will accept when invoked with a user specific bearer token.\n return `user_${payloadObject.authns}_${payloadObject.user}`;\n }\n\n throw new Error('The UserFolders service must be invoked with a valid bearer token');\n }\n\n async createFolder(\n {\n folder_name,\n parent_folder_uuid,\n timeout = 3000\n }:\n {\n folder_name: string,\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder> {\n const tag = await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: crypto.randomUUID(),\n tag_name: Buffer.from(folder_name).toString('base64'),\n tag_value: parent_folder_uuid ?? '-',\n },\n timeout\n }\n );\n return {name: folder_name, uuid: tag['resource_name'], parent: parent_folder_uuid} as Folder;\n }\n\n async listFolders(\n {\n parent_folder_uuid,\n timeout = 3000\n }:\n {\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder[]> {\n let tags;\n if (parent_folder_uuid) {\n tags = await this.getTagsByValue(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n tag_value: parent_folder_uuid,\n timeout\n }\n );\n } else {\n tags = await this.getTagsByName(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n }\n\n let folders = [];\n\n for (const tag of tags) {\n folders.push(\n {\n name: Buffer.from(tag['tag_name'], 'base64').toString(),\n uuid: tag['resource_name'],\n parent: tag['tag_value'] === '-' ? undefined : tag['tag_value']\n } as Folder\n );\n }\n\n return folders;\n }\n\n async getFolderContent(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<FolderObject[]> {\n let tags = await this.getTagsByValue(\n {\n identity: await this.getIdentity(),\n tag_value: folder_uuid,\n timeout\n }\n );\n\n let content = [];\n\n for (const tag of tags) {\n if (tag['resource_type'] === 'myaccount_user_folder') {\n content.push(\n {\n type: tag['resource_type'],\n identifier: tag['resource_name'],\n folder_uuid: tag['tag_value']\n } as FolderContent\n );\n } else {\n let folder = {\n name: Buffer.from(tag['tag_name'], 'base64').toString(),\n uuid: tag['resource_name'],\n parent: tag['tag_value']\n } as Folder\n content.push(folder);\n }\n }\n\n return content;\n }\n\n async addInternetbookToFolder(\n {\n folder_uuid,\n isbn,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n isbn: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n return await this.addContentToFolder(\n {\n folder_uuid,\n resource_name: isbn,\n resource_type: 'internetbook',\n timeout\n },\n );\n }\n\n /**\n * This is a generic function for creating folder content elements.\n **/\n async addContentToFolder(\n {\n folder_uuid,\n resource_name,\n resource_type,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n resource_name: string,\n resource_type: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: resource_type,\n resource_name: resource_name,\n tag_name: 'MYACCOUNT_USER_FOLDER',\n tag_value: folder_uuid,\n },\n timeout\n }\n );\n return {type: resource_type, identifier: resource_name, folder_uuid} as FolderContent;\n }\n\n async deleteFolder(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n timeout\n }\n );\n }\n\n async deleteAllFolders(\n {\n timeout = 3000\n }:\n {\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n }\n}\n\nexport default UserFolders;\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "@gyldendalas/gyldendal-divine-api",
3
+ "type": "module",
4
+ "scripts": {
5
+ "package": "tsup"
6
+ },
7
+ "devDependencies": {
8
+ "tsup": "^8.3.6",
9
+ "typescript": "^5.7.3",
10
+ "@types/node": "^22.10.10"
11
+ },
12
+ "version": "0.0.1",
13
+ "files": [
14
+ "dist",
15
+ "package.json"
16
+ ],
17
+ "types": "./dist/index.d.ts",
18
+ "main": "./dist/index.js",
19
+ "module": "./dist/index.mjs"
20
+ }