Add gitservers to backend

This commit is contained in:
2026-05-02 17:37:36 +02:00
parent 38d2083d06
commit 76e3454c4c
6 changed files with 311 additions and 0 deletions
+123
View File
@@ -0,0 +1,123 @@
package handlers
import (
"database/sql"
"errors"
"log"
"quay/app/models"
"quay/app/repository"
"github.com/gofiber/fiber/v3"
)
type GitServerHandler struct {
Repo repository.GitServerRepository
}
func NewGitServerHandler(repo repository.GitServerRepository) *GitServerHandler {
return &GitServerHandler{Repo: repo}
}
func (h *GitServerHandler) GetGitServers(c fiber.Ctx) error {
gs, err := h.Repo.ListGitServers()
if err != nil {
log.Println("Error listing gitservers: ", err)
return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{Message: "Unexpected error while listing git servers"})
}
if gs == nil {
gs = []models.GitServer{}
}
return c.JSON(gs)
}
func (h *GitServerHandler) GetGitServer(c fiber.Ctx) error {
id := c.Params("id")
g, err := h.Repo.GetGitServer(id)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return c.Status(fiber.StatusNotFound).JSON(&models.APIError{Message: "Git server not found"})
}
log.Println("Error getting gitserver: ", err)
return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{Message: "Unexpected error while getting git server"})
}
if g == nil {
return c.Status(fiber.StatusNotFound).JSON(&models.APIError{Message: "Git server not found"})
}
return c.JSON(g)
}
func validateIncomingGitServer(gs *models.GitServer) error {
return models.ValidateGitServer(gs)
}
func (h *GitServerHandler) PostGitServer(c fiber.Ctx) error {
var gs models.GitServer
if err := c.Bind().Body(&gs); err != nil {
log.Println("Error parsing body: ", err)
return c.Status(fiber.StatusBadRequest).JSON(&models.APIError{Message: "Invalid request body"})
}
if err := validateIncomingGitServer(&gs); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(&models.APIError{Message: "Invalid request body: " + err.Error()})
}
if err := h.Repo.CreateGitServer(&gs); err != nil {
log.Println("Error creating gitserver: ", err)
return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{Message: "Unexpected error while creating git server"})
}
return c.JSON(gs)
}
func (h *GitServerHandler) PutGitServer(c fiber.Ctx) error {
id := c.Params("id")
if _, err := h.Repo.GetGitServer(id); err != nil {
if errors.Is(err, sql.ErrNoRows) {
return c.Status(fiber.StatusNotFound).JSON(&models.APIError{Message: "Git server not found"})
}
log.Println("Error checking gitserver before update: ", err)
return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{Message: "Unexpected error while updating git server"})
}
var gs models.GitServer
if err := c.Bind().Body(&gs); err != nil {
log.Println("Error parsing body: ", err)
return c.Status(fiber.StatusBadRequest).JSON(&models.APIError{Message: "Invalid request body"})
}
if err := validateIncomingGitServer(&gs); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(&models.APIError{Message: "Invalid request body: " + err.Error()})
}
gs.ID = id
if err := h.Repo.UpdateGitServer(&gs); err != nil {
log.Println("Error updating gitserver: ", err)
return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{Message: "Unexpected error while updating git server"})
}
updated, err := h.Repo.GetGitServer(id)
if err != nil {
log.Println("Error getting updated gitserver: ", err)
return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{Message: "Git server was updated but could not be retrieved"})
}
return c.JSON(updated)
}
func (h *GitServerHandler) DeleteGitServer(c fiber.Ctx) error {
id := c.Params("id")
if _, err := h.Repo.GetGitServer(id); err != nil {
if errors.Is(err, sql.ErrNoRows) {
return c.Status(fiber.StatusNotFound).JSON(&models.APIError{Message: "Git server not found"})
}
log.Println("Error checking gitserver before delete: ", err)
return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{Message: "Unexpected error while deleting git server"})
}
if err := h.Repo.DeleteGitServer(id); err != nil {
log.Println("Error deleting gitserver: ", err)
return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{Message: "Unexpected error while deleting git server"})
}
return c.SendStatus(fiber.StatusNoContent)
}
+34
View File
@@ -0,0 +1,34 @@
package models
import "errors"
type GitServer struct {
ID string `json:"id"`
Name string `json:"name"`
Protocol string `json:"protocol"`
BaseUrl string `json:"baseUrl"`
Type string `json:"type"`
CreatedAt string `json:"created_at"`
}
func ValidateGitServer(gs *GitServer) error {
if gs.Name == "" {
return errors.New("name is required")
}
if gs.Protocol == "" {
return errors.New("protocol is required")
}
if gs.Protocol != "http" && gs.Protocol != "https" {
return errors.New("protocol must be either 'http' or 'https'")
}
if gs.BaseUrl == "" {
return errors.New("baseUrl is required")
}
if gs.Type == "" {
return errors.New("type is required")
}
if gs.Type != "github" && gs.Type != "gitlab" && gs.Type != "gitea" {
return errors.New("type must be either 'github', 'gitlab' or 'gitea'")
}
return nil
}
@@ -0,0 +1,16 @@
package repository
import (
"errors"
"quay/app/models"
)
var ErrGitServerAlreadyExists = errors.New("gitserver already exists")
type GitServerRepository interface {
ListGitServers() ([]models.GitServer, error)
GetGitServer(id string) (*models.GitServer, error)
CreateGitServer(gs *models.GitServer) error
UpdateGitServer(gs *models.GitServer) error
DeleteGitServer(id string) error
}
+24
View File
@@ -19,10 +19,27 @@ func Register(app *fiber.App, cfg *config.Config, envCfg *envconfig.EnvConfig, d
siteRepository := cachedrepo.NewCachedSiteRepository(database.NewSQLiteSiteRepository(db))
deploymentRepository := database.NewSQLiteDeploymentRepository(db)
userRepository := database.NewSQLiteUserRepository(db)
gitServerRepository := database.NewSQLiteGitServerRepository(db)
// Seed default git servers if none exist
if gsList, err := gitServerRepository.ListGitServers(); err != nil {
log.Printf("Warning checking gitservers: %v", err)
} else if len(gsList) == 0 {
defaults := []models.GitServer{
{Name: "GitHub", Protocol: "https", BaseUrl: "github.com", Type: "github"},
{Name: "GitLab", Protocol: "https", BaseUrl: "gitlab.com", Type: "gitlab"},
}
for _, d := range defaults {
if err := gitServerRepository.CreateGitServer(&d); err != nil {
log.Printf("Warning creating default gitserver %s: %v", d.Name, err)
}
}
}
siteHandler := handlers.NewSiteHandler(siteRepository)
deploySiteHandler := handlers.NewDeploySiteHandler(envCfg, siteRepository, deploymentRepository)
userHandler := handlers.NewUserHandler(userRepository)
gitServerHandler := handlers.NewGitServerHandler(gitServerRepository)
deploymentsHandler := handlers.NewDeploymentHandler(deploymentRepository)
api := app.Group("/api/v1", middleware.APIHostGuard(envCfg.DashboardHost))
@@ -46,6 +63,13 @@ func Register(app *fiber.App, cfg *config.Config, envCfg *envconfig.EnvConfig, d
protected.Delete("/sites/:id", siteHandler.DeleteSite)
protected.Patch("/sites/:id/enabled", siteHandler.ToggleEnabled)
// Git servers
protected.Get("/gitservers", gitServerHandler.GetGitServers)
protected.Get("/gitservers/:id", gitServerHandler.GetGitServer)
protected.Post("/gitservers", gitServerHandler.PostGitServer)
protected.Put("/gitservers/:id", gitServerHandler.PutGitServer)
protected.Delete("/gitservers/:id", gitServerHandler.DeleteGitServer)
// Forward rules
protected.Get("/sites/:id/forward-rules", siteHandler.GetSiteForwardRules)
protected.Post("/sites/:id/forward-rules", siteHandler.PostForwardRule)