This commit is contained in:
Lizandro Guarnizo
2026-05-15 23:22:35 -05:00
parent c91383882c
commit 49cc56123b
12 changed files with 1371 additions and 4 deletions
+5
View File
@@ -11,6 +11,7 @@ import (
"github.com/gofiber/fiber/v2"
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
"github.com/sujit-baniya/fiber-boilerplate/pkg/services"
)
func FacturasIndex(c *fiber.Ctx) error {
@@ -185,6 +186,10 @@ func UploadFacturaPDF(c *fiber.Ctx) error {
if err := models.UpdateFacturaArchivo(uint(id), savePath, file.Filename); err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
// Notificar al cliente
if f, err := models.GetFacturaByID(uint(id)); err == nil {
go services.DispatchFacturaSubida(f)
}
return c.JSON(fiber.Map{"ok": true, "archivo": savePath})
}
+286
View File
@@ -0,0 +1,286 @@
package controllers
import (
"strconv"
"github.com/gofiber/fiber/v2"
"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
"github.com/sujit-baniya/fiber-boilerplate/pkg/services"
)
// shieldClient construye el cliente Shield desde la config activa.
func shieldClient() (*services.ShieldClient, error) {
cfg, err := models.GetShieldConfig()
if err != nil {
return nil, err
}
return services.NewShieldClient(cfg.BaseUrl, cfg.AdminToken), nil
}
// ─── Vista principal ─────────────────────────────────────────────────────────
func ShieldIndex(c *fiber.Ctx) error {
return c.Render("shield", fiber.Map{
"user": c.Locals("user"),
"modules": c.Locals("userModules"),
}, "layouts/main")
}
// ─── Configuración ───────────────────────────────────────────────────────────
func LoadShieldConfig(c *fiber.Ctx) error {
cfg, err := models.GetShieldConfig()
if err != nil {
return c.JSON(fiber.Map{"base_url": "https://api-shield.u-s.app", "admin_token": "", "activo": true, "nota": ""})
}
return c.JSON(cfg)
}
func SaveShieldConfig(c *fiber.Ctx) error {
var req models.ShieldConfig
if err := c.BodyParser(&req); err != nil {
return c.Status(400).JSON(fiber.Map{"error": err.Error()})
}
if req.BaseUrl == "" {
req.BaseUrl = "https://api-shield.u-s.app"
}
if err := models.UpsertShieldConfig(&req); err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"ok": true})
}
// ─── Health ──────────────────────────────────────────────────────────────────
func ShieldHealth(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.JSON(fiber.Map{"status": "sin configurar", "db": "-", "error": "No hay configuración Shield activa"})
}
data, err := client.Health()
if err != nil {
return c.JSON(fiber.Map{"status": "offline", "db": "-", "error": err.Error()})
}
return c.JSON(data)
}
func ShieldExtensionVersion(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
data, err := client.ExtensionVersion()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
// ─── Logs ────────────────────────────────────────────────────────────────────
func ShieldLogs(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
limit, _ := strconv.Atoi(c.Query("limit", "100"))
data, err := client.Logs(limit, c.Query("path"), c.Query("method"))
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
func ShieldLogStats(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
data, err := client.LogStats()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
// ─── Review requests ─────────────────────────────────────────────────────────
func ShieldReviewRequests(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
data, err := client.ReviewRequests(c.Query("status", "pending"))
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
func ShieldApproveRequest(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
id := c.Params("id")
var body struct {
Note string `json:"note"`
Reason string `json:"reason"`
}
c.BodyParser(&body)
data, err := client.ApproveRequest(id, body.Note, body.Reason)
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
func ShieldRejectRequest(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
id := c.Params("id")
var body struct {
Note string `json:"note"`
}
c.BodyParser(&body)
data, err := client.RejectRequest(id, body.Note)
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
// ─── Whitelist ───────────────────────────────────────────────────────────────
func ShieldWhitelist(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
data, err := client.Whitelist()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
func ShieldAddWhitelist(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
var body struct {
Domain string `json:"domain"`
Reason string `json:"reason"`
AddedBy string `json:"added_by"`
}
if err := c.BodyParser(&body); err != nil || body.Domain == "" {
return c.Status(400).JSON(fiber.Map{"error": "domain requerido"})
}
if body.AddedBy == "" {
body.AddedBy = "admin"
}
data, err := client.AddWhitelist(body.Domain, body.Reason, body.AddedBy)
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
func ShieldDeleteWhitelist(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
domain := c.Params("domain")
if err := client.DeleteWhitelist(domain); err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"ok": true})
}
// ─── Blacklist ───────────────────────────────────────────────────────────────
func ShieldBlacklist(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
data, err := client.Blacklist()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
func ShieldAddBlacklist(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
var body struct {
Domain string `json:"domain"`
Reason string `json:"reason"`
AddedBy string `json:"added_by"`
}
if err := c.BodyParser(&body); err != nil || body.Domain == "" {
return c.Status(400).JSON(fiber.Map{"error": "domain requerido"})
}
if body.AddedBy == "" {
body.AddedBy = "admin"
}
data, err := client.AddBlacklist(body.Domain, body.Reason, body.AddedBy)
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
func ShieldDeleteBlacklist(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
domain := c.Params("domain")
if err := client.DeleteBlacklist(domain); err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"ok": true})
}
// ─── Reputación ──────────────────────────────────────────────────────────────
func ShieldReputation(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
domain := c.Params("domain")
data, err := client.Reputation(domain)
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
func ShieldAdjustScore(c *fiber.Ctx) error {
client, err := shieldClient()
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Sin configuración"})
}
domain := c.Params("domain")
var body struct {
VotesReal int `json:"votes_real"`
VotesFake int `json:"votes_fake"`
}
if err := c.BodyParser(&body); err != nil {
return c.Status(400).JSON(fiber.Map{"error": err.Error()})
}
data, err := client.AdjustScore(domain, body.VotesReal, body.VotesFake)
if err != nil {
return c.Status(500).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(data)
}
+20
View File
@@ -154,6 +154,26 @@ func UserRoutes(app fiber.Router) {
protected.Get("/cloudflare/zones/:zone_id/ssl", controllers.GetCloudflareSSL)
protected.Get("/cloudflare/zones/:zone_id/firewall", controllers.GetCloudflareFirewall)
// ─── USITE Shield ─────────────────────────────────────────────────────────
protected.Get("/shield", middlewares.MenuMiddleware, controllers.ShieldIndex)
protected.Get("/loadshield", controllers.LoadShieldConfig)
protected.Post("/saveshield", controllers.SaveShieldConfig)
protected.Get("/shield/health", controllers.ShieldHealth)
protected.Get("/shield/extension-version", controllers.ShieldExtensionVersion)
protected.Get("/shield/logs", controllers.ShieldLogs)
protected.Get("/shield/logs/stats", controllers.ShieldLogStats)
protected.Get("/shield/review-requests", controllers.ShieldReviewRequests)
protected.Put("/shield/review-requests/:id/approve", controllers.ShieldApproveRequest)
protected.Put("/shield/review-requests/:id/reject", controllers.ShieldRejectRequest)
protected.Get("/shield/whitelist", controllers.ShieldWhitelist)
protected.Post("/shield/whitelist", controllers.ShieldAddWhitelist)
protected.Delete("/shield/whitelist/:domain", controllers.ShieldDeleteWhitelist)
protected.Get("/shield/blacklist", controllers.ShieldBlacklist)
protected.Post("/shield/blacklist", controllers.ShieldAddBlacklist)
protected.Delete("/shield/blacklist/:domain", controllers.ShieldDeleteBlacklist)
protected.Get("/shield/reputation/:domain", controllers.ShieldReputation)
protected.Put("/shield/reputation/:domain/score", controllers.ShieldAdjustScore)
// ─── Pasarelas de Pago ────────────────────────────────────────────
protected.Get("/pasarelas-pago", middlewares.MenuMiddleware, controllers.PasarelasPage)
// Bold