@purpleschool/gptbot 0.7.26 → 0.7.28

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 (45) hide show
  1. package/api/controllers/http/daily-streak.ts +6 -0
  2. package/api/controllers/http/index.ts +1 -0
  3. package/api/controllers/http/user.ts +1 -0
  4. package/api/routes.ts +5 -0
  5. package/build/api/controllers/http/daily-streak.js +8 -0
  6. package/build/api/controllers/http/index.js +1 -0
  7. package/build/api/controllers/http/user.js +1 -0
  8. package/build/api/routes.js +5 -0
  9. package/build/commands/daily-streak/collect-daily-reward.command.js +11 -0
  10. package/build/commands/daily-streak/get-daily-streak.command.js +11 -0
  11. package/build/commands/daily-streak/index.js +18 -0
  12. package/build/commands/index.js +1 -0
  13. package/build/commands/user/delete-account.command.js +12 -0
  14. package/build/commands/user/find-users-by-criteria.command.js +1 -0
  15. package/build/commands/user/index.js +1 -0
  16. package/build/constants/daily-streak/enums/daily-streak-status.enum.js +9 -0
  17. package/build/constants/daily-streak/enums/day-in-daily-streak-reward-type.enum.js +8 -0
  18. package/build/constants/daily-streak/enums/index.js +18 -0
  19. package/build/constants/daily-streak/index.js +17 -0
  20. package/build/constants/errors/errors.js +50 -0
  21. package/build/constants/index.js +1 -0
  22. package/build/constants/promocode/enums/promocode-promotion.enum.js +1 -0
  23. package/build/constants/user/enums/user-status.js +1 -0
  24. package/build/models/daily-streak.js +29 -0
  25. package/build/models/index.js +1 -0
  26. package/build/models/user.schema.js +1 -0
  27. package/commands/daily-streak/collect-daily-reward.command.ts +12 -0
  28. package/commands/daily-streak/get-daily-streak.command.ts +12 -0
  29. package/commands/daily-streak/index.ts +2 -0
  30. package/commands/index.ts +1 -0
  31. package/commands/user/delete-account.command.ts +13 -0
  32. package/commands/user/find-users-by-criteria.command.ts +1 -0
  33. package/commands/user/index.ts +1 -0
  34. package/constants/daily-streak/enums/daily-streak-status.enum.ts +5 -0
  35. package/constants/daily-streak/enums/day-in-daily-streak-reward-type.enum.ts +4 -0
  36. package/constants/daily-streak/enums/index.ts +2 -0
  37. package/constants/daily-streak/index.ts +1 -0
  38. package/constants/errors/errors.ts +50 -0
  39. package/constants/index.ts +1 -0
  40. package/constants/promocode/enums/promocode-promotion.enum.ts +1 -0
  41. package/constants/user/enums/user-status.ts +1 -0
  42. package/models/daily-streak.ts +27 -0
  43. package/models/index.ts +1 -0
  44. package/models/user.schema.ts +1 -0
  45. package/package.json +1 -1
@@ -0,0 +1,6 @@
1
+ export const DAILY_STREAK_PRIVATE_CONTROLLER = 'private/daily-streak' as const;
2
+
3
+ export const DAILY_STREAK_ROUTES = {
4
+ GET: '',
5
+ COLLECT: 'collect',
6
+ } as const;
@@ -44,3 +44,4 @@ export * from './folder';
44
44
  export * from './user-to-product';
45
45
  export * from './user-to-subscription';
46
46
  export * from './video';
47
+ export * from './daily-streak';
@@ -12,4 +12,5 @@ export const USER_ROUTES = {
12
12
  GET_PRODUCTS: (uuid: string) => `products/${uuid}`,
13
13
  GET_COUNT_NOTIFICATION: 'broadcast/count',
14
14
  SEND_NOTIFICATION: 'broadcast',
15
+ DELETE_ACCOUNT: 'delete-account',
15
16
  } as const;
