From c4dc0509c2ddd7ade20fe682838438ca8a44cf6f Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 7 Apr 2023 22:55:18 +0200 Subject: [PATCH] feat: Implement getTrialStatus graphQL query --- .../graphql/queries/get-trial-status.ee.ts | 19 ++++++++++ .../backend/src/graphql/query-resolvers.ts | 2 ++ packages/backend/src/graphql/schema.graphql | 5 +++ .../backend/src/models/subscription.ee.ts | 4 +++ packages/backend/src/models/user.ts | 36 ++++++++++++------- 5 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 packages/backend/src/graphql/queries/get-trial-status.ee.ts diff --git a/packages/backend/src/graphql/queries/get-trial-status.ee.ts b/packages/backend/src/graphql/queries/get-trial-status.ee.ts new file mode 100644 index 00000000..58a8f936 --- /dev/null +++ b/packages/backend/src/graphql/queries/get-trial-status.ee.ts @@ -0,0 +1,19 @@ +import appConfig from '../../config/app'; +import Context from '../../types/express/context'; + +const getTrialStatus = async ( + _parent: unknown, + _params: unknown, + context: Context +) => { + if (!appConfig.isCloud) return; + + const inTrial = await context.currentUser.inTrial(); + if (!inTrial) return; + + return { + expireAt: context.currentUser.trialExpiryDate, + }; +}; + +export default getTrialStatus; diff --git a/packages/backend/src/graphql/query-resolvers.ts b/packages/backend/src/graphql/query-resolvers.ts index b7263799..71e44020 100644 --- a/packages/backend/src/graphql/query-resolvers.ts +++ b/packages/backend/src/graphql/query-resolvers.ts @@ -17,6 +17,7 @@ import getPaddleInfo from './queries/get-paddle-info.ee'; import getBillingAndUsage from './queries/get-billing-and-usage.ee'; import getInvoices from './queries/get-invoices.ee'; import getAutomatischInfo from './queries/get-automatisch-info'; +import getTrialStatus from './queries/get-trial-status.ee'; import healthcheck from './queries/healthcheck'; const queryResolvers = { @@ -39,6 +40,7 @@ const queryResolvers = { getBillingAndUsage, getInvoices, getAutomatischInfo, + getTrialStatus, healthcheck, }; diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql index 4dec2ecc..578a06d3 100644 --- a/packages/backend/src/graphql/schema.graphql +++ b/packages/backend/src/graphql/schema.graphql @@ -40,6 +40,7 @@ type Query { getBillingAndUsage: GetBillingAndUsage getInvoices: [Invoice] getAutomatischInfo: GetAutomatischInfo + getTrialStatus: GetTrialStatus healthcheck: AppHealth } @@ -474,6 +475,10 @@ type GetAutomatischInfo { isCloud: Boolean } +type GetTrialStatus { + expireAt: String +} + type GetBillingAndUsage { subscription: Subscription usage: Usage diff --git a/packages/backend/src/models/subscription.ee.ts b/packages/backend/src/models/subscription.ee.ts index 1d639a97..216e5e52 100644 --- a/packages/backend/src/models/subscription.ee.ts +++ b/packages/backend/src/models/subscription.ee.ts @@ -76,6 +76,10 @@ class Subscription extends Base { get plan() { return getPlanById(this.paddlePlanId); } + + get isActive() { + return this.status === 'active' || this.status === 'past_due'; + } } export default Subscription; diff --git a/packages/backend/src/models/user.ts b/packages/backend/src/models/user.ts index 8e7337ee..f83b6c01 100644 --- a/packages/backend/src/models/user.ts +++ b/packages/backend/src/models/user.ts @@ -126,19 +126,6 @@ class User extends Base { }, }); - get inTrial() { - if (!this.trialExpiryDate) { - return false; - } - - const expiryDate = DateTime.fromJSDate( - this.trialExpiryDate as unknown as Date - ); - const now = DateTime.now(); - - return now < expiryDate; - } - login(password: string) { return bcrypt.compare(password, this.password); } @@ -178,6 +165,29 @@ class User extends Base { this.trialExpiryDate = DateTime.now().plus({ days: 30 }).toISODate(); } + async inTrial() { + if (!appConfig.isCloud) { + return false; + } + + if (!this.trialExpiryDate) { + return false; + } + + const subscription = await this.$relatedQuery('currentSubscription'); + + if (subscription?.isActive) { + return false; + } + + const expiryDate = DateTime.fromJSDate( + this.trialExpiryDate as unknown as Date + ); + const now = DateTime.now(); + + return now < expiryDate; + } + async $beforeInsert(queryContext: QueryContext) { await super.$beforeInsert(queryContext); await this.generateHash();