77 lines
1.8 KiB
JavaScript
77 lines
1.8 KiB
JavaScript
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);
|
|
|