package/api/routes.ts CHANGED
@@ -29,6 +29,7 @@ export const REST_API = {
29
29
  `${ROOT}/${CONTROLLERS.USER_CONTROLLER}/${CONTROLLERS.USER_ROUTES.GET_PRODUCTS(uuid)}`,
30
30
  GET_COUNT: `${ROOT}/${CONTROLLERS.USER_CONTROLLER}/${CONTROLLERS.USER_ROUTES.GET_COUNT_NOTIFICATION}`,
31
31
  SEND_NOTIFICATION: `${ROOT}/${CONTROLLERS.USER_CONTROLLER}/${CONTROLLERS.USER_ROUTES.SEND_NOTIFICATION}`,
32
+ DELETE_ACCOUNT: `${ROOT}/${CONTROLLERS.USER_CONTROLLER}/${CONTROLLERS.USER_ROUTES.DELETE_ACCOUNT}`,
32
33
  },
33
34
  PAGE: {
34
35
  GET: `${ROOT}/${CONTROLLERS.PAGE_CONTROLLER}/${CONTROLLERS.PAGE_ROUTES.GET_ALL}`,
@@ -284,4 +285,8 @@ export const REST_API = {
284
285
  FEEDBACK_PUBLIC: {
285
286
  CHECK_IF_USER_READY_FOR_FEEDBACK: `${ROOT}/${CONTROLLERS.FEEDBACK_CONTROLLER_PUBLIC}/${CONTROLLERS.FEEDBACK_ROUTES.CHECK_IF_USER_READY_FOR_FEEDBACK}`,
286
287
  },
288
+ DAILY_STREAK_PRIVATE: {
289
+ GET: `${ROOT}/${CONTROLLERS.DAILY_STREAK_PRIVATE_CONTROLLER}/${CONTROLLERS.DAILY_STREAK_ROUTES.GET}`,
290
+ COLLECT: `${ROOT}/${CONTROLLERS.DAILY_STREAK_PRIVATE_CONTROLLER}/${CONTROLLERS.DAILY_STREAK_ROUTES.COLLECT}`,
291
+ },
287
292
  } as const;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DAILY_STREAK_ROUTES = exports.DAILY_STREAK_PRIVATE_CONTROLLER = void 0;
4
+ exports.DAILY_STREAK_PRIVATE_CONTROLLER = 'private/daily-streak';
5
+ exports.DAILY_STREAK_ROUTES = {
6
+ GET: '',
7
+ COLLECT: 'collect',
8
+ };
@@ -60,3 +60,4 @@ __exportStar(require("./folder"), exports);
60
60
  __exportStar(require("./user-to-product"), exports);
61
61
  __exportStar(require("./user-to-subscription"), exports);
62
62
  __exportStar(require("./video"), exports);
63
+ __exportStar(require("./daily-streak"), exports);
@@ -14,4 +14,5 @@ exports.USER_ROUTES = {
14
14
  GET_PRODUCTS: (uuid) => `products/${uuid}`,
15
15
  GET_COUNT_NOTIFICATION: 'broadcast/count',
16
16
  SEND_NOTIFICATION: 'broadcast',
17
+ DELETE_ACCOUNT: 'delete-account',
17
18
  };
@@ -58,6 +58,7 @@ exports.REST_API = {
58
58
  GET_PRODUCTS: (uuid) => `${exports.ROOT}/${CONTROLLERS.USER_CONTROLLER}/${CONTROLLERS.USER_ROUTES.GET_PRODUCTS(uuid)}`,
59
59
  GET_COUNT: `${exports.ROOT}/${CONTROLLERS.USER_CONTROLLER}/${CONTROLLERS.USER_ROUTES.GET_COUNT_NOTIFICATION}`,
60
60
  SEND_NOTIFICATION: `${exports.ROOT}/${CONTROLLERS.USER_CONTROLLER}/${CONTROLLERS.USER_ROUTES.SEND_NOTIFICATION}`,
61
+ DELETE_ACCOUNT: `${exports.ROOT}/${CONTROLLERS.USER_CONTROLLER}/${CONTROLLERS.USER_ROUTES.DELETE_ACCOUNT}`,
61
62
  },
62
63
  PAGE: {
63
64
  GET: `${exports.ROOT}/${CONTROLLERS.PAGE_CONTROLLER}/${CONTROLLERS.PAGE_ROUTES.GET_ALL}`,
@@ -256,4 +257,8 @@ exports.REST_API = {
256
257
  FEEDBACK_PUBLIC: {
257
258
  CHECK_IF_USER_READY_FOR_FEEDBACK: `${exports.ROOT}/${CONTROLLERS.FEEDBACK_CONTROLLER_PUBLIC}/${CONTROLLERS.FEEDBACK_ROUTES.CHECK_IF_USER_READY_FOR_FEEDBACK}`,
258
259
  },
260
+ DAILY_STREAK_PRIVATE: {
261
+ GET: `${exports.ROOT}/${CONTROLLERS.DAILY_STREAK_PRIVATE_CONTROLLER}/${CONTROLLERS.DAILY_STREAK_ROUTES.GET}`,
262
+ COLLECT: `${exports.ROOT}/${CONTROLLERS.DAILY_STREAK_PRIVATE_CONTROLLER}/${CONTROLLERS.DAILY_STREAK_ROUTES.COLLECT}`,
263
+ },
259
264
  };
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CollectDailyRewardCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const models_1 = require("../../models");
6
+ var CollectDailyRewardCommand;
7
+ (function (CollectDailyRewardCommand) {
8
+ CollectDailyRewardCommand.ResponseSchema = zod_1.z.object({
9
+ data: models_1.DailyStreakWithPromocodeSchema,
10
+ });
11
+ })(CollectDailyRewardCommand || (exports.CollectDailyRewardCommand = CollectDailyRewardCommand = {}));
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GetDailyStreakCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const models_1 = require("../../models");
6
+ var GetDailyStreakCommand;
7
+ (function (GetDailyStreakCommand) {
8
+ GetDailyStreakCommand.ResponseSchema = zod_1.z.object({
9
+ data: models_1.DailyStreakWithPromocodeSchema,
10
+ });
11
+ })(GetDailyStreakCommand || (exports.GetDailyStreakCommand = GetDailyStreakCommand = {}));
@@ -0,0 +1,18 @@
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("./collect-daily-reward.command"), exports);
18
+ __exportStar(require("./get-daily-streak.command"), exports);
@@ -51,3 +51,4 @@ __exportStar(require("./prompt-topic"), exports);
51
51
  __exportStar(require("./prompt"), exports);
52
52
  __exportStar(require("./folder"), exports);
53
53
  __exportStar(require("./user-to-product"), exports);
54
+ __exportStar(require("./daily-streak"), exports);
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeleteAccountCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ var DeleteAccountCommand;
6
+ (function (DeleteAccountCommand) {
7
+ DeleteAccountCommand.ResponseSchema = zod_1.z.object({
8
+ data: zod_1.z.object({
9
+ isDeleted: zod_1.z.boolean(),
10
+ }),
11
+ });
12
+ })(DeleteAccountCommand || (exports.DeleteAccountCommand = DeleteAccountCommand = {}));
@@ -41,6 +41,7 @@ var FindUsersByCriteriaCommand;
41
41
  telegramId: zod_1.default.coerce.number().optional(),
42
42
  createdAt: models_1.DateFilter.optional(),
43
43
  updatedAt: models_1.DateFilter.optional(),
44
+ deletedAt: models_1.DateFilter.optional(),
44
45
  tokenBonusBalance: models_1.NumberFilter.optional(),
45
46
  sortBy: zod_1.default.nativeEnum(constants_1.USER_SORT_BY).optional(),
46
47
  sortOrder: zod_1.default.nativeEnum(constants_1.SORT_ORDER).default(constants_1.SORT_ORDER.DESC).optional(),
@@ -23,3 +23,4 @@ __exportStar(require("./get-user-balance.command"), exports);
23
23
  __exportStar(require("./get-user-orders.command"), exports);
24
24
  __exportStar(require("./get-user-subscriptions.command"), exports);
25
25
  __exportStar(require("./get-user-products.command"), exports);
26
+ __exportStar(require("./delete-account.command"), exports);
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DAILY_STREAK_STATUS = void 0;
4
+ var DAILY_STREAK_STATUS;
5
+ (function (DAILY_STREAK_STATUS) {
6
+ DAILY_STREAK_STATUS["COLLECTED"] = "COLLECTED";
7
+ DAILY_STREAK_STATUS["NOT_READY"] = "NOT_READY";
8
+ DAILY_STREAK_STATUS["READY"] = "READY";
9
+ })(DAILY_STREAK_STATUS || (exports.DAILY_STREAK_STATUS = DAILY_STREAK_STATUS = {}));
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DAY_IN_DAILY_STREAK_AWARD_TYPE = void 0;
4
+ var DAY_IN_DAILY_STREAK_AWARD_TYPE;
5
+ (function (DAY_IN_DAILY_STREAK_AWARD_TYPE) {
6
+ DAY_IN_DAILY_STREAK_AWARD_TYPE["COIN_TRANSACTION"] = "COIN_TRANSACTION";
7
+ DAY_IN_DAILY_STREAK_AWARD_TYPE["PROMOCODE"] = "PROMOCODE";
8
+ })(DAY_IN_DAILY_STREAK_AWARD_TYPE || (exports.DAY_IN_DAILY_STREAK_AWARD_TYPE = DAY_IN_DAILY_STREAK_AWARD_TYPE = {}));
@@ -0,0 +1,18 @@
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("./daily-streak-status.enum"), exports);
18
+ __exportStar(require("./day-in-daily-streak-reward-type.enum"), exports);
@@ -0,0 +1,17 @@
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("./enums"), exports);
@@ -1662,4 +1662,54 @@ exports.ERRORS = {
1662
1662
  message: 'Произошла ошибка при подсчёте количества сообщений для юзера',
1663
1663
  httpCode: 500,
1664
1664
  },
