:sparles: Badges

This commit is contained in:
2024-06-02 20:45:56 +08:00
parent 61eff6ea49
commit 1c36b429ea
9 changed files with 108 additions and 172 deletions

View File

@ -1,10 +1,11 @@
package models
import "gorm.io/datatypes"
type Badge struct {
BaseModel
Type string `json:"type"`
Label string `json:"label"`
Color string `json:"color"`
AccountID uint `json:"account_id"`
Type string `json:"type"`
Metadata datatypes.JSONMap `json:"metadata"`
AccountID uint `json:"account_id"`
}

View File

@ -0,0 +1,63 @@
package admin
import (
"fmt"
"git.solsynth.dev/hydrogen/passport/pkg/database"
"git.solsynth.dev/hydrogen/passport/pkg/models"
"git.solsynth.dev/hydrogen/passport/pkg/services"
"git.solsynth.dev/hydrogen/passport/pkg/utils"
"github.com/gofiber/fiber/v2"
)
func grantBadge(c *fiber.Ctx) error {
if err := utils.CheckPermissions(c, "AdminGrantBadges", true); err != nil {
return err
}
var data struct {
Type string `json:"type" validate:"required"`
Metadata map[string]any `json:"metadata"`
AccountID uint `json:"account_id"`
}
if err := utils.BindAndValidate(c, &data); err != nil {
return err
}
var err error
var account models.Account
if account, err = services.GetAccount(data.AccountID); err != nil {
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("target account was not found: %v", err))
}
badge := models.Badge{
Type: data.Type,
Metadata: data.Metadata,
}
if err := services.GrantBadge(account, badge); err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.Error())
} else {
return c.JSON(badge)
}
}
func revokeBadge(c *fiber.Ctx) error {
if err := utils.CheckPermissions(c, "AdminRevokeBadges", true); err != nil {
return err
}
id, _ := c.ParamsInt("badgeId", 0)
var badge models.Badge
if err := database.C.Where("id = ?", id).First(&badge).Error; err != nil {
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("target badge was not found: %v", err))
}
if err := services.RevokeBadge(badge); err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.Error())
} else {
return c.JSON(badge)
}
}

14
pkg/server/admin/index.go Normal file
View File

@ -0,0 +1,14 @@
package admin
import (
"git.solsynth.dev/hydrogen/passport/pkg/utils"
"github.com/gofiber/fiber/v2"
)
func MapAdminEndpoints(A *fiber.App, authFunc utils.AuthFunc) {
admin := A.Group("/api/admin").Use(authFunc)
{
admin.Post("/badges", grantBadge)
admin.Delete("/badges/:badgeId", revokeBadge)
}
}

View File

@ -1,12 +1,14 @@
package server
import (
"github.com/gofiber/contrib/websocket"
"net/http"
"strings"
"github.com/gofiber/contrib/websocket"
"git.solsynth.dev/hydrogen/passport/pkg"
"git.solsynth.dev/hydrogen/passport/pkg/i18n"
"git.solsynth.dev/hydrogen/passport/pkg/server/admin"
"git.solsynth.dev/hydrogen/passport/pkg/server/ui"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
@ -142,6 +144,7 @@ func NewServer() {
URL: "/favicon.png",
}))
admin.MapAdminEndpoints(A, authFunc)
ui.MapUserInterface(A, authFunc)
}

View File

@ -4,10 +4,11 @@ import (
"fmt"
"git.solsynth.dev/hydrogen/passport/pkg/services"
"git.solsynth.dev/hydrogen/passport/pkg/utils"
"github.com/gofiber/fiber/v2"
)
func MapUserInterface(A *fiber.App, authFunc func(c *fiber.Ctx, overrides ...string) error) {
func MapUserInterface(A *fiber.App, authFunc utils.AuthFunc) {
authCheckWare := func(c *fiber.Ctx) error {
var token string
if cookie := c.Cookies(services.CookieAccessKey); len(cookie) > 0 {

15
pkg/services/badges.go Normal file
View File

@ -0,0 +1,15 @@
package services
import (
"git.solsynth.dev/hydrogen/passport/pkg/database"
"git.solsynth.dev/hydrogen/passport/pkg/models"
)
func GrantBadge(user models.Account, badge models.Badge) error {
badge.AccountID = user.ID
return database.C.Save(badge).Error
}
func RevokeBadge(badge models.Badge) error {
return database.C.Delete(&badge).Error
}

5
pkg/utils/auth.go Normal file
View File

@ -0,0 +1,5 @@
package utils
import "github.com/gofiber/fiber/v2"
type AuthFunc func(c *fiber.Ctx, overrides ...string) error