الملفات
back_end_oudelaa/src/modules/media/media.repository.ts
boutmoun123 7a754f4bf9
فشلت بعض الفحوصات
Deploy To Ghaymah / deploy (push) Has been cancelled
Add AI music archive backend
2026-06-30 14:41:50 +03:00

123 أسطر
2.9 KiB
TypeScript

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model, Types } from 'mongoose';
import {
AiMusicArchive,
AiMusicArchiveDocument,
AiMusicArchiveType,
} from './schemas/ai-music-archive.schema';
@Injectable()
export class MediaRepository {
constructor(
@InjectModel(AiMusicArchive.name)
private readonly aiMusicArchiveModel: Model<AiMusicArchiveDocument>,
) {}
async createAiMusicArchiveItem(
userId: string,
payload: {
type: AiMusicArchiveType;
title: string;
prompt: string;
tag: string;
audioUrl: string;
storageKey?: string;
durationSeconds?: number | null;
mimeType?: string;
sizeBytes?: number;
waveformPeaks?: number[];
},
): Promise<AiMusicArchiveDocument> {
return this.aiMusicArchiveModel.create({
...payload,
userId: new Types.ObjectId(userId),
isDeleted: false,
});
}
async findAiMusicArchiveItemsByUser(
userId: string,
skip: number,
limit: number,
): Promise<AiMusicArchiveDocument[]> {
return this.aiMusicArchiveModel
.find({
userId: new Types.ObjectId(userId),
isDeleted: { $ne: true },
})
.sort({ createdAt: -1 })
.skip(skip)
.limit(limit)
.exec();
}
async countAiMusicArchiveItemsByUser(userId: string): Promise<number> {
return this.aiMusicArchiveModel
.countDocuments({
userId: new Types.ObjectId(userId),
isDeleted: { $ne: true },
})
.exec();
}
async findAiMusicArchiveItemByUser(
userId: string,
itemId: string,
): Promise<AiMusicArchiveDocument | null> {
if (!Types.ObjectId.isValid(itemId)) {
return null;
}
return this.aiMusicArchiveModel
.findOne({
_id: new Types.ObjectId(itemId),
userId: new Types.ObjectId(userId),
isDeleted: { $ne: true },
})
.exec();
}
async updateAiMusicArchiveTitle(
userId: string,
itemId: string,
title: string,
): Promise<AiMusicArchiveDocument | null> {
if (!Types.ObjectId.isValid(itemId)) {
return null;
}
return this.aiMusicArchiveModel
.findOneAndUpdate(
{
_id: new Types.ObjectId(itemId),
userId: new Types.ObjectId(userId),
isDeleted: { $ne: true },
},
{ title },
{ new: true },
)
.exec();
}
async softDeleteAiMusicArchiveItem(userId: string, itemId: string): Promise<boolean> {
if (!Types.ObjectId.isValid(itemId)) {
return false;
}
const updated = await this.aiMusicArchiveModel
.findOneAndUpdate(
{
_id: new Types.ObjectId(itemId),
userId: new Types.ObjectId(userId),
isDeleted: { $ne: true },
},
{ isDeleted: true },
{ new: false },
)
.exec();
return !!updated;
}
}