1665
+ DAILY_REWARD_COLLECT_ERROR: {
1666
+ code: 'A353',
1667
+ message: 'Ошибка при получении ежедневной награды',
1668
+ httpCode: 500,
1669
+ },
1670
+ DAILY_STREAK_CREATE_ERROR: {
1671
+ code: 'A354',
1672
+ message: 'Ошибка при создании ежедневного стрика',
1673
+ httpCode: 500,
1674
+ },
1675
+ DAILY_STREAK_FIND_ERROR: {
1676
+ code: 'A355',
1677
+ message: 'Ошибка при поиске ежедневного стрика',
1678
+ httpCode: 500,
1679
+ },
1680
+ DAILY_STREAK_PROMOCODE_ALREADY_EXISTS_ERROR: {
1681
+ code: 'A356',
1682
+ message: 'Промокод для ежедневного стрика уже существует',
1683
+ httpCode: 409,
1684
+ },
1685
+ DAILY_REWARD_NOT_READY_ERROR: {
1686
+ code: 'A357',
1687
+ message: 'Запрашиваемая награда ещё недоступна для получения',
1688
+ httpCode: 429,
1689
+ },
1690
+ DAILY_REWARD_ALREADY_COLLECTED_ERROR: {
1691
+ code: 'A358',
1692
+ message: 'Запрашиваемая награда уже получена',
1693
+ httpCode: 429,
1694
+ },
1695
+ DAILY_STREAK_UPDATE_ERROR: {
1696
+ code: 'A359',
1697
+ message: 'Ошибка при обновлении ежедневного стрика',
1698
+ httpCode: 500,
1699
+ },
1700
+ ACCOUNT_DELETE_ERROR: {
1701
+ code: 'A360',
1702
+ message: 'Аккаунт не был удалён',
1703
+ httpCode: 500,
1704
+ },
1705
+ ACCOUNT_DELETED: {
1706
+ code: 'A361',
1707
+ message: 'Операция невозможна, аккаунт был удалён',
1708
+ httpCode: 400,
1709
+ },
1710
+ TELEGRAM_PROFILE_DELETE_ERROR: {
1711
+ code: 'A362',
1712
+ message: 'Произошла ошибка при удалении Telegram профиля',
1713
+ httpCode: 500,
1714
+ },
1665
1715
  };
