@unchainedshop/api 4.0.0-rc.15 → 4.0.0-rc.16

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 (117) hide show
  1. package/lib/chat/defaultSystemPrompt.d.ts +3 -0
  2. package/lib/chat/defaultSystemPrompt.d.ts.map +1 -0
  3. package/lib/chat/defaultSystemPrompt.js +7 -0
  4. package/lib/chat/defaultSystemPrompt.js.map +1 -0
  5. package/lib/chat/generateImageHandler.d.ts +7 -0
  6. package/lib/chat/generateImageHandler.d.ts.map +1 -0
  7. package/lib/chat/generateImageHandler.js +64 -0
  8. package/lib/chat/generateImageHandler.js.map +1 -0
  9. package/lib/chat/normalizeToolsIndex.d.ts +7 -0
  10. package/lib/chat/normalizeToolsIndex.d.ts.map +1 -0
  11. package/lib/chat/normalizeToolsIndex.js +11 -0
  12. package/lib/chat/normalizeToolsIndex.js.map +1 -0
  13. package/lib/chat/utils.d.ts +13 -0
  14. package/lib/chat/utils.d.ts.map +1 -0
  15. package/lib/chat/utils.js +32 -0
  16. package/lib/chat/utils.js.map +1 -0
  17. package/lib/context.d.ts +3 -0
  18. package/lib/context.d.ts.map +1 -1
  19. package/lib/context.js.map +1 -1
  20. package/lib/express/chatHandler.d.ts +5 -0
  21. package/lib/express/chatHandler.d.ts.map +1 -0
  22. package/lib/express/chatHandler.js +116 -0
  23. package/lib/express/chatHandler.js.map +1 -0
  24. package/lib/express/createBulkImportMiddleware.d.ts.map +1 -1
  25. package/lib/express/createBulkImportMiddleware.js +6 -7
  26. package/lib/express/createBulkImportMiddleware.js.map +1 -1
  27. package/lib/express/createERCMetadataMiddleware.d.ts.map +1 -1
  28. package/lib/express/createERCMetadataMiddleware.js +5 -9
  29. package/lib/express/createERCMetadataMiddleware.js.map +1 -1
  30. package/lib/express/createTempUploadMiddleware.d.ts.map +1 -1
  31. package/lib/express/createTempUploadMiddleware.js +4 -8
  32. package/lib/express/createTempUploadMiddleware.js.map +1 -1
  33. package/lib/express/index.d.ts +1 -0
  34. package/lib/express/index.d.ts.map +1 -1
  35. package/lib/express/index.js +1 -0
  36. package/lib/express/index.js.map +1 -1
  37. package/lib/fastify/bulkImportHandler.js +5 -6
  38. package/lib/fastify/bulkImportHandler.js.map +1 -1
  39. package/lib/fastify/chatHandler.d.ts +4 -0
  40. package/lib/fastify/chatHandler.d.ts.map +1 -0
  41. package/lib/fastify/chatHandler.js +110 -0
  42. package/lib/fastify/chatHandler.js.map +1 -0
  43. package/lib/fastify/ercMetadataHandler.d.ts.map +1 -1
  44. package/lib/fastify/ercMetadataHandler.js +3 -6
  45. package/lib/fastify/ercMetadataHandler.js.map +1 -1
  46. package/lib/fastify/index.d.ts +6 -1
  47. package/lib/fastify/index.d.ts.map +1 -1
  48. package/lib/fastify/index.js +28 -0
  49. package/lib/fastify/index.js.map +1 -1
  50. package/lib/fastify/mcpHandler.js +2 -2
  51. package/lib/fastify/mcpHandler.js.map +1 -1
  52. package/lib/fastify/tempUploadHandler.d.ts.map +1 -1
  53. package/lib/fastify/tempUploadHandler.js +3 -6
  54. package/lib/fastify/tempUploadHandler.js.map +1 -1
  55. package/lib/mcp/tools/product/handlers/addProductMedia.d.ts +26 -1
  56. package/lib/mcp/tools/product/handlers/addProductMedia.d.ts.map +1 -1
  57. package/lib/mcp/tools/product/handlers/addProductMedia.js +4 -4
  58. package/lib/mcp/tools/product/handlers/addProductMedia.js.map +1 -1
  59. package/lib/mcp/tools/product/handlers/updateProduct.d.ts.map +1 -1
  60. package/lib/mcp/tools/product/handlers/updateProduct.js +10 -2
  61. package/lib/mcp/tools/product/handlers/updateProduct.js.map +1 -1
  62. package/lib/mcp/tools/product/schemas.d.ts.map +1 -1
  63. package/lib/mcp/tools/product/schemas.js +3 -3
  64. package/lib/mcp/tools/product/schemas.js.map +1 -1
  65. package/lib/mcp/tools/users/schemas.d.ts +14 -14
  66. package/lib/mcp/utils/getNormalizedProductDetails.d.ts.map +1 -1
  67. package/lib/mcp/utils/getNormalizedProductDetails.js +3 -1
  68. package/lib/mcp/utils/getNormalizedProductDetails.js.map +1 -1
  69. package/lib/resolvers/mutations/orders/checkoutCart.js +1 -1
  70. package/lib/resolvers/mutations/orders/checkoutCart.js.map +1 -1
  71. package/lib/resolvers/queries/shopInfo.d.ts.map +1 -1
  72. package/lib/resolvers/queries/shopInfo.js +49 -3
  73. package/lib/resolvers/queries/shopInfo.js.map +1 -1
  74. package/lib/resolvers/type/index.d.ts +1 -1
  75. package/lib/resolvers/type/media-types.d.ts.map +1 -1
  76. package/lib/resolvers/type/media-types.js +3 -1
  77. package/lib/resolvers/type/media-types.js.map +1 -1
  78. package/lib/resolvers/type/price-types.d.ts +1 -1
  79. package/lib/resolvers/type/price-types.d.ts.map +1 -1
  80. package/lib/resolvers/type/price-types.js +5 -2
  81. package/lib/resolvers/type/price-types.js.map +1 -1
  82. package/lib/resolvers/type/shop-types.d.ts.map +1 -1
  83. package/lib/resolvers/type/shop-types.js.map +1 -1
  84. package/lib/schema/query.d.ts.map +1 -1
  85. package/lib/schema/query.js +2 -0
  86. package/lib/schema/query.js.map +1 -1
  87. package/lib/schema/types/shop.d.ts.map +1 -1
  88. package/lib/schema/types/shop.js +3 -0
  89. package/lib/schema/types/shop.js.map +1 -1
  90. package/package.json +13 -3
  91. package/src/chat/defaultSystemPrompt.ts +7 -0
  92. package/src/chat/generateImageHandler.ts +78 -0
  93. package/src/chat/normalizeToolsIndex.ts +11 -0
  94. package/src/chat/utils.ts +31 -0
  95. package/src/context.ts +3 -0
  96. package/src/express/chatHandler.ts +147 -0
  97. package/src/express/createBulkImportMiddleware.ts +7 -7
  98. package/src/express/createERCMetadataMiddleware.ts +5 -9
  99. package/src/express/createTempUploadMiddleware.ts +4 -9
  100. package/src/express/index.ts +2 -0
  101. package/src/fastify/bulkImportHandler.ts +6 -6
  102. package/src/fastify/chatHandler.ts +140 -0
  103. package/src/fastify/ercMetadataHandler.ts +3 -6
  104. package/src/fastify/index.ts +37 -1
  105. package/src/fastify/mcpHandler.ts +2 -2
  106. package/src/fastify/tempUploadHandler.ts +3 -6
  107. package/src/mcp/tools/product/handlers/addProductMedia.ts +4 -5
  108. package/src/mcp/tools/product/handlers/updateProduct.ts +12 -1
  109. package/src/mcp/tools/product/schemas.ts +7 -3
  110. package/src/mcp/utils/getNormalizedProductDetails.ts +4 -1
  111. package/src/resolvers/mutations/orders/checkoutCart.ts +1 -1
  112. package/src/resolvers/queries/shopInfo.ts +49 -3
  113. package/src/resolvers/type/media-types.ts +4 -1
  114. package/src/resolvers/type/price-types.ts +5 -3
  115. package/src/resolvers/type/shop-types.ts +0 -1
  116. package/src/schema/query.ts +2 -0
  117. package/src/schema/types/shop.ts +3 -0
