storemw-core-api 1.0.142 → 1.0.144

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 (92) hide show
  1. package/dist/app.js +1 -0
  2. package/dist/app.js.map +1 -1
  3. package/dist/controllers/index.d.ts +2 -0
  4. package/dist/controllers/index.js +13 -2
  5. package/dist/controllers/index.js.map +1 -1
  6. package/dist/controllers/subscription/account/accountSubscribeController.d.ts +9 -0
  7. package/dist/controllers/subscription/account/accountSubscribeController.js +105 -0
  8. package/dist/controllers/subscription/account/accountSubscribeController.js.map +1 -0
  9. package/dist/controllers/subscription/plan/subscribePlanController.d.ts +11 -0
  10. package/dist/controllers/subscription/plan/subscribePlanController.js +163 -0
  11. package/dist/controllers/subscription/plan/subscribePlanController.js.map +1 -0
  12. package/dist/features/auth_token/authTokenRegister.d.ts +5 -0
  13. package/dist/features/auth_token/authTokenRegister.js +11 -0
  14. package/dist/features/auth_token/authTokenRegister.js.map +1 -0
  15. package/dist/features/auth_token/authTokenRegistry.d.ts +2 -0
  16. package/dist/features/auth_token/authTokenRegistry.js +16 -0
  17. package/dist/features/auth_token/authTokenRegistry.js.map +1 -0
  18. package/dist/features/auth_token/authTokenType.d.ts +5 -0
  19. package/dist/features/auth_token/authTokenType.js +3 -0
  20. package/dist/features/auth_token/authTokenType.js.map +1 -0
  21. package/dist/features/index.d.ts +3 -0
  22. package/dist/features/index.js +5 -1
  23. package/dist/features/index.js.map +1 -1
  24. package/dist/middlewares/route/index.d.ts +2 -0
  25. package/dist/middlewares/route/index.js +13 -2
  26. package/dist/middlewares/route/index.js.map +1 -1
  27. package/dist/middlewares/route/validateSubscriptionAccount.d.ts +5 -0
  28. package/dist/middlewares/route/validateSubscriptionAccount.js +20 -0
  29. package/dist/middlewares/route/validateSubscriptionAccount.js.map +1 -0
  30. package/dist/middlewares/route/validateSubscriptionPlan.d.ts +6 -0
  31. package/dist/middlewares/route/validateSubscriptionPlan.js +24 -0
  32. package/dist/middlewares/route/validateSubscriptionPlan.js.map +1 -0
  33. package/dist/models/index.d.ts +5 -1
  34. package/dist/models/index.js +8 -2
  35. package/dist/models/index.js.map +1 -1
  36. package/dist/models/subscription/account/AccountSubscribeModel.d.ts +257 -0
  37. package/dist/models/subscription/account/AccountSubscribeModel.js +13 -0
  38. package/dist/models/subscription/account/AccountSubscribeModel.js.map +1 -0
  39. package/dist/models/subscription/plan/SubscribePlanModel.d.ts +257 -0
  40. package/dist/models/subscription/plan/SubscribePlanModel.js +13 -0
  41. package/dist/models/subscription/plan/SubscribePlanModel.js.map +1 -0
  42. package/dist/routes/index.d.ts +1 -0
  43. package/dist/routes/index.js +3 -1
  44. package/dist/routes/index.js.map +1 -1
  45. package/dist/routes/subscription/subscriptionsAccountRoutes.d.ts +2 -0
  46. package/dist/routes/subscription/subscriptionsAccountRoutes.js +15 -0
  47. package/dist/routes/subscription/subscriptionsAccountRoutes.js.map +1 -0
  48. package/dist/routes/subscription/subscriptionsAccountsRoutes.d.ts +2 -0
  49. package/dist/routes/subscription/subscriptionsAccountsRoutes.js +11 -0
  50. package/dist/routes/subscription/subscriptionsAccountsRoutes.js.map +1 -0
  51. package/dist/routes/subscription/subscriptionsPlanRoutes.d.ts +2 -0
  52. package/dist/routes/subscription/subscriptionsPlanRoutes.js +15 -0
  53. package/dist/routes/subscription/subscriptionsPlanRoutes.js.map +1 -0
  54. package/dist/routes/subscription/subscriptionsPlansRoutes.d.ts +2 -0
  55. package/dist/routes/subscription/subscriptionsPlansRoutes.js +13 -0
  56. package/dist/routes/subscription/subscriptionsPlansRoutes.js.map +1 -0
  57. package/dist/routes/subscription/subscriptionsRoutes.d.ts +2 -0
  58. package/dist/routes/subscription/subscriptionsRoutes.js +17 -0
  59. package/dist/routes/subscription/subscriptionsRoutes.js.map +1 -0
  60. package/dist/schema/middleware/route/index.d.ts +4 -0
  61. package/dist/schema/middleware/route/index.js +5 -1
  62. package/dist/schema/middleware/route/index.js.map +1 -1
  63. package/dist/schema/middleware/route/schemaSubscriptionAccount.d.ts +4 -0
  64. package/dist/schema/middleware/route/schemaSubscriptionAccount.js +10 -0
  65. package/dist/schema/middleware/route/schemaSubscriptionAccount.js.map +1 -0
  66. package/dist/schema/middleware/route/schemaSubscriptionPlan.d.ts +4 -0
  67. package/dist/schema/middleware/route/schemaSubscriptionPlan.js +10 -0
  68. package/dist/schema/middleware/route/schemaSubscriptionPlan.js.map +1 -0
  69. package/dist/schema/payload/index.d.ts +4 -0
  70. package/dist/schema/payload/index.js +9 -2
  71. package/dist/schema/payload/index.js.map +1 -1
  72. package/dist/schema/payload/subscription/schemaAccountSubscribe.d.ts +126 -0
  73. package/dist/schema/payload/subscription/schemaAccountSubscribe.js +31 -0
  74. package/dist/schema/payload/subscription/schemaAccountSubscribe.js.map +1 -0
  75. package/dist/schema/payload/subscription/schemaSubscribePlan.d.ts +259 -0
  76. package/dist/schema/payload/subscription/schemaSubscribePlan.js +41 -0
  77. package/dist/schema/payload/subscription/schemaSubscribePlan.js.map +1 -0
  78. package/dist/services/auth/AuthService.d.ts +8 -7
  79. package/dist/services/auth/AuthService.js +6 -1
  80. package/dist/services/auth/AuthService.js.map +1 -1
  81. package/dist/services/index.d.ts +5 -1
  82. package/dist/services/index.js +7 -1
  83. package/dist/services/index.js.map +1 -1
  84. package/dist/services/others/NumberDateSequenceService.d.ts +1 -1
  85. package/dist/services/subscription/account/AccountSubscribeService.d.ts +43 -0
  86. package/dist/services/subscription/account/AccountSubscribeService.js +193 -0
  87. package/dist/services/subscription/account/AccountSubscribeService.js.map +1 -0
  88. package/dist/services/subscription/plan/SubscribePlanService.d.ts +63 -0
  89. package/dist/services/subscription/plan/SubscribePlanService.js +175 -0
  90. package/dist/services/subscription/plan/SubscribePlanService.js.map +1 -0
  91. package/package.json +21 -11
  92. package/prisma/schema.prisma +40 -0
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubscribePlanService = exports.subscribeCurrencies = exports.subscribePlanBillingCycles = void 0;
4
+ const utils_1 = require("../../../utils");
5
+ const models_1 = require("../../../models");
6
+ const lib_1 = require("../../../lib");
7
+ exports.subscribePlanBillingCycles = {
8
+ monthly: "monthly",
9
+ yearly: "yearly"
10
+ };
11
+ exports.subscribeCurrencies = {
12
+ myr: "myr",
13
+ usd: "usd"
14
+ };
15
+ const getCreatePayload = (data) => {
16
+ return {
17
+ [`${models_1.ModelSubscribePlanFields.name}`]: data.name,
18
+ [`${models_1.ModelSubscribePlanFields.short_description}`]: data.shortDescription,
19
+ [`${models_1.ModelSubscribePlanFields.full_description}`]: data.fullDescription,
20
+ [`${models_1.ModelSubscribePlanFields.price}`]: Number(data.price),
21
+ [`${models_1.ModelSubscribePlanFields.currency}`]: data.currency,
22
+ [`${models_1.ModelSubscribePlanFields.billing_cycle}`]: data.billingCycle,
23
+ [`${models_1.ModelSubscribePlanFields.status}`]: Boolean(data.status)
24
+ };
25
+ };
26
+ const getUpdatePayload = (data) => {
27
+ return {
28
+ [`${models_1.ModelSubscribePlanFields.name}`]: data.name,
29
+ [`${models_1.ModelSubscribePlanFields.short_description}`]: data.shortDescription,
30
+ [`${models_1.ModelSubscribePlanFields.full_description}`]: data.fullDescription,
31
+ [`${models_1.ModelSubscribePlanFields.price}`]: Number(data.price),
32
+ [`${models_1.ModelSubscribePlanFields.currency}`]: data.currency,
33
+ [`${models_1.ModelSubscribePlanFields.billing_cycle}`]: data.billingCycle,
34
+ [`${models_1.ModelSubscribePlanFields.status}`]: Boolean(data.status)
35
+ };
36
+ };
37
+ let mainSqlSelect = {
38
+ [`subplan.${models_1.ModelSubscribePlanFields.subscribe_plan_id}`]: "subscribe_plan_id",
39
+ [`subplan.${models_1.ModelSubscribePlanFields.short_description}`]: "short_description",
40
+ [`subplan.${models_1.ModelSubscribePlanFields.full_description}`]: "full_description",
41
+ [`subplan.${models_1.ModelSubscribePlanFields.price}::float`]: "price",
42
+ [`subplan.${models_1.ModelSubscribePlanFields.billing_cycle}`]: "billing_cycle",
43
+ [`subplan.${models_1.ModelSubscribePlanFields.currency}`]: "currency",
44
+ [`subplan.${models_1.ModelSubscribePlanFields.status}`]: "status"
45
+ };
46
+ // let regionSqlSelect = {
47
+ // [`bussarea.${ModelAreaFields.area_name}`]: "area_name",
48
+ // [`bussstate.${ModelStateFields.state_name}`]: "state_name",
49
+ // [`busscoun.${ModelCountryFields.country_name}`]: "country_name"
50
+ // }
51
+ let defaultSqlSelect = {
52
+ [`subplan.${models_1.ModelSubscribePlanFields.createdatetime}`]: "createdatetime",
53
+ [`creator.${models_1.ModelUserFields.login_username}`]: "createusername",
54
+ [`subplan.${models_1.ModelSubscribePlanFields.updatedatetime}`]: "updatedatetime",
55
+ [`updater.${models_1.ModelUserFields.login_username}`]: "updateusername",
56
+ [`subplan.${models_1.ModelSubscribePlanFields.isdelete}`]: "isdelete",
57
+ [`subplan.${models_1.ModelSubscribePlanFields.istrash}`]: "istrash",
58
+ [`subplan.${models_1.ModelSubscribePlanFields.accountid}`]: "accountid",
59
+ };
60
+ const SubscribePlanService = (props) => {
61
+ const { ...rest } = props;
62
+ const subscribePlanModel = (0, models_1.SubscribePlanModel)({ ...rest, isOperator: true });
63
+ const createSubscribePlan = async ({ data }) => {
64
+ const _data = getCreatePayload(data);
65
+ if (!_data) {
66
+ throw new Error(`Invalid create subscribe plan payload: ${JSON.stringify(_data)}`);
67
+ }
68
+ let response = await subscribePlanModel.create({ data: _data });
69
+ return await getSubscribePlan({ id: Number(response?.subscribe_plan_id ?? 0), datatypes: [] });
70
+ };
71
+ const updateSubscribePlan = async ({ subscribePlanId, data }) => {
72
+ const _data = getUpdatePayload(data);
73
+ if (!_data) {
74
+ throw new Error(`Invalid update subscribe plan payload: ${JSON.stringify(_data)}`);
75
+ }
76
+ let response = await subscribePlanModel.update({ where: { [`${models_1.ModelSubscribePlanFields.subscribe_plan_id}`]: subscribePlanId }, data: _data });
77
+ return await getSubscribePlan({ id: Number(subscribePlanId), datatypes: [] });
78
+ };
79
+ const getSubscribePlan = async ({ id, datatypes = [] }) => {
80
+ let { data } = await listSubscribePlans({
81
+ limit: 1,
82
+ offset: 0,
83
+ filters: [{ field: `${models_1.ModelSubscribePlanFields.subscribe_plan_id}`, operator: "=", value: id }],
84
+ sortfield: `${models_1.ModelSubscribePlanFields.subscribe_plan_id}`,
85
+ sortorder: "ASC",
86
+ datatypes
87
+ });
88
+ return data[0] ?? null;
89
+ };
90
+ const listSubscribePlans = async ({ limit, offset, filters = [], sortfield, sortorder, datatypes = [] }) => {
91
+ let data = [];
92
+ let sqlSelect = [
93
+ `COUNT(subplan.*) OVER() as filtered_count`,
94
+ (0, lib_1.buildSqlSelect)(``, mainSqlSelect),
95
+ (0, lib_1.buildSqlSelect)(``, defaultSqlSelect)
96
+ ];
97
+ let sqlRelation = [
98
+ // buildSqlRelation("left", "buss", "states", "bussstate", ["buss.state_id = bussstate.state_id", "bussstate.isdelete = false", "bussstate.istrash = false"]),
99
+ (0, lib_1.buildSqlRelation)("left", "subplan", "users", "creator", ["subplan.createuserid = creator.user_id", "creator.isdelete = false", "creator.istrash = false"]),
100
+ (0, lib_1.buildSqlRelation)("left", "subplan", "users", "updater", ["subplan.updateuserid = updater.user_id", "updater.isdelete = false", "updater.istrash = false"])
101
+ ];
102
+ let sqlGroupBy = [
103
+ ...Object.keys(mainSqlSelect),
104
+ ...Object.keys(defaultSqlSelect)
105
+ ];
106
+ let filterColumns = {
107
+ ...mainSqlSelect,
108
+ ...defaultSqlSelect
109
+ };
110
+ let sqlWhere = [
111
+ `subplan.isdelete = false`,
112
+ `subplan.istrash = false`,
113
+ ...(filters.length ? [(0, lib_1.buildSqlWhere)(filters, filterColumns)?.where] : []),
114
+ ];
115
+ let sqlOrderby = (0, lib_1.buildSqlOrderBy)(sortfield, sortorder);
116
+ let sqlLimitOffset = (0, lib_1.buildSqlLimitOffset)(limit, offset);
117
+ const sqlRaw = (0, lib_1.buildSqlRawSelect)({
118
+ tableName: "subscribe_plans",
119
+ mainAlias: "subplan",
120
+ accountId: rest.accountId,
121
+ sqlSelect,
122
+ sqlRelation,
123
+ sqlWhere,
124
+ sqlGroupBy,
125
+ sqlOrderby,
126
+ sqlLimitOffset
127
+ });
128
+ data = await subscribePlanModel.raw(sqlRaw);
129
+ const response = {
130
+ data: data.map(({ filtered_count, ...rest }) => rest),
131
+ total: data.length ? Number(data[0].filtered_count) : 0
132
+ };
133
+ return response;
134
+ };
135
+ const removeSubscribePlans = async ({ subscribePlanIds }) => {
136
+ if (!subscribePlanIds.length)
137
+ (0, utils_1.throwError)('subscribePlanIds is required');
138
+ const response = await subscribePlanModel.remove({ where: { [`${models_1.ModelSubscribePlanFields.subscribe_plan_id}`]: { in: subscribePlanIds } } });
139
+ return response;
140
+ };
141
+ // const getDataTypes = () => {
142
+ // return Object.values(accountDataTypes);
143
+ // }
144
+ /**
145
+ * Calculate the next end date based on start date and billing cycle
146
+ * @param startDate - the starting date of the subscription
147
+ * @param cycle - either "monthly" or "yearly"
148
+ * @returns the next end date as Date
149
+ */
150
+ const getNextBillingEndDate = (startDate, cycle) => {
151
+ // const date = startDate instanceof Date ? new Date(startDate) : new Date(startDate);
152
+ const date = new Date(startDate.getTime()); // clone to avoid mutating original
153
+ switch (cycle) {
154
+ case "monthly":
155
+ date.setMonth(date.getMonth() + 1);
156
+ break;
157
+ case "yearly":
158
+ date.setFullYear(date.getFullYear() + 1);
159
+ break;
160
+ default:
161
+ throw new Error(`Unknown billing cycle: ${cycle}`);
162
+ }
163
+ return date;
164
+ };
165
+ return {
166
+ getSubscribePlan,
167
+ createSubscribePlan,
168
+ updateSubscribePlan,
169
+ removeSubscribePlans,
170
+ listSubscribePlans,
171
+ getNextBillingEndDate
172
+ };
173
+ };
174
+ exports.SubscribePlanService = SubscribePlanService;
175
+ //# sourceMappingURL=SubscribePlanService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubscribePlanService.js","sourceRoot":"","sources":["../../../../src/services/subscription/plan/SubscribePlanService.ts"],"names":[],"mappings":"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","sourcesContent":["import { logError, throwError } from \"@/utils\";\n\nimport {\n ModelUserFields,\n SubscribePlanModel,\n ModelSubscribePlanFields,\n ModelAreaFields,\n ModelStateFields,\n ModelCountryFields,\n} from \"@/models\";\n\nimport { QueryList, QueryGet } from \"@/schema/common\";\n\nimport { DefaultServiceProps } from \"@/utils\";\n\nimport { buildSqlRelation, buildSqlRawSelect, buildSqlWhere, buildSqlSelect, buildSqlLimitOffset, buildSqlOrderBy } from \"@/lib\";\n\nexport type SubscribePlanServiceProps = DefaultServiceProps & {};\n\nexport const subscribePlanBillingCycles = {\n monthly: \"monthly\",\n yearly: \"yearly\"\n}\n\nexport type SubscribePlanBillingCycle = keyof typeof subscribePlanBillingCycles\n\nexport const subscribeCurrencies = {\n myr: \"myr\",\n usd: \"usd\"\n}\n\nexport type SubscribePlanCurrency = keyof typeof subscribeCurrencies\n\nexport type SubscribePlanGetProps = QueryGet & {\n id: number,\n};\n\nexport type SubscribePlanListProps = QueryList & {\n};\n\nexport type SubscribePlanRemoveProps = {\n subscribePlanIds: BigInt[]\n};\n\nexport type SubscribePlan = {\n name: string\n shortDescription: string\n fullDescription: string\n price: number\n billingCycle: SubscribePlanBillingCycle;\n currency: SubscribePlanCurrency;\n status: boolean\n}\n\nexport type SubscribePlanCreateProps = {\n data: SubscribePlan\n}\n\nexport type SubscribePlanUpdateProps = {\n subscribePlanId: number,\n data: SubscribePlan\n}\n\nconst getCreatePayload = (data: SubscribePlanCreateProps[\"data\"]) => {\n\n return {\n [`${ModelSubscribePlanFields.name}`]: data.name,\n [`${ModelSubscribePlanFields.short_description}`]: data.shortDescription,\n [`${ModelSubscribePlanFields.full_description}`]: data.fullDescription,\n [`${ModelSubscribePlanFields.price}`]: Number(data.price),\n [`${ModelSubscribePlanFields.currency}`]: data.currency,\n\n [`${ModelSubscribePlanFields.billing_cycle}`]: data.billingCycle,\n [`${ModelSubscribePlanFields.status}`]: Boolean(data.status)\n }\n\n}\n\nconst getUpdatePayload = (data: SubscribePlanUpdateProps[\"data\"]) => {\n\n return {\n [`${ModelSubscribePlanFields.name}`]: data.name,\n [`${ModelSubscribePlanFields.short_description}`]: data.shortDescription,\n [`${ModelSubscribePlanFields.full_description}`]: data.fullDescription,\n [`${ModelSubscribePlanFields.price}`]: Number(data.price),\n [`${ModelSubscribePlanFields.currency}`]: data.currency,\n\n [`${ModelSubscribePlanFields.billing_cycle}`]: data.billingCycle,\n [`${ModelSubscribePlanFields.status}`]: Boolean(data.status)\n }\n\n}\n\nlet mainSqlSelect = {\n [`subplan.${ModelSubscribePlanFields.subscribe_plan_id}`]: \"subscribe_plan_id\",\n [`subplan.${ModelSubscribePlanFields.short_description}`]: \"short_description\",\n [`subplan.${ModelSubscribePlanFields.full_description}`]: \"full_description\",\n [`subplan.${ModelSubscribePlanFields.price}::float`]: \"price\",\n [`subplan.${ModelSubscribePlanFields.billing_cycle}`]: \"billing_cycle\",\n [`subplan.${ModelSubscribePlanFields.currency}`]: \"currency\",\n [`subplan.${ModelSubscribePlanFields.status}`]: \"status\"\n}\n\n// let regionSqlSelect = {\n// [`bussarea.${ModelAreaFields.area_name}`]: \"area_name\",\n// [`bussstate.${ModelStateFields.state_name}`]: \"state_name\",\n// [`busscoun.${ModelCountryFields.country_name}`]: \"country_name\"\n// }\n\nlet defaultSqlSelect = {\n [`subplan.${ModelSubscribePlanFields.createdatetime}`]: \"createdatetime\",\n [`creator.${ModelUserFields.login_username}`]: \"createusername\",\n [`subplan.${ModelSubscribePlanFields.updatedatetime}`]: \"updatedatetime\",\n [`updater.${ModelUserFields.login_username}`]: \"updateusername\",\n [`subplan.${ModelSubscribePlanFields.isdelete}`]: \"isdelete\",\n [`subplan.${ModelSubscribePlanFields.istrash}`]: \"istrash\",\n [`subplan.${ModelSubscribePlanFields.accountid}`]: \"accountid\",\n}\n\nexport const SubscribePlanService = (props: SubscribePlanServiceProps) => {\n\n const {\n ...rest\n } = props\n\n const subscribePlanModel = SubscribePlanModel({ ...rest, isOperator: true })\n\n const createSubscribePlan = async ({ data }: SubscribePlanCreateProps) => {\n\n const _data = getCreatePayload(data)\n\n if (!_data) {\n throw new Error(`Invalid create subscribe plan payload: ${JSON.stringify(_data)}`);\n }\n\n let response = await subscribePlanModel.create({ data: _data })\n\n return await getSubscribePlan({ id: Number(response?.subscribe_plan_id ?? 0), datatypes: [] })\n }\n\n const updateSubscribePlan = async ({ subscribePlanId, data }: SubscribePlanUpdateProps) => {\n\n const _data = getUpdatePayload(data)\n\n if (!_data) {\n throw new Error(`Invalid update subscribe plan payload: ${JSON.stringify(_data)}`);\n }\n\n let response = await subscribePlanModel.update({ where: { [`${ModelSubscribePlanFields.subscribe_plan_id}`]: subscribePlanId }, data: _data })\n\n return await getSubscribePlan({ id: Number(subscribePlanId), datatypes: [] })\n }\n\n const getSubscribePlan = async ({ id, datatypes = [] }: SubscribePlanGetProps) => {\n\n let { data } = await listSubscribePlans({\n limit: 1,\n offset: 0,\n filters: [{ field: `${ModelSubscribePlanFields.subscribe_plan_id}`, operator: \"=\", value: id }],\n sortfield: `${ModelSubscribePlanFields.subscribe_plan_id}`,\n sortorder: \"ASC\",\n datatypes\n })\n\n return data[0] ?? null;\n\n };\n\n const listSubscribePlans = async ({ limit, offset, filters = [], sortfield, sortorder, datatypes = [] }: SubscribePlanListProps) => {\n\n let data = []\n\n let sqlSelect = [\n `COUNT(subplan.*) OVER() as filtered_count`,\n buildSqlSelect(``, mainSqlSelect),\n buildSqlSelect(``, defaultSqlSelect)\n ]\n\n let sqlRelation = [\n // buildSqlRelation(\"left\", \"buss\", \"states\", \"bussstate\", [\"buss.state_id = bussstate.state_id\", \"bussstate.isdelete = false\", \"bussstate.istrash = false\"]),\n buildSqlRelation(\"left\", \"subplan\", \"users\", \"creator\", [\"subplan.createuserid = creator.user_id\", \"creator.isdelete = false\", \"creator.istrash = false\"]),\n buildSqlRelation(\"left\", \"subplan\", \"users\", \"updater\", [\"subplan.updateuserid = updater.user_id\", \"updater.isdelete = false\", \"updater.istrash = false\"])\n ]\n\n let sqlGroupBy: string[] = [\n ...Object.keys(mainSqlSelect),\n ...Object.keys(defaultSqlSelect)\n ]\n\n let filterColumns = {\n ...mainSqlSelect,\n ...defaultSqlSelect\n }\n\n let sqlWhere = [\n `subplan.isdelete = false`,\n `subplan.istrash = false`,\n ...(filters.length ? [buildSqlWhere(filters, filterColumns)?.where] : []),\n ]\n\n let sqlOrderby = buildSqlOrderBy(sortfield, sortorder)\n let sqlLimitOffset = buildSqlLimitOffset(limit, offset)\n\n const sqlRaw = buildSqlRawSelect({\n tableName: \"subscribe_plans\",\n mainAlias: \"subplan\",\n accountId: rest.accountId,\n sqlSelect,\n sqlRelation,\n sqlWhere,\n sqlGroupBy,\n sqlOrderby,\n sqlLimitOffset\n })\n\n data = await subscribePlanModel.raw(sqlRaw)\n\n const response = {\n data: data.map(({ filtered_count, ...rest }) => rest),\n total: data.length ? Number(data[0].filtered_count) : 0\n }\n\n return response\n\n };\n\n const removeSubscribePlans = async ({ subscribePlanIds }: SubscribePlanRemoveProps) => {\n\n if (!subscribePlanIds.length) throwError('subscribePlanIds is required');\n\n const response = await subscribePlanModel.remove({ where: { [`${ModelSubscribePlanFields.subscribe_plan_id}`]: { in: subscribePlanIds } } });\n\n return response\n };\n\n // const getDataTypes = () => {\n // return Object.values(accountDataTypes);\n // }\n\n /**\n * Calculate the next end date based on start date and billing cycle\n * @param startDate - the starting date of the subscription\n * @param cycle - either \"monthly\" or \"yearly\"\n * @returns the next end date as Date\n */\n const getNextBillingEndDate = (\n startDate: Date,\n cycle: SubscribePlanBillingCycle\n ): Date => {\n\n // const date = startDate instanceof Date ? new Date(startDate) : new Date(startDate);\n const date = new Date(startDate.getTime()); // clone to avoid mutating original\n\n switch (cycle) {\n case \"monthly\":\n date.setMonth(date.getMonth() + 1);\n break;\n case \"yearly\":\n date.setFullYear(date.getFullYear() + 1);\n break;\n default:\n throw new Error(`Unknown billing cycle: ${cycle}`);\n }\n\n return date;\n }\n\n return {\n getSubscribePlan,\n createSubscribePlan,\n updateSubscribePlan,\n removeSubscribePlans,\n listSubscribePlans,\n getNextBillingEndDate\n }\n\n}\n\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "storemw-core-api",
3
- "version": "1.0.142",
3
+ "version": "1.0.144",
4
4
  "description": "STOREMW Core API",
