@jrmc/adonis-attachment
Version:
Turn any field on your Lucid model to an attachment data type
60 lines (59 loc) • 2.01 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 value = this.#multiple
? JSON.stringify(attachments.map((att) => JSON.parse(att.toDbString())))
: (attachments[0]?.toDbString() ?? JSON.stringify(null));
return { [index]: value };
}
async #executeUpdate(trx, data) {
await trx.query().from(this.#modelTable).where(this.#primaryKey, this.#id).update(data);
}
}