-
Notifications
You must be signed in to change notification settings - Fork 3
/
intro_prest.slide
282 lines (178 loc) · 6.13 KB
/
intro_prest.slide
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
Postgres + REST = pREST ❤
A pREST introduction
Tags: go, postgres, rest
Cássio Botaro
Software Engineer, Nuveo
cassiobotaro@gmail.com
https://cassiobotaro.github.io/
@cassiobotaro
Igor Leroy
Software Engineer, Nuveo
ip.leroy@gmail.com
http://lerrua.com
@lerrua
* Slides
These slides are already available in [[http://bit.ly/intro_prest][http://bit.ly/intro_prest]]
.image images/padroes_de_projeto/DRAWING_GOPHER.png
.caption _credits_by_ [[https://github.com/ashleymcnamara/gophers][@ashleymcnamara]]
* Summary
- Intro
- Installation
- Usage
- Usage as framework
- New features
* Intro
* Intro
pREST is a way to serve a RESTful APIs for any database. Right now we support PostgreSQL and support to others databases such as MySQL are being developed by the community.
.image images/intro_prest/logo.png
[[http://github.com/prest][Organization]] & [[https://postgres.rest/][Docs]]
* Installation
Using go get:
go get -u github.com/prest/prest
with Homebrew:
brew install prest
with docker:
docker pull prest/prest
Executable:
[[https://github.com/prest/prest/releases/tag/v0.3.0][Latest version]]
* Configuration
* prest.toml
migrations = "./migrations"
queries = "./queries"
[http]
port = 6000
[jwt]
key = "secret"
algo = "HS256"
[pg]
host = "127.0.0.1"
user = "postgres"
pass = "mypass"
port = 5432
database = "prest"
[ssl]
mode = "disable"
sslcert = "./PATH"
sslkey = "./PATH"
sslrootcert = "./PATH"
More datails at [[https://postgres.rest/configurations/#toml][docs]]
* Environment vars
# migrations
PREST_MIGRATIONS="./migrations"
PREST_QUERIES="./queries"
# http
PREST_HTTP_PORT=3000
# pg
PREST_PG_HOST="127.0.0.1"
PREST_PG_USER="postgres"
PREST_PG_PASS="mypass"
PREST_PG_DATABASE="prest"
PREST_PG_PORT=5432
# jwt
PREST_JWT_KEY=secret
PREST_JWT_ALGO=HS256
# ssl
PREST_SSL_MODE="disable"
PREST_SSL_SSLCERT="./path"
PREST_SSL_SSLKEY="./path"
PREST_SSL_SSLROOTCERT="./path"
More datails at [[https://postgres.rest/configurations/#environment-vars][docs]].
* Usage
* Migrations
# create new migration file in path
prest migrate create migration_file_xyz
# apply all available migrations
prest migrate up
# roll back all migrations
prest migrate down
# roll back the most recently applied migration, then run it again.
prest migrate redo
# run down and then up command
prest migrate reset
# show the current migration version
prest migrate version
More datails at [[https://postgres.rest/configurations/#migrations][docs]].
* CRUD
Create
curl -X POST "localhost:3000/demo/public/person" -d '{"name": "cassio", "age": 27}'
curl -X POST "localhost:3000/demo/public/person" -d '{"name": "igor", "age": 31}'
Read
curl -X GET "localhost:3000/demo/public/person"
or
curl -X GET "localhost:3000/demo/public/person?name=cassio"
* CRUD
Update
curl -X PUT "localhost:3000/demo/public/person?name=igor" -d '{"name": "igor", "age": 32}'
or
curl -X PATCH "localhost:3000/demo/public/person?name=igor" -d '{"age": 31}'
Delete
curl -X DELETE "localhost:3000/demo/public/person?name=igor"
More details at [[https://postgres.rest/query-statements/][docs]].
Code at [[http://github.com/cassiobotaro/demoprest][this repository]].
* Query statements
FILTER
Equal
curl -X GET "localhost:3000/demo/public/person?name=cassio"
or
curl -X GET "localhost:3000/demo/public/person?name=\$eq.cassio"
Null or Not null
curl -X GET "localhost:3000/demo/public/person?name=\$null"
curl -X GET "localhost:3000/demo/public/person?name=\$notnull"
True or False
curl -X GET "localhost:3000/demo/public/person?status=\$true"
curl -X GET "localhost:3000/demo/public/person?status=\$false"
* Query statements
Like
curl -X GET "localhost:3000/demo/public/person?name=\$like.cassio"
etc
$gt, $gte, $lt, $lte, $ne, $in, $nin, $null, $notnull
More details at [[https://postgres.rest/query-statements/#filter-where-with-jsonb-field/][docs]].
* Query statements
ORDER BY
ASC
curl -X GET "localhost:3000/demo/public/person?_order=name"
DESC
curl -X GET "localhost:3000/demo/public/person?_order=-name"
More details at [[https://postgres.rest/query-statements/#order-by/][docs]].
* Query statements
- JOIN
- DISTINCT
- GROUP BY
- JSONB support
- Database and schema operations (like `show all tables`)
More details at [[https://postgres.rest/query-statements/][docs]].
* Table permissions
For default the pREST will serve in publish mode, making all tables and views visible.
But using prest.toml you can configure read/write/delete permissions of each table.
[[access.tables]]
name = "person"
permissions = ["read", "write", "delete"]
fields = ["id", "name"]
* Other features
- script
- template
- cors
.image images/intro_prest/gopher_snacks.png
.caption _credits_by_ [[https://github.com/ashleymcnamara/gophers][@ashleymcnamara]]
* Usage as framework
* Ping
.code codes/intro_prest/hello_world.go /func main/,
* New features
* Batch insert
curl -x POST "localhost:3000/batch/demo/public/person" \
-d @10000records.json -H "Prest-Batch-Method: copy"
.image images/intro_prest/MovingGopher.png
.caption _credits_by_ [[https://github.com/ashleymcnamara/gophers][@ashleymcnamara]]
* Batch update
Unfornately we decide to not implement this feature due to a performance limitation, but a draft can be founded [[https://gist.github.com/cassiobotaro/0999e201825969129fcec12fc28a03b9][here]].
.image images/intro_prest/LazyGopher.png
.caption _credits_by_ [[https://github.com/ashleymcnamara/gophers][@ashleymcnamara]]
* Mysql suppport (third party)
This support is under development and can be followed by issue [[https://github.com/prest/prest/issues/239][prest/prest#239]].
.image images/intro_prest/GO_BUILD.png
.caption _credits_by_ [[https://github.com/ashleymcnamara/gophers][@ashleymcnamara]]
* Conclusion
.image images/padroes_de_projeto/DOCTOR_STRANGE_GOPHER.png
* Questions?
.image images/padroes_de_projeto/NERDY.png
.caption _credits_by_ [[https://github.com/ashleymcnamara/gophers][@ashleymcnamara]]