@@ -1,3 +1,4 @@
1
+ import { readFile } from 'fs/promises';
1
2
  import { Context } from '../../context.js';
2
3
  import { log } from '@unchainedshop/logger';
3
4
 
@@ -10,14 +11,23 @@ export default function shopInfo(
10
11
  adminUiConfig?: Record<string, any>;
11
12
  vapidPublicKey?: string;
12
13
  } {
13
- const { adminUiConfig } = context;
14
+ const { adminUiConfig, modules } = context;
14
15
  log('query shopInfo', { userId: context.userId });
15
16
 
16
17
  return {
17
18
  version: context.version,
18
19
  adminUiConfig: {
19
- customProperties: adminUiConfig?.customProperties ?? [],
20
- singleSignOnURL: adminUiConfig?.singleSignOnURL,
20
+ customProperties: async () => {
21
+ try {
22
+ const raw = await readFile(process.env.UNCHAINED_ADMIN_UI_CUSTOM_PROPERTIES, 'utf-8');
23
+ const parsed = JSON.parse(raw);
24
+ return parsed;
25
+ } catch {
26
+ return adminUiConfig?.customProperties ?? [];
27
+ }
28
+ },
29
+ singleSignOnURL:
30
+ process.env.UNCHAINED_ADMIN_UI_SINGLE_SIGN_ON_URL || adminUiConfig?.singleSignOnURL,
21
31
  externalLinks: () => {
22
32
  try {
23
33
  const parsed = JSON.parse(process.env.EXTERNAL_LINKS);
@@ -26,6 +36,42 @@ export default function shopInfo(
26
36
  return [];
27
37
  }
28
38
  },
39
+ productTags: async () => {
40
+ const existingProductTags = await modules.products.existingTags();
41
+ const envTags = (process.env.UNCHAINED_ADMIN_UI_DEFAULT_PRODUCT_TAGS || '')
42
+ .split(',')
43
+ .map((t) => t.trim())
44
+ .filter(Boolean);
45
+ const normalizedDefaultTags = envTags?.length
46
+ ? envTags
47
+ : (adminUiConfig?.defaultProductTags || []).filter(Boolean);
48
+ const normalizedTags = Array.from(new Set(normalizedDefaultTags.concat(existingProductTags)));
49
+ return normalizedTags;
50
+ },
51
+ assortmentTags: async () => {
52
+ const existingAssortmentTags = await modules.assortments.existingTags();
53
+ const envTags = (process.env.UNCHAINED_ADMIN_UI_DEFAULT_ASSORTMENT_TAGS || '')
54
+ .split(',')
55
+ .map((t) => t.trim())
56
+ .filter(Boolean);
57
+ const normalizedDefaultTags = envTags?.length
58
+ ? envTags
59
+ : (adminUiConfig?.defaultAssortmentTags || []).filter(Boolean);
60
+ const normalizedTags = Array.from(new Set(normalizedDefaultTags.concat(existingAssortmentTags)));
61
+ return normalizedTags;
62
+ },
63
+ userTags: async () => {
64
+ const existingUserTags = await modules.users.existingTags();
65
+ const envTags = (process.env.UNCHAINED_ADMIN_UI_DEFAULT_USER_TAGS || '')
66
+ .split(',')
67
+ .map((t) => t.trim())
68
+ .filter(Boolean);
69
+ const normalizedDefaultTags = envTags?.length
70
+ ? envTags
71
+ : (adminUiConfig?.defaultUserTags || []).filter(Boolean);
72
+ const normalizedTags = Array.from(new Set(normalizedDefaultTags.concat(existingUserTags)));
73
+ return normalizedTags;
74
+ },
29
75
  },
30
76
  vapidPublicKey: process.env?.PUSH_NOTIFICATION_PUBLIC_KEY,
31
77
  };
@@ -2,6 +2,9 @@ import { File as FileType, getFileAdapter } from '@unchainedshop/core-files';
2
2
  import { Context } from '../../context.js';
3
3
  import { checkAction } from '../../acl.js';
4
4
  import { actions } from '../../roles/index.js';
5
+ import { createLogger } from '@unchainedshop/logger';
6
+
7
+ const logger = createLogger('unchained:api');
5
8
  export interface MediaHelperTypes {
6
9
  url: (language: FileType, params: Record<string, any>, context: Context) => Promise<string>;
7
10
  }
@@ -16,7 +19,7 @@ export const Media: MediaHelperTypes = {
16
19
  const url = await fileUploadAdapter.createDownloadURL(file, params?.expires);
17
20
  return modules.files.normalizeUrl(url, params);
18
21
  } catch (e) {
19
- console.error(e);
22
+ logger.error(e);
20
23
  return null;
21
24
  }
22
25
  },
@@ -1,5 +1,3 @@
1
- import accounting from 'accounting';
2
-
3
1
  export interface PriceType {
4
2
  isTaxable?: boolean;
5
3
  isNetPrice?: boolean;
@@ -21,7 +19,11 @@ export const Price = {
21
19
  },
22
20
  amount(obj: PriceType) {
23
21
  if (obj.amount) {
24
- return accounting.toFixed(obj.amount, 0);
22
+ return Number(obj.amount).toLocaleString(undefined, {
23
+ minimumFractionDigits: 0,
24
+ maximumFractionDigits: 0,
25
+ useGrouping: false,
26
+ });
25
27
  }
26
28
  return 0;
27
29
  },
@@ -5,7 +5,6 @@ import { checkAction } from '../../acl.js';
5
5
  import { allRoles, actions } from '../../roles/index.js';
6
6
 
7
7
  type HelperType<T> = (root: never, params: never, context: Context) => Promise<T>;
8
-
9
8
  export interface ShopHelperTypes {
10
9
  _id: () => string;
11
10
  country: HelperType<Country>;
@@ -22,6 +22,7 @@ export default [
22
22
  sort: [SortOptionInput!]
23
23
  emailVerified: Boolean
24
24
  lastLogin: DateFilterInput
25
+ tags: [LowerCaseString!]
25
26
  ): [User!]!
26
27
 
27
28
  """
@@ -32,6 +33,7 @@ export default [
32
33
  queryString: String
33
34
  emailVerified: Boolean
34
35
  lastLogin: DateFilterInput
36
+ tags: [LowerCaseString!]
35
37
  ): Int!
36
38
 
37
39
  """
@@ -25,6 +25,9 @@ export default [
25
25
  customProperties: [AdminUiConfigCustomEntityInterface!]!
26
26
  externalLinks: [AdminUiLink!]!
27
27
  singleSignOnURL: String
28
+ productTags: [String!]!
29
+ assortmentTags: [String!]!
30
+ userTags: [String!]!
28
31
  }
29
32
 
30
33
  type Shop @cacheControl(maxAge: 180) {