From e71530bb30c42ebf6c44e323b30426c36ef0b83c Mon Sep 17 00:00:00 2001 From: KartoffelChips <104089082+KartoffelChipss@users.noreply.github.com> Date: Thu, 2 Apr 2026 21:47:43 +0200 Subject: [PATCH] Add update and delete for sites --- app/handlers/site.go | 97 ++++++++++++++++++++++++++++++++++++++++++++ app/routes/routes.go | 2 + 2 files changed, 99 insertions(+) diff --git a/app/handlers/site.go b/app/handlers/site.go index 8d681f7..dde2292 100644 --- a/app/handlers/site.go +++ b/app/handlers/site.go @@ -174,3 +174,100 @@ func (h *SiteHandler) PostSite(c fiber.Ctx) error { return c.JSON(site) } + +// PutSite godoc +// @Summary Update an existing site +// @Description Update an existing site by its ID +// @Tags Sites +// @Accept json +// @Produce json +// @Param id path string true "Site ID" +// @Param site body models.Site true "Updated site details" +// @Success 200 {object} models.Site +// @Failure 400 {object} models.APIError +// @Failure 404 {object} models.APIError +// @Failure 500 {object} models.APIError +// @Router /sites/{id} [put] +func (h *SiteHandler) PutSite(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", + }) + } + + var site models.Site + if err := c.Bind().Body(&site); err != nil { + log.Println("Error parsing body: ", err) + return c.Status(fiber.StatusBadRequest).JSON(&models.APIError{ + Message: "Invalid request body", + }) + } + + if err := validateIncomingSite(&site); err != nil { + return c.Status(fiber.StatusBadRequest).JSON(&models.APIError{ + Message: "Invalid request body: " + err.Error(), + }) + } + + site.ID = id + if err := h.Repo.UpdateSite(&site); err != nil { + log.Println("Error updating site: ", err) + return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{ + Message: "Unexpected error while updating site", + }) + } + + updatedSite, err := h.Repo.GetSite(id) + if err != nil { + log.Println("Error getting updated site: ", err) + return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{ + Message: "Site was updated but could not be retrieved", + }) + } + + return c.JSON(updatedSite) +} + +// DeleteSite godoc +// @Summary Delete a site +// @Description Delete a site by its ID +// @Tags Sites +// @Accept json +// @Produce json +// @Param id path string true "Site ID" +// @Success 204 +// @Failure 404 {object} models.APIError +// @Failure 500 {object} models.APIError +// @Router /sites/{id} [delete] +func (h *SiteHandler) DeleteSite(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 delete: ", err) + return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{ + Message: "Unexpected error while deleting site", + }) + } + + if err := h.Repo.DeleteSite(id); err != nil { + log.Println("Error deleting site: ", err) + return c.Status(fiber.StatusInternalServerError).JSON(&models.APIError{ + Message: "Unexpected error while deleting site", + }) + } + + return c.SendStatus(fiber.StatusNoContent) +} diff --git a/app/routes/routes.go b/app/routes/routes.go index 36c1514..ebf1279 100644 --- a/app/routes/routes.go +++ b/app/routes/routes.go @@ -26,6 +26,8 @@ func Register(app *fiber.App, cfg *config.Config, envCfg *envconfig.EnvConfig, d api.Get("/sites", siteHandler.GetSites) api.Get("/sites/:id", siteHandler.GetSite) api.Post("/sites", siteHandler.PostSite) + api.Put("/sites/:id", siteHandler.PutSite) + api.Delete("/sites/:id", siteHandler.DeleteSite) storagePath, err := filepath.Abs(envCfg.StoragePath) if err != nil {