From eb5bf5eee6b8edca1816178065a6f06155fc8c2e Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Thu, 11 Sep 2025 11:36:55 +0300 Subject: [PATCH] feat: add subscription_rewards relation to customer and subscription history schemas, and update TypeScript definitions - Introduced a new 'subscription_rewards' relation in both the customer and subscription history schemas to link them with subscription rewards. - Updated the 'expiresAt' field in the subscription schema to be required, ensuring better data integrity. - Adjusted the default value for 'maxOrdersPerMonth' in the subscription setting schema from 30 to 20, and removed unused fields to streamline the model. - Updated TypeScript definitions to reflect these changes, ensuring type safety and consistency across the application. --- .../content-types/customer/schema.json | 6 ++ .../subscription-history/schema.json | 9 ++- .../subscription-reward/schema.json | 47 +++++++++++++++ .../controllers/subscription-reward.ts | 7 +++ .../routes/subscription-reward.ts | 7 +++ .../services/subscription-reward.ts | 7 +++ .../subscription-setting/schema.json | 7 +-- .../content-types/subscription/schema.json | 2 +- types/generated/contentTypes.d.ts | 58 ++++++++++++++++--- 9 files changed, 135 insertions(+), 15 deletions(-) create mode 100644 src/api/subscription-reward/content-types/subscription-reward/schema.json create mode 100644 src/api/subscription-reward/controllers/subscription-reward.ts create mode 100644 src/api/subscription-reward/routes/subscription-reward.ts create mode 100644 src/api/subscription-reward/services/subscription-reward.ts diff --git a/src/api/customer/content-types/customer/schema.json b/src/api/customer/content-types/customer/schema.json index 5ea221f..cb75ad3 100644 --- a/src/api/customer/content-types/customer/schema.json +++ b/src/api/customer/content-types/customer/schema.json @@ -87,6 +87,12 @@ }, "bannedUntil": { "type": "datetime" + }, + "subscription_rewards": { + "type": "relation", + "relation": "oneToMany", + "target": "api::subscription-reward.subscription-reward", + "mappedBy": "owner" } } } diff --git a/src/api/subscription-history/content-types/subscription-history/schema.json b/src/api/subscription-history/content-types/subscription-history/schema.json index b11aa6b..73c4c55 100644 --- a/src/api/subscription-history/content-types/subscription-history/schema.json +++ b/src/api/subscription-history/content-types/subscription-history/schema.json @@ -66,11 +66,18 @@ "payment", "referral", "admin", - "promo" + "promo", + "reward" ] }, "description": { "type": "text" + }, + "subscription_rewards": { + "type": "relation", + "relation": "oneToMany", + "target": "api::subscription-reward.subscription-reward", + "mappedBy": "subscription_history" } } } diff --git a/src/api/subscription-reward/content-types/subscription-reward/schema.json b/src/api/subscription-reward/content-types/subscription-reward/schema.json new file mode 100644 index 0000000..7a02b9c --- /dev/null +++ b/src/api/subscription-reward/content-types/subscription-reward/schema.json @@ -0,0 +1,47 @@ +{ + "kind": "collectionType", + "collectionName": "subscription_rewards", + "info": { + "singularName": "subscription-reward", + "pluralName": "subscription-rewards", + "displayName": "SubscriptionReward" + }, + "options": { + "draftAndPublish": true + }, + "pluginOptions": {}, + "attributes": { + "activated": { + "type": "boolean", + "default": false + }, + "owner": { + "type": "relation", + "relation": "manyToOne", + "target": "api::customer.customer", + "inversedBy": "subscription_rewards" + }, + "invited": { + "type": "relation", + "relation": "oneToOne", + "target": "api::customer.customer" + }, + "days": { + "type": "integer", + "required": true + }, + "expiresAt": { + "type": "datetime", + "required": true + }, + "description": { + "type": "text" + }, + "subscription_history": { + "type": "relation", + "relation": "manyToOne", + "target": "api::subscription-history.subscription-history", + "inversedBy": "subscription_rewards" + } + } +} diff --git a/src/api/subscription-reward/controllers/subscription-reward.ts b/src/api/subscription-reward/controllers/subscription-reward.ts new file mode 100644 index 0000000..647ec9e --- /dev/null +++ b/src/api/subscription-reward/controllers/subscription-reward.ts @@ -0,0 +1,7 @@ +/** + * subscription-reward controller + */ + +import { factories } from '@strapi/strapi' + +export default factories.createCoreController('api::subscription-reward.subscription-reward'); diff --git a/src/api/subscription-reward/routes/subscription-reward.ts b/src/api/subscription-reward/routes/subscription-reward.ts new file mode 100644 index 0000000..2b4646a --- /dev/null +++ b/src/api/subscription-reward/routes/subscription-reward.ts @@ -0,0 +1,7 @@ +/** + * subscription-reward router + */ + +import { factories } from '@strapi/strapi'; + +export default factories.createCoreRouter('api::subscription-reward.subscription-reward'); diff --git a/src/api/subscription-reward/services/subscription-reward.ts b/src/api/subscription-reward/services/subscription-reward.ts new file mode 100644 index 0000000..b508752 --- /dev/null +++ b/src/api/subscription-reward/services/subscription-reward.ts @@ -0,0 +1,7 @@ +/** + * subscription-reward service + */ + +import { factories } from '@strapi/strapi'; + +export default factories.createCoreService('api::subscription-reward.subscription-reward'); diff --git a/src/api/subscription-setting/content-types/subscription-setting/schema.json b/src/api/subscription-setting/content-types/subscription-setting/schema.json index 72423bf..9deb95b 100644 --- a/src/api/subscription-setting/content-types/subscription-setting/schema.json +++ b/src/api/subscription-setting/content-types/subscription-setting/schema.json @@ -14,14 +14,9 @@ "maxOrdersPerMonth": { "type": "integer", "required": true, - "default": 30 + "default": 20 }, "referralRewardDays": { - "type": "integer", - "required": true, - "default": 3 - }, - "referralBonusDays": { "type": "integer", "required": true, "default": 1 diff --git a/src/api/subscription/content-types/subscription/schema.json b/src/api/subscription/content-types/subscription/schema.json index 47900e8..5c3e3df 100644 --- a/src/api/subscription/content-types/subscription/schema.json +++ b/src/api/subscription/content-types/subscription/schema.json @@ -24,7 +24,7 @@ }, "expiresAt": { "type": "datetime", - "required": false + "required": true }, "autoRenew": { "type": "boolean", diff --git a/types/generated/contentTypes.d.ts b/types/generated/contentTypes.d.ts index d0964e1..bfeef97 100644 --- a/types/generated/contentTypes.d.ts +++ b/types/generated/contentTypes.d.ts @@ -461,6 +461,10 @@ export interface ApiCustomerCustomer extends Struct.CollectionTypeSchema { 'oneToOne', 'api::subscription.subscription' >; + subscription_rewards: Schema.Attribute.Relation< + 'oneToMany', + 'api::subscription-reward.subscription-reward' + >; telegramId: Schema.Attribute.BigInteger & Schema.Attribute.Unique; updatedAt: Schema.Attribute.DateTime; updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & @@ -650,7 +654,7 @@ export interface ApiSubscriptionHistorySubscriptionHistory Schema.Attribute.Required; publishedAt: Schema.Attribute.DateTime; source: Schema.Attribute.Enumeration< - ['payment', 'referral', 'admin', 'promo'] + ['payment', 'referral', 'admin', 'promo', 'reward'] > & Schema.Attribute.Required & Schema.Attribute.DefaultTo<'payment'>; @@ -661,6 +665,10 @@ export interface ApiSubscriptionHistorySubscriptionHistory 'manyToOne', 'api::subscription.subscription' >; + subscription_rewards: Schema.Attribute.Relation< + 'oneToMany', + 'api::subscription-reward.subscription-reward' + >; updatedAt: Schema.Attribute.DateTime; updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & Schema.Attribute.Private; @@ -704,6 +712,44 @@ export interface ApiSubscriptionPriceSubscriptionPrice }; } +export interface ApiSubscriptionRewardSubscriptionReward + extends Struct.CollectionTypeSchema { + collectionName: 'subscription_rewards'; + info: { + displayName: 'SubscriptionReward'; + pluralName: 'subscription-rewards'; + singularName: 'subscription-reward'; + }; + options: { + draftAndPublish: true; + }; + attributes: { + activated: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo; + createdAt: Schema.Attribute.DateTime; + createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & + Schema.Attribute.Private; + days: Schema.Attribute.Integer & Schema.Attribute.Required; + description: Schema.Attribute.Text; + expiresAt: Schema.Attribute.DateTime & Schema.Attribute.Required; + invited: Schema.Attribute.Relation<'oneToOne', 'api::customer.customer'>; + locale: Schema.Attribute.String & Schema.Attribute.Private; + localizations: Schema.Attribute.Relation< + 'oneToMany', + 'api::subscription-reward.subscription-reward' + > & + Schema.Attribute.Private; + owner: Schema.Attribute.Relation<'manyToOne', 'api::customer.customer'>; + publishedAt: Schema.Attribute.DateTime; + subscription_history: Schema.Attribute.Relation< + 'manyToOne', + 'api::subscription-history.subscription-history' + >; + updatedAt: Schema.Attribute.DateTime; + updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & + Schema.Attribute.Private; + }; +} + export interface ApiSubscriptionSettingSubscriptionSetting extends Struct.SingleTypeSchema { collectionName: 'subscription_settings'; @@ -727,14 +773,11 @@ export interface ApiSubscriptionSettingSubscriptionSetting Schema.Attribute.Private; maxOrdersPerMonth: Schema.Attribute.Integer & Schema.Attribute.Required & - Schema.Attribute.DefaultTo<30>; + Schema.Attribute.DefaultTo<20>; publishedAt: Schema.Attribute.DateTime; - referralBonusDays: Schema.Attribute.Integer & - Schema.Attribute.Required & - Schema.Attribute.DefaultTo<1>; referralRewardDays: Schema.Attribute.Integer & Schema.Attribute.Required & - Schema.Attribute.DefaultTo<3>; + Schema.Attribute.DefaultTo<1>; updatedAt: Schema.Attribute.DateTime; updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & Schema.Attribute.Private; @@ -760,7 +803,7 @@ export interface ApiSubscriptionSubscription createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & Schema.Attribute.Private; customer: Schema.Attribute.Relation<'oneToOne', 'api::customer.customer'>; - expiresAt: Schema.Attribute.DateTime; + expiresAt: Schema.Attribute.DateTime & Schema.Attribute.Required; isActive: Schema.Attribute.Boolean & Schema.Attribute.Required & Schema.Attribute.DefaultTo; @@ -1298,6 +1341,7 @@ declare module '@strapi/strapi' { 'api::slot.slot': ApiSlotSlot; 'api::subscription-history.subscription-history': ApiSubscriptionHistorySubscriptionHistory; 'api::subscription-price.subscription-price': ApiSubscriptionPriceSubscriptionPrice; + 'api::subscription-reward.subscription-reward': ApiSubscriptionRewardSubscriptionReward; 'api::subscription-setting.subscription-setting': ApiSubscriptionSettingSubscriptionSetting; 'api::subscription.subscription': ApiSubscriptionSubscription; 'plugin::content-releases.release': PluginContentReleasesRelease;