:sparles: Badges
This commit is contained in:
		
							
								
								
									
										63
									
								
								pkg/server/admin/badges_api.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								pkg/server/admin/badges_api.go
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										14
									
								
								pkg/server/admin/index.go
									
									
									
									
									
										Normal 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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -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)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user