From f0b5e1706d872f6d2f11ba7ccafe3f7fb8ad9107 Mon Sep 17 00:00:00 2001 From: the-sabra Date: Wed, 5 Feb 2025 20:41:57 +0200 Subject: [PATCH] feat: Implement random tilawa selection and update DTO for optional reciter ID #31 --- src/audio/audio.service.ts | 14 +++----------- src/audio/dto/random.dto.ts | 5 +++-- src/reciter/reciter.service.ts | 21 ++++++++++++++++++++- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/audio/audio.service.ts b/src/audio/audio.service.ts index 367d617..4b49958 100644 --- a/src/audio/audio.service.ts +++ b/src/audio/audio.service.ts @@ -1,7 +1,7 @@ import { ConflictException, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { TilawaSurah } from 'src/surah/entities/tilawa-surah.entity'; -import { Repository } from 'typeorm'; +import { In, Repository } from 'typeorm'; import { CreateAudioDto } from './dto/create-audio.dto'; import { FilterAudioDto } from './dto/filter-audio.dto'; import { ReciterService } from 'src/reciter/reciter.service'; @@ -65,20 +65,12 @@ export class AudioService { throw new Error('Limit must be greater than 0'); } - const tilawat = await this.reciterService.getReciterTilawa(reciter_id); - - if (!tilawat?.length) { - throw new Error('No tilawat found for this reciter'); - } - - // Use more efficient random selection for tilawa - const randomTilawaIndex = Math.floor(Math.random() * tilawat.length); - const randomTilawa = tilawat[randomTilawaIndex]; + const randomTilawa = await this.reciterService.getRandomTilawa(reciter_id); const audioRecords = await this.tilawaSurahRepo.find({ select: ['tilawa_id', 'url'], where: { - tilawa_id: randomTilawa.id, + tilawa_id: In(randomTilawa.map((tilawa) => tilawa.id)), }, relations: { surah: true, diff --git a/src/audio/dto/random.dto.ts b/src/audio/dto/random.dto.ts index 4ce51c6..0338f0c 100644 --- a/src/audio/dto/random.dto.ts +++ b/src/audio/dto/random.dto.ts @@ -1,5 +1,5 @@ import { Transform } from 'class-transformer'; -import { IsNumber, IsPositive } from 'class-validator'; +import { IsNumber, IsOptional, IsPositive } from 'class-validator'; export class RandomDto { @IsNumber() @@ -10,5 +10,6 @@ export class RandomDto { @IsNumber() @IsPositive() @Transform(({ value }) => parseInt(value)) - reciter_id: number; + @IsOptional() + reciter_id?: number; } diff --git a/src/reciter/reciter.service.ts b/src/reciter/reciter.service.ts index 603f807..7bfb932 100644 --- a/src/reciter/reciter.service.ts +++ b/src/reciter/reciter.service.ts @@ -2,7 +2,7 @@ import { Injectable, Logger, NotFoundException } from '@nestjs/common'; import { CreateReciterDto } from './dto/create-reciter.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Reciter } from './entities/reciter.entity'; -import { Repository } from 'typeorm'; +import { In, Repository } from 'typeorm'; import { Tilawa } from './entities/tilawa.entity'; import { AddTilawaDto } from './dto/add-tilawa.dto'; import { ReciterFilterDto } from './dto/reciter-filter.dto'; @@ -113,6 +113,25 @@ export class ReciterService { return tilawa; } + async getRandomTilawa(reciterId: number) { + const tilawa = await this.tilawaRepository.find({ + where: { + reciter_id: reciterId || In([1, 2, 3, 4, 14, 6, 13, 15, 18]), + }, + }); + + const size = 5; + const randomTilawas = []; + while (randomTilawas.length < Math.min(size, tilawa.length)) { + const randomTilawa = tilawa[Math.floor(Math.random() * tilawa.length)]; + if (!randomTilawas.includes(randomTilawa)) { + randomTilawas.push(randomTilawa); + } + } + + return randomTilawas; + } + addReciterTilawa(id: number, addTilawaDto: Omit) { const tilawa = this.tilawaRepository.create({ ...addTilawaDto,