All Projects → jschoedt → go-firestorm

jschoedt / go-firestorm

Licence: MIT license
Simple Go ORM for Google/Firebase Cloud Firestore

Programming Languages

go
31211 projects - #10 most used programming language
HTML
75241 projects

Projects that are alternatives of or similar to go-firestorm

miracle-basketball
miracle-basketball.firebaseapp.com/
Stars: ✭ 29 (-25.64%)
Mutual labels:  firestore
serverless-rest-api
Building RESTful Web APIs with Firebase Cloud Function, Firestore, Express and TypeScript
Stars: ✭ 103 (+164.1%)
Mutual labels:  firestore
flutter-auth-ui
flutter-auth-ui is an authentication library for flutter web applications. It uses Firebase auth as security as a service (SECaaS) provider. It implements UI to register user, validate email, sign in, sign out, restore password, access firestore..
Stars: ✭ 59 (+51.28%)
Mutual labels:  firestore
firestore-to-bigquery-export
NPM package for copying and converting Cloud Firestore data to BigQuery.
Stars: ✭ 26 (-33.33%)
Mutual labels:  firestore
whatsapp-clone-react
Build a WhatsApp Clone with React JS and FireBase.
Stars: ✭ 38 (-2.56%)
Mutual labels:  firestore
mars
Mars - ODM Framework for MongoDB (MongoDB ODM Java )
Stars: ✭ 35 (-10.26%)
Mutual labels:  orm-framework
firestore-explorer
A web based explorer for cloud firestore and emulator
Stars: ✭ 34 (-12.82%)
Mutual labels:  firestore
firebase-bundle
A Symfony Bundle for the Firebase PHP Admin SDK
Stars: ✭ 112 (+187.18%)
Mutual labels:  firestore
fastquery
FastQuery(Method of fast database query) 基于Java语言. 他的使命是:简化Java操作数据层.做为一个开发者,仅仅只需要设计编写DAO接口即可,在项目初始化阶段采用ASM生成好实现类. 因此,开发代码不得不简洁而优雅.从而,大幅度提升开发效率.
Stars: ✭ 63 (+61.54%)
Mutual labels:  orm-framework
flutter-app
Full Feature Todos Flutter Mobile app with fireStore integration.
Stars: ✭ 138 (+253.85%)
Mutual labels:  firestore
Sub-Track
Flutter Application to keep track of Subscriptions
Stars: ✭ 31 (-20.51%)
Mutual labels:  firestore
squanchy-flutter
Flutter implementation of the Squanchy conference app
Stars: ✭ 56 (+43.59%)
Mutual labels:  firestore
orkan
A content management toolkit for building and managing dynamic React applications with ease.
Stars: ✭ 25 (-35.9%)
Mutual labels:  firestore
react-crud-firestore
A Reactjs CRUD using Firebaes FIrestore as a Database
Stars: ✭ 48 (+23.08%)
Mutual labels:  firestore
JewelCase
This is the source code for JewelCase, a sample app demonstrating how to use SwiftUI and Firebase together. This slide deck discusses the architecture of the app: https://www.slideshare.net/peterfriese/building-swiftui-apps-with-firebase
Stars: ✭ 42 (+7.69%)
Mutual labels:  firestore
png2svg
🔀 Convert small PNG images to SVG Tiny 1.2
Stars: ✭ 219 (+461.54%)
Mutual labels:  go-module
cms30
🙌 #CMS30 | Free 30 CMS templates
Stars: ✭ 23 (-41.03%)
Mutual labels:  firestore
godot-android-plugin-firebase
Godot 3.2.2 Android plugin for Firebase
Stars: ✭ 41 (+5.13%)
Mutual labels:  firestore
AngularPos
A real-time, simple web Point of Sale system written with Angular 12, Firebase (Cloud Firestore), Bootstrap 4 and PrimeNg
Stars: ✭ 67 (+71.79%)
Mutual labels:  firestore
unishox js
JS Library for Guaranteed compression of Unicode short strings
Stars: ✭ 27 (-30.77%)
Mutual labels:  firestore

pipeline status coverage report Go Report Card GoDoc GitHub

go-firestorm

Go ORM (Object-relational mapping) for Google Cloud Firestore.

Goals

  1. Easy to use
  2. Non-intrusive
  3. Non-exclusive
  4. Fast

Features

  • Basic CRUD operations
  • Search
  • Concurrent requests support (except when run in transactions)
  • Transactions
  • Nested transactions will reuse the first transaction (reads before writes as required by firestore)
  • Configurable auto load of references
  • Handles cyclic references
  • Sub collections
  • Supports embedded/anonymous structs
  • Supports unexported fields
  • Custom mappers between fields and types
  • Caching (session + second level)
  • Supports Google App Engine - 2. Gen (go version >= 1.11)

Getting Started

Prerequisites

This library only supports Firestore Native mode and not the old Datastore mode.

go get -u github.com/jschoedt/go-firestorm

Setup

  1. Setup a Firestore client
  2. Create a firestorm client and supply the names of the id and parent fields of your model structs. Parent is optional. The id field must be a string but can be called anything.
