diff --git a/src/gamification/entities/challenge.entity.ts b/src/gamification/entities/challenge.entity.ts index 24ec96fa..da60049a 100644 --- a/src/gamification/entities/challenge.entity.ts +++ b/src/gamification/entities/challenge.entity.ts @@ -1,9 +1,10 @@ -import { Entity, PrimaryGeneratedColumn, Column, VersionColumn } from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, Column, VersionColumn, Index } from 'typeorm'; /** * Represents the challenge entity. */ @Entity('challenges') +@Index(['type']) export class Challenge { @PrimaryGeneratedColumn('uuid') id: string; diff --git a/src/gamification/entities/point-transaction.entity.ts b/src/gamification/entities/point-transaction.entity.ts index 0274e5c3..c6afea44 100644 --- a/src/gamification/entities/point-transaction.entity.ts +++ b/src/gamification/entities/point-transaction.entity.ts @@ -5,6 +5,7 @@ import { ManyToOne, CreateDateColumn, VersionColumn, + Index, } from 'typeorm'; import { User } from '../../users/entities/user.entity'; @@ -12,6 +13,8 @@ import { User } from '../../users/entities/user.entity'; * Represents the point Transaction entity. */ @Entity('point_transactions') +@Index(['user', 'createdAt']) +@Index(['activityType']) export class PointTransaction { @PrimaryGeneratedColumn('uuid') id: string; diff --git a/src/gamification/entities/tier-reward.entity.ts b/src/gamification/entities/tier-reward.entity.ts index ce21566c..ceac5e12 100644 --- a/src/gamification/entities/tier-reward.entity.ts +++ b/src/gamification/entities/tier-reward.entity.ts @@ -1,10 +1,11 @@ -import { Entity, PrimaryGeneratedColumn, Column, VersionColumn } from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, Column, VersionColumn, Index } from 'typeorm'; import { Tier } from '../enums/tier.enum'; /** * Defines the reward granted when a user reaches a specific tier. */ @Entity('tier_rewards') +@Index(['tier']) export class TierReward { @PrimaryGeneratedColumn('uuid') id: string; diff --git a/src/gamification/entities/user-challenge.entity.ts b/src/gamification/entities/user-challenge.entity.ts index 3e5b09cf..1584ffab 100644 --- a/src/gamification/entities/user-challenge.entity.ts +++ b/src/gamification/entities/user-challenge.entity.ts @@ -1,4 +1,4 @@ -import { Entity, PrimaryGeneratedColumn, ManyToOne, Column, VersionColumn } from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, ManyToOne, Column, VersionColumn, Index } from 'typeorm'; import { User } from '../../users/entities/user.entity'; import { Challenge } from './challenge.entity'; @@ -6,6 +6,7 @@ import { Challenge } from './challenge.entity'; * Represents the user Challenge entity. */ @Entity('user_challenges') +@Index(['userId', 'challengeId']) export class UserChallenge { @PrimaryGeneratedColumn('uuid') id: string; diff --git a/src/migrations/1750000000000-add-gamification-indexes.ts b/src/migrations/1750000000000-add-gamification-indexes.ts new file mode 100644 index 00000000..bafbb8c1 --- /dev/null +++ b/src/migrations/1750000000000-add-gamification-indexes.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddGamificationIndexes1750000000000 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_point_transactions_user_createdAt" ON "point_transactions" ("userId", "createdAt")`); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_point_transactions_activityType" ON "point_transactions" ("activityType")`); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_user_challenges_user_challenge" ON "user_challenges" ("userId", "challengeId")`); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_challenges_type" ON "challenges" ("type")`); + await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_tier_rewards_tier" ON "tier_rewards" ("tier")`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX IF EXISTS "IDX_tier_rewards_tier"`); + await queryRunner.query(`DROP INDEX IF EXISTS "IDX_challenges_type"`); + await queryRunner.query(`DROP INDEX IF EXISTS "IDX_user_challenges_user_challenge"`); + await queryRunner.query(`DROP INDEX IF EXISTS "IDX_point_transactions_activityType"`); + await queryRunner.query(`DROP INDEX IF EXISTS "IDX_point_transactions_user_createdAt"`); + } +}