feat(umind): vincula tenants a clientes y agrega planes con precios
Base para que el cliente administre uMind desde su portal y para el cobro por consumo. Todavía no cambia nada del comportamiento actual. - UmindTenant gana ClienteID (punteros, sin not null: los tenants creados antes del portal quedan sin asignar y el ALTER TABLE no falla sobre datos existentes) y PlanID. - GetUmindTenantsByClientes es fail-closed: sin clientes, no ve nada. - UmindPlan define el máximo de agentes y los precios por 1k tokens, por imagen OCR, por transcripción y la mensualidad, más un tope de consumo que solo avisa. CRUD para staff en /app/umind-planes. - El modelo va en AMBAS listas de AutoMigrate (main.go y migrations), no repetir el error de agregarlo solo en una. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
84506a98e2
commit
c69b904b03
@@ -23,6 +23,12 @@ type UmindTenant struct {
|
||||
DominiosPermitidos string `json:"dominios_permitidos" gorm:"column:dominios_permitidos;type:text"` // coma-separado, ej: u-site.app,www.u-site.app
|
||||
Activo bool `json:"activo" gorm:"column:activo;default:true"`
|
||||
CreadoPorID uint `json:"creado_por_id" gorm:"column:creado_por_id"`
|
||||
// ClienteID es lo que le permite a un PortalUser llegar a sus tenants
|
||||
// (ver GetClienteIDsForPortalUser). Puntero y sin not null: los tenants
|
||||
// creados antes de que existiera el portal quedan sin cliente hasta que
|
||||
// el staff los asigne, y el ALTER TABLE no falla sobre datos existentes.
|
||||
ClienteID *uint `json:"cliente_id" gorm:"column:cliente_id;index"`
|
||||
PlanID *uint `json:"plan_id" gorm:"column:plan_id;index"`
|
||||
}
|
||||
|
||||
func (UmindTenant) TableName() string { return "umind_tenants" }
|
||||
@@ -55,6 +61,18 @@ func GetAllUmindTenants(limit, offset int) ([]UmindTenant, int64, error) {
|
||||
return items, total, nil
|
||||
}
|
||||
|
||||
// GetUmindTenantsByClientes lista los tenants que pertenecen a alguno de los
|
||||
// clientes dados — es la base del alcance del portal. Lista vacía devuelve
|
||||
// vacío sin consultar (fail-closed: un portal user sin clientes no ve nada).
|
||||
func GetUmindTenantsByClientes(clienteIDs []uint) ([]UmindTenant, error) {
|
||||
if len(clienteIDs) == 0 {
|
||||
return []UmindTenant{}, nil
|
||||
}
|
||||
var items []UmindTenant
|
||||
err := app.Http.Database.DB.Where("cliente_id IN ?", clienteIDs).Order("id DESC").Find(&items).Error
|
||||
return items, err
|
||||
}
|
||||
|
||||
func GetUmindTenantByID(id uint) (*UmindTenant, error) {
|
||||
var t UmindTenant
|
||||
if err := app.Http.Database.DB.First(&t, id).Error; err != nil {
|
||||
|
||||
Reference in New Issue
Block a user