@floristcloud/api-lib 1.2.112 → 1.2.113

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.
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONTACT_PHONE_LABEL_MAX_LENGTH = exports.CONTACT_PHONE_MAX_LENGTH = exports.CONTACT_PHONE_LIST_MAX_LENGTH = void 0;
4
+ // Ограничение на длину списка контактов вебшопа: блок контактов рисуется в шапке и в мобильном
5
+ // меню, больше десятка номеров туда не помещается физически.
6
+ exports.CONTACT_PHONE_LIST_MAX_LENGTH = 10;
7
+ // Потолки для полей одного контакта. Список лежит в JSON-колонке, где длину не держит тип колонки,
8
+ // поэтому единственная граница — схема. Номер с кодом страны и разделителями в 32 символа
9
+ // укладывается с запасом, подпись отдела («отдел продаж», «склад») — в 64.
10
+ exports.CONTACT_PHONE_MAX_LENGTH = 32;
11
+ exports.CONTACT_PHONE_LABEL_MAX_LENGTH = 64;
@@ -81,6 +81,9 @@ exports.ERRORS = {
81
81
  SETTINGS_NOT_UPDATED: { code: 'S003', message: 'Failed to update settings', httpCode: 500 },
82
82
  SETTINGS_NOT_FOUND: { code: 'S005', message: 'Settings not found', httpCode: 404 },
83
83
  SETTINGS_FETCH_FAILED: { code: 'S006', message: 'Error when retrieving a Settings', httpCode: 500 },
84
+ // 409, а не 403: фильтр исключений маскирует текст любого 403 общим «Access denied», а здесь
85
+ // клиенту важно получить причину — заказы отключены временно, доступ ни при чём.
86
+ ORDERS_DISABLED_BY_SETTINGS: { code: 'S007', message: 'Ordering is temporarily disabled by the company', httpCode: 409 },
84
87
  FORBIDDEN_API: { code: 'A011', message: 'Access denied', httpCode: 403 },
85
88
  RESOURCE_ACCESS_DENIED: { code: 'A022', message: 'Resource does not belong to your company', httpCode: 400 },
86
89
  RESOURCE_NOT_FOUND: { code: 'A023', message: 'Resource not found', httpCode: 404 },
@@ -21,3 +21,5 @@ __exportStar(require("./import.constant"), exports);
21
21
  __exportStar(require("./validation-i18n-key"), exports);
22
22
  __exportStar(require("./validation-i18n-message"), exports);
23
23
  __exportStar(require("./report.constant"), exports);
24
+ __exportStar(require("./contact-phone.constant"), exports);
25
+ __exportStar(require("./settings.constant"), exports);
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DISABLE_ORDERS_MESSAGE_MAX_LENGTH = void 0;
4
+ // Текст режима «запрет заказов» («Возобновим работу в 16.00 после инвентаризации»). Витрина рисует
5
+ // его баннером вместо каталога, поэтому это короткое объявление, а не страница: 300 символов.
6
+ exports.DISABLE_ORDERS_MESSAGE_MAX_LENGTH = 300;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContactMessengerEnum = void 0;
4
+ var ContactMessengerEnum;
5
+ (function (ContactMessengerEnum) {
6
+ ContactMessengerEnum["WHATSAPP"] = "whatsapp";
7
+ ContactMessengerEnum["TELEGRAM"] = "telegram";
8
+ ContactMessengerEnum["MAX"] = "max";
9
+ })(ContactMessengerEnum || (exports.ContactMessengerEnum = ContactMessengerEnum = {}));
@@ -97,6 +97,7 @@ __exportStar(require("./order-webshop-available-status-list"), exports);
97
97
  __exportStar(require("./transaction-type-groups"), exports);
98
98
  __exportStar(require("./chat-has-manager-mode.enum"), exports);
99
99
  __exportStar(require("./chat-no-manager-mode.enum"), exports);
100
+ __exportStar(require("./contact-messenger.enum"), exports);
100
101
  __exportStar(require("./match-confidence.enum"), exports);
101
102
  __exportStar(require("./session-platform.enum"), exports);
102
103
  __exportStar(require("./device-platform.enum"), exports);
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UpdateSettingsRequestSchema = exports.CreateSettingsSchema = exports.SettingsForAdminSchema = exports.SettingsSchema = exports.DeliveryPricingTierSchema = exports.ImportantMessageSchema = exports.SettingsWorkingHoursSchema = void 0;
3
+ exports.UpdateSettingsRequestSchema = exports.CreateSettingsSchema = exports.SettingsForAdminSchema = exports.SettingsSchema = exports.DeliveryPricingTierSchema = exports.DisableOrdersMessageSchema = exports.ContactPhoneListSchema = exports.ContactPhoneSchema = exports.ImportantMessageSchema = exports.SettingsWorkingHoursSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const enum_1 = require("../../enum");
6
+ const contact_phone_constant_1 = require("../../constant/contact-phone.constant");
7
+ const settings_constant_1 = require("../../constant/settings.constant");
6
8
  const webshop_main_display_mode_enum_1 = require("../../enum/webshop-main-display-mode.enum");
7
9
  const menu_items_url_enum_1 = require("../../enum/menu-items-url.enum");
8
10
  const non_negative_money_schema_1 = require("../non-negative-money.schema");
@@ -21,6 +23,17 @@ exports.ImportantMessageSchema = zod_1.z.object({
21
23
  description: zod_1.z.string(),
22
24
  isActive: zod_1.z.boolean(),
23
25
  });
26
+ // Один контакт из блока контактов вебшопа: номер, подпись отдела («отдел продаж», «склад») и
27
+ // мессенджеры, доступные по этому же номеру. Порядок вывода задаётся порядком элементов в массиве.
28
+ exports.ContactPhoneSchema = zod_1.z.object({
29
+ phone: zod_1.z.string().min(1).max(contact_phone_constant_1.CONTACT_PHONE_MAX_LENGTH),
30
+ label: zod_1.z.string().max(contact_phone_constant_1.CONTACT_PHONE_LABEL_MAX_LENGTH).nullable(),
31
+ messengers: zod_1.z.array(zod_1.z.nativeEnum(enum_1.ContactMessengerEnum)),
32
+ });
33
+ exports.ContactPhoneListSchema = zod_1.z.array(exports.ContactPhoneSchema).max(contact_phone_constant_1.CONTACT_PHONE_LIST_MAX_LENGTH);
34
+ // Один потолок на все три схемы настроек: колонка `disable_orders_message` — TEXT, длину держит
35
+ // только валидация.
36
+ exports.DisableOrdersMessageSchema = zod_1.z.string().max(settings_constant_1.DISABLE_ORDERS_MESSAGE_MAX_LENGTH);
24
37
  // Обе величины — деньги: `minSubtotal` сравнивается с суммой заказа, `cost` попадает в
25
38
  // `order.delivery_cost`. Живут они внутри JSON-колонки, куда ALTER TABLE не достаёт, поэтому
26
39
  // точность здесь держит не тип колонки, а формат значения — та же десятичная строка, что и на проводе.
@@ -72,6 +85,7 @@ exports.SettingsSchema = zod_1.z.object({
72
85
  phoneSales: zod_1.z.string().nullable(),
73
86
  phoneWhatsappSales: zod_1.z.string().nullable(),
74
87
  telegramChannel: zod_1.z.string().nullable(),
88
+ contactPhoneList: exports.ContactPhoneListSchema.nullable(),
75
89
  menuItemsSort: zod_1.z.array(zod_1.z.nativeEnum(menu_items_url_enum_1.MenuItemsUrlEnum)).nullable(),
76
90
  phoneCountryCode: zod_1.z.array(zod_1.z.string()),
77
91
  aboutCompany: zod_1.z.string().nullable(),
@@ -82,6 +96,7 @@ exports.SettingsSchema = zod_1.z.object({
82
96
  deliveryPolicy: zod_1.z.string().nullable(),
83
97
  writeOffPolicy: zod_1.z.string().nullable(),
84
98
  disableOrders: zod_1.z.boolean(),
99
+ disableOrdersMessage: exports.DisableOrdersMessageSchema.nullable(),
85
100
  bankHookEnabled: zod_1.z.coerce.boolean().optional(),
86
101
  loginImageList: zod_1.z.array(zod_1.z.string()),
87
102
  loginImageKeyList: zod_1.z.array(zod_1.z.string()),
@@ -158,6 +173,7 @@ exports.CreateSettingsSchema = zod_1.z.object({
158
173
  phoneSales: zod_1.z.string().nullable().optional(),
159
174
  phoneWhatsappSales: zod_1.z.string().nullable().optional(),
160
175
  telegramChannel: zod_1.z.string().nullable().optional(),
176
+ contactPhoneList: exports.ContactPhoneListSchema.nullable().optional(),
161
177
  menuItemsSort: zod_1.z.array(zod_1.z.nativeEnum(menu_items_url_enum_1.MenuItemsUrlEnum)).nullable().optional(),
162
178
  phoneCountryCode: zod_1.z.array(zod_1.z.string()).optional(),
163
179
  aboutCompany: zod_1.z.string().nullable().optional(),
@@ -168,6 +184,7 @@ exports.CreateSettingsSchema = zod_1.z.object({
168
184
  deliveryPolicy: zod_1.z.string().nullable().optional(),
169
185
  writeOffPolicy: zod_1.z.string().nullable().optional(),
170
186
  disableOrders: zod_1.z.boolean().optional(),
187
+ disableOrdersMessage: exports.DisableOrdersMessageSchema.nullable().optional(),
171
188
  isMessengerEnabled: zod_1.z.coerce.boolean().optional(),
172
189
  isWriteOffAcceptanceEnabled: zod_1.z.coerce.boolean().optional(),
173
190
  isInvoiceDownloadEnabled: zod_1.z.coerce.boolean().optional(),
@@ -219,6 +236,7 @@ exports.UpdateSettingsRequestSchema = zod_1.z.object({
219
236
  phoneSales: zod_1.z.string().nullable().optional(),
220
237
  phoneWhatsappSales: zod_1.z.string().nullable().optional(),
221
238
  telegramChannel: zod_1.z.string().nullable().optional(),
239
+ contactPhoneList: exports.ContactPhoneListSchema.nullable().optional(),
222
240
  menuItemsSort: zod_1.z.array(zod_1.z.nativeEnum(menu_items_url_enum_1.MenuItemsUrlEnum)).nullable().optional(),
223
241
  phoneCountryCode: zod_1.z.array(zod_1.z.string()).optional(),
224
242
  aboutCompany: zod_1.z.string().nullable().optional(),
@@ -229,6 +247,7 @@ exports.UpdateSettingsRequestSchema = zod_1.z.object({
229
247
  deliveryPolicy: zod_1.z.string().nullable().optional(),
230
248
  writeOffPolicy: zod_1.z.string().nullable().optional(),
231
249
  disableOrders: zod_1.z.boolean().optional(),
250
+ disableOrdersMessage: exports.DisableOrdersMessageSchema.nullable().optional(),
232
251
  isMessengerEnabled: zod_1.z.coerce.boolean().optional(),
233
252
  isWriteOffAcceptanceEnabled: zod_1.z.coerce.boolean().optional(),
234
253
  isInvoiceDownloadEnabled: zod_1.z.coerce.boolean().optional(),
@@ -0,0 +1,9 @@
1
+ // Ограничение на длину списка контактов вебшопа: блок контактов рисуется в шапке и в мобильном
2
+ // меню, больше десятка номеров туда не помещается физически.
3
+ export const CONTACT_PHONE_LIST_MAX_LENGTH = 10;
4
+
5
+ // Потолки для полей одного контакта. Список лежит в JSON-колонке, где длину не держит тип колонки,
6
+ // поэтому единственная граница — схема. Номер с кодом страны и разделителями в 32 символа
7
+ // укладывается с запасом, подпись отдела («отдел продаж», «склад») — в 64.
8
+ export const CONTACT_PHONE_MAX_LENGTH = 32;
9
+ export const CONTACT_PHONE_LABEL_MAX_LENGTH = 64;
package/constant/error.ts CHANGED
@@ -81,6 +81,9 @@ export const ERRORS = {
81
81
  SETTINGS_NOT_UPDATED: { code: 'S003', message: 'Failed to update settings', httpCode: 500 },
82
82
  SETTINGS_NOT_FOUND: { code: 'S005', message: 'Settings not found', httpCode: 404 },
83
83
  SETTINGS_FETCH_FAILED: { code: 'S006', message: 'Error when retrieving a Settings', httpCode: 500 },
84
+ // 409, а не 403: фильтр исключений маскирует текст любого 403 общим «Access denied», а здесь
85
+ // клиенту важно получить причину — заказы отключены временно, доступ ни при чём.
86
+ ORDERS_DISABLED_BY_SETTINGS: { code: 'S007', message: 'Ordering is temporarily disabled by the company', httpCode: 409 },
84
87
 
85
88
  FORBIDDEN_API: { code: 'A011', message: 'Access denied', httpCode: 403 },
86
89
  RESOURCE_ACCESS_DENIED: { code: 'A022', message: 'Resource does not belong to your company', httpCode: 400 },
package/constant/index.ts CHANGED
@@ -5,3 +5,5 @@ export * from './import.constant';
5
5
  export * from './validation-i18n-key';
6
6
  export * from './validation-i18n-message';
7
7
  export * from './report.constant';
8
+ export * from './contact-phone.constant';
9
+ export * from './settings.constant';
@@ -0,0 +1,3 @@
1
+ // Текст режима «запрет заказов» («Возобновим работу в 16.00 после инвентаризации»). Витрина рисует
2
+ // его баннером вместо каталога, поэтому это короткое объявление, а не страница: 300 символов.
3
+ export const DISABLE_ORDERS_MESSAGE_MAX_LENGTH = 300;
@@ -0,0 +1,5 @@
1
+ export enum ContactMessengerEnum {
2
+ WHATSAPP = 'whatsapp',
3
+ TELEGRAM = 'telegram',
4
+ MAX = 'max',
5
+ }
package/enum/index.ts CHANGED
@@ -81,6 +81,7 @@ export * from './order-webshop-available-status-list';
81
81
  export * from './transaction-type-groups';
82
82
  export * from './chat-has-manager-mode.enum';
83
83
  export * from './chat-no-manager-mode.enum';
84
+ export * from './contact-messenger.enum';
84
85
  export * from './match-confidence.enum';
85
86
  export * from './session-platform.enum';
86
87
  export * from './device-platform.enum';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floristcloud/api-lib",
3
- "version": "1.2.112",
3
+ "version": "1.2.113",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {
@@ -1,5 +1,18 @@
1
1
  import { z } from 'zod';
2
- import { ChatHasManagerModeEnum, ChatNoManagerModeEnum, DiscountPriceRoundingEnum, LanguageEnum, WebshopModeEnum } from '../../enum';
2
+ import {
3
+ ChatHasManagerModeEnum,
4
+ ChatNoManagerModeEnum,
5
+ ContactMessengerEnum,
6
+ DiscountPriceRoundingEnum,
7
+ LanguageEnum,
8
+ WebshopModeEnum,
9
+ } from '../../enum';
10
+ import {
11
+ CONTACT_PHONE_LABEL_MAX_LENGTH,
12
+ CONTACT_PHONE_LIST_MAX_LENGTH,
13
+ CONTACT_PHONE_MAX_LENGTH,
14
+ } from '../../constant/contact-phone.constant';
15
+ import { DISABLE_ORDERS_MESSAGE_MAX_LENGTH } from '../../constant/settings.constant';
3
16
  import { WebshopMainDisplayModeEnum } from '../../enum/webshop-main-display-mode.enum';
4
17
  import { MenuItemsUrlEnum } from '../../enum/menu-items-url.enum';
5
18
  import { MoneySchema } from '../money.schema';
@@ -22,6 +35,20 @@ export const ImportantMessageSchema = z.object({
22
35
  isActive: z.boolean(),
23
36
  });
24
37
 
38
+ // Один контакт из блока контактов вебшопа: номер, подпись отдела («отдел продаж», «склад») и
39
+ // мессенджеры, доступные по этому же номеру. Порядок вывода задаётся порядком элементов в массиве.
40
+ export const ContactPhoneSchema = z.object({
41
+ phone: z.string().min(1).max(CONTACT_PHONE_MAX_LENGTH),
42
+ label: z.string().max(CONTACT_PHONE_LABEL_MAX_LENGTH).nullable(),
43
+ messengers: z.array(z.nativeEnum(ContactMessengerEnum)),
44
+ });
45
+
46
+ export const ContactPhoneListSchema = z.array(ContactPhoneSchema).max(CONTACT_PHONE_LIST_MAX_LENGTH);
47
+
48
+ // Один потолок на все три схемы настроек: колонка `disable_orders_message` — TEXT, длину держит
49
+ // только валидация.
50
+ export const DisableOrdersMessageSchema = z.string().max(DISABLE_ORDERS_MESSAGE_MAX_LENGTH);
51
+
25
52
  // Обе величины — деньги: `minSubtotal` сравнивается с суммой заказа, `cost` попадает в
26
53
  // `order.delivery_cost`. Живут они внутри JSON-колонки, куда ALTER TABLE не достаёт, поэтому
27
54
  // точность здесь держит не тип колонки, а формат значения — та же десятичная строка, что и на проводе.
@@ -74,6 +101,7 @@ export const SettingsSchema = z.object({
74
101
  phoneSales: z.string().nullable(),
75
102
  phoneWhatsappSales: z.string().nullable(),
76
103
  telegramChannel: z.string().nullable(),
104
+ contactPhoneList: ContactPhoneListSchema.nullable(),
77
105
  menuItemsSort: z.array(z.nativeEnum(MenuItemsUrlEnum)).nullable(),
78
106
  phoneCountryCode: z.array(z.string()),
79
107
  aboutCompany: z.string().nullable(),
@@ -84,6 +112,7 @@ export const SettingsSchema = z.object({
84
112
  deliveryPolicy: z.string().nullable(),
85
113
  writeOffPolicy: z.string().nullable(),
86
114
  disableOrders: z.boolean(),
115
+ disableOrdersMessage: DisableOrdersMessageSchema.nullable(),
87
116
  bankHookEnabled: z.coerce.boolean().optional(),
88
117
  loginImageList: z.array(z.string()),
89
118
  loginImageKeyList: z.array(z.string()),
@@ -164,6 +193,7 @@ export const CreateSettingsSchema = z.object({
164
193
  phoneSales: z.string().nullable().optional(),
165
194
  phoneWhatsappSales: z.string().nullable().optional(),
166
195
  telegramChannel: z.string().nullable().optional(),
196
+ contactPhoneList: ContactPhoneListSchema.nullable().optional(),
167
197
  menuItemsSort: z.array(z.nativeEnum(MenuItemsUrlEnum)).nullable().optional(),
168
198
  phoneCountryCode: z.array(z.string()).optional(),
169
199
  aboutCompany: z.string().nullable().optional(),
@@ -174,6 +204,7 @@ export const CreateSettingsSchema = z.object({
174
204
  deliveryPolicy: z.string().nullable().optional(),
175
205
  writeOffPolicy: z.string().nullable().optional(),
176
206
  disableOrders: z.boolean().optional(),
207
+ disableOrdersMessage: DisableOrdersMessageSchema.nullable().optional(),
177
208
  isMessengerEnabled: z.coerce.boolean().optional(),
178
209
  isWriteOffAcceptanceEnabled: z.coerce.boolean().optional(),
179
210
  isInvoiceDownloadEnabled: z.coerce.boolean().optional(),
@@ -228,6 +259,7 @@ export const UpdateSettingsRequestSchema = z.object({
228
259
  phoneSales: z.string().nullable().optional(),
229
260
  phoneWhatsappSales: z.string().nullable().optional(),
230
261
  telegramChannel: z.string().nullable().optional(),
262
+ contactPhoneList: ContactPhoneListSchema.nullable().optional(),
231
263
  menuItemsSort: z.array(z.nativeEnum(MenuItemsUrlEnum)).nullable().optional(),
232
264
  phoneCountryCode: z.array(z.string()).optional(),
233
265
  aboutCompany: z.string().nullable().optional(),
@@ -238,6 +270,7 @@ export const UpdateSettingsRequestSchema = z.object({
238
270
  deliveryPolicy: z.string().nullable().optional(),
239
271
  writeOffPolicy: z.string().nullable().optional(),
240
272
  disableOrders: z.boolean().optional(),
273
+ disableOrdersMessage: DisableOrdersMessageSchema.nullable().optional(),
241
274
  isMessengerEnabled: z.coerce.boolean().optional(),
242
275
  isWriteOffAcceptanceEnabled: z.coerce.boolean().optional(),
243
276
  isInvoiceDownloadEnabled: z.coerce.boolean().optional(),