const db = require('../models'); const assert = require('assert'); const services = require('../../services/file'); module.exports = class FileDBApi { static async replaceRelationFiles( relation, rawFiles, options, ) { assert(relation.belongsTo, 'belongsTo is required'); assert( relation.belongsToColumn, 'belongsToColumn is required', ); assert(relation.belongsToId, 'belongsToId is required'); let files = []; if (Array.isArray(rawFiles)) { files = rawFiles; } else { files = rawFiles ? [rawFiles] : []; } await this._removeLegacyFiles(relation, files, options); await this._addFiles(relation, files, options); } static async _addFiles(relation, files, options) { const transaction = (options && options.transaction) || undefined; const currentUser = (options && options.currentUser) || {id: null}; const inexistentFiles = files.filter( (file) => !!file.new, ); for (const file of inexistentFiles) { await db.file.create( { belongsTo: relation.belongsTo, belongsToColumn: relation.belongsToColumn, belongsToId: relation.belongsToId, name: file.name, sizeInBytes: file.sizeInBytes, privateUrl: file.privateUrl, publicUrl: file.publicUrl, createdById: currentUser.id, updatedById: currentUser.id, }, { transaction, }, ); } } static async _removeLegacyFiles( relation, files, options, ) { const transaction = (options && options.transaction) || undefined; const filesToDelete = await db.file.findAll({ where: { belongsTo: relation.belongsTo, belongsToId: relation.belongsToId, belongsToColumn: relation.belongsToColumn, id: { [db.Sequelize.Op .notIn]: files .filter((file) => !file.new) .map((file) => file.id) }, }, transaction, }); for (let file of filesToDelete) { await services.deleteGCloud(file.privateUrl); await file.destroy({ transaction, }); } } };