mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2024-11-08 09:04:43 +01:00
145 lines
4.2 KiB
JavaScript
145 lines
4.2 KiB
JavaScript
const { DataTypes, Model } = require('sequelize')
|
|
const Logger = require('../Logger')
|
|
const oldLibrary = require('../objects/Library')
|
|
|
|
module.exports = (sequelize) => {
|
|
class Library extends Model {
|
|
static async getAllOldLibraries() {
|
|
const libraries = await this.findAll({
|
|
include: sequelize.models.libraryFolder,
|
|
order: [['displayOrder', 'ASC']]
|
|
})
|
|
return libraries.map(lib => this.getOldLibrary(lib))
|
|
}
|
|
|
|
static getOldLibrary(libraryExpanded) {
|
|
const folders = libraryExpanded.libraryFolders.map(folder => {
|
|
return {
|
|
id: folder.id,
|
|
fullPath: folder.path,
|
|
libraryId: folder.libraryId,
|
|
addedAt: folder.createdAt.valueOf()
|
|
}
|
|
})
|
|
return new oldLibrary({
|
|
id: libraryExpanded.id,
|
|
oldLibraryId: libraryExpanded.extraData?.oldLibraryId || null,
|
|
name: libraryExpanded.name,
|
|
folders,
|
|
displayOrder: libraryExpanded.displayOrder,
|
|
icon: libraryExpanded.icon,
|
|
mediaType: libraryExpanded.mediaType,
|
|
provider: libraryExpanded.provider,
|
|
settings: libraryExpanded.settings,
|
|
createdAt: libraryExpanded.createdAt.valueOf(),
|
|
lastUpdate: libraryExpanded.updatedAt.valueOf()
|
|
})
|
|
}
|
|
|
|
/**
|
|
* @param {object} oldLibrary
|
|
* @returns {Library|null}
|
|
*/
|
|
static async createFromOld(oldLibrary) {
|
|
const library = this.getFromOld(oldLibrary)
|
|
|
|
library.libraryFolders = oldLibrary.folders.map(folder => {
|
|
return {
|
|
id: folder.id,
|
|
path: folder.fullPath
|
|
}
|
|
})
|
|
|
|
return this.create(library, {
|
|
include: sequelize.models.libraryFolder
|
|
}).catch((error) => {
|
|
Logger.error(`[Library] Failed to create library ${library.id}`, error)
|
|
return null
|
|
})
|
|
}
|
|
|
|
static async updateFromOld(oldLibrary) {
|
|
const existingLibrary = await this.findByPk(oldLibrary.id, {
|
|
include: sequelize.models.libraryFolder
|
|
})
|
|
if (!existingLibrary) {
|
|
Logger.error(`[Library] Failed to update library ${oldLibrary.id} - not found`)
|
|
return null
|
|
}
|
|
|
|
const library = this.getFromOld(oldLibrary)
|
|
|
|
const libraryFolders = oldLibrary.folders.map(folder => {
|
|
return {
|
|
id: folder.id,
|
|
path: folder.fullPath,
|
|
libraryId: library.id
|
|
}
|
|
})
|
|
for (const libraryFolder of libraryFolders) {
|
|
const existingLibraryFolder = existingLibrary.libraryFolders.find(lf => lf.id === libraryFolder.id)
|
|
if (!existingLibraryFolder) {
|
|
await sequelize.models.libraryFolder.create(libraryFolder)
|
|
} else if (existingLibraryFolder.path !== libraryFolder.path) {
|
|
await existingLibraryFolder.update({ path: libraryFolder.path })
|
|
}
|
|
}
|
|
|
|
const libraryFoldersRemoved = existingLibrary.libraryFolders.filter(lf => !libraryFolders.some(_lf => _lf.id === lf.id))
|
|
for (const existingLibraryFolder of libraryFoldersRemoved) {
|
|
await existingLibraryFolder.destroy()
|
|
}
|
|
|
|
return existingLibrary.update(library)
|
|
}
|
|
|
|
static getFromOld(oldLibrary) {
|
|
const extraData = {}
|
|
if (oldLibrary.oldLibraryId) {
|
|
extraData.oldLibraryId = oldLibrary.oldLibraryId
|
|
}
|
|
return {
|
|
id: oldLibrary.id,
|
|
name: oldLibrary.name,
|
|
displayOrder: oldLibrary.displayOrder,
|
|
icon: oldLibrary.icon || null,
|
|
mediaType: oldLibrary.mediaType || null,
|
|
provider: oldLibrary.provider,
|
|
settings: oldLibrary.settings?.toJSON() || {},
|
|
createdAt: oldLibrary.createdAt,
|
|
updatedAt: oldLibrary.lastUpdate,
|
|
extraData
|
|
}
|
|
}
|
|
|
|
static removeById(libraryId) {
|
|
return this.destroy({
|
|
where: {
|
|
id: libraryId
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
Library.init({
|
|
id: {
|
|
type: DataTypes.UUID,
|
|
defaultValue: DataTypes.UUIDV4,
|
|
primaryKey: true
|
|
},
|
|
name: DataTypes.STRING,
|
|
displayOrder: DataTypes.INTEGER,
|
|
icon: DataTypes.STRING,
|
|
mediaType: DataTypes.STRING,
|
|
provider: DataTypes.STRING,
|
|
lastScan: DataTypes.DATE,
|
|
lastScanVersion: DataTypes.STRING,
|
|
settings: DataTypes.JSON,
|
|
extraData: DataTypes.JSON
|
|
}, {
|
|
sequelize,
|
|
modelName: 'library'
|
|
})
|
|
|
|
return Library
|
|
} |