From b17e43147384a393c7fd2579fb5c118916cde1b7 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Thu, 23 Mar 2023 18:15:36 +0300 Subject: [PATCH] feat: Create subscription model --- .../20230323145809_create_subscriptions.ts | 27 +++++++++ .../backend/src/models/subscription.ee.ts | 57 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 packages/backend/src/db/migrations/20230323145809_create_subscriptions.ts create mode 100644 packages/backend/src/models/subscription.ee.ts diff --git a/packages/backend/src/db/migrations/20230323145809_create_subscriptions.ts b/packages/backend/src/db/migrations/20230323145809_create_subscriptions.ts new file mode 100644 index 00000000..5fa0663c --- /dev/null +++ b/packages/backend/src/db/migrations/20230323145809_create_subscriptions.ts @@ -0,0 +1,27 @@ +import { Knex } from 'knex'; +import appConfig from '../../config/app'; + +export async function up(knex: Knex): Promise { + if (!appConfig.isCloud) return; + + return knex.schema.createTable('subscriptions', (table) => { + table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); + table.uuid('user_id').references('id').inTable('users'); + table.string('paddle_subscription_id').unique().notNullable(); + table.string('paddle_plan_id').notNullable(); + table.string('update_url').notNullable(); + table.string('cancel_url').notNullable(); + table.string('status').notNullable(); + table.string('next_bill_amount').notNullable(); + table.date('next_bill_date').notNullable(); + table.date('last_bill_date'); + + table.timestamps(true, true); + }); +} + +export async function down(knex: Knex): Promise { + if (!appConfig.isCloud) return; + + return knex.schema.dropTable('subscriptions'); +} diff --git a/packages/backend/src/models/subscription.ee.ts b/packages/backend/src/models/subscription.ee.ts new file mode 100644 index 00000000..8f06d802 --- /dev/null +++ b/packages/backend/src/models/subscription.ee.ts @@ -0,0 +1,57 @@ +import Base from './base'; +import User from './user'; + +class Subscription extends Base { + id!: string; + userId!: string; + paddleSubscriptionId!: string; + paddlePlanId!: string; + updateUrl!: string; + cancelUrl!: string; + status!: string; + nextBillAmount!: string; + nextBillDate!: string; + lastBillDate?: string; + + static tableName = 'subscriptions'; + + static jsonSchema = { + type: 'object', + required: [ + 'userId', + 'paddleSubscriptionId', + 'paddlePlanId', + 'updateUrl', + 'cancelUrl', + 'status', + 'nextBillAmount', + 'nextBillDate', + ], + + properties: { + id: { type: 'string', format: 'uuid' }, + userId: { type: 'string', format: 'uuid' }, + paddleSubscriptionId: { type: 'string' }, + paddlePlanId: { type: 'string' }, + updateUrl: { type: 'string' }, + cancelUrl: { type: 'string' }, + status: { type: 'string' }, + nextBillAmount: { type: 'string' }, + nextBillDate: { type: 'string' }, + lastBillDate: { type: 'string' }, + }, + }; + + static relationMappings = () => ({ + user: { + relation: Base.BelongsToOneRelation, + modelClass: User, + join: { + from: 'usage_data.user_id', + to: 'users.id', + }, + }, + }); +} + +export default Subscription;