LukeWood

LukeWood

I haven’t seen any examples online, fiddled with the Gcp generated client but had no luck.

Showing Posts 1 to 6

LukeWood

LukeWood OP

Ended up getting the rest api to work decently

rramonfraga

rramonfraga

Hello!

Do you have an example of this implementation. I would like to use a client or ecto adapter for firestore in my service. Thanks!

LukeWood

LukeWood OP

An adapter for Ecto would be sweet - let me see if I can put the code up in a gist.

longpham

longpham

Hi @LukeWood, is it possible to see a code example of your implementation of the firestore REST API ? I want to try and upload a document to a collection. Thanks.

LukeWood

LukeWood OP

I switched to use GoogleApi.Firestore.V1

Some of this code is pretty bad but I don’t actually use it anywhere anymore

defmodule Highscores.Firestore do
  @firestore_url "projects/${PROJECTS}/databases/(default)/documents/highscores/"
  @updateMask %GoogleApi.Firestore.V1.Model.DocumentMask{fieldPaths: ["highscores"]}

  def load_scores(_, nil), do: raise "missing config value: server_name. configure highscores\nconfig :highscores,\n server_name: \"name\""
  def load_scores(conn, server) do
    {:ok, result} = GoogleApi.Firestore.V1.Api.Projects.firestore_projects_databases_documents_get(conn, @firestore_url <> server)
    Map.get(result, :fields) |>
      Map.get("highscores") |>
      Map.get(:arrayValue) |>
      Map.get(:values) |>
      parse_firestore_to_model()
  end

  def sync_scores(conn, server, scores) do
    body = scores |>
      package_to_firestore_types

    {:ok, _response} = GoogleApi.Firestore.V1.Api.Projects.firestore_projects_databases_documents_patch(conn, @firestore_url <> server, updateMask: @updateMask, body: body)
    :ok
  end

  defp package_to_firestore_types(scores) do
    scores = Enum.map(scores, &to_firestore_score/1)
    %{
      fields: %{"highscores" =>
        %GoogleApi.Firestore.V1.Model.Value{
          arrayValue: %GoogleApi.Firestore.V1.Model.ArrayValue{values: scores}
        }
      }
    }
  end

  defp to_firestore_score(%Highscores.Model.Score{name: name, rank: rank, score: score}) do
    %GoogleApi.Firestore.V1.Model.Value{
      mapValue: %GoogleApi.Firestore.V1.Model.MapValue{
        fields: %{
          "name" =>%GoogleApi.Firestore.V1.Model.Value{stringValue: name},
          "score" =>%GoogleApi.Firestore.V1.Model.Value{integerValue: Integer.to_string(score)},
          "rank" =>%GoogleApi.Firestore.V1.Model.Value{integerValue: Integer.to_string(rank)}
        }
      }
    }
  end

  defp parse_firestore_to_model(highscores) do
    Enum.map(highscores, &parse_score/1)
  end

  defp parse_score(entry) do
    fields = entry |>
      Map.get(:mapValue) |>
      Map.get(:fields)

    name = Map.get(fields, "name") |> Map.get(:stringValue)
    {rank, ""} = Map.get(fields, "rank") |> Map.get(:integerValue) |> Integer.parse()
    {score, ""} = Map.get(fields, "score") |> Map.get(:integerValue) |> Integer.parse()

    %Highscores.Model.Score{rank: rank, name: name, score: score}
  end

end
dunyakirkali

dunyakirkali

I’ve managed to use the gRPC API to make a simple connection to it:

https://github.com/dunyakirkali/firestore.ex

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews