// @flow import path from "path"; import { DataTypes, sequelize } from "../sequelize"; import { deleteFromS3, getFileByKey } from "../utils/s3"; const Attachment = sequelize.define( "attachment", { id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true, }, key: { type: DataTypes.STRING, allowNull: false, }, url: { type: DataTypes.STRING, allowNull: false, }, contentType: { type: DataTypes.STRING, allowNull: false, }, size: { type: DataTypes.BIGINT, allowNull: false, }, acl: { type: DataTypes.STRING, allowNull: false, defaultValue: "public-read", validate: { isIn: [["private", "public-read"]], }, }, }, { getterMethods: { name: function () { return path.parse(this.key).base; }, redirectUrl: function () { return `/api/attachments.redirect?id=${this.id}`; }, isPrivate: function () { return this.acl === "private"; }, buffer: function () { return getFileByKey(this.key); }, }, } ); Attachment.beforeDestroy(async (model) => { await deleteFromS3(model.key); }); Attachment.associate = (models) => { Attachment.belongsTo(models.Team); Attachment.belongsTo(models.Document); Attachment.belongsTo(models.User); }; export default Attachment;