@jrmc/adonis-attachment
Version:
Turn any field on your Lucid model to an attachment data type
63 lines (62 loc) • 2 kB
JavaScript
/**
* @jrmc/adonis-attachment
*
* @license MIT
* @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
*/
import logger from '@adonisjs/core/services/logger';
import string from '@adonisjs/core/helpers/string';
import db from '@adonisjs/lucid/services/db';
import attachmentManager from '../../../services/main.js';
export default class VariantPersisterService {
#id;
#modelTable;
#attributeName;
#multiple;
#primaryKey;
constructor({ id, modelTable, attributeName, multiple, primaryKey }) {
this.#id = id;
this.#modelTable = modelTable;
this.#attributeName = attributeName;
this.#multiple = multiple;
this.#primaryKey = primaryKey;
}
async persist({ attachments, variants }) {
const rollback = () => this.#rollbackVariants(variants);
const trx = await db.transaction();
trx.after('rollback', rollback);
try {
const data = this.#prepareUpdateData(attachments);
await this.#executeUpdate(trx, data);
await trx.commit();
}
catch (error) {
logger.error(`Persist failed: ${error.message}`);
await trx.rollback();
throw error;
}
}
#rollbackVariants(variants) {
variants.forEach(variant => {
try {
attachmentManager.remove(variant);
}
catch (error) {
logger.error(`Rollback failed for variant: ${error.message}`);
}
});
}
#prepareUpdateData(attachments) {
const index = string.snakeCase(this.#attributeName);
const data = this.#multiple
? attachments.map(att => att.toObject())
: attachments[0]?.toObject();
return { [index]: JSON.stringify(data) };
}
async #executeUpdate(trx, data) {
await trx.query()
.from(this.#modelTable)
.where(this.#primaryKey, this.#id)
.update(data);
}
}