diff --git a/config/connection.go b/config/connection.go index 03a0c7f..736f67e 100644 --- a/config/connection.go +++ b/config/connection.go @@ -60,6 +60,7 @@ func InitDatabase() { &domain.Article{}, &domain.TrashCategory{}, &domain.TrashDetail{}, + &domain.Banner{}, ) if err != nil { log.Fatal("Error: Failed to auto migrate domain:", err) diff --git a/domain/banner.go b/domain/banner.go new file mode 100644 index 0000000..50e783d --- /dev/null +++ b/domain/banner.go @@ -0,0 +1,11 @@ +package domain + +import "time" + +type Banner struct { + ID string `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()" json:"id"` + BannerName string `gorm:"not null" json:"bannername"` + BannerImage string `gorm:"not null" json:"bannerimage"` + CreatedAt time.Time `gorm:"default:current_timestamp" json:"createdAt"` + UpdatedAt time.Time `gorm:"default:current_timestamp" json:"updatedAt"` +} diff --git a/dto/banner.go b/dto/banner.go new file mode 100644 index 0000000..b940873 --- /dev/null +++ b/dto/banner.go @@ -0,0 +1,38 @@ +package dto + +import "github.com/go-playground/validator/v10" + +type BannerResponse struct { + ID string `json:"id"` + BannerName string `json:"bannername"` + BannerImage string `json:"bannerimage"` + CreatedAt string `json:"createdAt"` + UpdatedAt string `json:"updatedAt"` +} + +func NewBannerResponse(id, bannerName, bannerImage, createdAt, updatedAt string) BannerResponse { + return BannerResponse{ + ID: id, + BannerName: bannerName, + BannerImage: bannerImage, + CreatedAt: createdAt, + UpdatedAt: updatedAt, + } +} + +type BannerRequest struct { + BannerName string `json:"bannername" validate:"required"` + BannerImage string `json:"bannerimage" validate:"required,url"` +} + +func NewBannerRequest(bannerName, bannerImage string) BannerRequest { + return BannerRequest{ + BannerName: bannerName, + BannerImage: bannerImage, + } +} + +func (b *BannerRequest) Validate() error { + validate := validator.New() + return validate.Struct(b) +} diff --git a/internal/api/routes.go b/internal/api/routes.go index 84141ae..3e6d596 100644 --- a/internal/api/routes.go +++ b/internal/api/routes.go @@ -48,4 +48,8 @@ func AppRouter(app *fiber.App) { app.Put("/updatetrash-detail/:id", controllers.UpdateTrashDetail) app.Delete("/deletetrash-category/:id", controllers.DeleteTrashCategory) app.Delete("/deletetrash-detail/:id", controllers.DeleteTrashDetail) + + // # banner + app.Get("/banners", controllers.GetBanners) + app.Get("/banners/:id", controllers.GetBannerByID) } diff --git a/internal/controllers/banner.go b/internal/controllers/banner.go new file mode 100644 index 0000000..8020142 --- /dev/null +++ b/internal/controllers/banner.go @@ -0,0 +1,83 @@ +package controllers + +import ( + "github.com/gofiber/fiber/v2" + "github.com/pahmiudahgede/senggoldong/dto" + "github.com/pahmiudahgede/senggoldong/internal/services" + "github.com/pahmiudahgede/senggoldong/utils" +) + +func GetBanners(c *fiber.Ctx) error { + + banners, err := services.GetBanners() + if err != nil { + + return c.Status(fiber.StatusInternalServerError).JSON(utils.FormatResponse( + fiber.StatusInternalServerError, + "Failed to fetch banners", + nil, + )) + } + + var bannerResponses []dto.BannerResponse + for _, banner := range banners { + + bannerResponses = append(bannerResponses, dto.BannerResponse{ + ID: banner.ID, + BannerName: banner.BannerName, + BannerImage: banner.BannerImage, + CreatedAt: utils.FormatDateToIndonesianFormat(banner.CreatedAt), + UpdatedAt: utils.FormatDateToIndonesianFormat(banner.UpdatedAt), + }) + } + + return c.Status(fiber.StatusOK).JSON(utils.FormatResponse( + fiber.StatusOK, + "Banners fetched successfully", + struct { + Banners []dto.BannerResponse `json:"banners"` + }{ + Banners: bannerResponses, + }, + )) +} + +func GetBannerByID(c *fiber.Ctx) error { + id := c.Params("id") + + banner, err := services.GetBannerByID(id) + if err != nil { + + if err.Error() == "banner not found" { + return c.Status(fiber.StatusNotFound).JSON(utils.FormatResponse( + fiber.StatusNotFound, + "Banner not found", + nil, + )) + } + + return c.Status(fiber.StatusInternalServerError).JSON(utils.FormatResponse( + fiber.StatusInternalServerError, + "Failed to fetch banner", + nil, + )) + } + + bannerResponse := dto.BannerResponse{ + ID: banner.ID, + BannerName: banner.BannerName, + BannerImage: banner.BannerImage, + CreatedAt: utils.FormatDateToIndonesianFormat(banner.CreatedAt), + UpdatedAt: utils.FormatDateToIndonesianFormat(banner.UpdatedAt), + } + + return c.Status(fiber.StatusOK).JSON(utils.FormatResponse( + fiber.StatusOK, + "Banner fetched successfully", + struct { + Banner dto.BannerResponse `json:"banner"` + }{ + Banner: bannerResponse, + }, + )) +} diff --git a/internal/repositories/banner.go b/internal/repositories/banner.go new file mode 100644 index 0000000..88d5835 --- /dev/null +++ b/internal/repositories/banner.go @@ -0,0 +1,24 @@ +package repositories + +import ( + "github.com/pahmiudahgede/senggoldong/config" + "github.com/pahmiudahgede/senggoldong/domain" +) + +func GetBanners() ([]domain.Banner, error) { + var banners []domain.Banner + + if err := config.DB.Find(&banners).Error; err != nil { + return nil, err + } + return banners, nil +} + +func GetBannerByID(id string) (domain.Banner, error) { + var banner domain.Banner + + if err := config.DB.Where("id = ?", id).First(&banner).Error; err != nil { + return banner, err + } + return banner, nil +} diff --git a/internal/services/banner.go b/internal/services/banner.go new file mode 100644 index 0000000..39e2a34 --- /dev/null +++ b/internal/services/banner.go @@ -0,0 +1,21 @@ +package services + +import ( + "errors" + + "github.com/pahmiudahgede/senggoldong/domain" + "github.com/pahmiudahgede/senggoldong/internal/repositories" +) + +func GetBanners() ([]domain.Banner, error) { + return repositories.GetBanners() +} + +func GetBannerByID(id string) (domain.Banner, error) { + banner, err := repositories.GetBannerByID(id) + if err != nil { + + return domain.Banner{}, errors.New("banner not found") + } + return banner, nil +}