@c-rex/services 0.1.11 → 0.1.13

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.d.mts CHANGED
@@ -122,7 +122,8 @@ declare class DocumentTypesService extends BaseService {
122
122
  * Provides methods to retrieve and search information units.
123
123
  */
124
124
  declare class InformationUnitsService extends BaseService {
125
- constructor();
125
+ private directoryNodesService;
126
+ constructor(directoryNodesService?: DirectoryNodesService);
126
127
  /**
127
128
  * Retrieves a list of information units based on specified criteria.
128
129
  *
@@ -173,6 +174,12 @@ declare class InformationUnitsService extends BaseService {
173
174
  query: string;
174
175
  language: string;
175
176
  }): Promise<string[]>;
177
+ getDocumentInfo({ shortId }: {
178
+ shortId: string;
179
+ }): Promise<{
180
+ documentId?: string;
181
+ label?: string;
182
+ }>;
176
183
  }
177
184
 
178
185
  /**
package/dist/index.d.ts CHANGED
@@ -122,7 +122,8 @@ declare class DocumentTypesService extends BaseService {
122
122
  * Provides methods to retrieve and search information units.
123
123
  */
124
124
  declare class InformationUnitsService extends BaseService {
125
- constructor();
125
+ private directoryNodesService;
126
+ constructor(directoryNodesService?: DirectoryNodesService);
126
127
  /**
127
128
  * Retrieves a list of information units based on specified criteria.
128
129
  *
@@ -173,6 +174,12 @@ declare class InformationUnitsService extends BaseService {
173
174
  query: string;
174
175
  language: string;
175
176
  }): Promise<string[]>;
177
+ getDocumentInfo({ shortId }: {
178
+ shortId: string;
179
+ }): Promise<{
180
+ documentId?: string;
181
+ label?: string;
182
+ }>;
176
183
  }
177
184
 
178
185
  /**
package/dist/index.js CHANGED
@@ -51,14 +51,7 @@ var LOG_LEVELS = {
51
51
  info: 6,
52
52
  debug: 7
53
53
  };
54
- var API = {
55
- MAX_RETRY: 3,
56
- API_TIMEOUT: 1e4,
57
- RETRY_DELAY: 500,
58
- API_HEADERS: {
59
- "content-Type": "application/json"
60
- }
61
- };
54
+ var SDK_CONFIG_KEY = "crex-sdk-config";
62
55
  var CONTENT_LANG_KEY = "CONTENT_LANG_KEY";
63
56
  var UI_LANG_KEY = "UI_LANG_KEY";
64
57
  var FLAGS_BY_LANG = {
@@ -90,7 +83,7 @@ var OPERATOR_OPTIONS = {
90
83
  };
91
84
 
92
85
  // ../core/src/requests.ts
93
- var import_headers = require("next/headers");
86
+ var import_headers2 = require("next/headers");
94
87
 
95
88
  // ../core/src/logger.ts
96
89
  var import_winston = __toESM(require("winston"));
@@ -153,7 +146,6 @@ var GraylogTransport = class extends import_winston_transport2.default {
153
146
  handleExceptions: false,
154
147
  graylog: {
155
148
  servers: [
156
- { host: "localhost", port: 12201 },
157
149
  { host: configs.logs.graylog.hostname, port: configs.logs.graylog.port }
158
150
  ]
159
151
  }
@@ -173,8 +165,24 @@ var GraylogTransport = class extends import_winston_transport2.default {
173
165
  }
174
166
  };
175
167
 
168
+ // ../core/src/config.ts
169
+ var import_headers = require("next/headers");
170
+ var getClientConfig = () => {
171
+ const jsonConfigs = (0, import_headers.cookies)().get(SDK_CONFIG_KEY)?.value;
172
+ if (!jsonConfigs) {
173
+ throw new Error("Configs not found");
174
+ }
175
+ const configs = JSON.parse(jsonConfigs);
176
+ return configs;
177
+ };
178
+ function getServerConfig() {
179
+ if (!global.__GLOBAL_CONFIG__) {
180
+ throw new Error("Server config not initialized");
181
+ }
182
+ return global.__GLOBAL_CONFIG__;
183
+ }
184
+
176
185
  // ../core/src/logger.ts
177
- var import_next_cookies = require("@c-rex/utils/next-cookies");
178
186
  var CrexLogger = class {
179
187
  customerConfig;
180
188
  logger;
@@ -187,13 +195,13 @@ var CrexLogger = class {
187
195
  async initLogger() {
188
196
  try {
189
197
  if (!this.customerConfig) {
190
- this.customerConfig = await (0, import_next_cookies.getServerConfigs)();
198
+ this.customerConfig = getServerConfig();
191
199
  }
192
200
  if (!this.logger) {
193
201
  this.logger = this.createLogger();
194
202
  }
195
203
  } catch (error) {
196
- console.error("Error initializing logger:", error);
204
+ console.log("Error initializing logger:", error);
197
205
  }
198
206
  }
199
207
  /**
@@ -206,7 +214,9 @@ var CrexLogger = class {
206
214
  */
207
215
  async log({ level, message, category }) {
208
216
  await this.initLogger();
209
- this.logger.log(level, message, category);
217
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
218
+ const newMessage = `[${timestamp}] ${message}`;
219
+ this.logger.log(level, newMessage, category);
210
220
  }
211
221
  /**
212
222
  * Creates a new Winston logger instance with configured transports.
@@ -229,13 +239,35 @@ var CrexLogger = class {
229
239
  }
230
240
  };
231
241
 
242
+ // ../core/src/OIDC.ts
243
+ var import_openid_client = require("openid-client");
244
+ var getToken = async () => {
245
+ try {
246
+ const config = getServerConfig();
247
+ const issuer = await import_openid_client.Issuer.discover(config.OIDC.client.issuer);
248
+ const client = new issuer.Client({
249
+ client_id: config.OIDC.client.id,
250
+ client_secret: config.OIDC.client.secret
251
+ });
252
+ const tokenSet = await client.grant({ grant_type: "client_credentials" });
253
+ const token = tokenSet.access_token;
254
+ const expiresAt = tokenSet.expires_at;
255
+ return { token, expiresAt };
256
+ } catch (error) {
257
+ const logger = new CrexLogger();
258
+ logger.log({
259
+ level: "error",
260
+ message: `getToken error: ${error}`
261
+ });
262
+ return { token: "", expiresAt: 0, error: JSON.stringify(error) };
263
+ }
264
+ };
265
+
232
266
  // ../core/src/requests.ts
233
- var import_next_cookies2 = require("@c-rex/utils/next-cookies");
234
267
  var CrexApi = class {
235
268
  customerConfig;
236
269
  apiClient;
237
270
  logger;
238
- publicNextApiUrl;
239
271
  /**
240
272
  * Initializes the API client if it hasn't been initialized yet.
241
273
  * Loads customer configuration, creates the axios instance, and initializes the logger.
@@ -245,10 +277,7 @@ var CrexApi = class {
245
277
  async initAPI() {
246
278
  this.logger = new CrexLogger();
247
279
  if (!this.customerConfig) {
248
- this.customerConfig = await (0, import_next_cookies2.getServerConfigs)();
249
- }
250
- if (!this.publicNextApiUrl) {
251
- this.publicNextApiUrl = await (0, import_next_cookies2.getClientConfigs)().publicNextApiUrl;
280
+ this.customerConfig = getServerConfig();
252
281
  }
253
282
  if (!this.apiClient) {
254
283
  this.apiClient = import_axios.default.create({
@@ -256,34 +285,13 @@ var CrexApi = class {
256
285
  });
257
286
  }
258
287
  }
259
- async getToken() {
260
- for (let retry = 0; retry < API.MAX_RETRY; retry++) {
261
- try {
262
- const response = await fetch(`${this.publicNextApiUrl}/api/token`, {
263
- method: "POST",
264
- credentials: "include"
265
- });
266
- const { token } = await response.json();
267
- return token;
268
- } catch (error) {
269
- this.logger.log({
270
- level: "error",
271
- message: `utils.getToken ${retry + 1}\xBA error when request token. Error: ${error}`
272
- });
273
- await new Promise((resolve) => setTimeout(resolve, API.RETRY_DELAY));
274
- if (retry === API.MAX_RETRY) {
275
- throw error;
276
- }
277
- }
278
- }
279
- }
280
288
  async manageToken() {
281
289
  try {
282
290
  let token = "";
283
- const hasToken = (0, import_headers.cookies)().get(CREX_TOKEN_HEADER_KEY);
291
+ const hasToken = (0, import_headers2.cookies)().get(CREX_TOKEN_HEADER_KEY);
284
292
  if (hasToken == void 0 || hasToken.value === null) {
285
- const tokenResult = await this.getToken();
286
- if (tokenResult === null) throw new Error("Token is undefined");
293
+ const { token: tokenResult } = await getToken();
294
+ if (tokenResult.length === 0) throw new Error("Token is undefined");
287
295
  token = tokenResult;
288
296
  } else {
289
297
  token = hasToken.value;
@@ -316,40 +324,35 @@ var CrexApi = class {
316
324
  body,
317
325
  headers = {}
318
326
  }) {
319
- await this.initAPI();
320
- let response = void 0;
321
- if (this.customerConfig.OIDC.client.enabled) {
322
- const token = await this.manageToken();
323
- headers = {
324
- ...headers,
325
- Authorization: `Bearer ${token}`
326
- };
327
- this.apiClient.defaults.headers.common["Authorization"] = `Bearer ${token}`;
328
- }
329
- for (let retry = 0; retry < API.MAX_RETRY; retry++) {
330
- try {
331
- response = await this.apiClient.request({
332
- url,
333
- method,
334
- data: body,
335
- params,
336
- headers
337
- });
338
- break;
339
- } catch (error) {
340
- this.logger.log({
341
- level: "error",
342
- message: `API.execute ${retry + 1}\xBA error when request ${url}. Error: ${error}`
343
- });
344
- if (retry === API.MAX_RETRY - 1) {
345
- throw error;
346
- }
327
+ try {
328
+ await this.initAPI();
329
+ let response = void 0;
330
+ if (this.customerConfig.OIDC.client.enabled) {
331
+ const token = await this.manageToken();
332
+ headers = {
333
+ ...headers,
334
+ Authorization: `Bearer ${token}`
335
+ };
336
+ this.apiClient.defaults.headers.common["Authorization"] = `Bearer ${token}`;
347
337
  }
338
+ response = await this.apiClient.request({
339
+ url,
340
+ method,
341
+ data: body,
342
+ params,
343
+ headers
344
+ });
345
+ if (response) {
346
+ return response.data;
347
+ }
348
+ throw new Error("API.execute error: Failed to retrieve a valid response");
349
+ } catch (error) {
350
+ this.logger.log({
351
+ level: "error",
352
+ message: `CrexAPI.execute error: ${error}`
353
+ });
354
+ throw error;
348
355
  }
349
- if (response) {
350
- return response.data;
351
- }
352
- throw new Error("API.execute error: Failed to retrieve a valid response");
353
356
  }
354
357
  };
355
358
 
@@ -379,10 +382,15 @@ var import_clsx = require("clsx");
379
382
  var import_tailwind_merge = require("tailwind-merge");
380
383
 
381
384
  // ../utils/src/params.ts
382
- var createParams = (fieldsList, key = "Fields") => fieldsList.map((item) => ({
383
- key,
384
- value: item
385
- }));
385
+ var createParams = (fieldsList, key = "Fields") => {
386
+ if (!fieldsList || fieldsList.length === 0) {
387
+ return [];
388
+ }
389
+ return fieldsList.map((item) => ({
390
+ key,
391
+ value: item
392
+ }));
393
+ };
386
394
  var generateQueryParams = (params) => {
387
395
  const queryParams = params.map((param) => `${encodeURIComponent(param.key)}=${encodeURIComponent(param.value)}`).join("&");
388
396
  return queryParams;
@@ -530,12 +538,11 @@ var DirectoryNodesService = class extends BaseService {
530
538
  };
531
539
 
532
540
  // src/transforms/documentTypes.ts
533
- var import_next_cookies3 = require("@c-rex/utils/next-cookies");
534
- var import_headers2 = require("next/headers");
535
- var transformDocumentTypes = (data) => {
541
+ var import_headers3 = require("next/headers");
542
+ var transformDocumentTypes = async (data) => {
536
543
  const labels = [];
537
- const config = (0, import_next_cookies3.getClientConfigs)();
538
- const contentLanguage = (0, import_headers2.cookies)().get(CONTENT_LANG_KEY)?.value || config.languageSwitcher.default;
544
+ const config = getClientConfig();
545
+ const contentLanguage = (0, import_headers3.cookies)().get(CONTENT_LANG_KEY)?.value || config.languageSwitcher.default;
539
546
  const language = contentLanguage.split("-")[0];
540
547
  data.items.forEach((documentItem) => {
541
548
  const label = documentItem.labels.find((item) => item.language.toLowerCase() === language.toLowerCase());
@@ -570,13 +577,12 @@ var DocumentTypesService = class extends BaseService {
570
577
  };
571
578
 
572
579
  // src/transforms/information.ts
573
- var import_next_cookies4 = require("@c-rex/utils/next-cookies");
574
- var import_headers3 = require("next/headers");
575
- var import_logger2 = require("@c-rex/core/logger");
580
+ var import_headers4 = require("next/headers");
581
+ var import_logger3 = require("@c-rex/core/logger");
576
582
  var transformInformationUnits = async (data) => {
577
- const logger = new import_logger2.CrexLogger();
578
- const frontEndConfig = await (0, import_next_cookies4.getClientConfigs)();
579
- const backEndConfig = await (0, import_next_cookies4.getServerConfigs)();
583
+ const logger = new import_logger3.CrexLogger();
584
+ const frontEndConfig = getClientConfig();
585
+ const backEndConfig = getServerConfig();
580
586
  const filteredTags = {};
581
587
  const items = data.items.map((item) => {
582
588
  const type = item.class.labels.filter((item2) => item2.language === EN_LANG)[0].value.toUpperCase();
@@ -588,34 +594,34 @@ var transformInformationUnits = async (data) => {
588
594
  link = `/documents/${item.shortId}`;
589
595
  }
590
596
  let title = "NO TITLE";
597
+ if (item.titles) {
598
+ title = item.titles[0].value;
599
+ } else if (item.labels) {
600
+ title = item.labels[0].value;
601
+ }
591
602
  let language = "NO LANGUAGE";
592
- try {
593
- if (item.titles) {
594
- title = item.titles[0].value;
595
- language = item.titles[0].language;
596
- } else {
597
- title = item.labels[0].value;
598
- language = item.labels[0].language;
599
- }
600
- } catch {
601
- logger.log({
602
- level: "error",
603
- message: `No label or title on item ${item.shortId}`
604
- });
603
+ if (item.languages.length > 0) {
604
+ language = item.languages[0];
605
+ }
606
+ let versionOf = [];
607
+ if (item?.versionOf && item.versionOf?.labels) {
608
+ versionOf = item.versionOf.labels.map((item2) => item2.language).filter((value) => value !== void 0);
605
609
  }
606
610
  return {
607
611
  language,
608
612
  title,
609
613
  type,
610
614
  localeType: "",
615
+ revision: item.revision,
611
616
  shortId: item.shortId,
617
+ multipleVersions: versionOf,
612
618
  disabled: frontEndConfig.results.disabledResults.includes(type),
613
619
  link,
614
620
  files
615
621
  };
616
622
  });
617
623
  if (data.tags) {
618
- const contentLang = ((0, import_headers3.cookies)().get(CONTENT_LANG_KEY)?.value || EN_LANG).toLowerCase();
624
+ const contentLang = ((0, import_headers4.cookies)().get(CONTENT_LANG_KEY)?.value || EN_LANG).toLowerCase();
619
625
  const splittedContentLang = contentLang.split("-")[0];
620
626
  for (const [key, value] of Object.entries(data.tags)) {
621
627
  if (!value || !value.items || value.items.length === 0) {
@@ -685,8 +691,10 @@ var transformSuggestions = (data, query) => {
685
691
 
686
692
  // src/informationUnits.ts
687
693
  var InformationUnitsService = class extends BaseService {
688
- constructor() {
694
+ directoryNodesService;
695
+ constructor(directoryNodesService) {
689
696
  super("InformationUnits/");
697
+ this.directoryNodesService = directoryNodesService || new DirectoryNodesService();
690
698
  }
691
699
  /**
692
700
  * Retrieves a list of information units based on specified criteria.
@@ -716,7 +724,6 @@ var InformationUnitsService = class extends BaseService {
716
724
  const remainFilters = createParams(filters, "Filter");
717
725
  const restrictions = createParams(restrict, "Restrict");
718
726
  const remainTags = createParams(tags, "Tags");
719
- const languageParam = `VALUES ?lang { ${languages.map((lang) => `"${lang}"`).join(" ")} } ?s iirds:language ?lang .`;
720
727
  const params = [
721
728
  { key: "pageSize", value: "12" },
722
729
  { key: "wildcard", value: wildcard.toLowerCase() },
@@ -729,6 +736,7 @@ var InformationUnitsService = class extends BaseService {
729
736
  ...restrictions
730
737
  ];
731
738
  if (languages.length > 0) {
739
+ const languageParam = `VALUES ?lang { ${languages.map((lang) => `"${lang}"`).join(" ")} } ?s iirds:language ?lang .`;
732
740
  params.push({ key: "sparqlWhere", value: languageParam });
733
741
  }
734
742
  if (queries.length > 0) {
@@ -789,13 +797,39 @@ var InformationUnitsService = class extends BaseService {
789
797
  transformer: (data) => transformSuggestions(data, query)
790
798
  });
791
799
  }
800
+ async getDocumentInfo({ shortId }) {
801
+ const response = await this.getItem({
802
+ id: shortId,
803
+ shouldGetAllFields: true
804
+ });
805
+ const directoryNodes = response.directoryNodes;
806
+ if (directoryNodes.length === 0 || !directoryNodes[0]) {
807
+ return {};
808
+ }
809
+ let id = directoryNodes[0].shortId;
810
+ let node = await this.directoryNodesService.getItem(id);
811
+ if (!node.ancestors || node.ancestors.length === 0) return {};
812
+ const hasInfo = node.informationUnits?.[0];
813
+ const hasLabel = node.labels?.[0];
814
+ if (!hasInfo || !hasLabel) return {};
815
+ const lastIndex = node.ancestors[0]?.length - 1;
816
+ const ancestorNode = node.ancestors[0][lastIndex];
817
+ if (!ancestorNode?.shortId) return {};
818
+ id = ancestorNode.shortId;
819
+ node = await this.directoryNodesService.getItem(id);
820
+ const ancestorInfoUnit = node.informationUnits?.[0];
821
+ const ancestorLabel = ancestorInfoUnit?.labels?.[0];
822
+ return {
823
+ documentId: ancestorInfoUnit?.shortId,
824
+ label: ancestorLabel?.value || ""
825
+ };
826
+ }
792
827
  };
793
828
 
794
829
  // src/language.ts
795
- var import_next_cookies5 = require("@c-rex/utils/next-cookies");
796
830
  var LanguageService = class extends BaseService {
797
831
  constructor() {
798
- const configs = (0, import_next_cookies5.getClientConfigs)();
832
+ const configs = getClientConfig();
799
833
  super(configs.languageSwitcher.endpoint);
800
834
  }
801
835
  /**
@@ -832,13 +866,12 @@ var LanguageService = class extends BaseService {
832
866
  };
833
867
 
834
868
  // src/transforms/topics.ts
835
- var import_next_cookies6 = require("@c-rex/utils/next-cookies");
836
- var import_headers4 = require("next/headers");
837
- var import_logger3 = require("@c-rex/core/logger");
869
+ var import_headers5 = require("next/headers");
870
+ var import_logger4 = require("@c-rex/core/logger");
838
871
  var transformTopics = async (data) => {
839
- const logger = new import_logger3.CrexLogger();
840
- const config = (0, import_next_cookies6.getClientConfigs)();
841
- const uiLang = ((0, import_headers4.cookies)().get(UI_LANG_KEY)?.value || config.languageSwitcher.default).toLowerCase();
872
+ const logger = new import_logger4.CrexLogger();
873
+ const config = getClientConfig();
874
+ const uiLang = ((0, import_headers5.cookies)().get(UI_LANG_KEY)?.value || config.languageSwitcher.default).toLowerCase();
842
875
  const items = data.items.map((item) => {
843
876
  const type = item.class.labels.filter((item2) => item2.language === EN_LANG)[0].value.toUpperCase();
844
877
  let link = `/topics/${item.shortId}`;