@gigapay-dev/contracts 1.8.1 → 1.8.3

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.
@@ -25,4 +25,4 @@ __exportStar(require("./payment-methods"), exports);
25
25
  __exportStar(require("./api-response"), exports);
26
26
  __exportStar(require("./users"), exports);
27
27
  __exportStar(require("./stats"), exports);
28
- __exportStar(require("./status"), exports);
28
+ __exportStar(require("./settings"), exports);
@@ -3,21 +3,38 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.OrderCreateResponseSchema = exports.OrderCreateRequestSchema = void 0;
6
+ exports.OrderCreateResponseSchema = exports.OrderCreateRequestSchema = exports.OrderItemInputSchema = void 0;
7
7
  const zod_1 = __importDefault(require("zod"));
8
8
  const enums_1 = require("./enums");
9
+ exports.OrderItemInputSchema = zod_1.default.object({
10
+ variantId: zod_1.default.coerce.number().int().positive(),
11
+ quantity: zod_1.default.coerce.number().int().min(1).default(1),
12
+ gameUsername: zod_1.default.string().max(255).optional(),
13
+ gameUsernameType: zod_1.default.string().max(64).optional(),
14
+ });
15
+ /** Запрос на создание заказа */
9
16
  exports.OrderCreateRequestSchema = zod_1.default.object({
17
+ /** Email покупателя */
10
18
  email: zod_1.default.string().email(),
11
- steamUsername: zod_1.default.string(),
12
- amount: zod_1.default.coerce.number().nonnegative(),
13
- userId: zod_1.default.coerce.number().positive().optional(),
19
+ /** ID способа оплаты */
14
20
  paymentMethodId: zod_1.default.coerce.number().positive(),
21
+ /** Список товаров в заказе (минимум 1) */
22
+ items: zod_1.default.array(exports.OrderItemInputSchema).min(1),
23
+ /** ID промокода (опционально) */
15
24
  promocodeId: zod_1.default.coerce.number().positive().optional(),
16
- type: enums_1.OrderType.optional().default('MAIN'),
25
+ /** ID существующего пользователя (опционально) */
26
+ userId: zod_1.default.coerce.number().positive().optional(),
27
+ /** Telegram ID покупателя (опционально) */
28
+ telegramId: zod_1.default.string().optional(),
29
+ /** UTM-метка источника трафика */
17
30
  utmSource: zod_1.default.string().optional(),
31
+ /** Тип дизайна формы оплаты */
18
32
  designType: zod_1.default.string().optional(),
19
- telegramId: zod_1.default.string().optional(),
33
+ /** Тип заказа: MAIN (сайт) или WEBAPP (Telegram Mini App) */
34
+ type: enums_1.OrderType.optional().default("MAIN"),
20
35
  });
36
+ /** Ответ на создание заказа — ссылка для оплаты */
21
37
  exports.OrderCreateResponseSchema = zod_1.default.object({
38
+ /** URL для редиректа на платёжную страницу */
22
39
  redirectUrl: zod_1.default.string(),
23
40
  });
@@ -3,6 +3,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.OrderType = void 0;
6
+ exports.OrderItemStatus = exports.OrderStatus = exports.OrderType = void 0;
7
7
  const zod_1 = __importDefault(require("zod"));
8
8
  exports.OrderType = zod_1.default.enum(["MAIN", "WEBAPP"]);
9
+ exports.OrderStatus = zod_1.default.enum([
10
+ "PENDING",
11
+ "AWAITING_PAYMENT",
12
+ "PAID",
13
+ "PROCESSING",
14
+ "SUCCESS",
15
+ "FAILED",
16
+ "REFUNDED",
17
+ "CANCELLED",
18
+ ]);
19
+ exports.OrderItemStatus = zod_1.default.enum([
20
+ "PENDING",
21
+ "PROCESSING",
22
+ "DELIVERED",
23
+ "FAILED",
24
+ "REFUNDED",
25
+ ]);
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./enums"), exports);
17
18
  __exportStar(require("./create"), exports);
18
19
  __exportStar(require("./update"), exports);
19
20
  __exportStar(require("./read"), exports);
@@ -6,11 +6,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.OrdersListQuerySchema = exports.OrdersSortSchema = exports.OrdersFiltersSchema = exports.OrdersPeriodSchema = void 0;
7
7
  const zod_1 = __importDefault(require("zod"));
8
8
  const pagination_1 = require("../pagination");
9
+ const enums_1 = require("./enums");
10
+ /** Фильтр по периоду (базовая схема без refinements для merge) */
9
11
  const OrdersPeriodBase = zod_1.default.object({
12
+ /** Предустановленный период: day, week, month, year, custom */
10
13
  period: zod_1.default.enum(["day", "week", "month", "year", "custom"]).optional(),
14
+ /** Начало периода (ISO datetime, обязателен при period=custom) */
11
15
  start: zod_1.default.string().datetime().optional(),
16
+ /** Конец периода (ISO datetime, обязателен при period=custom) */
12
17
  end: zod_1.default.string().datetime().optional(),
13
18
  });
19
+ /** Фильтр по периоду с валидацией custom-диапазона */
14
20
  exports.OrdersPeriodSchema = OrdersPeriodBase
