feat: agrega integraciones OCR y Whisper ASR (servicios propios)

Nuevos submódulos en Integraciones para conectar el servicio propio de
OCR (extracción de texto de imágenes) y el de transcripción de audio
self-hosted (whisper-asr-webservice, Basic Auth), con panel de
configuración y prueba en vivo, siguiendo el patrón ya usado por
WebSMS/Hostinger.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-13 10:09:40 -05:00
co-authored by Claude Sonnet 5
parent 997e3cc790
commit d493d6dee6
11 changed files with 621 additions and 0 deletions
+41
View File
@@ -0,0 +1,41 @@
package models
import (
"github.com/sujit-baniya/fiber-boilerplate/app"
"gorm.io/gorm"
)
// OcrConfig almacena la conexión al servicio propio de OCR (extracción de
// texto de imágenes, ej. comprobantes de pago). Solo un registro activo a
// la vez, mismo patrón que HostingerConfig/WebSmsConfig.
type OcrConfig struct {
gorm.Model
BaseURL string `json:"base_url" gorm:"column:base_url;type:text;not null"` // ej: https://ocr.u-s.app/extract
Token string `json:"token" gorm:"column:token;type:text;not null"` // Bearer token
Notas string `json:"notas" gorm:"column:notas;type:text"`
Activo bool `json:"activo" gorm:"column:activo;default:true"`
}
func (OcrConfig) TableName() string { return "ocr_config" }
func GetOcrConfig() (*OcrConfig, error) {
var item OcrConfig
if err := app.Http.Database.DB.Where("activo = ?", true).Order("id DESC").First(&item).Error; err != nil {
return nil, err
}
return &item, nil
}
func SaveOcrConfig(s OcrConfig) error {
app.Http.Database.DB.Model(&OcrConfig{}).Where("activo = ?", true).Update("activo", false)
s.Activo = true
if s.ID > 0 {
return app.Http.Database.DB.Model(&s).Updates(map[string]interface{}{
"base_url": s.BaseURL,
"token": s.Token,
"notas": s.Notas,
"activo": true,
}).Error
}
return app.Http.Database.DB.Create(&s).Error
}
+44
View File
@@ -0,0 +1,44 @@
package models
import (
"github.com/sujit-baniya/fiber-boilerplate/app"
"gorm.io/gorm"
)
// WhisperAsrConfig almacena la conexión al servicio propio de transcripción
// de audio (whisper-asr-webservice self-hosted, autenticado con Basic Auth)
// — distinto del Whisper de OpenAI que ya se configura vía AiConfig con
// modulo "whisper" para el bot de Telegram. Solo un registro activo a la vez.
type WhisperAsrConfig struct {
gorm.Model
BaseURL string `json:"base_url" gorm:"column:base_url;type:text;not null"` // ej: https://whisper.u-s.app/asr
Username string `json:"username" gorm:"column:username;size:255;not null"`
Password string `json:"password" gorm:"column:password;type:text;not null"`
Notas string `json:"notas" gorm:"column:notas;type:text"`
Activo bool `json:"activo" gorm:"column:activo;default:true"`
}
func (WhisperAsrConfig) TableName() string { return "whisper_asr_config" }
func GetWhisperAsrConfig() (*WhisperAsrConfig, error) {
var item WhisperAsrConfig
if err := app.Http.Database.DB.Where("activo = ?", true).Order("id DESC").First(&item).Error; err != nil {
return nil, err
}
return &item, nil
}
func SaveWhisperAsrConfig(s WhisperAsrConfig) error {
app.Http.Database.DB.Model(&WhisperAsrConfig{}).Where("activo = ?", true).Update("activo", false)
s.Activo = true
if s.ID > 0 {
return app.Http.Database.DB.Model(&s).Updates(map[string]interface{}{
"base_url": s.BaseURL,
"username": s.Username,
"password": s.Password,
"notas": s.Notas,
"activo": true,
}).Error
}
return app.Http.Database.DB.Create(&s).Error
}