mirror of
https://github.com/nprasad2077/NBA_Go.git
synced 2026-09-22 05:55:13 +00:00
62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package controllers
|
||
|
||
import (
|
||
"net/http"
|
||
"os"
|
||
|
||
"github.com/gofiber/fiber/v2"
|
||
"github.com/nprasad2077/NBA_Go/models"
|
||
"github.com/nprasad2077/NBA_Go/utils/security"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// very small middleware: require header X‑Admin‑Secret == $ADMIN_SECRET
|
||
func adminGuard() fiber.Handler {
|
||
secret := os.Getenv("ADMIN_SECRET")
|
||
return func(c *fiber.Ctx) error {
|
||
if c.Get("X-Admin-Secret") != secret {
|
||
return c.SendStatus(http.StatusUnauthorized)
|
||
}
|
||
return c.Next()
|
||
}
|
||
}
|
||
|
||
func RegisterKeyAdminRoutes(app *fiber.App, db *gorm.DB) {
|
||
admin := app.Group("/admin/keys", adminGuard())
|
||
|
||
admin.Get("/", func(c *fiber.Ctx) error {
|
||
var keys []models.APIKey
|
||
db.Find(&keys)
|
||
return c.JSON(keys)
|
||
})
|
||
|
||
admin.Post("/", func(c *fiber.Ctx) error {
|
||
var body struct{ Label string }
|
||
if err := c.BodyParser(&body); err != nil {
|
||
return err
|
||
}
|
||
|
||
raw, err := security.GenerateRawKey()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
key := models.APIKey{
|
||
Hash: security.HashKey(raw),
|
||
Label: body.Label,
|
||
}
|
||
db.Create(&key)
|
||
|
||
// return ONLY the raw key once
|
||
return c.JSON(fiber.Map{
|
||
"apiKey": raw,
|
||
"id": key.ID,
|
||
})
|
||
})
|
||
|
||
admin.Post("/:id/revoke", func(c *fiber.Ctx) error {
|
||
id := c.Params("id")
|
||
db.Model(&models.APIKey{}).Where("id = ?", id).Update("revoked", true)
|
||
return c.JSON(fiber.Map{"revoked": id})
|
||
})
|
||
} |