UNPKG

@jrmc/adonis-attachment

Version:

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

60 lines (59 loc) 2.01 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 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); } }