@@ -48,3 +48,4 @@ __exportStar(require("./ui-notification"), exports);
48
48
  __exportStar(require("./review"), exports);
49
49
  __exportStar(require("./tool-video"), exports);
50
50
  __exportStar(require("./feedback"), exports);
51
+ __exportStar(require("./daily-streak"), exports);
@@ -5,4 +5,5 @@ var PROMOCODE_PROMOTION;
5
5
  (function (PROMOCODE_PROMOTION) {
6
6
  PROMOCODE_PROMOTION["BONUS"] = "bonus";
7
7
  PROMOCODE_PROMOTION["CHAT_UPSELL"] = "chat_upsell";
8
+ PROMOCODE_PROMOTION["DAILY_STREAK"] = "daily_streak";
8
9
  })(PROMOCODE_PROMOTION || (exports.PROMOCODE_PROMOTION = PROMOCODE_PROMOTION = {}));
@@ -7,4 +7,5 @@ var USER_STATUS;
7
7
  USER_STATUS["INACTIVE"] = "inactive";
8
8
  USER_STATUS["TG_AUTO_REGISTERED"] = "tg_auto_registered";
9
9
  USER_STATUS["MERGED"] = "merged";
10
+ USER_STATUS["DELETED"] = "deleted";
10
11
  })(USER_STATUS || (exports.USER_STATUS = USER_STATUS = {}));
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DailyStreakWithPromocodeSchema = exports.DailyStreakSchema = exports.DayInDailyStreakSchema = void 0;
7
+ const zod_1 = __importDefault(require("zod"));
8
+ const constants_1 = require("../constants");
9
+ const promocode_schema_1 = require("./promocode.schema");
10
+ exports.DayInDailyStreakSchema = zod_1.default.object({
11
+ dayNumber: zod_1.default.number().int().nonnegative(),
12
+ status: zod_1.default.nativeEnum(constants_1.DAILY_STREAK_STATUS),
13
+ award: zod_1.default.number().int().nonnegative().nullable(), // null on PROMOCODE days
14
+ isCurrentDay: zod_1.default.boolean(),
15
+ awardType: zod_1.default.nativeEnum(constants_1.DAY_IN_DAILY_STREAK_AWARD_TYPE),
16
+ });
17
+ exports.DailyStreakSchema = zod_1.default.object({
18
+ uuid: zod_1.default.string().uuid(),
19
+ userId: zod_1.default.string().uuid(),
20
+ promocodeId: zod_1.default.string().uuid().nullable(),
21
+ lastDailyCollectionAt: zod_1.default.date().nullable(),
22
+ currentDayStreak: zod_1.default.number().int().min(0),
23
+ createdAt: zod_1.default.date(),
24
+ updatedAt: zod_1.default.date(),
25
+ days: zod_1.default.array(exports.DayInDailyStreakSchema).default([]),
26
+ });
27
+ exports.DailyStreakWithPromocodeSchema = exports.DailyStreakSchema.extend({
28
+ promocode: promocode_schema_1.PromocodeSchema.nullable(),
29
+ }).omit({ promocodeId: true });
@@ -64,3 +64,4 @@ __exportStar(require("./prompt.schema"), exports);
64
64
  __exportStar(require("./folder.schema"), exports);
