Kata SUHU

24 September 2020 - Kategori: Knowledge - Oleh: SUHU

Golang + Firebase Realtime Database

Golang + Firebase Realtime Database

Memanfaatkan Firebase Realtime Database sebagai media penyimpanan data.

Pada kesempatan ini, saya akan coba berbagi sedikit hal yang menarik kepada teman-teman mengenai Firebase Realtime Database + Go. Alasan mengapa saya mengangkat topik ini karena menurut saya pribadi, tema ini sangatlah menarik.

Teman-teman mungkin pernah mengalami kompleksitas masalah yang dihadapi ketika mengembangkan sebuah Aplikasi, terutama dalam pemilihan teknologi — misal ketika memilih bahasa pemrograman yang ingin digunakan, media menyimpanannya, maupun yang lain — tetapi pada artikel ini saya lebih menekankan ke media penyimpanannya. Disisi lain, ada banyak lagi pertimbangan seperti; biaya, kemudahan dalam implementasi, perawatan, support komunitas, keamanan, dan banyak lagi. Nah, pada tema yang saya angkat ini, mungkin akan menjadi solusi buat teman-teman dalam segi biaya dan kemudahan.
Untuk teman-teman yang baru belajar, saya akan coba menjelaskan apa itu Golang dan Firebase Realtime Database.

Golang

Golang atau biasa disebut Go merupakan bahasa pemrograman open source yang biasa dipakai untuk aplikasi di sisi server, pengembangan aplikasi web, bahkan untuk command line interafaces. Go juga merupakan salah satu produk dari Google. Banyak kelebihannya yang bisa kita manfaatkan, salah satunya ialah goroutine. Pelajari lebih lanjut pada situs resminnya di sini.

Firebase Realtime Database

Firebase Realtime Database merupakan media penyimpanan data NoSQL dan salah satu produk yang dikembagkan oleh Google. Pelajari lebih lanjut pada situs resminnya di sini. FRD sendiri support dalam pengembagan Aplikasi lintas platform seperti Web, Android, iOS. Masing-masing pun sudah memiliki Library di sisi Client.

Topik utama.

Kenapa menggunakan Go ?

Kebetulan saya senang sekali dengan bahasa pemrograman Go, jadinya saya terbiasa membuat sesuatu atau projek di level medium menggunakan bahasa pemrograman Go. Mungkin banyak yang menganggap pemborosan kali ya, wkwkw. Kenapa tidak menggunakan PHP, atau NodeJS yang lebih full support untuk Firebase?

Saya menggunakan Go di sini tujuanya untuk memudahkan saya dalam mengelola data yang sudah ada di Firebase. Data yang dikelola di sini lebih tepatnya sesuai dengan kebutuhan kita sih.

Kenapa memilih Firebase Realtime Database ?

Sangat menarik jika kita bahas terkait database. Hmm ... menurut saya semua tergantung kebutuhan sih. Sekompleks apa aplikasi yang kita buat, bagaimana integrasinya, dan seberapa besar manfaat yang bisa kita dapatkan jika kita mengimplementasikanya.
Firebase Realtime Database menawarkan banyak kemudahan kepada developer dalam pengembangan aplikasi. Salah satunya ketika melakukan integrasi. Jika kita mengembangkan aplikasi di sisi mobile Android, iOS, Web, Firebase sudah menyiapkan client libary-nya. Anda bisa mengakses data tersebut dengan fungsi-fungsi yang sudah disediakan oleh library.

Studi Kasus

Saya di sini akan mencoba membuat API CRUD menggunakan Go + Firebase Realtime Database.
Sebelum mulai, teman-teman pastikan sudah memiliki projek di Firebase.

var (
db *db.Ref
app *firebase.App
)

Menghubungkan aplikasi dengan Firebase

