2020-07-27 18:57:36 +00:00
|
|
|
#!/usr/bin/env python -B
|
|
|
|
"""
|
|
|
|
Generates a JS schema file from sandbox/grist/schema.py.
|
|
|
|
"""
|
|
|
|
|
2021-06-30 14:46:38 +00:00
|
|
|
import schema # pylint: disable=import-error
|
2020-07-27 18:57:36 +00:00
|
|
|
|
|
|
|
# These are the types that appear in Grist metadata columns.
|
|
|
|
_ts_types = {
|
|
|
|
"Bool": "boolean",
|
|
|
|
"DateTime": "number",
|
|
|
|
"Int": "number",
|
|
|
|
"PositionNumber": "number",
|
|
|
|
"Ref": "number",
|
2021-06-29 04:47:59 +00:00
|
|
|
"RefList": "['L', ...number[]]|null", # Non-primitive values are encoded
|
(core) Initial webhooks implementation
Summary:
See https://grist.quip.com/VKd3ASF99ezD/Outgoing-Webhooks
- 2 new DocApi endpoints: _subscribe and _unsubscribe, not meant to be user friendly or publicly documented. _unsubscribe should be given the response from _subscribe in the body, e.g:
```
$ curl -X POST -H "Authorization: Bearer 8fd4dc59ecb05ab29ae5a183c03101319b8e6ca9" "http://localhost:8080/api/docs/6WYa23FqWxGNe3AR6DLjCJ/tables/Table2/_subscribe" -H "Content-type: application/json" -d '{"url": "https://webhook.site/a916b526-8afc-46e6-aa8f-a625d0d83ec3", "eventTypes": ["add"], "isReadyColumn": "C"}'
{"unsubscribeKey":"3246f158-55b5-4fc7-baa5-093b75ffa86c","triggerId":2,"webhookId":"853b4bfa-9d39-4639-aa33-7d45354903c0"}
$ curl -X POST -H "Authorization: Bearer 8fd4dc59ecb05ab29ae5a183c03101319b8e6ca9" "http://localhost:8080/api/docs/6WYa23FqWxGNe3AR6DLjCJ/tables/Table2/_unsubscribe" -H "Content-type: application/json" -d '{"unsubscribeKey":"3246f158-55b5-4fc7-baa5-093b75ffa86c","triggerId":2,"webhookId":"853b4bfa-9d39-4639-aa33-7d45354903c0"}'
{"success":true}
```
- New DB entity Secret to hold the webhook URL and unsubscribe key
- New document metatable _grist_Triggers subscribes to table changes and points to a secret to use for a webhook
- New file Triggers.ts processes action summaries and uses the two new tables to send webhooks.
- Also went on a bit of a diversion and made a typesafe subclass of TableData for metatables.
I think this is essentially good enough for a first diff, to keep the diffs manageable and to talk about the overall structure. Future diffs can add tests and more robustness using redis etc. After this diff I can also start building the Zapier integration privately.
Test Plan: Tested manually: see curl commands in summary for an example. Payloads can be seen in https://webhook.site/#!/a916b526-8afc-46e6-aa8f-a625d0d83ec3/0b9fe335-33f7-49fe-b90b-2db5ba53382d/1 . Great site for testing webhooks btw.
Reviewers: dsagal, paulfitz
Reviewed By: paulfitz
Differential Revision: https://phab.getgrist.com/D3019
2021-09-22 23:06:23 +00:00
|
|
|
"ChoiceList": "['L', ...string[]]|null",
|
2020-07-27 18:57:36 +00:00
|
|
|
"Text": "string",
|
|
|
|
}
|
|
|
|
|
|
|
|
def get_ts_type(col_type):
|
|
|
|
col_type = col_type.split(':', 1)[0] # Strip suffix for Ref:, DateTime:, etc.
|
|
|
|
return _ts_types.get(col_type, "CellValue")
|
|
|
|
|
|
|
|
def main():
|
2021-06-29 04:47:59 +00:00
|
|
|
print("""\
|
2020-07-27 18:57:36 +00:00
|
|
|
/*** THIS FILE IS AUTO-GENERATED BY %s ***/
|
|
|
|
// tslint:disable:object-literal-key-quotes
|
|
|
|
|
|
|
|
export const schema = {
|
2021-06-22 15:12:25 +00:00
|
|
|
""" % __file__)
|
2020-07-27 18:57:36 +00:00
|
|
|
|
|
|
|
for table in schema.schema_create_actions():
|
2021-06-22 15:12:25 +00:00
|
|
|
print(' "%s": {' % table.table_id)
|
2020-07-27 18:57:36 +00:00
|
|
|
for column in table.columns:
|
2021-06-22 15:12:25 +00:00
|
|
|
print(' %-20s: "%s",' % (column['id'], column['type']))
|
|
|
|
print(' },\n')
|
2020-07-27 18:57:36 +00:00
|
|
|
|
2021-06-22 15:12:25 +00:00
|
|
|
print("""};
|
2020-07-27 18:57:36 +00:00
|
|
|
|
|
|
|
export interface SchemaTypes {
|
2021-06-22 15:12:25 +00:00
|
|
|
""")
|
2020-07-27 18:57:36 +00:00
|
|
|
for table in schema.schema_create_actions():
|
2021-06-22 15:12:25 +00:00
|
|
|
print(' "%s": {' % table.table_id)
|
2020-07-27 18:57:36 +00:00
|
|
|
for column in table.columns:
|
2021-06-22 15:12:25 +00:00
|
|
|
print(' %s: %s;' % (column['id'], get_ts_type(column['type'])))
|
|
|
|
print(' };\n')
|
|
|
|
print("}")
|
2020-07-27 18:57:36 +00:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|