Added site overview page

This commit is contained in:
2026-04-06 16:05:14 +02:00
parent 538bd8920c
commit 3a96717d02
25 changed files with 1293 additions and 16 deletions
@@ -119,6 +119,18 @@ func (c *CachedSiteRepository) UpdateSite(s *models.Site) error {
return nil
}
func (c *CachedSiteRepository) ToggleEnabled(id string) (enabledReturn bool, err error) {
enabledReturn, err = c.inner.ToggleEnabled(id)
if err != nil {
return false, err
}
c.mu.Lock()
delete(c.sites, id)
c.siteListValid = false
c.mu.Unlock()
return enabledReturn, nil
}
func (c *CachedSiteRepository) DeleteSite(id string) error {
if err := c.inner.DeleteSite(id); err != nil {
return err
+40
View File
@@ -254,6 +254,46 @@ func (h *SiteHandler) PutSite(c fiber.Ctx) error {
return c.JSON(updatedSite)
}
// ToggleEnabled godoc
// @Summary Toggle site enabled status
// @Description Enable or disable a site by its ID
// @Tags Sites
// @Accept json
// @Produce json
// @Param id path string true "Site ID"
// @Success 200 {object} models.ToggleEnabledResponse
// @Failure 404 {object} models.APIError
// @Failure 500 {object} models.APIError
// @Router /sites/{id}/enabled [patch]
func (h *SiteHandler) ToggleEnabled(c fiber.Ctx) error {
id := c.Params("id")
if _, err := h.Repo.GetSite(id); err != nil {
if errors.Is(err, sql.ErrNoRows) {
return c.Status(fiber.StatusNotFound).JSON(&models.APIError{
Message: "Site not found",
})
}
log.Println("Error checking site before update: ", err)
return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{
Message: "Unexpected error while updating site",
})
}
enabled, err := h.Repo.ToggleEnabled(id)
if err != nil {
log.Println("Error while toggling enabled: ", err)
return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{
Message: "Unexpected error while toggling enabled",
})
}
return c.Status(fiber.StatusOK).JSON(&models.ToggleEnabledResponse{
Enabled: enabled,
})
}
// DeleteSite godoc
// @Summary Delete a site
// @Description Delete a site by its ID
+4
View File
@@ -46,3 +46,7 @@ type CreateSiteResponse struct {
Site Site `json:"site"`
RawDeployToken string `json:"raw_deploy_token"`
}
type ToggleEnabledResponse struct {
Enabled bool `json:"enabled"`
}
@@ -8,6 +8,7 @@ type SiteRepository interface {
ListSites() ([]models.Site, error)
CreateSite(s *models.Site) error
UpdateSite(s *models.Site) error
ToggleEnabled(id string) (enabled bool, err error)
DeleteSite(id string) error
GetForwardRule(id string) (*models.ForwardRule, error)
CreateForwardRule(siteID string, fr *models.ForwardRule) error
+1
View File
@@ -31,6 +31,7 @@ func Register(app *fiber.App, cfg *config.Config, envCfg *envconfig.EnvConfig, d
api.Post("/sites", siteHandler.PostSite)
api.Put("/sites/:id", siteHandler.PutSite)
api.Delete("/sites/:id", siteHandler.DeleteSite)
api.Patch("/sites/:id/enabled", siteHandler.ToggleEnabled)
api.Get("/sites/:id/forward-rules", siteHandler.GetSiteForwardRules)
api.Post("/sites/:id/forward-rules", siteHandler.PostForwardRule)
+38 -9
View File
@@ -25,7 +25,7 @@ var _ repository.SiteRepository = (*SQLiteSiteRepository)(nil)
func (r *SQLiteSiteRepository) GetSite(id string) (*models.Site, error) {
row := r.db.QueryRow(`
SELECT id, name, git_server, owner, repository, branch, domain, deploy_token, enabled, not_found_file
SELECT id, name, git_server, owner, repository, branch, domain, deploy_token, spa, enabled, not_found_file
FROM sites WHERE id = ?`, id)
s, err := scanSite(row)
@@ -41,7 +41,7 @@ func (r *SQLiteSiteRepository) GetSite(id string) (*models.Site, error) {
func (r *SQLiteSiteRepository) GetSiteByDomain(domain string) (*models.Site, error) {
row := r.db.QueryRow(`
SELECT id, name, git_server, owner, repository, branch, domain, deploy_token, enabled, not_found_file
SELECT id, name, git_server, owner, repository, branch, domain, deploy_token, spa, enabled, not_found_file
FROM sites WHERE domain = ?`, domain)
s, err := scanSite(row)
@@ -60,7 +60,7 @@ func (r *SQLiteSiteRepository) GetSiteByDomain(domain string) (*models.Site, err
func (r *SQLiteSiteRepository) ListSites() ([]models.Site, error) {
rows, err := r.db.Query(`
SELECT id, name, git_server, owner, repository, branch, domain, deploy_token, enabled, not_found_file
SELECT id, name, git_server, owner, repository, branch, domain, deploy_token, spa, enabled, not_found_file
FROM sites`)
if err != nil {
return nil, fmt.Errorf("list sites: %w", err)
@@ -98,10 +98,10 @@ func (r *SQLiteSiteRepository) CreateSite(s *models.Site) error {
s.ID = uuid.NewString()
_, err = tx.Exec(`
INSERT INTO sites (id, name, git_server, owner, repository, branch, domain, deploy_token, enabled, not_found_file)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
INSERT INTO sites (id, name, git_server, owner, repository, branch, domain, deploy_token, spa, enabled, not_found_file)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
s.ID, s.Name, s.GitServer, s.Owner, s.Repository, s.Branch,
s.Domain, s.DeployToken, s.Enabled, s.NotFoundFile,
s.Domain, s.DeployToken, s.Spa, s.Enabled, s.NotFoundFile,
)
if err != nil {
return fmt.Errorf("create site insert: %w", err)
@@ -131,9 +131,9 @@ func (r *SQLiteSiteRepository) UpdateSite(s *models.Site) error {
_, err = tx.Exec(`
UPDATE sites SET name=?, git_server=?, owner=?, repository=?, branch=?, domain=?,
deploy_token=?, enabled=?, not_found_file=? WHERE id=?`,
deploy_token=?, spa=?, enabled=?, not_found_file=? WHERE id=?`,
s.Name, s.GitServer, s.Owner, s.Repository, s.Branch, s.Domain,
s.DeployToken, s.Enabled, s.NotFoundFile, s.ID,
s.DeployToken, s.Spa, s.Enabled, s.NotFoundFile, s.ID,
)
if err != nil {
return fmt.Errorf("update site: %w", err)
@@ -166,6 +166,35 @@ func (r *SQLiteSiteRepository) UpdateSite(s *models.Site) error {
return tx.Commit()
}
func (r *SQLiteSiteRepository) ToggleEnabled(id string) (enabledReturn bool, err error) {
tx, err := r.db.Begin()
if err != nil {
return false, fmt.Errorf("toggle enabled begin tx: %w", err)
}
defer tx.Rollback()
var enabled int
err = tx.QueryRow(`SELECT enabled FROM sites WHERE id = ?`, id).Scan(&enabled)
if err != nil {
return false, fmt.Errorf("toggle enabled select: %w", err)
}
newEnabled := 0
if enabled == 0 {
newEnabled = 1
}
_, err = tx.Exec(`UPDATE sites SET enabled = ? WHERE id = ?`, newEnabled, id)
if err != nil {
return false, fmt.Errorf("toggle enabled update: %w", err)
}
if err := tx.Commit(); err != nil {
return false, fmt.Errorf("toggle enabled commit: %w", err)
}
return newEnabled != 0, nil
}
func (r *SQLiteSiteRepository) DeleteSite(id string) error {
_, err := r.db.Exec(`DELETE FROM sites WHERE id = ?`, id)
if err != nil {
@@ -334,7 +363,7 @@ func scanSite(s scanner) (*models.Site, error) {
var enabled int
err := s.Scan(
&site.ID, &site.Name, &site.GitServer, &site.Owner, &site.Repository,
&site.Branch, &site.Domain, &site.DeployToken, &enabled, &site.NotFoundFile,
&site.Branch, &site.Domain, &site.DeployToken, &site.Spa, &enabled, &site.NotFoundFile,
)
if err != nil {
return nil, err