...
client, _ := app.Firestore(ctx)
fsc := firestorm.New(client, "ID", "")
  1. Optional. For optimal caching to work consider adding the CacheHandler.

Basic CRUD example

Note: Recursive Create/Delete is not supported and must be called on every entity. So to create an A->B relation. Create B first so the B.ID has been created and then create A.

type Car struct {
	ID         string
	Make       string
	Year       time.Time
}
car := &Car{}
car.Make = "Toyota"
car.Year, _ = time.Parse(time.RFC3339, "2001-01-01T00:00:00.000Z")

// Create the entity
fsc.NewRequest().CreateEntities(ctx, car)()

if car.ID == "" {
    t.Errorf("car should have an auto generated ID")
}

// Read the entity by ID
otherCar := &Car{ID:car.ID}
fsc.NewRequest().GetEntities(ctx, otherCar)()
if otherCar.Make != "Toyota" {
    t.Errorf("car should have name: Toyota but was: %s", otherCar.Make)
}
if otherCar.Year != car.Year {
    t.Errorf("car should have same year: %s", otherCar.Year)
}

// Update the entity
car.Make = "Jeep"
fsc.NewRequest().UpdateEntities(ctx, car)()

otherCar := &Car{ID:car.ID}
fsc.NewRequest().GetEntities(ctx, otherCar)()
if otherCar.Make != "Jeep" {
    t.Errorf("car should have name: Jeep but was: %s", otherCar.Make)
}

// Delete the entity
fsc.NewRequest().DeleteEntities(ctx, car)()

otherCar = &Car{ID:car.ID}
if err := fsc.NewRequest().GetEntities(ctx, otherCar)(); err == nil {
    t.Errorf("We expect a NotFoundError")
}

More examples

Search

Create a query using the firebase client

car := &Car{}
car.ID = "testID"
car.Make = "Toyota"

fsc.NewRequest().CreateEntities(ctx, car)()

query := fsc.Client.Collection("Car").Where("make", "==", "Toyota")

result := make([]Car, 0)
if err := fsc.NewRequest().QueryEntities(ctx, query, &result)(); err != nil {
    t.Errorf("car was not found by search: %v", car)
}

if result[0].ID != car.ID || result[0].Make != car.Make {
    t.Errorf("entity did not match original entity : %v", result)
}

More examples

Concurrent requests

All CRUD operations are asynchronous and return a future func that when called will block until the operation is done.

NOTE: the state of the entities is undefined until the future func returns.

car := &Car{Make:"Toyota"}

// Create the entity which returns a future func
future := fsc.NewRequest().CreateEntities(ctx, car)

// ID is not set
if car.ID != "" {
	t.Errorf("car ID should not have been set yet")
}

// do some more work

// blocks and waits for the database to finish
future()

// now the car has been saved and the ID has been set
if car.ID == "" {
    t.Errorf("car should have an auto generated ID now")
}

More examples

Transactions

Transactions are simply done in a function using the transaction context

car := &Car{Make: "Toyota"}

fsc.DoInTransaction(ctx, func(transCtx context.Context) error {

    // Create the entity in the transaction using the transCtx
    fsc.NewRequest().CreateEntities(transCtx, car)()

    // Using the transCtx we can load the entity as it is saved in the session context
    otherCar := &Car{ID:car.ID}
    fsc.NewRequest().GetEntities(transCtx, otherCar)()
    if otherCar.Make != car.Make {
        t.Errorf("The car should have been saved in the transaction context")
    }

    // Loading using an other context (request) will fail as the car is not created until the func returns successfully
    if err := fsc.NewRequest().GetEntities(ctx, &Car{ID:car.ID})(); err == nil {
        t.Errorf("We expect a NotFoundError")
    }
})

// Now we can load the car as the transaction has been committed
otherCar := &Car{ID:car.ID}
fsc.NewRequest().GetEntities(ctx, otherCar)()
if otherCar.Make != "Toyota" {
    t.Errorf("car should have name: Toyota but was: %s", otherCar.Make)
}

More examples

Cache

Firestorm supports adding a session cache to the context. The session cache only caches entities that are loaded within the same request.

# add it to a single handler:
http.HandleFunc("/", firestorm.CacheHandler(otherHandler))
# or add it to the routing chain (for gorilla/mux, go-chi etc.):
r.Use(firestorm.CacheMiddleware)

To add a second level cache (such as Redis or memcache) the Cache interface needs to be implemented and added to the client:

fsc.SetCache(c)

Firestore will first try to fetch an entity from the session cache. If it is not found it will try the second level cache.

Configurable auto load of references

Use the req.SetLoadPaths("fieldName") to auto load a particular field or req.SetLoadPaths(firestorm.AllEntities) to load all fields.

Load an entity path by adding multiple paths eg.: path->to->field

fsc.NewRequest().SetLoadPaths("path", "path.to", "path.to.field").GetEntities(ctx, car)()

More examples

Customize data mapping

This library uses go-structmapper for mapping values between Firestore and structs. The mapping can be customized by setting the mappers:

fsc.MapToDB = mapper.New()
fsc.MapFromDB = mapper.New()

Help

Help is provided in the go-firestorm User Group

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].