65
65
  __exportStar(require("./filters.schema"), exports);
66
66
  __exportStar(require("./users-filter-notification.schema"), exports);
67
+ __exportStar(require("./daily-streak"), exports);
@@ -17,6 +17,7 @@ exports.UserSchema = zod_1.z.object({
17
17
  role: zod_1.z.string(),
18
18
  createdAt: zod_1.z.date(),
19
19
  updatedAt: zod_1.z.date(),
20
+ deletedAt: zod_1.z.date().nullable(),
20
21
  });
21
22
  exports.UserAggregateSchema = zod_1.z.object({
22
23
  user: exports.UserSchema,
@@ -0,0 +1,12 @@
1
+ import { z } from 'zod';
2
+ import { DailyStreakWithPromocodeSchema } from '../../models';
3
+
4
+ export namespace CollectDailyRewardCommand {
5
+ export type Request = void;
6
+
7
+ export const ResponseSchema = z.object({
8
+ data: DailyStreakWithPromocodeSchema,
9
+ });
10
+
11
+ export type Response = z.infer<typeof ResponseSchema>;
12
+ }
@@ -0,0 +1,12 @@
1
+ import { z } from 'zod';
2
+ import { DailyStreakWithPromocodeSchema } from '../../models';
3
+
4
+ export namespace GetDailyStreakCommand {
5
+ export type Request = void;
6
+
7
+ export const ResponseSchema = z.object({
8
+ data: DailyStreakWithPromocodeSchema,
9
+ });
10
+
11
+ export type Response = z.infer<typeof ResponseSchema>;
12
+ }
@@ -0,0 +1,2 @@
1
+ export * from './collect-daily-reward.command';
2
+ export * from './get-daily-streak.command';
package/commands/index.ts CHANGED
@@ -35,3 +35,4 @@ export * from './prompt-topic';
35
35
  export * from './prompt';
36
36
  export * from './folder';
37
37
  export * from './user-to-product';
38
+ export * from './daily-streak';
@@ -0,0 +1,13 @@
1
+ import { z } from 'zod';
2
+
3
+ export namespace DeleteAccountCommand {
4
+ export type Request = void;
5
+
6
+ export const ResponseSchema = z.object({
7
+ data: z.object({
8
+ isDeleted: z.boolean(),
9
+ }),
10
+ });
11
+
12
+ export type Response = z.infer<typeof ResponseSchema>;
13
+ }
@@ -41,6 +41,7 @@ export namespace FindUsersByCriteriaCommand {
41
41
 
42
42
  createdAt: DateFilter.optional(),
43
43
  updatedAt: DateFilter.optional(),
44
+ deletedAt: DateFilter.optional(),
44
45
  tokenBonusBalance: NumberFilter.optional(),
45
46
 
46
47
  sortBy: z.nativeEnum(USER_SORT_BY).optional(),
@@ -7,3 +7,4 @@ export * from './get-user-balance.command';
7
7
  export * from './get-user-orders.command';
8
8
  export * from './get-user-subscriptions.command';
9
9
  export * from './get-user-products.command';
10
+ export * from './delete-account.command';
@@ -0,0 +1,5 @@
1
+ export enum DAILY_STREAK_STATUS {
2
+ COLLECTED = 'COLLECTED', // награда уже собрана
3
+ NOT_READY = 'NOT_READY', // награда еще недоступна для сбора
4
+ READY = 'READY', // награда доступна для сбора
5
+ }
@@ -0,0 +1,4 @@
1
+ export enum DAY_IN_DAILY_STREAK_AWARD_TYPE {
2
+ COIN_TRANSACTION = 'COIN_TRANSACTION',
3
+ PROMOCODE = 'PROMOCODE',
4
+ }
@@ -0,0 +1,2 @@
1
+ export * from './daily-streak-status.enum';
2
+ export * from './day-in-daily-streak-reward-type.enum';
@@ -0,0 +1 @@
1
+ export * from './enums';
@@ -1669,4 +1669,54 @@ export const ERRORS = {
1669
1669
  message: 'Произошла ошибка при подсчёте количества сообщений для юзера',
1670
1670
  httpCode: 500,
1671
1671
  },
1672
+ DAILY_REWARD_COLLECT_ERROR: {
1673
+ code: 'A353',
1674
+ message: 'Ошибка при получении ежедневной награды',
1675
+ httpCode: 500,
1676
+ },
1677
+ DAILY_STREAK_CREATE_ERROR: {
1678
+ code: 'A354',
1679
+ message: 'Ошибка при создании ежедневного стрика',
1680
+ httpCode: 500,
1681
+ },
1682
+ DAILY_STREAK_FIND_ERROR: {
1683
+ code: 'A355',
1684
+ message: 'Ошибка при поиске ежедневного стрика',
1685
+ httpCode: 500,
1686
+ },
1687
+ DAILY_STREAK_PROMOCODE_ALREADY_EXISTS_ERROR: {
1688
+ code: 'A356',
1689
+ message: 'Промокод для ежедневного стрика уже существует',
1690
+ httpCode: 409,
1691
+ },
1692
+ DAILY_REWARD_NOT_READY_ERROR: {
1693
+ code: 'A357',
1694
+ message: 'Запрашиваемая награда ещё недоступна для получения',
1695
+ httpCode: 429,
1696
+ },
1697
+ DAILY_REWARD_ALREADY_COLLECTED_ERROR: {
1698
+ code: 'A358',
1699
+ message: 'Запрашиваемая награда уже получена',
1700
+ httpCode: 429,
1701
+ },
1702
+ DAILY_STREAK_UPDATE_ERROR: {
1703
+ code: 'A359',
1704
+ message: 'Ошибка при обновлении ежедневного стрика',
1705
+ httpCode: 500,
1706
+ },
1707
+ ACCOUNT_DELETE_ERROR: {
1708
+ code: 'A360',
1709
+ message: 'Аккаунт не был удалён',
1710
+ httpCode: 500,
1711
+ },
1712
+ ACCOUNT_DELETED: {
1713
+ code: 'A361',
1714
+ message: 'Операция невозможна, аккаунт был удалён',
1715
+ httpCode: 400,
1716
+ },
1717
+ TELEGRAM_PROFILE_DELETE_ERROR: {
1718
+ code: 'A362',
1719
+ message: 'Произошла ошибка при удалении Telegram профиля',
1720
+ httpCode: 500,
1721
+ },
1672
1722
  };
@@ -32,3 +32,4 @@ export * from './ui-notification';
32
32
  export * from './review';
33
33
  export * from './tool-video';
34
34
  export * from './feedback';
35
+ export * from './daily-streak';
@@ -1,4 +1,5 @@
1
1
  export enum PROMOCODE_PROMOTION {
2
2
  BONUS = 'bonus',
3
3
  CHAT_UPSELL = 'chat_upsell',
4
+ DAILY_STREAK = 'daily_streak',
4
5
  }
@@ -3,4 +3,5 @@ export enum USER_STATUS {
3
3
  INACTIVE = 'inactive',
4
4
  TG_AUTO_REGISTERED = 'tg_auto_registered',
5
5
  MERGED = 'merged',
6
+ DELETED = 'deleted',
6
7
  }
@@ -0,0 +1,27 @@
1
+ import z from 'zod';
2
+ import { DAILY_STREAK_STATUS, DAY_IN_DAILY_STREAK_AWARD_TYPE } from '../constants';
3
+ import { PromocodeSchema } from './promocode.schema';
4
+
5
+ export const DayInDailyStreakSchema = z.object({
6
+ dayNumber: z.number().int().nonnegative(),
7
+ status: z.nativeEnum(DAILY_STREAK_STATUS),
8
+ award: z.number().int().nonnegative().nullable(), // null on PROMOCODE days
9
+ isCurrentDay: z.boolean(),
10
+ awardType: z.nativeEnum(DAY_IN_DAILY_STREAK_AWARD_TYPE),
11
+ });
12
+
13
+ export const DailyStreakSchema = z.object({
14
+ uuid: z.string().uuid(),
15
+ userId: z.string().uuid(),
16
+ promocodeId: z.string().uuid().nullable(),
17
+ lastDailyCollectionAt: z.date().nullable(),
18
+ currentDayStreak: z.number().int().min(0),
19
+ createdAt: z.date(),
20
+ updatedAt: z.date(),
21
+
22
+ days: z.array(DayInDailyStreakSchema).default([]),
23
+ });
24
+
25
+ export const DailyStreakWithPromocodeSchema = DailyStreakSchema.extend({
26
+ promocode: PromocodeSchema.nullable(),
27
+ }).omit({ promocodeId: true });
package/models/index.ts CHANGED
@@ -48,3 +48,4 @@ export * from './prompt.schema';
48
48
  export * from './folder.schema';
49
49
  export * from './filters.schema';
50
50
  export * from './users-filter-notification.schema';
51
+ export * from './daily-streak';
@@ -16,6 +16,7 @@ export const UserSchema = z.object({
16
16
 
17
17
  createdAt: z.date(),
18
18
  updatedAt: z.date(),
19
+ deletedAt: z.date().nullable(),
19
20
  });
20
21
 
21
22
  export const UserAggregateSchema = z.object({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@purpleschool/gptbot",
3
- "version": "0.7.26",
3
+ "version": "0.7.28",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",