-
Notifications
You must be signed in to change notification settings - Fork 1
/
ParseSdk.elm
125 lines (88 loc) · 2.95 KB
/
ParseSdk.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
module ParseSdk exposing (init, Credentials, ParseSdk)
import Http
import Json.Encode as JsonE
import Json.Decode as JsonD exposing ((:=))
import Task
import String
-- TYPES
type alias Create msg =
String -> (Http.RawError -> msg) -> (Http.Response -> msg) -> JsonE.Value -> Cmd msg
type alias Query doc msg =
String -> List ( String, JsonE.Value ) -> JsonD.Decoder doc -> (Http.Error -> msg) -> (List doc -> msg) -> Cmd msg
type alias Get doc msg =
String -> String -> JsonD.Decoder doc -> (Http.Error -> msg) -> (doc -> msg) -> Cmd msg
type alias ParseSdk doc msg =
{ create : Create msg
, query : Query doc msg
, get : Get doc msg
}
type alias Credentials =
{ appId : String
, apiKey : String
, url : String
}
-- HELPERS
headers : Credentials -> List ( String, String )
headers creds =
[ ( "X-Parse-Application-Id", creds.appId )
, ( "X-Parse-REST-API-Key", creds.apiKey )
]
trailingSlash : String -> String
trailingSlash url =
if String.endsWith "/" url then
url
else
url ++ "/"
appendToURL : String -> String -> String
appendToURL url str =
trailingSlash <| (trailingSlash url) ++ str
pathURL : String -> List String -> String
pathURL url pathList =
List.foldl (flip appendToURL) url pathList
-- OBJECTS
create : Credentials -> Create msg
create credentials class onError onSucceed value =
Http.send Http.defaultSettings
{ verb = "POST"
, headers = ( "Content-Type", "application/json" ) :: (headers credentials)
, url = pathURL credentials.url [ "classes", class ]
, body = Http.string <| JsonE.encode 0 value
}
|> Task.perform onError onSucceed
{-| http://parse.com/docs/rest/guide#queries-query-constraints
NOTE: Not used yet
-}
type alias Options =
{ order : Maybe (List String)
, limit : Maybe Int
, skip : Maybe Int
, keys : Maybe (List String)
, include : Maybe (List String)
, count : Bool
}
query : Credentials -> Query doc msg
query credentials class query decoder onError onSucceed =
Http.send Http.defaultSettings
{ verb = "GET"
, headers = ( "Content-Type", "application/json" ) :: (headers credentials)
, url = pathURL credentials.url [ "classes", class ]
, body = Http.empty
}
|> Http.fromJson ("results" := JsonD.list decoder)
|> Task.perform onError onSucceed
get : Credentials -> Get doc msg
get credentials class objectId decoder onError onSucceed =
Http.send Http.defaultSettings
{ verb = "GET"
, headers = ( "Content-Type", "application/json" ) :: (headers credentials)
, url = pathURL credentials.url [ "classes", class, objectId ]
, body = Http.empty
}
|> Http.fromJson decoder
|> Task.perform onError onSucceed
init : Credentials -> ParseSdk doc msg
init credentials =
{ create = create credentials
, query = query credentials
, get = get credentials
}