package models import ( "time" "github.com/sujit-baniya/fiber-boilerplate/app" "gorm.io/gorm" ) // UmindArchivo es el repositorio del espacio: contratos firmados, pólizas, // cotizaciones viejas. Vive a nivel tenant y no de agente, porque los archivos // son del negocio — si mañana crea un segundo agente, sus papeles no se mudan. type UmindArchivo struct { gorm.Model TenantID uint `json:"tenant_id" gorm:"column:tenant_id;index;not null"` Nombre string `json:"nombre" gorm:"column:nombre;size:255;not null"` Archivo string `json:"-" gorm:"column:archivo;size:500;not null"` // ruta en disco, nunca al cliente TipoMime string `json:"tipo_mime" gorm:"column:tipo_mime;size:120"` Tamanio int64 `json:"tamanio" gorm:"column:tamanio"` Origen string `json:"origen" gorm:"column:origen;size:20;default:'subido'"` // subido | generado DocumentoID *uint `json:"documento_id" gorm:"column:documento_id"` // si se usó como conocimiento SubidoPor string `json:"subido_por" gorm:"column:subido_por;size:120"` Descripcion string `json:"descripcion" gorm:"column:descripcion;type:text"` } func (UmindArchivo) TableName() string { return "umind_archivos" } func CreateUmindArchivo(a *UmindArchivo) error { return app.Http.Database.DB.Create(a).Error } func GetUmindArchivosByTenant(tenantID uint) ([]UmindArchivo, error) { var items []UmindArchivo err := app.Http.Database.DB.Where("tenant_id = ?", tenantID). Order("created_at DESC").Limit(500).Find(&items).Error return items, err } func GetUmindArchivoByID(id uint) (*UmindArchivo, error) { var a UmindArchivo if err := app.Http.Database.DB.First(&a, id).Error; err != nil { return nil, err } return &a, nil } func DeleteUmindArchivo(id uint) error { return app.Http.Database.DB.Delete(&UmindArchivo{}, id).Error } // EspacioUsadoUmind suma los bytes guardados por un espacio, para el tope // del plan. Se cuenta lo que hay, no lo que se subió alguna vez. func EspacioUsadoUmind(tenantID uint) int64 { var total int64 app.Http.Database.DB.Model(&UmindArchivo{}). Where("tenant_id = ? AND deleted_at IS NULL", tenantID). Select("COALESCE(SUM(tamanio), 0)").Scan(&total) return total } // VincularArchivoADocumento deja constancia de que este archivo ya se cargó // como conocimiento, para no ingerir dos veces el mismo PDF. func VincularArchivoADocumento(archivoID, documentoID uint) error { return app.Http.Database.DB.Model(&UmindArchivo{}).Where("id = ?", archivoID). Update("documento_id", documentoID).Error } // AhoraUnix da el prefijo de tiempo para los nombres de archivo en disco. func AhoraUnix() int64 { return time.Now().Unix() }