5
5
  "main": "dist/app.js",
6
6
  "types": "dist/app.d.ts",
@@ -90,6 +90,16 @@
90
90
  "require": "./dist/schema/middleware/index.js",
91
91
  "types": "./dist/schema/middleware/index.d.ts"
92
92
  },
93
+ "./schema/middleware/request": {
94
+ "import": "./dist/schema/middleware/request/index.js",
95
+ "require": "./dist/schema/middleware/request/index.js",
96
+ "types": "./dist/schema/middleware/request/index.d.ts"
97
+ },
98
+ "./schema/middleware/route": {
99
+ "import": "./dist/schema/middleware/route/index.js",
100
+ "require": "./dist/schema/middleware/route/index.js",
101
+ "types": "./dist/schema/middleware/route/index.d.ts"
102
+ },
93
103
  "./schema/payload": {
94
104
  "import": "./dist/schema/payload/index.js",
95
105
  "require": "./dist/schema/payload/index.js",
@@ -109,9 +119,6 @@
109
119
  "author": "",
110
120
  "license": "ISC",
111
121
  "dependencies": {
112
- "@types/jsonwebtoken": "^9.0.9",
113
- "@types/pg": "^8.11.11",
114
- "@types/uuid": "^10.0.0",
115
122
  "axios": "^1.8.4",
116
123
  "basic-auth": "^2.0.1",
117
124
  "bcrypt": "^6.0.0",
@@ -123,24 +130,22 @@
123
130
  "jsonwebtoken": "^9.0.2",
124
131
  "lodash": "^4.17.21",
125
132
  "multer": "^2.0.2",
126
- "nodemailer-express-handlebars": "^7.0.0",
127
133
  "path-to-regexp": "^8.3.0",
128
134
  "pg": "^8.14.1",
129
135
  "pino": "^9.6.0",
130
136
  "pino-pretty": "^13.0.0",
131
137
  "rotating-file-stream": "^3.2.7",
132
- "sharp": "^0.34.4",
133
- "tmp-promise": "^3.0.3",
134
- "uuid": "^11.1.0",
135
138
  "zod": "^3.24.2"
136
139
  },
137
140
  "peerDependencies": {
138
141
  "@prisma/client": "^6.16.3",
139
142
  "@types/express": "^4.17.21",
140
- "express": "^4.21.2",
141
- "nodemailer": "^6.10.1"
143
+ "express": "^4.21.2"
142
144
  },
143
145
  "devDependencies": {
146
+ "@types/jsonwebtoken": "^9.0.9",
147
+ "@types/pg": "^8.11.11",
148
+ "@types/uuid": "^10.0.0",
144
149
  "@types/basic-auth": "^1.1.8",
145
150
  "@types/bcrypt": "^6.0.0",
146
151
  "@types/cors": "^2.8.17",
@@ -162,11 +167,16 @@
162
167
  "typescript": "^5.8.2"
163
168
  },
164
169
  "optionalDependencies": {
170
+ "nodemailer": "^6.10.1",
171
+ "nodemailer-express-handlebars": "^7.0.0",
165
172
  "@aws-sdk/client-s3": "^3.1000.0",
166
173
  "@aws-sdk/s3-request-presigner": "^3.1000.0",
167
174
  "@google-cloud/storage": "^7.17.2",
175
+ "sharp": "^0.34.4",
176
+ "tmp-promise": "^3.0.3",
168
177
  "ffmpeg-static": "^5.2.0",
169
178
  "ffprobe-static": "^3.1.0",
170
- "fluent-ffmpeg": "^2.1.3"
179
+ "fluent-ffmpeg": "^2.1.3",
180
+ "uuid": "^11.1.0"
171
181
  }
172
182
  }
