Tutorial Restful API Golang #7 : Delete Data dari Database


Tutorial Restful API Golang #7 : Delete Data dari Database

Halo teman-teman semuanya, pada artikel sebelumnya kita semua telah belajar bagaimana cara melakukan proses update data di Go dengan Rest API dan pada kesempatan kali ini kita semua akan belajar bagaimana cara melakukan proses delete data di Go dengan Rest API.

Langkah 1 - Menambahkan Function DeletePost di Controller

Sekarang, silahkan teman-teman buka file controllers/postsController.go, kemudian ubah semua kode-nya menjadi seperti berikut ini.

controllers/postController.go

package controllers

import (
	"errors"
	"net/http"
	"santrikoding/backend-api/models"

	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
)

// type validation post input
type ValidatePostInput struct {
	Title   string `json:"title" binding:"required"`
	Content string `json:"content" binding:"required"`
}

// type error message
type ErrorMsg struct {
	Field   string `json:"field"`
	Message string `json:"message"`
}

// function get error message
func GetErrorMsg(fe validator.FieldError) string {
	switch fe.Tag() {
	case "required":
		return "This field is required"
	}
	return "Unknown error"
}

// get all posts
func FindPosts(c *gin.Context) {

	//get data from database using model
	var posts []models.Post
	models.DB.Find(&posts)

	//return json
	c.JSON(200, gin.H{
		"success": true,
		"message": "Lists Data Posts",
		"data":    posts,
	})
}

// store a post
func StorePost(c *gin.Context) {
	//validate input
	var input ValidatePostInput
	if err := c.ShouldBindJSON(&input); err != nil {
		var ve validator.ValidationErrors
		if errors.As(err, &ve) {
			out := make([]ErrorMsg, len(ve))
			for i, fe := range ve {
				out[i] = ErrorMsg{fe.Field(), GetErrorMsg(fe)}
			}
			c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errors": out})
		}
		return
	}

	//create post
	post := models.Post{
		Title:   input.Title,
		Content: input.Content,
	}
	models.DB.Create(&post)

	//return response json
	c.JSON(201, gin.H{
		"success": true,
		"message": "Post Created Successfully",
		"data":    post,
	})
}

// get post by id
func FindPostById(c *gin.Context) {
	var post models.Post
	if err := models.DB.Where("id = ?", c.Param("id")).First(&post).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"})
		return
	}

	c.JSON(200, gin.H{
		"success": true,
		"message": "Detail Data Post By ID : " + c.Param("id"),
		"data":    post,
	})
}

// update post
func UpdatePost(c *gin.Context) {
	var post models.Post
	if err := models.DB.Where("id = ?", c.Param("id")).First(&post).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"})
		return
	}

	//validate input
	var input ValidatePostInput
	if err := c.ShouldBindJSON(&input); err != nil {
		var ve validator.ValidationErrors
		if errors.As(err, &ve) {
			out := make([]ErrorMsg, len(ve))
			for i, fe := range ve {
				out[i] = ErrorMsg{fe.Field(), GetErrorMsg(fe)}
			}
			c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errors": out})
		}
		return
	}

	//update post
	models.DB.Model(&post).Updates(input)

	c.JSON(200, gin.H{
		"success": true,
		"message": "Post Updated Successfully",
		"data":    post,
	})
}

// delete post
func DeletePost(c *gin.Context) {
	var post models.Post
	if err := models.DB.Where("id = ?", c.Param("id")).First(&post).Error; err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"})
		return
	}

	//delete post
	models.DB.Delete(&post)

	c.JSON(200, gin.H{
		"success": true,
		"message": "Post Deleted Successfully",
	})
}

Dari perubahan kode di atas, kita menambahkan fungsi baru dengan nama DeletePost.

// delete post
func DeletePost(c *gin.Context) {

	//...
	
}

Di dalam fungsi di atas, pertama kita mendeklarasikan sebuah variable bernama post dengan tipe data models.Post. Ini berarti variable post akan digunakan untuk menyimpan data post.

var post models.Post

Kemudian kita membuat kondisi untuk mencari data post berdasarkan context c.Param("id"). Jika tidak ditemukan, maka kita akan menampilkan response error Record not found!.

if err := models.DB.Where("id = ?", c.Param("id")).First(&post).Error; err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"})
        return
}

Tapi jika data ditemukan, maka kita akan menghapus data post yang ada di dalam variable post.

//delete post
models.DB.Delete(&post)

Terakhir, kita tinggal mengembalikan sebuah response dengan format JSON yang berisi informasi data post yang telah dihapus.

c.JSON(200, gin.H{
        "success": true,
        "message": "Post Deleted Successfully",
})

Langkah 2 - Membuat Route API Delete Post

Sekarang, kita lanjutkan untuk membuat route untuk proses delete data post, jadi silahkan teman-teman buka file main.go, kemudian ubah kode-nya menjadi seperti berikut ini.

main.go

package main

import (
	"santrikoding/backend-api/controllers"
	"santrikoding/backend-api/models"

	"github.com/gin-gonic/gin"
)

func main() {
	//inisialiasai Gin
	router := gin.Default()

	//panggil koneksi database
	models.ConnectDatabase()

	//membuat route dengan method GET
	router.GET("/", func(c *gin.Context) {

		//return response JSON
		c.JSON(200, gin.H{
			"message": "Hello World!",
		})
	})

	//membuat route get all posts
	router.GET("/api/posts", controllers.FindPosts)

	//membuat route store post
	router.POST("/api/posts", controllers.StorePost)

	//membuat route detail post
	router.GET("/api/posts/:id", controllers.FindPostById)

	//membuat route update post
	router.PUT("/api/posts/:id", controllers.UpdatePost)

	//membuat route delete post
	router.DELETE("/api/posts/:id", controllers.DeletePost)

	//mulai server dengan port 3000
	router.Run(":3000")
}

Di atas, kita menambahkan route baru dengan method DELETE dan path yang digunakan adalah /api/posts/:id.

//membuat route delete post
router.DELETE("/api/posts/:id", controllers.DeletePost)

Langkah 3 - Uji Coba Rest API Delete Post

Silahkan restrat server Go-nya terlebih dahulu, yaitu dengan cara distop dan start lagi.

Silahkan teman-teman buka aplikasi Postman, kemudian masukkan URL berikut ini http://localhost:3000/api/posts/1 dan untuk method-nya silahkan pilih DELETE.

Di atas, kita berikan contoh melakukan get data dengan ID 1

Jika sudah, silahkan klik Send dan jika berhasil maka kita akan mendapatkan response JSON yang kurang lebih seperti berikut ini.

{
    "message": "Post Deleted Successfully",
    "success": true
}

Kesimpulan

Pada artikel ini, kita semua telah belajar bagaimana cara membuat proses delete data di Go dengan Rest API. Jika teman-teman mengalami kendala, silahkan bisa bertanya melalui kolom komentar atau bisa juga melalui group Telegram SantriKoding.

SOURCE CODE : https://github.com/SantriKoding-com/Golang-Restful-API

Terima Kasih



Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami