From 5fa5e317cbbbf98c67458f771fc1a2ea7ac4fb93 Mon Sep 17 00:00:00 2001 From: shamoo53 Date: Thu, 23 Apr 2026 11:25:14 +0100 Subject: [PATCH] perf(database): optimize and audit indexes --- src/assessment/entities/assessment.entity.ts | 11 ++++++++++- src/assessment/entities/question.entity.ts | 4 +++- src/courses/entities/course.entity.ts | 1 + src/email-marketing/entities/campaign.entity.ts | 7 +++++++ src/gamification/entities/user-progress.entity.ts | 6 +++++- src/payments/entities/invoice.entity.ts | 9 +++++++++ 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/assessment/entities/assessment.entity.ts b/src/assessment/entities/assessment.entity.ts index 5612f609..d5ce1815 100644 --- a/src/assessment/entities/assessment.entity.ts +++ b/src/assessment/entities/assessment.entity.ts @@ -1,4 +1,11 @@ -import { Column, CreateDateColumn, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; +import { + Column, + CreateDateColumn, + Entity, + OneToMany, + PrimaryGeneratedColumn, + Index, +} from 'typeorm'; import { Question } from './question.entity'; @Entity() @@ -7,12 +14,14 @@ export class Assessment { id: string; @Column() + @Index() title: string; @Column({ nullable: true }) description?: string; @Column() + @Index() durationMinutes: number; @OneToMany(() => Question, (q) => q.assessment, { diff --git a/src/assessment/entities/question.entity.ts b/src/assessment/entities/question.entity.ts index 8dc1b753..d440e156 100644 --- a/src/assessment/entities/question.entity.ts +++ b/src/assessment/entities/question.entity.ts @@ -1,4 +1,4 @@ -import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; +import { Column, Entity, ManyToOne, PrimaryGeneratedColumn, Index } from 'typeorm'; import { QuestionType } from '../enums/question-type.enum'; import { Assessment } from './assessment.entity'; @@ -8,9 +8,11 @@ export class Question { id: string; @Column({ type: 'enum', enum: QuestionType }) + @Index() type: QuestionType; @Column() + @Index() prompt: string; @Column({ type: 'json', nullable: true }) diff --git a/src/courses/entities/course.entity.ts b/src/courses/entities/course.entity.ts index 170e0a9b..58c61704 100644 --- a/src/courses/entities/course.entity.ts +++ b/src/courses/entities/course.entity.ts @@ -18,6 +18,7 @@ export class Course { id: string; @Column() + @Index() title: string; @Column('text') diff --git a/src/email-marketing/entities/campaign.entity.ts b/src/email-marketing/entities/campaign.entity.ts index 6577ee9a..2b358002 100644 --- a/src/email-marketing/entities/campaign.entity.ts +++ b/src/email-marketing/entities/campaign.entity.ts @@ -8,6 +8,7 @@ import { OneToMany, OneToOne, JoinColumn, + Index, } from 'typeorm'; import { ApiProperty } from '@nestjs/swagger'; @@ -24,10 +25,12 @@ export class Campaign { @ApiProperty() @Column() + @Index() name: string; @ApiProperty() @Column() + @Index() subject: string; @ApiProperty({ required: false }) @@ -40,6 +43,7 @@ export class Campaign { @ApiProperty({ required: false }) @Column({ nullable: true }) + @Index() templateId?: string; @ManyToOne(() => EmailTemplate, { nullable: true }) @@ -52,14 +56,17 @@ export class Campaign { @ApiProperty({ enum: CampaignStatus }) @Column({ type: 'enum', enum: CampaignStatus, default: CampaignStatus.DRAFT }) + @Index() status: CampaignStatus; @ApiProperty({ required: false }) @Column({ nullable: true }) + @Index() scheduledAt?: Date; @ApiProperty({ required: false }) @Column({ nullable: true }) + @Index() sentAt?: Date; @ApiProperty() diff --git a/src/gamification/entities/user-progress.entity.ts b/src/gamification/entities/user-progress.entity.ts index 5c5dc834..fbe04ccd 100644 --- a/src/gamification/entities/user-progress.entity.ts +++ b/src/gamification/entities/user-progress.entity.ts @@ -1,4 +1,4 @@ -import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn, Index } from 'typeorm'; import { User } from '../../users/entities/user.entity'; @Entity('user_progress') @@ -8,14 +8,18 @@ export class UserProgress { @OneToOne(() => User) @JoinColumn() + @Index() user: User; @Column({ default: 0 }) + @Index() totalPoints: number; @Column({ default: 1 }) + @Index() level: number; @Column({ default: 0 }) + @Index() xp: number; } diff --git a/src/payments/entities/invoice.entity.ts b/src/payments/entities/invoice.entity.ts index 3d8e6781..ca1c671c 100644 --- a/src/payments/entities/invoice.entity.ts +++ b/src/payments/entities/invoice.entity.ts @@ -6,6 +6,7 @@ import { UpdateDateColumn, ManyToOne, JoinColumn, + Index, } from 'typeorm'; import { Payment } from './payment.entity'; import { User } from '../../users/entities/user.entity'; @@ -31,15 +32,18 @@ export class Invoice { id: string; @Column({ type: 'varchar', unique: true }) + @Index() invoiceNumber: string; @Column({ type: 'decimal', precision: 10, scale: 2 }) + @Index() amount: number; @Column({ type: 'decimal', precision: 10, scale: 2, default: 0 }) taxAmount: number; @Column({ type: 'decimal', precision: 10, scale: 2 }) + @Index() totalAmount: number; @Column({ type: 'varchar', length: 3, default: 'USD' }) @@ -53,12 +57,15 @@ export class Invoice { enum: InvoiceStatus, default: InvoiceStatus.DRAFT, }) + @Index() status: InvoiceStatus; @Column({ type: 'date', nullable: true }) + @Index() issuedDate: Date; @Column({ type: 'date', nullable: true }) + @Index() dueDate: Date; @Column({ type: 'text', nullable: true }) @@ -72,6 +79,7 @@ export class Invoice { payment: Payment; @Column({ name: 'payment_id' }) + @Index() paymentId: string; @ManyToOne(() => User, (user) => user.id) @@ -79,6 +87,7 @@ export class Invoice { user: User; @Column({ name: 'user_id' }) + @Index() userId: string; @CreateDateColumn()