diff --git a/dto/banner.go b/dto/banner.go index b940873..06ab9a8 100644 --- a/dto/banner.go +++ b/dto/banner.go @@ -36,3 +36,13 @@ func (b *BannerRequest) Validate() error { validate := validator.New() return validate.Struct(b) } + +type BannerUpdateDTO struct { + BannerName string `json:"bannername" validate:"required"` + BannerImage string `json:"bannerimage" validate:"required,url"` +} + +func (b *BannerUpdateDTO) Validate() error { + validate := validator.New() + return validate.Struct(b) +} \ No newline at end of file diff --git a/internal/api/routes.go b/internal/api/routes.go index dffef7e..187af04 100644 --- a/internal/api/routes.go +++ b/internal/api/routes.go @@ -53,4 +53,5 @@ func AppRouter(app *fiber.App) { app.Get("/banners", controllers.GetBanners) app.Get("/banners/:id", controllers.GetBannerByID) app.Post("/addbanners", controllers.CreateBanner) + app.Put("/updatebanners/:id", controllers.UpdateBanner) } diff --git a/internal/controllers/banner.go b/internal/controllers/banner.go index 9364651..f0098a5 100644 --- a/internal/controllers/banner.go +++ b/internal/controllers/banner.go @@ -127,4 +127,52 @@ func CreateBanner(c *fiber.Ctx) error { Banner: bannerResponse, }, )) -} \ No newline at end of file +} + +func UpdateBanner(c *fiber.Ctx) error { + id := c.Params("id") + + var bannerInput dto.BannerUpdateDTO + if err := c.BodyParser(&bannerInput); err != nil { + return c.Status(fiber.StatusBadRequest).JSON(utils.FormatResponse( + fiber.StatusBadRequest, + "Invalid input data", + nil, + )) + } + + if err := bannerInput.Validate(); err != nil { + return c.Status(fiber.StatusBadRequest).JSON(utils.FormatResponse( + fiber.StatusBadRequest, + "Validation failed: "+err.Error(), + nil, + )) + } + + updatedBanner, err := services.UpdateBanner(id, bannerInput.BannerName, bannerInput.BannerImage) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(utils.FormatResponse( + fiber.StatusInternalServerError, + "Failed to update banner", + nil, + )) + } + + bannerResponse := dto.NewBannerResponse( + updatedBanner.ID, + updatedBanner.BannerName, + updatedBanner.BannerImage, + utils.FormatDateToIndonesianFormat(updatedBanner.CreatedAt), + utils.FormatDateToIndonesianFormat(updatedBanner.UpdatedAt), + ) + + return c.Status(fiber.StatusOK).JSON(utils.FormatResponse( + fiber.StatusOK, + "Banner updated successfully", + struct { + Banner dto.BannerResponse `json:"banner"` + }{ + Banner: bannerResponse, + }, + )) +} diff --git a/internal/repositories/banner.go b/internal/repositories/banner.go index 112cc91..3186a80 100644 --- a/internal/repositories/banner.go +++ b/internal/repositories/banner.go @@ -28,4 +28,11 @@ func CreateBanner(banner *domain.Banner) error { return err } return nil +} + +func UpdateBanner(banner *domain.Banner) error { + if err := config.DB.Save(banner).Error; err != nil { + return err + } + return nil } \ No newline at end of file diff --git a/internal/services/banner.go b/internal/services/banner.go index 550062f..74bdacf 100644 --- a/internal/services/banner.go +++ b/internal/services/banner.go @@ -31,4 +31,21 @@ func CreateBanner(bannerName, bannerImage string) (domain.Banner, error) { } return newBanner, nil -} \ No newline at end of file +} + +func UpdateBanner(id, bannerName, bannerImage string) (domain.Banner, error) { + + banner, err := repositories.GetBannerByID(id) + if err != nil { + return domain.Banner{}, err + } + + banner.BannerName = bannerName + banner.BannerImage = bannerImage + + if err := repositories.UpdateBanner(&banner); err != nil { + return domain.Banner{}, err + } + + return banner, nil +}