Menambahkan query ke database di Gofiber

Untuk melanjutkan proyek Anda, pertama-tama, mari kita integrasikan langkah-langkah untuk membuat query di model Product. Kemudian, kita akan memperbarui kontroler ProductController sesuai dengan kode yang diberikan.

  1. SelectAllProducts(): Fungsi ini digunakan untuk mengambil semua produk dari database menggunakan GORM. Kemudian, data produk tersebut dikembalikan dalam bentuk slice dari pointer ke struct Product.

  2. SelectProductById(id int): Fungsi ini digunakan untuk mengambil detail produk berdasarkan ID yang diberikan. Jika produk dengan ID yang diberikan tidak ditemukan, nil akan dikembalikan. Jika ditemukan, detail produk akan dikembalikan dalam bentuk pointer ke struct Product.

  3. *PostProduct(item Product) error: Fungsi ini digunakan untuk menambahkan produk baru ke dalam database. Jika proses penambahan berhasil, nil akan dikembalikan. Jika terjadi kesalahan, error akan dikembalikan.

  4. *UpdateProduct(id int, newProduct Product) error: Fungsi ini digunakan untuk memperbarui produk berdasarkan ID yang diberikan. Jika proses pembaruan berhasil, nil akan dikembalikan. Jika terjadi kesalahan, error akan dikembalikan.

  5. DeleteProduct(id int) error: Fungsi ini digunakan untuk menghapus produk berdasarkan ID yang diberikan. Jika proses penghapusan berhasil, nil akan dikembalikan. Jika terjadi kesalahan, error akan dikembalikan.

src/models/Products.go

package models

import (
	"gofiber/src/configs"
	"gorm.io/gorm"
)

type Product struct {
	gorm.Model
	Name  string  `json:"name"`
	Price float64 `json:"price"`
	Stock int     `json:"stock"`
}

func SelectAllProducts() []*Product {
	var items []*Product
	configs.DB.Find(&items)
	return items
}

func SelectProductById(id int) *Product {
	var item Product
	configs.DB.First(&item, "id = ?", id)
	return &item
}

func PostProduct(item *Product) error {
	result := configs.DB.Create(&item)
	return result.Error
}

func UpdateProduct(id int, newProduct *Product) error {
	result := configs.DB.Model(&Product{}).Where("id = ?", id).Updates(newProduct)
	return result.Error
}

func DeleteProduct(id int) error {
	result := configs.DB.Delete(&Product{}, "id = ?", id)
	return result.Error
}
  1. *GetAllProduct(c fiber.Ctx) error: Fungsi ini mengembalikan semua produk dalam database sebagai respons JSON.

  2. *GetDetailProduct(c fiber.Ctx) error: Fungsi ini mengembalikan detail produk berdasarkan ID yang diberikan dalam respons JSON. Jika produk tidak ditemukan, respons status "Product not found" akan dikirim.

  3. *CreateProduct(c fiber.Ctx) error: Fungsi ini digunakan untuk menambahkan produk baru ke dalam database. Jika proses penambahan berhasil, respons "Product created successfully" akan dikirim.

  4. *UpdateProduct(c fiber.Ctx) error: Fungsi ini digunakan untuk memperbarui produk berdasarkan ID yang diberikan. Jika proses pembaruan berhasil, respons "Product updated successfully" akan dikirim.

  5. *DeleteProduct(c fiber.Ctx) error: Fungsi ini digunakan untuk menghapus produk berdasarkan ID yang diberikan. Jika proses penghapusan berhasil, respons "Product deleted successfully" akan dikirim.

src/controllers/ProductsControllers.go

package controllers

import (
	"fmt"
	"gofiber/src/models"
	"strconv"

	"github.com/gofiber/fiber/v2"
)

func GetAllProducts(c *fiber.Ctx) error {
	products := models.SelectAllProducts()
	return c.JSON(products)
}

func GetProductById(c *fiber.Ctx) error {
	id, _ := strconv.Atoi(c.Params("id"))
	foundProduct := models.SelectProductById(id)
	if foundProduct == nil {
		return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
			"message": "Product not found",
		})
	}
	return c.JSON(foundProduct)
}

func CreateProduct(c *fiber.Ctx) error {
	var newProduct models.Product
	if err := c.BodyParser(&newProduct); err != nil {
		c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
			"message": "Invalid request body",
		})
		return err
	}
	models.PostProduct(&newProduct)
	return c.Status(fiber.StatusCreated).JSON(fiber.Map{
		"message": "Product created successfully",
	})
}

func UpdateProduct(c *fiber.Ctx) error {
	id, _ := strconv.Atoi(c.Params("id"))

	var updatedProduct models.Product
	if err := c.BodyParser(&updatedProduct); err != nil {
		c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
			"message": "Invalid request body",
		})
		return err
	}
	err := models.UpdateProduct(id, &updatedProduct)
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
			"message": fmt.Sprintf("Failed to update product with ID %d", id),
		})
	}
	return c.Status(fiber.StatusOK).JSON(fiber.Map{
		"message": fmt.Sprintf("Product with ID %d updated successfully", id),
	})
}

func DeleteProduct(c *fiber.Ctx) error {
	id, _ := strconv.Atoi(c.Params("id"))
	err := models.DeleteProduct(id)
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
			"message": fmt.Sprintf("Failed to delete product with ID %d", id),
		})
	}
	return c.Status(fiber.StatusOK).JSON(fiber.Map{
		"message": fmt.Sprintf("Product with ID %d deleted successfully", id),
	})
}

Dengan memperbarui model dan kontroler sesuai dengan kode yang diberikan, Anda telah menambahkan fungsi untuk melakukan operasi database dengan menggunakan GORM. Sekarang, kontroler akan memanggil fungsi-fungsi yang sesuai dari model untuk mengakses dan memanipulasi data produk dalam database.

Last updated