@@ -2845,3 +2845,43 @@ model agents {
2845
2845
 
2846
2846
  @@schema("public")
2847
2847
  }
2848
+
2849
+ model subscribe_plans {
2850
+ subscribe_plan_id BigInt @id(map: "subscribe_plan_pkey") @default(autoincrement())
2851
+ createdatetime DateTime? @db.Timestamptz(6)
2852
+ createuserid BigInt @default(0)
2853
+ updatedatetime DateTime? @db.Timestamptz(6)
2854
+ updateuserid BigInt @default(0)
2855
+ isdelete Boolean? @default(false)
2856
+ istrash Boolean? @default(false)
2857
+ accountid BigInt @default(0)
2858
+ name String @db.VarChar(100)
2859
+ short_description String? @db.VarChar(255)
2860
+ full_description String?
2861
+ price Decimal @db.Decimal(10, 2)
2862
+ currency String @default("MYR") @db.Char(3)
2863
+ billing_cycle String @db.VarChar(20)
2864
+ status Boolean? @default(false)
2865
+
2866
+ @@schema("public")
2867
+ }
2868
+
2869
+ model account_subscriptions {
2870
+ account_subscription_id BigInt @id @default(autoincrement())
2871
+ createdatetime DateTime? @db.Timestamptz(6)
2872
+ createuserid BigInt @default(0)
2873
+ updatedatetime DateTime? @db.Timestamptz(6)
2874
+ updateuserid BigInt @default(0)
2875
+ isdelete Boolean? @default(false)
2876
+ istrash Boolean? @default(false)
2877
+ accountid BigInt @default(0)
2878
+ account_id BigInt @default(0)
2879
+ subscribe_plan_id BigInt @default(0)
2880
+ status Boolean? @default(false)
2881
+ subscription_start_date DateTime? @db.Timestamptz(6)
2882
+ subscription_end_date DateTime? @db.Timestamptz(6)
2883
+ is_cancel Boolean? @default(false)
2884
+ cancel_datetime DateTime? @db.Timestamptz(6)
2885
+
2886
+ @@schema("public")
2887
+ }