feat: add feature banner API (still get method)

This commit is contained in:
pahmiudahgede 2024-12-11 08:40:59 +07:00
parent fec1ec8e36
commit f2934658ae
7 changed files with 182 additions and 0 deletions

View File

@ -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)

11
domain/banner.go Normal file
View File

@ -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"`
}

38
dto/banner.go Normal file
View File

@ -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)
}

View File

@ -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)
}

View File

@ -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,
},
))
}

View File

@ -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
}

View File

@ -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
}