import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm'; import User from './User'; import CrudApiEndpoint from 'Common/Types/Database/CrudApiEndpoint'; import Route from 'Common/Types/API/Route'; import TableColumnType from 'Common/Types/BaseDatabase/TableColumnType'; import TableColumn from 'Common/Types/Database/TableColumn'; import ColumnType from 'Common/Types/Database/ColumnType'; import ObjectID from 'Common/Types/ObjectID'; import ColumnLength from 'Common/Types/Database/ColumnLength'; import TableAccessControl from 'Common/Types/Database/AccessControl/TableAccessControl'; import Permission from 'Common/Types/Permission'; import ColumnAccessControl from 'Common/Types/Database/AccessControl/ColumnAccessControl'; import TableMetadata from 'Common/Types/Database/TableMetadata'; import IconProp from 'Common/Types/Icon/IconProp'; import BaseModel from 'Common/Models/BaseModel'; import { PlanSelect } from 'Common/Types/Billing/SubscriptionPlan'; import Email from 'Common/Types/Email'; import Reseller from './Reseller'; import ResellerPlan from './ResellerPlan'; import Project from './Project'; @TableAccessControl({ create: [], read: [], delete: [], update: [], }) @CrudApiEndpoint(new Route('/promo-code')) @TableMetadata({ tableName: 'PromoCode', singularName: 'Promo Code', pluralName: 'Promo Codes', icon: IconProp.Billing, tableDescription: 'List of Promo Codes that customers can use in OneUptime.', }) @Entity({ name: 'PromoCode', }) export default class PromoCode extends BaseModel { @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ required: true, type: TableColumnType.ShortText, canReadOnRelationQuery: true, title: 'Resller ID', description: 'ID that is shared between resller and OneUptime.', }) @Column({ nullable: false, type: ColumnType.ShortText, length: ColumnLength.ShortText, }) public promoCodeId?: string = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ required: false, type: TableColumnType.ShortText, canReadOnRelationQuery: true, title: 'Plan Type', description: 'If this promocode can be used for specific plan, please specify here. If null, it can be used for all the plans', }) @Column({ nullable: true, type: ColumnType.ShortText, length: ColumnLength.ShortText, }) public planType?: PlanSelect = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ required: true, type: TableColumnType.ShortText, canReadOnRelationQuery: true, title: 'User Email', description: 'Which user can redeem this promocode? If no one is specified, anyone can redeem this promocode.', }) @Column({ nullable: true, type: ColumnType.Email, length: ColumnLength.Email, transformer: Email.getDatabaseTransformer(), }) public userEmail?: Email = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateProjectLabel, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadProjectLabel, ], update: [], }) @TableColumn({ manyToOneRelationColumn: 'createdByUserId', type: TableColumnType.Entity, modelType: User, title: 'Created by User', description: 'Relation to User who created this object (if this object was created by a User)', }) @ManyToOne( (_type: string) => { return User; }, { eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'createdByUserId' }) public createdByUser?: User = undefined; @ColumnAccessControl({ create: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateProjectLabel, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadProjectLabel, ], update: [], }) @TableColumn({ type: TableColumnType.ObjectID, title: 'Created by User ID', description: 'User ID who created this object (if this object was created by a User)', }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public createdByUserId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadProjectLabel, ], update: [], }) @TableColumn({ manyToOneRelationColumn: 'deletedByUserId', type: TableColumnType.Entity, title: 'Deleted by User', description: 'Relation to User who deleted this object (if this object was deleted by a User)', }) @ManyToOne( (_type: string) => { return User; }, { cascade: false, eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'deletedByUserId' }) public deletedByUser?: User = undefined; @ColumnAccessControl({ create: [], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadProjectLabel, ], update: [], }) @TableColumn({ type: TableColumnType.ObjectID, title: 'Deleted by User ID', description: 'User ID who deleted this object (if this object was deleted by a User)', }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public deletedByUserId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ manyToOneRelationColumn: 'resellerId', type: TableColumnType.Entity, modelType: Reseller, title: 'Reseller', description: 'Relation to Reseller Resource in which this object belongs', }) @ManyToOne( (_type: string) => { return Reseller; }, { eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'resellerId' }) public reseller?: Reseller = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: 'Reseller ID', description: 'ID of your OneUptime Reseller in which this object belongs', }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public resellerId?: ObjectID = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ manyToOneRelationColumn: 'ResellerPlanId', type: TableColumnType.Entity, modelType: ResellerPlan, title: 'ResellerPlan', description: 'Relation to ResellerPlan Resource in which this object belongs', }) @ManyToOne( (_type: string) => { return ResellerPlan; }, { eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'resellerPlanId' }) public resellerPlan?: ResellerPlan = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: 'Reseller Plan ID', description: 'ID of your OneUptime Reseller Plan in which this object belongs', }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public resellerPlanId?: ObjectID = undefined; @ColumnAccessControl({ create: [Permission.User], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, Permission.CanReadProject, Permission.UnAuthorizedSsoUser, Permission.ProjectUser, ], update: [ Permission.ProjectOwner, Permission.CanManageProjectBilling, Permission.CanEditProject, ], }) @TableColumn({ required: false, type: TableColumnType.ShortText, title: 'License ID', description: 'License ID from a OneUptime Reseller', canReadOnRelationQuery: true, }) @Column({ nullable: true, type: ColumnType.ShortText, length: ColumnLength.ShortText, }) public resellerLicenseId?: string = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ isDefaultValueColumn: true, type: TableColumnType.Boolean }) @Column({ type: ColumnType.Boolean, default: false, }) public isPromoCodeUsed?: boolean = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ isDefaultValueColumn: false, type: TableColumnType.Date }) @Column({ type: ColumnType.Date, nullable: true, }) public promoCodeUsedAt?: Date = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @TableColumn({ manyToOneRelationColumn: 'projectId', type: TableColumnType.Entity, modelType: Project, title: 'Project', description: 'If promo code is used for a specific project, please specify here.', }) @ManyToOne( (_type: string) => { return Project; }, { eager: false, nullable: true, onDelete: 'CASCADE', orphanedRowAction: 'nullify', } ) @JoinColumn({ name: 'projectId' }) public project?: Project = undefined; @ColumnAccessControl({ create: [], read: [], update: [], }) @Index() @TableColumn({ type: TableColumnType.ObjectID, required: false, canReadOnRelationQuery: true, title: 'Project ID', description: 'If promo code is used for a specific project, please specify here.', }) @Column({ type: ColumnType.ObjectID, nullable: true, transformer: ObjectID.getDatabaseTransformer(), }) public projectId?: ObjectID = undefined; }