15
21
  .refine(v => v.period !== "custom" || (v.start && v.end), {
16
22
  message: "start/end обязательны при period=custom",
@@ -18,15 +24,21 @@ exports.OrdersPeriodSchema = OrdersPeriodBase
18
24
  .refine(v => v.period !== "custom" || new Date(v.start) < new Date(v.end), {
19
25
  message: "start должен быть раньше end",
20
26
  });
27
+ /** Фильтры списка заказов */
21
28
  exports.OrdersFiltersSchema = zod_1.default.object({
22
- email: zod_1.default.string().email().optional(),
23
- steamUsername: zod_1.default.string().min(1).optional(),
24
- status: zod_1.default.enum(["PENDING", "SUCCESS", "FAILED", "CANCELED"]).optional(),
29
+ /** Фильтр по email покупателя (частичное совпадение) */
30
+ email: zod_1.default.string().optional(),
31
+ /** Фильтр по статусу заказа */
32
+ status: enums_1.OrderStatus.optional(),
25
33
  });
34
+ /** Сортировка списка заказов */
26
35
  exports.OrdersSortSchema = zod_1.default.object({
27
- sortBy: zod_1.default.string().default("createdAt"),
36
+ /** Поле для сортировки: createdAt, updatedAt, total, subtotal */
37
+ sortBy: zod_1.default.enum(["createdAt", "updatedAt", "total", "subtotal"]).default("createdAt"),
38
+ /** Направление сортировки */
28
39
  sortDir: zod_1.default.enum(["asc", "desc"]).default("desc"),
29
40
  });
41
+ /** Объединённая схема запроса списка заказов */
30
42
  exports.OrdersListQuerySchema = pagination_1.PaginationQuery
31
43
  .merge(exports.OrdersFiltersSchema)
32
44
  .merge(exports.OrdersSortSchema)
@@ -1,26 +1,81 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OrderReadResponseSchema = void 0;
3
+ exports.OrderReadResponseSchema = exports.OrderItemResponseSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const enums_1 = require("./enums");
6
+ /** Элемент заказа в ответе */
7
+ exports.OrderItemResponseSchema = zod_1.z.object({
8
+ /** ID элемента заказа */
9
+ id: zod_1.z.number(),
10
+ /** ID товара */
11
+ productId: zod_1.z.number(),
12
+ /** ID варианта товара */
13
+ variantId: zod_1.z.number(),
14
+ /** Количество */
15
+ quantity: zod_1.z.number(),
16
+ /** Цена на момент покупки (строка, Decimal) */
17
+ price: zod_1.z.string(),
18
+ /** Игровой логин для доставки */
19
+ gameUsername: zod_1.z.string().nullable(),
20
+ /** Тип игрового логина */
21
+ gameUsernameType: zod_1.z.string().nullable(),
22
+ /** Выданный ключ (если автоматическая доставка) */
23
+ deliveredKey: zod_1.z.string().nullable(),
24
+ /** Дата доставки */
25
+ deliveredAt: zod_1.z.coerce.date().nullable(),
26
+ /** Статус элемента заказа */
27
+ status: enums_1.OrderItemStatus,
28
+ /** Название товара */
29
+ productTitle: zod_1.z.string().optional(),
30
+ /** Название варианта */
31
+ variantName: zod_1.z.string().optional(),
32
+ });
33
+ /** Полная информация о заказе */
6
34
  exports.OrderReadResponseSchema = zod_1.z.object({
35
+ /** ID заказа */
7
36
  id: zod_1.z.coerce.number().positive(),
8
- userId: zod_1.z.coerce.number().positive().optional(),
9
- promocodeId: zod_1.z.coerce.number().nonnegative().optional(),
37
+ /** ID пользователя (null для гостевых заказов) */
38
+ userId: zod_1.z.coerce.number().positive().nullable().optional(),
39
+ /** ID промокода */
40
+ promocodeId: zod_1.z.coerce.number().nonnegative().nullable().optional(),
41
+ /** ID способа оплаты */
42
+ paymentMethodId: zod_1.z.coerce.number().nonnegative().nullable().optional(),
43
+ /** Email покупателя */
10
44
  email: zod_1.z.string(),
11
- status: zod_1.z.string(),
12
- steamUsername: zod_1.z.string(),
13
- paymentId: zod_1.z.coerce.number().nonnegative(),
14
- paymentMethodId: zod_1.z.coerce.number().nonnegative().optional(),
15
- paymentMethodName: zod_1.z.string(),
16
- promocodeValue: zod_1.z.string().nullable(),
17
- promocodeDiscount: zod_1.z.string().nullable(),
18
- amount: zod_1.z.coerce.number().nonnegative(),
45
+ /** Статус заказа */
46
+ status: enums_1.OrderStatus,
47
+ /** Тип заказа */
19
48
  type: enums_1.OrderType,
20
- designType: zod_1.z.string().nullable(),
49
+ /** Сумма товаров до скидки и комиссий (строка, Decimal) */
50
+ subtotal: zod_1.z.string(),
51
+ /** Сумма скидки (строка, Decimal) */
52
+ discount: zod_1.z.string(),
53
+ /** Комиссия эквайринга (строка, Decimal) */
54
+ commission: zod_1.z.string(),
55
+ /** Комиссия сервиса (строка, Decimal) */
56
+ serviceCommission: zod_1.z.string(),
57
+ /** Итого к оплате (строка, Decimal) */
58
+ total: zod_1.z.string(),
59
+ /** IP-адрес покупателя */
60
+ ipAddress: zod_1.z.string().nullable().optional(),
61
+ /** UTM-метка источника трафика */
21
62
  utmSource: zod_1.z.string().nullable(),
63
+ /** Тип дизайна формы оплаты */
64
+ designType: zod_1.z.string().nullable(),
65
+ /** Название способа оплаты */
66
+ paymentMethodName: zod_1.z.string().nullable(),
67
+ /** Значение промокода */
68
+ promocodeValue: zod_1.z.string().nullable(),
69
+ /** Скидка промокода в процентах (строка, Decimal) */
70
+ promocodeDiscount: zod_1.z.string().nullable(),
71
+ /** Процент комиссии сервиса (serviceComission + secretComission) */
22
72
  serviceCommissionPercent: zod_1.z.coerce.number().nonnegative().optional(),
73
+ /** Процент комиссии эквайринга */
23
74
  acquiringCommissionPercent: zod_1.z.coerce.number().nonnegative().optional(),
75
+ /** Элементы заказа */
76
+ items: zod_1.z.array(exports.OrderItemResponseSchema).optional(),
77
+ /** Дата создания */
24
78
  createdAt: zod_1.z.coerce.date().default(() => new Date()),
79
+ /** Дата обновления */
25
80
  updatedAt: zod_1.z.coerce.date().default(() => new Date()),
26
81
  });
@@ -2,13 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OrderUpdateRequestSchema = void 0;
4
4
  const zod_1 = require("zod");
5
+ const enums_1 = require("./enums");
6
+ /** Запрос на обновление заказа (администратором) */
5
7
  exports.OrderUpdateRequestSchema = zod_1.z.object({
8
+ /** Новый статус заказа */
9
+ status: enums_1.OrderStatus.optional(),
10
+ /** Email покупателя */
6
11
  email: zod_1.z.string().email().optional(),
7
- amount: zod_1.z.coerce.number().nonnegative().optional(),
8
- steamUsername: zod_1.z.string().optional(),
9
- userId: zod_1.z.coerce.number().positive().optional(),
12
+ /** ID способа оплаты */
10
13
  paymentMethodId: zod_1.z.coerce.number().positive().optional(),
11
- paymentId: zod_1.z.coerce.number().positive().optional(),
14
+ /** ID промокода */
12
15
  promocodeId: zod_1.z.coerce.number().positive().optional(),
13
- comission: zod_1.z.coerce.number().nonnegative().optional(),
14
16
  });
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SettingsEndpoints = void 0;
4
+ const zod_1 = require("zod");
5
+ const read_1 = require("./read");
6
+ const update_1 = require("./update");
7
+ exports.SettingsEndpoints = {
8
+ getAll: {
9
+ method: "GET",
10
+ path: "/settings",
11
+ request: zod_1.z.object({}),
12
+ response: read_1.SettingsReadResponseSchema,
13
+ },
14
+ getOne: {
15
+ method: "GET",
16
+ path: "/settings/:key",
17
+ request: zod_1.z.object({
18
+ key: zod_1.z.string(),
19
+ }),
20
+ response: zod_1.z.object({
21
+ key: zod_1.z.string(),
22
+ value: zod_1.z.union([zod_1.z.string(), zod_1.z.boolean()]),
23
+ }),
24
+ },
25
+ updateAll: {
26
+ method: "PUT",
27
+ path: "/settings",
28
+ request: update_1.SettingsUpdateRequestSchema,
29
+ response: read_1.SettingsReadResponseSchema,
30
+ },
31
+ updateOne: {
32
+ method: "PUT",
33
+ path: "/settings/:key",
34
+ request: zod_1.z.object({
35
+ key: zod_1.z.string(),
36
+ value: zod_1.z.union([zod_1.z.string(), zod_1.z.boolean()]),
37
+ }),
38
+ response: zod_1.z.object({
39
+ key: zod_1.z.string(),
40
+ value: zod_1.z.union([zod_1.z.string(), zod_1.z.boolean()]),
41
+ }),
42
+ },
43
+ };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./read"), exports);
18
+ __exportStar(require("./update"), exports);
19
+ __exportStar(require("./endpoints"), exports);
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SettingsReadResponseSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.SettingsReadResponseSchema = zod_1.z.object({
6
+ desslyDiscount: zod_1.z.string(),
7
+ serviceEnabled: zod_1.z.boolean(),
8
+ worksEnabled: zod_1.z.boolean(),
9
+ paymentsEnabled: zod_1.z.boolean(),
10
+ });
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SettingsUpdateRequestSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.SettingsUpdateRequestSchema = zod_1.z.object({
6
+ desslyDiscount: zod_1.z.string().optional(),
7
+ serviceEnabled: zod_1.z.boolean().optional(),
8
+ worksEnabled: zod_1.z.boolean().optional(),
9
+ paymentsEnabled: zod_1.z.boolean().optional(),
10
+ });
package/commands/index.ts CHANGED
@@ -9,4 +9,4 @@ export * from './payment-methods';
9
9
  export * from './api-response';
10
10
  export * from './users';
11
11
  export * from './stats';
12
- export * from './status';
12
+ export * from './settings';
@@ -1,22 +1,41 @@
1
1
  import z from "zod";
2
2
  import { OrderType } from "./enums";
3
3
 
4
+ export const OrderItemInputSchema = z.object({
5
+ variantId: z.coerce.number().int().positive(),
6
+ quantity: z.coerce.number().int().min(1).default(1),
7
+ gameUsername: z.string().max(255).optional(),
8
+ gameUsernameType: z.string().max(64).optional(),
9
+ });
10
+
11
+ /** Запрос на создание заказа */
4
12
  export const OrderCreateRequestSchema = z.object({
5
- email: z.string().email(),
6
- steamUsername: z.string(),
7
- amount: z.coerce.number().nonnegative(),
8
- userId: z.coerce.number().positive().optional(),
9
- paymentMethodId: z.coerce.number().positive(),
10
- promocodeId: z.coerce.number().positive().optional(),
11
- type: OrderType.optional().default('MAIN'),
12
- utmSource: z.string().optional(),
13
+ /** Email покупателя */
14
+ email: z.string().email(),
15
+ /** ID способа оплаты */
16
+ paymentMethodId: z.coerce.number().positive(),
17
+ /** Список товаров в заказе (минимум 1) */
18
+ items: z.array(OrderItemInputSchema).min(1),
19
+ /** ID промокода (опционально) */
20
+ promocodeId: z.coerce.number().positive().optional(),
21
+ /** ID существующего пользователя (опционально) */
22
+ userId: z.coerce.number().positive().optional(),
23
+ /** Telegram ID покупателя (опционально) */
24
+ telegramId: z.string().optional(),
25
+ /** UTM-метка источника трафика */
26
+ utmSource: z.string().optional(),
27
+ /** Тип дизайна формы оплаты */
13
28
  designType: z.string().optional(),
14
- telegramId: z.string().optional(),
29
+ /** Тип заказа: MAIN (сайт) или WEBAPP (Telegram Mini App) */
30
+ type: OrderType.optional().default("MAIN"),
15
31
  });
16
32
 
33
+ /** Ответ на создание заказа — ссылка для оплаты */
17
34
  export const OrderCreateResponseSchema = z.object({
18
- redirectUrl: z.string(),
35
+ /** URL для редиректа на платёжную страницу */
36
+ redirectUrl: z.string(),
19
37
  });
20
38
 
39
+ export type OrderItemInput = z.infer<typeof OrderItemInputSchema>;
21
40
  export type OrderCreateRequest = z.infer<typeof OrderCreateRequestSchema>;
22
- export type OrderCreateResponse = z.infer<typeof OrderCreateResponseSchema>;
41
+ export type OrderCreateResponse = z.infer<typeof OrderCreateResponseSchema>;
@@ -1,55 +1,51 @@
1
1
  import z from "zod";
2
-
3
- import {
4
- OrderReadResponseSchema,
5
- } from "./read";
6
-
2
+ import { OrderReadResponseSchema } from "./read";
7
3
  import { EndpointContract } from "../../types";
8
4
  import { OrderCreateRequestSchema, OrderCreateResponseSchema } from "./create";
9
5
  import { OrdersListQuerySchema } from "./query";
10
6
 
11
7
  export const OrderEndpoints = {
12
- create: {
13
- method: "POST",
14
- path: "/orders",
15
- request: OrderCreateRequestSchema,
16
- response: OrderCreateResponseSchema,
17
- },
18
- list: {
19
- method: "GET",
20
- path: "/orders",
21
- request: OrdersListQuerySchema,
22
- response: z.array(OrderReadResponseSchema),
23
- },
24
- getById: {
25
- method: "GET",
26
- path: "/orders/:id",
27
- request: z.object({
28
- id: z.coerce.number().positive(),
29
- }),
30
- response: OrderReadResponseSchema,
31
- },
32
- getUserOrders: {
33
- method: "GET",
34
- path: "/orders/user",
35
- request: OrdersListQuerySchema,
36
- response: z.array(OrderReadResponseSchema),
37
- },
38
- getUserOrderById: {
39
- method: "GET",
40
- path: "/orders/user/:userId/:orderId",
41
- request: z.object({
42
- userId: z.coerce.number().positive(),
43
- orderId: z.coerce.number().positive(),
44
- }),
45
- response: OrderReadResponseSchema,
46
- },
8
+ create: {
9
+ method: "POST",
10
+ path: "/orders",
11
+ request: OrderCreateRequestSchema,
12
+ response: OrderCreateResponseSchema,
13
+ },
14
+ list: {
15
+ method: "GET",
16
+ path: "/orders",
17
+ request: OrdersListQuerySchema,
18
+ response: z.array(OrderReadResponseSchema),
19
+ },
20
+ getById: {
21
+ method: "GET",
22
+ path: "/orders/:id",
23
+ request: z.object({
24
+ id: z.coerce.number().positive(),
25
+ }),
26
+ response: OrderReadResponseSchema,
27
+ },
28
+ getUserOrders: {
29
+ method: "GET",
30
+ path: "/orders/user",
31
+ request: OrdersListQuerySchema,
32
+ response: z.array(OrderReadResponseSchema),
33
+ },
34
+ getUserOrderById: {
35
+ method: "GET",
36
+ path: "/orders/user/:userId/:orderId",
37
+ request: z.object({
38
+ userId: z.coerce.number().positive(),
39
+ orderId: z.coerce.number().positive(),
40
+ }),
41
+ response: OrderReadResponseSchema,
42
+ },
47
43
  } satisfies Record<string, EndpointContract>;
48
44
 
49
45
  export type OrderEndpointKey = keyof typeof OrderEndpoints;
50
46
 
51
47
  export type GetOrderRequest<K extends OrderEndpointKey> =
52
- z.infer<typeof OrderEndpoints[K]["request"]>;
48
+ z.infer<typeof OrderEndpoints[K]["request"]>;
53
49
 
54
50
  export type GetOrderResponse<K extends OrderEndpointKey> =
55
- z.infer<typeof OrderEndpoints[K]["response"]>;
51
+ z.infer<typeof OrderEndpoints[K]["response"]>;
@@ -1,7 +1,25 @@
1
1
  import z from "zod";
2
2
 
3
3
  export const OrderType = z.enum(["MAIN", "WEBAPP"]);
4
-
5
4
  export type OrderType = z.infer<typeof OrderType>;
6
-
7
5
 
6
+ export const OrderStatus = z.enum([
7
+ "PENDING",
8
+ "AWAITING_PAYMENT",
9
+ "PAID",
10
+ "PROCESSING",
11
+ "SUCCESS",
12
+ "FAILED",
13
+ "REFUNDED",
14
+ "CANCELLED",
15
+ ]);
16
+ export type OrderStatus = z.infer<typeof OrderStatus>;
17
+
18
+ export const OrderItemStatus = z.enum([
19
+ "PENDING",
20
+ "PROCESSING",
21
+ "DELIVERED",
22
+ "FAILED",
23
+ "REFUNDED",
24
+ ]);
25
+ export type OrderItemStatus = z.infer<typeof OrderItemStatus>;
@@ -1,5 +1,6 @@
1
- export * from './create'
2
- export * from './update'
3
- export * from './read'
4
- export * from './query'
5
- export * from './endpoints'
1
+ export * from "./enums";
2
+ export * from "./create";
3
+ export * from "./update";
4
+ export * from "./read";
5
+ export * from "./query";
6
+ export * from "./endpoints";
@@ -1,33 +1,46 @@
1
1
  import z from "zod";
2
2
  import { PaginationQuery } from "../pagination";
3
+ import { OrderStatus } from "./enums";
3
4
 
5
+ /** Фильтр по периоду (базовая схема без refinements для merge) */
4
6
  const OrdersPeriodBase = z.object({
5
- period: z.enum(["day", "week", "month", "year", "custom"]).optional(),
6
- start: z.string().datetime().optional(),
7
- end: z.string().datetime().optional(),
7
+ /** Предустановленный период: day, week, month, year, custom */
8
+ period: z.enum(["day", "week", "month", "year", "custom"]).optional(),
9
+ /** Начало периода (ISO datetime, обязателен при period=custom) */
10
+ start: z.string().datetime().optional(),
11
+ /** Конец периода (ISO datetime, обязателен при period=custom) */
12
+ end: z.string().datetime().optional(),
8
13
  });
14
+
15
+ /** Фильтр по периоду с валидацией custom-диапазона */
9
16
  export const OrdersPeriodSchema = OrdersPeriodBase
10
- .refine(v => v.period !== "custom" || (v.start && v.end), {
11
- message: "start/end обязательны при period=custom",
12
- })
13
- .refine(v => v.period !== "custom" || new Date(v.start!) < new Date(v.end!), {
14
- message: "start должен быть раньше end",
15
- });
17
+ .refine(v => v.period !== "custom" || (v.start && v.end), {
18
+ message: "start/end обязательны при period=custom",
19
+ })
20
+ .refine(v => v.period !== "custom" || new Date(v.start!) < new Date(v.end!), {
21
+ message: "start должен быть раньше end",
22
+ });
16
23
 
24
+ /** Фильтры списка заказов */
17
25
  export const OrdersFiltersSchema = z.object({
18
- email: z.string().email().optional(),
19
- steamUsername: z.string().min(1).optional(),
20
- status: z.enum(["PENDING", "SUCCESS", "FAILED", "CANCELED"]).optional(),
26
+ /** Фильтр по email покупателя (частичное совпадение) */
27
+ email: z.string().optional(),
28
+ /** Фильтр по статусу заказа */
29
+ status: OrderStatus.optional(),
21
30
  });
22
31
 
32
+ /** Сортировка списка заказов */
23
33
  export const OrdersSortSchema = z.object({
24
- sortBy: z.string().default("createdAt"),
25
- sortDir: z.enum(["asc", "desc"]).default("desc"),
34
+ /** Поле для сортировки: createdAt, updatedAt, total, subtotal */
35
+ sortBy: z.enum(["createdAt", "updatedAt", "total", "subtotal"]).default("createdAt"),
36
+ /** Направление сортировки */
37
+ sortDir: z.enum(["asc", "desc"]).default("desc"),
26
38
  });
27
39
 
40
+ /** Объединённая схема запроса списка заказов */
28
41
  export const OrdersListQuerySchema = PaginationQuery
29
- .merge(OrdersFiltersSchema)
30
- .merge(OrdersSortSchema)
31
- .merge(OrdersPeriodBase);
42
+ .merge(OrdersFiltersSchema)
43
+ .merge(OrdersSortSchema)
44
+ .merge(OrdersPeriodBase);
32
45
 
33
46
  export type OrdersListQuery = z.infer<typeof OrdersListQuerySchema>;
@@ -1,26 +1,83 @@
1
1
  import { z } from "zod";
2
- import { OrderType } from "./enums";
2
+ import { OrderType, OrderStatus, OrderItemStatus } from "./enums";
3
3
 
4
+ /** Элемент заказа в ответе */
5
+ export const OrderItemResponseSchema = z.object({
6
+ /** ID элемента заказа */
7
+ id: z.number(),
8
+ /** ID товара */
9
+ productId: z.number(),
10
+ /** ID варианта товара */
11
+ variantId: z.number(),
12
+ /** Количество */
13
+ quantity: z.number(),
14
+ /** Цена на момент покупки (строка, Decimal) */
15
+ price: z.string(),
16
+ /** Игровой логин для доставки */
17
+ gameUsername: z.string().nullable(),
18
+ /** Тип игрового логина */
19
+ gameUsernameType: z.string().nullable(),
20
+ /** Выданный ключ (если автоматическая доставка) */
21
+ deliveredKey: z.string().nullable(),
22
+ /** Дата доставки */
23
+ deliveredAt: z.coerce.date().nullable(),
24
+ /** Статус элемента заказа */
25
+ status: OrderItemStatus,
26
+ /** Название товара */
27
+ productTitle: z.string().optional(),
28
+ /** Название варианта */
29
+ variantName: z.string().optional(),
30
+ });
31
+
32
+ /** Полная информация о заказе */
4
33
  export const OrderReadResponseSchema = z.object({
5
- id: z.coerce.number().positive(),
6
- userId: z.coerce.number().positive().optional(),
7
- promocodeId: z.coerce.number().nonnegative().optional(),
8
- email: z.string(),
9
- status: z.string(),
10
- steamUsername: z.string(),
11
- paymentId: z.coerce.number().nonnegative(),
12
- paymentMethodId: z.coerce.number().nonnegative().optional(),
13
- paymentMethodName: z.string(),
14
- promocodeValue: z.string().nullable(),
15
- promocodeDiscount: z.string().nullable(),
16
- amount: z.coerce.number().nonnegative(),
17
- type: OrderType,
18
- designType: z.string().nullable(),
19
- utmSource: z.string().nullable(),
20
- serviceCommissionPercent: z.coerce.number().nonnegative().optional(),
21
- acquiringCommissionPercent: z.coerce.number().nonnegative().optional(),
22
- createdAt: z.coerce.date().default(() => new Date()),
23
- updatedAt: z.coerce.date().default(() => new Date()),
34
+ /** ID заказа */
35
+ id: z.coerce.number().positive(),
36
+ /** ID пользователя (null для гостевых заказов) */
37
+ userId: z.coerce.number().positive().nullable().optional(),
38
+ /** ID промокода */
39
+ promocodeId: z.coerce.number().nonnegative().nullable().optional(),
40
+ /** ID способа оплаты */
41
+ paymentMethodId: z.coerce.number().nonnegative().nullable().optional(),
42
+ /** Email покупателя */
43
+ email: z.string(),
44
+ /** Статус заказа */
45
+ status: OrderStatus,
46
+ /** Тип заказа */
47
+ type: OrderType,
48
+ /** Сумма товаров до скидки и комиссий (строка, Decimal) */
49
+ subtotal: z.string(),
50
+ /** Сумма скидки (строка, Decimal) */
51
+ discount: z.string(),
52
+ /** Комиссия эквайринга (строка, Decimal) */
53
+ commission: z.string(),
54
+ /** Комиссия сервиса (строка, Decimal) */
55
+ serviceCommission: z.string(),
56
+ /** Итого к оплате (строка, Decimal) */
57
+ total: z.string(),
58
+ /** IP-адрес покупателя */
59
+ ipAddress: z.string().nullable().optional(),
60
+ /** UTM-метка источника трафика */
61
+ utmSource: z.string().nullable(),
62
+ /** Тип дизайна формы оплаты */
63
+ designType: z.string().nullable(),
64
+ /** Название способа оплаты */
65
+ paymentMethodName: z.string().nullable(),
66
+ /** Значение промокода */
67
+ promocodeValue: z.string().nullable(),
68
+ /** Скидка промокода в процентах (строка, Decimal) */
69
+ promocodeDiscount: z.string().nullable(),
70
+ /** Процент комиссии сервиса (serviceComission + secretComission) */
71
+ serviceCommissionPercent: z.coerce.number().nonnegative().optional(),
72
+ /** Процент комиссии эквайринга */
73
+ acquiringCommissionPercent: z.coerce.number().nonnegative().optional(),
74
+ /** Элементы заказа */
75
+ items: z.array(OrderItemResponseSchema).optional(),
76
+ /** Дата создания */
77
+ createdAt: z.coerce.date().default(() => new Date()),
78
+ /** Дата обновления */
79
+ updatedAt: z.coerce.date().default(() => new Date()),
24
80
  });
25
81
 
26
- export type OrderReadResponse = z.infer<typeof OrderReadResponseSchema>;
82
+ export type OrderItemResponse = z.infer<typeof OrderItemResponseSchema>;
83
+ export type OrderReadResponse = z.infer<typeof OrderReadResponseSchema>;
@@ -1,14 +1,16 @@
1
1
  import { z } from "zod";
2
+ import { OrderStatus } from "./enums";
2
3
 
4
+ /** Запрос на обновление заказа (администратором) */
3
5
  export const OrderUpdateRequestSchema = z.object({
4
- email: z.string().email().optional(),
5
- amount: z.coerce.number().nonnegative().optional(),
6
- steamUsername: z.string().optional(),
7
- userId: z.coerce.number().positive().optional(),
8
- paymentMethodId: z.coerce.number().positive().optional(),
9
- paymentId: z.coerce.number().positive().optional(),
10
- promocodeId: z.coerce.number().positive().optional(),
11
- comission: z.coerce.number().nonnegative().optional(),
12
- })
6
+ /** Новый статус заказа */
7
+ status: OrderStatus.optional(),
8
+ /** Email покупателя */
9
+ email: z.string().email().optional(),
10
+ /** ID способа оплаты */
11
+ paymentMethodId: z.coerce.number().positive().optional(),
12
+ /** ID промокода */
13
+ promocodeId: z.coerce.number().positive().optional(),
14
+ });
13
15
 
