Intercept calls to firebase API

Instead of calling any third-party or home, we provide the stub for
firebase API calls.
This commit is contained in:
patwie
2024-04-14 13:29:39 +00:00
parent 3893dfb13e
commit eea09906f4
3 changed files with 210 additions and 17 deletions
+131
View File
@@ -0,0 +1,131 @@
package firebase
import (
"fmt"
"net/http"
"time"
"github.com/go-chi/chi/v5"
"github.com/go-chi/render"
)
type (
BatchGetRequest struct {
Documents []string `json:"documents"`
}
BatchGetEmptyResponse struct {
Missing string `json:"missing"`
ReadTime string `json:"readTime"`
}
FoundInfoResponse struct {
Name string `json:"name"`
Fields interface{} `json:"fields"`
CreateTime string `json:"createTime"`
UpdateTime string `json:"updateTime"`
}
BatchGetExistsResponse struct {
Found FoundInfoResponse `json:"found"`
ReadTime string `json:"readTime"`
}
UpdateRequest struct {
Name string `json:"name"`
Fields interface{} `json:"fields"`
}
WriteRequest struct {
Update UpdateRequest `json:"update"`
}
BatchCommitRequest struct {
Writes []WriteRequest `json:"writes"`
}
WriteResult struct {
UpdateTime string `json:"updateTime"`
}
BatchCommitResponse struct {
WriteResults []WriteResult `json:"writeResults"`
CommitTime string `json:"commitTime"`
}
)
var savedItems = make(map[string]interface{})
func (body *BatchGetRequest) Bind(r *http.Request) (err error) {
return nil
}
func (body *BatchCommitRequest) Bind(r *http.Request) (err error) {
return nil
}
func HandleBatchCommit() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
projectId := chi.URLParam(r, "project_id")
databaseId := chi.URLParam(r, "database_id")
_ = projectId
_ = databaseId
data := &BatchCommitRequest{}
// Seems like requests is text/plain but content is json ...
if err := render.DecodeJSON(r.Body, data); err != nil {
fmt.Println(err)
render.Status(r, http.StatusBadRequest)
return
}
savedItems[data.Writes[0].Update.Name] = data.Writes[0].Update.Fields
render.JSON(w, r, BatchCommitResponse{
CommitTime: time.Now().Format(time.RFC3339),
WriteResults: []WriteResult{
WriteResult{UpdateTime: time.Now().Format(time.RFC3339)},
},
})
render.Status(r, http.StatusOK)
return
}
}
func HandleBatchGet() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
projectId := chi.URLParam(r, "project_id")
databaseId := chi.URLParam(r, "database_id")
fmt.Printf("Got %v and %v\n", projectId, databaseId)
data := &BatchGetRequest{}
// Seems like requests is text/plain but content is json ...
if err := render.DecodeJSON(r.Body, data); err != nil {
fmt.Println(err)
render.Status(r, http.StatusBadRequest)
return
}
key := data.Documents[0]
fmt.Printf("Got key %v \n", key)
fields, ok := savedItems[key]
if !ok {
fmt.Println("missing key")
render.JSON(w, r, []BatchGetEmptyResponse{BatchGetEmptyResponse{
Missing: key,
ReadTime: time.Now().Format(time.RFC3339),
}})
render.Status(r, http.StatusOK)
return
}
fmt.Println("existing key")
render.JSON(w, r, []BatchGetExistsResponse{BatchGetExistsResponse{
Found: FoundInfoResponse{
Name: key,
Fields: fields,
CreateTime: time.Now().Format(time.RFC3339),
UpdateTime: time.Now().Format(time.RFC3339),
},
ReadTime: time.Now().Format(time.RFC3339),
}})
render.Status(r, http.StatusOK)
return
}
}