UNPKG

@jrmc/adonis-attachment

Version:

Turn any field on your Lucid model to an attachment data type

63 lines (62 loc) 2 kB
/** * @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); } }