nakama/backend/models/Track.js

77 lines
1.8 KiB
JavaScript
Raw Normal View History

2025-12-15 07:28:47 +00:00
const mongoose = require('mongoose');
const trackSchema = new mongoose.Schema({
title: {
type: String,
required: true,
trim: true,
index: true
},
artist: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Artist',
required: true,
index: true
},
album: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Album',
default: null,
index: true
},
// URL файла (хранится в MinIO или локально)
fileUrl: {
type: String,
required: true
},
// Метаданные файла
file: {
size: { type: Number, required: true }, // в байтах
mimeType: { type: String, required: true },
duration: { type: Number, default: 0 } // в секундах
},
// Обложка трека (если отличается от обложки альбома)
coverImage: {
type: String,
default: null
},
// Порядковый номер в альбоме
trackNumber: {
type: Number,
default: 0
},
// Метаданные
year: {
type: Number,
default: null
},
genre: {
type: String,
default: ''
},
// Статистика
stats: {
plays: { type: Number, default: 0 },
favorites: { type: Number, default: 0 },
downloads: { type: Number, default: 0 }
},
// Кто добавил трек
addedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true
}
}, {
timestamps: true
});
// Индексы для поиска
trackSchema.index({ title: 'text' });
trackSchema.index({ artist: 1, createdAt: -1 });
trackSchema.index({ album: 1, trackNumber: 1 });
trackSchema.index({ createdAt: -1 });
trackSchema.index({ 'stats.plays': -1 });
module.exports = mongoose.model('Track', trackSchema);