IzumiSy/elm-firestore/3.0.0

NOTE: the latest version is 13.0.0

elm-firestore

CircleCI

A type-safe Firestore integration for Elm.

The features elm-firestore library supports are as follows:

FeatureSupported?
Simple CRUD operation (get, create, patch, delete):white_check_mark: Yes
Transactions:white_check_mark: Yes
Realtime update listening:heavy_exclamation_mark: No
Collection group:heavy_exclamation_mark: No
Indexing:heavy_exclamation_mark: No

When will this package support realtime update?

Realtime update listening is one of fundamental features Firestore offers, but this library internally uses Firestore RESTful API which is officially said to be out of support for realtime update.

I strongly recommend you to use Firestore SDK in JavaScript through Ports instead of this library if you have a strong need to use realtime update on Firestore. This library shall not support it unless Google changes their mind.

Example

Almost all basic types in Firestore are supported

import Firestore
import Firestore.Config as Config
import Firestore.Types.Geopoint as Geopoint
import Firestore.Types.Reference as Reference
import Firestore.Types.Timestamp as Timestamp
import Firestore.Types.String as FSString
import Firestore.Types.Int as FSInt
import Firestore.Types.List as FSList
import Firestore.Types.Map as FSMap
import Firestore.Types.Bool as FSBool
import Firestore.Types.Nullable as FSNullable


-- model


type alias Model =
    { firestore : Firestore.Firestore
    }


type alias Document =
    { timestamp : Timestamp.Timestamp
    , geopoint : Geopoint.Geopoint
    , reference : Reference.Reference
    , integer : Int
    , string : String
    , list : List String
    , map : Dict.Dict String String
    , boolean : Bool
    , nullable : Maybe String
    }



-- init


init : ( Model, Cmd Msg )
init =
    let
        config =
            Config.new
                { apiKey = "your-own-api-key"
                , project = "your-firestore-app"
                }
                |> Firestore.withDatabase "your-own-database" -- optional
                |> Firestore.withAuthorization "your-own-auth-token" -- optional

        firestore =
            config
                |> Firestore.init
                |> Firestore.withCollection "documents" -- optional
    in
    ( { firestore = firestore }
    , firestore
        |> Firestore.get decoder
        |> Task.attempt GotDocuments
    )


decoder : Decode.Decoder Document
decoder =
    Decode.succeed Document
        |> Pipeline.required "timestamp" Timestamp.decoder
        |> Pipeline.required "geopoint" Geopoint.decoder
        |> Pipeline.required "reference" Reference.decoder
        |> Pipeline.required "integer" FSInt.decoder
        |> Pipeline.required "string" FSString.decoder
        |> Pipeline.required "list" (FSList.decoder FSString.decoder)
        |> Pipeline.required "map" (FSMap.decoder FSString.decoder)
        |> Pipeline.required "boolean" FSBool.decoder
        |> Pipeline.required "nullable" (FSNullable.decoder FSString.decoder)



-- update


type Msg
    = GotDocuments


update : Msg -> Model -> ( Model, Cmd msg )
update msg model =
    case msg of
        GotDocuments result ->
            case result of
                Ok document ->
                    -- ...

                Err (Firestore.Http_ httpErr) ->
                    -- ...

                Err (Firestore.Response firestoreErr) ->
                    -- ...

Development

Setup

$ npm install

Build

$ npm run build

Testing

$ npm test

License

MIT

Contribution

PRs accepted