14
- export type OrderUpdateRequest = z.infer<typeof OrderUpdateRequestSchema>
16
+ export type OrderUpdateRequest = z.infer<typeof OrderUpdateRequestSchema>;
@@ -0,0 +1,52 @@
1
+ import { z } from "zod";
2
+ import { EndpointContract } from "../../types";
3
+ import { SettingsReadResponseSchema } from "./read";
4
+ import { SettingsUpdateRequestSchema } from "./update";
5
+
6
+ export const SettingsEndpoints = {
7
+ getAll: {
8
+ method: "GET",
9
+ path: "/settings",
10
+ request: z.object({}),
11
+ response: SettingsReadResponseSchema,
12
+ },
13
+ getOne: {
14
+ method: "GET",
15
+ path: "/settings/:key",
16
+ request: z.object({
17
+ key: z.string(),
18
+ }),
19
+ response: z.object({
20
+ key: z.string(),
21
+ value: z.union([z.string(), z.boolean()]),
22
+ }),
23
+ },
24
+ updateAll: {
25
+ method: "PUT",
26
+ path: "/settings",
27
+ request: SettingsUpdateRequestSchema,
28
+ response: SettingsReadResponseSchema,
29
+ },
30
+ updateOne: {
31
+ method: "PUT",
32
+ path: "/settings/:key",
33
+ request: z.object({
34
+ key: z.string(),
35
+ value: z.union([z.string(), z.boolean()]),
36
+ }),
37
+ response: z.object({
38
+ key: z.string(),
39
+ value: z.union([z.string(), z.boolean()]),
40
+ }),
41
+ },
42
+ } satisfies Record<string, EndpointContract>;
43
+
44
+ export type SettingsEndpointKey = keyof typeof SettingsEndpoints;
45
+
46
+ export type GetSettingsRequest<K extends SettingsEndpointKey> = z.infer<
47
+ typeof SettingsEndpoints[K]["request"]
48
+ >;
49
+
50
+ export type GetSettingsResponse<K extends SettingsEndpointKey> = z.infer<
51
+ typeof SettingsEndpoints[K]["response"]
52
+ >;
@@ -0,0 +1,3 @@
1
+ export * from "./read";
2
+ export * from "./update";
3
+ export * from "./endpoints";
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+
3
+ export const SettingsReadResponseSchema = z.object({
4
+ desslyDiscount: z.string(),
5
+ serviceEnabled: z.boolean(),
6
+ worksEnabled: z.boolean(),
7
+ paymentsEnabled: z.boolean(),
8
+ });
9
+
10
+ export type SettingsReadResponse = z.infer<typeof SettingsReadResponseSchema>;
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+
3
+ export const SettingsUpdateRequestSchema = z.object({
4
+ desslyDiscount: z.string().optional(),
5
+ serviceEnabled: z.boolean().optional(),
6
+ worksEnabled: z.boolean().optional(),
7
+ paymentsEnabled: z.boolean().optional(),
8
+ });
9
+
10
+ export type SettingsUpdateRequest = z.infer<typeof SettingsUpdateRequestSchema>;
@@ -3,6 +3,8 @@ import { EndpointContract } from "../../types";
3
3
  import { StatsReadResponseSchema } from "./read";
4
4
  import { StatsReadRequestSchema } from "./query";
5
5
 
6
+
7
+
6
8
  export const StatsEndpoints = {
7
9
  list: {
8
10
  method: "GET",
@@ -15,7 +17,7 @@ export const StatsEndpoints = {
15
17
  export type StatsEndpointKey = keyof typeof StatsEndpoints;
16
18
 
17
19
  export type GetStatsRequest<K extends StatsEndpointKey> =
18
- z.infer<typeof StatsEndpoints[K]["request"]>;
20
+ z.infer<typeof StatsEndpoints[K]["request"]>;
19
21
 
20
22
  export type GetStatsResponse<K extends StatsEndpointKey> =
21
- z.infer<typeof StatsEndpoints[K]["response"]>;
23
+ z.infer<typeof StatsEndpoints[K]["response"]>;
@@ -1,18 +1,18 @@
1
1
  import z from "zod";
2
2
 
3
3
  export const StatsReadRequestSchema = z
4
- .object({
5
- period: z.enum(["day", "week", "month", "year", "custom"]).default("day"),
6
- start: z.string().datetime().optional(),
7
- end: z.string().datetime().optional(),
8
- })
9
- .refine(
10
- v => v.period !== "custom" || (v.start && v.end),
11
- { message: "from/to обязательны при period=custom" }
12
- )
13
- .refine(
14
- v => v.period !== "custom" || (new Date(v.start!) < new Date(v.end!)),
15
- { message: "from должен быть раньше to" }
16
- );
4
+ .object({
5
+ period: z.enum(["day", "week", "month", "year", "custom"]).default("day"),
6
+ start: z.string().datetime().optional(),
7
+ end: z.string().datetime().optional(),
8
+ })
9
+ .refine(
10
+ v => v.period !== "custom" || (v.start && v.end),
11
+ { message: "from/to обязательны при period=custom" }
12
+ )
13
+ .refine(
14
+ v => v.period !== "custom" || (new Date(v.start!) < new Date(v.end!)),
15
+ { message: "from должен быть раньше to" }
16
+ );
17
17
 
18
- export type StatsReadRequest = z.infer<typeof StatsReadRequestSchema>;
18
+ export type StatsReadRequest = z.infer<typeof StatsReadRequestSchema>;
@@ -1,14 +1,14 @@
1
1
  import z from "zod";
2
2
 
3
3
  export const StatsReadResponseSchema = z.object({
4
- usersCount: z.coerce.number().nonnegative(),
5
- ordersCount: z.coerce.number().nonnegative(),
6
- totalAmount: z.coerce.number().nonnegative(),
7
- acquiringCommission: z.coerce.number().nonnegative(),
8
- serviceCommission: z.coerce.number().nonnegative(),
9
- totalAmountWithCommission: z.coerce.number().nonnegative(),
10
- periodStart: z.string().datetime().optional(),
11
- periodEnd: z.string().datetime().optional(),
4
+ usersCount: z.coerce.number().nonnegative(),
5
+ ordersCount: z.coerce.number().nonnegative(),
6
+ totalAmount: z.coerce.number().nonnegative(),
7
+ acquiringCommission: z.coerce.number().nonnegative(),
8
+ serviceCommission: z.coerce.number().nonnegative(),
9
+ totalAmountWithCommission: z.coerce.number().nonnegative(),
10
+ periodStart: z.string().datetime().optional(),
11
+ periodEnd: z.string().datetime().optional(),
12
12
  });
13
13
 
14
14
  export type StatsReadResponse = z.infer<typeof StatsReadResponseSchema>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gigapay-dev/contracts",
3
- "version": "1.8.1",
3
+ "version": "1.8.3",
4
4
  "main": "./build/index.js",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -1,40 +0,0 @@
1
- import { z } from "zod";
2
- import { EndpointContract } from "../../types";
3
- import { StatusReadResponseSchema } from "./read";
4
-
5
- export const StatusEndpoints = {
6
- list: {
7
- method: "GET",
8
- path: "/status",
9
- request: z.object({}),
10
- response: StatusReadResponseSchema,
11
- },
12
- get: {
13
- method: "GET",
14
- path: "/status/:key",
15
- request: z.object({
16
- key: z.string(),
17
- }),
18
- response: z.object({
19
- key: z.string(),
20
- value: z.boolean(),
21
- }),
22
- },
23
- set: {
24
- method: "POST",
25
- path: "/status/:key",
26
- request: z.object({
27
- key: z.string(),
28
- value: z.boolean(),
29
- }),
30
- response: StatusReadResponseSchema,
31
- },
32
- } satisfies Record<string, EndpointContract>;
33
-
34
- export type StatusEndpointKey = keyof typeof StatusEndpoints;
35
-
36
- export type GetStatusRequest<K extends StatusEndpointKey> =
37
- z.infer<typeof StatusEndpoints[K]["request"]>;
38
-
39
- export type GetStatusResponse<K extends StatusEndpointKey> =
40
- z.infer<typeof StatusEndpoints[K]["response"]>;
@@ -1,2 +0,0 @@
1
- export * from "./read";
2
- export * from "./endpoints";
@@ -1,9 +0,0 @@
1
- import z from "zod";
2
-
3
- export const StatusReadResponseSchema = z.object({
4
- service: z.boolean(),
5
- works: z.boolean(),
6
- payments: z.boolean(),
7
- });
8
-
9
- export type StatusReadResponse = z.infer<typeof StatusReadResponseSchema>;