func InitialFCMServer() {
var err error
opt := option.WithCredentialsFile("file_service_account.json")
conf := &firebase.Config{
DatabaseURL: "https://your-project.firebaseio.com",
}
app, err = firebase.NewApp(context.Background(), conf, opt)
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
initDb, err = app.Database(ctx)
if err != nil {
log.Fatal(err)
}
db = initDb.NewRef("blogs")
}

Fungsi InitialFCMServer digunakan untuk menghubungkan aplikasi kita dengan projek yang ada di Firebase.

File service_account.json dapat di download di dashboard projek Firebase pada menu Settings -> Service accounts.

Mendefinisikan Model

Model ini digunakan untuk mendefinisikan model data.

BlogModel struct { ID uuid.UUID URI string ImageURL string Category string Title string Author string Content string TotalView int64 IsActive bool CreatedAt time.Time UpdatedAt time.Time CreatedBy uuid.UUID UpdatedBy uuid.UUID }

Mendefinisikan Fungsi List

Funsgi List digunakan untuk mengambil semua data sesuai dengan refName yang sudah kita definisikan.

func GetAllBlog(ctx context.Context) (map[string]BlogModel, error) { var Blogs map[string]BlogModel if err := db.Get(ctx, &Blogs); err != nil { log.Error(err) return Blogs, err } return Blogs, nil }

db.Get(), adalah fungsi bawaan dari library Firebase yang digunakan untuk mengambil semua data sesuai dengan refName.

Mendefinisikan fungsi Insert

Fungsi Insert digunakan untuk menambahkan data kedalam refName yang sudah didefinisikan.

func Insert(ctx context.Context) (*BlogModel, error) {
    blog := &model.BlogModel{
    ID:        uuid.NewV4(),
    URI:       url.QueryEscape(param.Title),
    ImageURL:  "url image here",
    Category:  "category",
    Title:     "title",
    Author:    "author",
    Content:   "Bla bla bla",
    TotalView: 100,
    IsActive:  false,
    CreatedBy: "user created id",
    CreatedAt: time.Now(),
}
err := db.Child(blog.ID.String()).Set(ctx, blog)
if err != nil {
  log.Error(err)
  return nil, err
 }
 return blog, nil
}

db.Child() adalah fungsi yang digunakan untuk mendefinisikan child node dari refName yang sudah kita definisikan sebelumnya.
db.Child().Set() adalah fungsi yang digunakan untuk menambahkan data berdasarkan child node.

Mendefinisikan fungsi Detail

func GetOneBlog(ctx context.Context, param string) (BlogModel, error)
{
  var Blog BlogModel
  err := db.Child(param).Get(ctx, &Blog)
  if err != nil {
   log.Error(err)
   return Blog, nil
  }
  Blog.Key = param
  return Blog, nil
}

db.Child().Get() adalah fungsi yang digunakan untuk Mengambil data berdasarkan child node.

Mendefinisikan fungsi Update

func (blog *BlogModel) Update(ctx context.Context, db *db.Ref) error
{
  err := db.Child(blog.ID.String()).Set(ctx, blog)
  if err != nil {
   log.Error(err)
   return err 
 }
 return nil
}

db.Child().Set() adalah fungsi yang digunakan untuk menambahkan/mengubah data berdasarkan child node. dan akan tambah secara otomatis jika key/child node tidak ditemukan.

Mendefinisikan fungsi Delete

func BlogDelete(ctx context.Context, id string) error {
 err := db.Child(id).Delete(ctx)
 if err != nil {
  log.Error(err)
  return err
 }
 return nil
}

db.Child().Delete() adalah fungsi yang digunakan untuk menghapus data berdasarkan child node.

Testing

Database FCM

Melalui Postman

List

Sekian artikel dari saya, semoga bermanfaat untuk teman-teman.

Learn, Try, and Share.

Jika Anda ingin mempelajari lebih dalam mengenai Golang, jangan ragu untuk hubungi kami di mail@suhu.co.id. 

Written by :
Jihar Al Gifari (Backend Developer)

 

BAGIKAN ARTIKEL INI

Kata SUHU Terkait

Hubungi kami