From fbd220621df5735ded2c3cef8bb0ff740e572548 Mon Sep 17 00:00:00 2001 From: Rishichandra Wawhal Date: Mon, 8 Oct 2018 11:42:42 +0530 Subject: [PATCH] firebase2graphql: improve readme structure, update git and add more tests (#666) --- community/tools/firebase2graphql/README.md | 204 ++++++++++++++++-- .../firebase2graphql/assets/added-rel.png | Bin 0 -> 42964 bytes .../firebase2graphql/assets/suggested-rel.png | Bin 0 -> 39830 bytes .../test/data-sets/fbUsers.js | 6 +- .../test/data-sets/readme-example-1.json | 6 +- community/tools/firebase2graphql/test/test.sh | 1 + .../test/verifyChinookNested.js | 6 +- .../tools/firebase2graphql/test/verifyRE1.js | 67 ++++++ 8 files changed, 259 insertions(+), 31 deletions(-) create mode 100644 community/tools/firebase2graphql/assets/added-rel.png create mode 100644 community/tools/firebase2graphql/assets/suggested-rel.png create mode 100644 community/tools/firebase2graphql/test/verifyRE1.js diff --git a/community/tools/firebase2graphql/README.md b/community/tools/firebase2graphql/README.md index d5de2533ccf..756a0cb0b8a 100644 --- a/community/tools/firebase2graphql/README.md +++ b/community/tools/firebase2graphql/README.md @@ -8,6 +8,25 @@ A CLI tool to help you try realtime GraphQL on your firebase data. It takes data ![GIF](https://graphql-engine-cdn.hasura.io/assets/firebase2graphql/demo.gif) +## Contents + +- [Getting started](#quick-start) +- [Installation](#installation) +- [Usage](#usage) +- [Command](#command) +- [Usage comparison](#usage-comparison---firebase-sdk-vs-graphql) +- [Authentication](#authentication) +- [Next steps](#next-steps) +- [More information](#more-information) + - [Working](#working) + - [Normalization](#normalization) + - [Automatic](#automatic) + - [Manual](#manual) + - [Duplicates](#duplicates) + - [Overwrite](#overwrite) +- [Feedback](#feedback) + + ## Quick start 1. Quickly get the GraphQL Engine running by clicking this button: @@ -177,8 +196,6 @@ Check out [next steps](#next-steps). ## Installation -### CLI - ```bash npm install -g firebase2graphql ``` @@ -215,22 +232,7 @@ firebase2graphql URL [flags] - `-v --version`: show CLI version - `-h, --help`: show CLI help -## Next steps - -Once you have imported your data, it is recommended that you make it production ready. - -1. Normalize the data by [removing duplicates](#duplicates). -2. Explore the GraphQL Engine Console to play with things such as - - - [Relationships](https://docs.hasura.io/1.0/graphql/manual/schema/relationships/index.html) - - [Permissions](https://docs.hasura.io/1.0/graphql/manual/auth/index.html) - - Using SQL - - [Set up async business logic using event triggers](https://docs.hasura.io/1.0/graphql/manual/event-triggers/index.html) - - [Create new tables](https://docs.hasura.io/1.0/graphql/manual/schema/basics.html) - -3. Set appropriate permissions. GraphQL Engine comes with [fine grained control layer](https://docs.hasura.io/1.0/graphql/manual/auth/index.html) that can be integrated with any standard Auth provider. - -## Usage Comparison - Firebase SDK vs GraphQL +## Usage comparison - Firebase SDK vs GraphQL A typical query to do a single read from the database using [Firebase SDK](https://firebase.google.com/docs/reference/), (javascript) would look something like: @@ -275,7 +277,26 @@ mutation { } ``` -## Things to know about implementation +## Authentication + +Hasura can be integrated with most standard Authentication mechanisms including Firebase and Auth0. [Check out the authentication docs here](https://docs.hasura.io/1.0/graphql/manual/auth/index.html). + +## Next steps + +Once you have imported your data, it is recommended that you make it production ready. + +1. [Normalize the data](#normalization) +2. Explore the GraphQL Engine Console to play with things such as + + - [Relationships](https://docs.hasura.io/1.0/graphql/manual/schema/relationships/index.html) + - [Permissions](https://docs.hasura.io/1.0/graphql/manual/auth/index.html) + - Using SQL + - [Set up async business logic using event triggers](https://docs.hasura.io/1.0/graphql/manual/event-triggers/index.html) + - [Create new tables](https://docs.hasura.io/1.0/graphql/manual/schema/basics.html) + +3. Set appropriate permissions. GraphQL Engine comes with [fine grained control layer](https://docs.hasura.io/1.0/graphql/manual/auth/index.html) that can be integrated with any standard Auth provider. + +## More information ### Working @@ -287,6 +308,8 @@ If you use the flag `--normalize`, the CLI finds out if the children tables are ### Normalization +#### Automatic + The CLI provides a flag called `--normalize` if you want to normalize your denormalized database. A lot of guess-work is done by the CLI while normalizing the database. Here are some thing you need to know: @@ -295,6 +318,143 @@ A lot of guess-work is done by the CLI while normalizing the database. Here are 2. Children tables are deleted if they are detected to be duplicates of some other root or child table. 3. In case of some children tables, when the data lacks a unique identifier, an extra unique field is added. In most cases, this field gets deleted while mergine a duplicate table with the original table. +#### Manual + +In some cases, due to inconsistent field names or due to insufficient data, the CLI might not be able to normalize your database; but it makes sure that you do not lose any data. + +In such cases, you can normalize the data yourself. Lets look at an example. + +Consider this firebase database. This is the database of the official Firebase example app: + +```json +{ + "posts" : { + "-LMbLFOAW2q6GO1bD-5g" : { + "author" : "Eena", + "authorPic" : "https://lh4.googleusercontent.com/-vPOIBOxCUpo/AAAAAAAAAAI/AAAAAAAAAFo/SKk9hpOB7v4/photo.jpg", + "body" : "My first post content\nAnd body\nANd structure", + "starCount" : 0, + "title" : "My first post", + "uid" : "4UPmbcaqZKT2NdAAqBahXj4tHYN2" + }, + "-LMbLIv6VKHYul7p_PZ-" : { + "author" : "Eena", + "authorPic" : "https://lh4.googleusercontent.com/-vPOIBOxCUpo/AAAAAAAAAAI/AAAAAAAAAFo/SKk9hpOB7v4/photo.jpg", + "body" : "AKsdjak\naklsdjaskldjklas\nasdklfjaklsdfjklsda\nasdklfjasklf", + "starCount" : 0, + "title" : "Whatta proaaa", + "uid" : "4UPmbcaqZKT2NdAAqBahXj4tHYN2" + } + }, + "user-posts" : { + "4UPmbcaqZKT2NdAAqBahXj4tHYN2" : { + "-LMbLFOAW2q6GO1bD-5g" : { + "author" : "Eena", + "authorPic" : "https://lh4.googleusercontent.com/-vPOIBOxCUpo/AAAAAAAAAAI/AAAAAAAAAFo/SKk9hpOB7v4/photo.jpg", + "body" : "My first post content\nAnd body\nANd structure", + "starCount" : 0, + "title" : "My first post", + "uid" : "4UPmbcaqZKT2NdAAqBahXj4tHYN2" + }, + "-LMbLIv6VKHYul7p_PZ-" : { + "author" : "Eena", + "authorPic" : "https://lh4.googleusercontent.com/-vPOIBOxCUpo/AAAAAAAAAAI/AAAAAAAAAFo/SKk9hpOB7v4/photo.jpg", + "body" : "AKsdjak\naklsdjaskldjklas\nasdklfjaklsdfjklsda\nasdklfjasklf", + "starCount" : 0, + "title" : "Whatta proaaa", + "uid" : "4UPmbcaqZKT2NdAAqBahXj4tHYN2" + } + } + }, + "users" : { + "4UPmbcaqZKT2NdAAqBahXj4tHYN2" : { + "email" : "rishichandrawawhal@gmail.com", + "profile_picture" : "https://lh4.googleusercontent.com/-vPOIBOxCUpo/AAAAAAAAAAI/AAAAAAAAAFo/SKk9hpOB7v4/photo.jpg", + "username" : "Eena" + } + } +} +``` + +In case of this JSON, the CLI will generate the following tables: + +```sql +users ( + _id text not null primary key, + email text, + profile_picture text, + username text +) + +posts ( + _id text not null primary key, + title text, + body text, + starCount int, + author text, + authorPic text, + uid text +) + +user_posts ( + _id text not null, + _id_2 text not null, + title text, + body text, + starCount int, + author text, + authorPic text, + uid text +) +``` + +As we can see, this is not the most efficient of schemas. + +- `posts(uid)` can be a foreign key referencing `users(_id)`. `posts(author)` and `posts(authorPic)` can be deleted if `users` and `posts` are related via a foreign key. +- `user_posts` table is obsolete if `posts` and `users` tables are deleted. + +To normalize it, here are the steps you must follow: + +1. Create the following foreign key constraints: + + ```sql + ALTER TABLE "posts" ADD CONSTRAINT "posts_users__uid" FOREIGN KEY ("uid") REFERENCES "users"("_id"); + + ALTER TABLE "posts" DROP COLUMN "author", DROP COLUMN "authorPic"; + + DROP TABLE "user_posts"; + ``` + + To create them, go to the Hasura Console and run the SQL in the `Data > SQL` section. + +2. Create the relationships. In the console, go the desired table and add the relationship suggested based on the Foreign key. For example for the `posts` table in the above schema, the suggested relationship would be suggested like: + + ![suggested](assets/suggested-rel.png) + + Click on `Add`. You can name it whatever you like. Lets call it `author` in this case. + + ![added](assets/added-rel.png) + + + Similarly, add the suggested relationships for other tables as well. + + +3. Once you have created relationships, you can start making fancy GraphQL queries like: + + ```graphql + query { + users (order_by: username_asc){ + username + profile_picture + email + posts (where: { starCount: { _gte: 100}}){ + title + body + starCount + } + } + } + ``` ### Duplicates @@ -304,12 +464,12 @@ In such cases, you have three choices: 1. Use the API as such if you prefer the exact API. 2. Go to the UI Console and delete the duplicates and normalize the database as you feel fit. -3. Use the `--normalize` flag and rerun the migration. In this case, the CLI will detect duplicates and make appropriate relationships between root nodes. (This feature is experimental and needs more test cases to attain stability. Contributions are welcome) - +3. Use the `--normalize` flag and rerun the migration. In this case, the CLI will detect duplicates and make appropriate relationships between root nodes. (This feature is experimental and needs more test cases to attain stability. Contributions are welcome) + ### Overwrite -If your database already contains tables with the same name as the root fields of your JSON database, the command will fail. If you want to overwrite the database anyway, you should provide an additional flag "--overwrite". +If your database already contains tables with the same name as the root fields of your JSON database, the command will fail. If you want to overwrite the database anyway, you should provide an additional flag `--overwrite`. ## Feedback diff --git a/community/tools/firebase2graphql/assets/added-rel.png b/community/tools/firebase2graphql/assets/added-rel.png new file mode 100644 index 0000000000000000000000000000000000000000..5dba1e1284b446c4b437415a54b2dedac4802c45 GIT binary patch literal 42964 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

r^)A65g2Lnsj@n{#`#pTzbO0`kRG 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 literal 0 HcmV?d00001 diff --git a/community/tools/firebase2graphql/assets/suggested-rel.png b/community/tools/firebase2graphql/assets/suggested-rel.png new file mode 100644 index 0000000000000000000000000000000000000000..08c96c4def900ee897c3f266378434d79137cb89 GIT binary patch literal 39830 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

*p@8Sly6srlKK0B|@o&Mu8n;W|9M5(H}~H zmH(FF8c6^H<4?W!@A9+4L0Mdb`A7YMG|M+kWct#5N7Ijk39x@j#aV%ihnQ;L{`H9e pIYC8$UwGei|6?T&yxJK|7SavBx+A_S?z2H&y<(#KM%(GP{{rlF2wMOE literal 0 HcmV?d00001 diff --git a/community/tools/firebase2graphql/test/data-sets/fbUsers.js b/community/tools/firebase2graphql/test/data-sets/fbUsers.js index 8be2db65515..a57b10155c4 100644 --- a/community/tools/firebase2graphql/test/data-sets/fbUsers.js +++ b/community/tools/firebase2graphql/test/data-sets/fbUsers.js @@ -1,10 +1,10 @@ module.exports = { - scores: { + f2g_test_scores: { Rishi: 24, Rikin: 26, Tanmai: 27, }, - author: { + f2g_test_author: { someone: { one: { name: 'Rishi', @@ -83,7 +83,7 @@ module.exports = { }, }, }, - articles: { + f2g_test_articles: { first: { title: 'Rishis article', body: "Rishi's article's body", diff --git a/community/tools/firebase2graphql/test/data-sets/readme-example-1.json b/community/tools/firebase2graphql/test/data-sets/readme-example-1.json index b3e7bb169e7..f6073f38ee0 100644 --- a/community/tools/firebase2graphql/test/data-sets/readme-example-1.json +++ b/community/tools/firebase2graphql/test/data-sets/readme-example-1.json @@ -1,5 +1,5 @@ { - "Articles": { + "f2g_Articles": { "A1": { "Title": "Title1", "Body": "Body1", @@ -55,7 +55,7 @@ } } }, - "Authors": { + "f2g_test_Authors": { "AT1": { "Name": "AName1", "Age": 11, @@ -77,7 +77,7 @@ } } }, - "Comments": { + "f2g_test_Comments": { "C1": { "Body": "Comment1", "Author": { diff --git a/community/tools/firebase2graphql/test/test.sh b/community/tools/firebase2graphql/test/test.sh index 009e0cd94a9..3b06e36e01b 100755 --- a/community/tools/firebase2graphql/test/test.sh +++ b/community/tools/firebase2graphql/test/test.sh @@ -5,4 +5,5 @@ else F2G_LOG=0 ../bin/run $TEST_HGE_URL --access-key=$TEST_X_HASURA_ACCESS_KEY --db=./data-sets/chinook.json --overwrite --normalize && node verifyChinook.js F2G_LOG=0 ../bin/run $TEST_HGE_URL --access-key=$TEST_X_HASURA_ACCESS_KEY --db=./data-sets/blog.json --overwrite --normalize && node verifyBlog.js F2G_LOG=0 ../bin/run $TEST_HGE_URL --access-key=$TEST_X_HASURA_ACCESS_KEY --db=./data-sets/chinook_nested.json --overwrite --normalize && node verifyChinookNested.js + F2G_LOG=0 ../bin/run $TEST_HGE_URL --access-key=$TEST_X_HASURA_ACCESS_KEY --db=./data-sets/readme-example-1.json --overwrite --normalize && node verifyRE1.js fi diff --git a/community/tools/firebase2graphql/test/verifyChinookNested.js b/community/tools/firebase2graphql/test/verifyChinookNested.js index ca845a2d00b..5c53bc0b939 100644 --- a/community/tools/firebase2graphql/test/verifyChinookNested.js +++ b/community/tools/firebase2graphql/test/verifyChinookNested.js @@ -56,17 +56,17 @@ const verifyDataImport = () => { }), } ).then(() => { - console.log(colors.green('✔︎ data-sets/chinook.json: Test passed')); + console.log(colors.green('✔︎ data-sets/chinook_nested.json: Test passed')); process.exit(); }).catch(() => { process.exit(); }); } else { - console.log(colors.red('✖ data-sets/chinook.json: Test failed. Unexpected response.')); + console.log(colors.red('✖ data-sets/chinook_nested.json: Test failed. Unexpected response.')); process.exit(); } }).catch(e => { - console.log(colors.red('✖ data-sets/chinook.json: Test failed. Unexpected response.')); + console.log(colors.red('✖ data-sets/chinook_nested.json: Test failed. Unexpected response.')); console.log(JSON.stringify(e, null, 2)); process.exit(); diff --git a/community/tools/firebase2graphql/test/verifyRE1.js b/community/tools/firebase2graphql/test/verifyRE1.js new file mode 100644 index 00000000000..008b2c4971f --- /dev/null +++ b/community/tools/firebase2graphql/test/verifyRE1.js @@ -0,0 +1,67 @@ +const {query} = require('graphqurl'); +const fetch = require('node-fetch'); +const colors = require('colors/safe'); + +const complexQuery = ` +query { + f2g_test_Authors (order_by: Name_asc) { + _id + Name + f2g_Articles (order_by: Title_asc, where: { IsUnpublished: { _eq: true}}) { + Title + f2g_test_Comments (order_by: Date_asc) { + Body + Date + } + } + } +} +`; + +const verifyDataImport = () => { + query({ + query: complexQuery, + endpoint: `${process.env.TEST_HGE_URL}/v1alpha1/graphql`, + headers: {'x-hasura-access-key': process.env.TEST_X_HASURA_ACCESS_KEY}, + }).then(response => { + if ( + response.data && + response.data.f2g_test_Authors[0].f2g_Articles.length === 0 && + response.data.f2g_test_Authors[1].f2g_Articles[0].f2g_test_Comments[0].Body === 'Comment1' + ) { + let sqlString = ''; + ['Articles', 'Authors', 'Comments'].forEach(t => { + sqlString += `drop table public."f2g_test_${t}" cascade;`; + }); + fetch( + `${process.env.TEST_HGE_URL}/v1/query`, + { + method: 'POST', + headers: {'x-hasura-access-key': process.env.TEST_X_HASURA_ACCESS_KEY}, + body: JSON.stringify({ + type: 'run_sql', + args: { + sql: sqlString, + cascade: true, + }, + }), + } + ).then(() => { + console.log(colors.green('✔︎ data-sets/readme-example-1.json: Test passed')); + process.exit(); + }).catch(() => { + process.exit(); + }); + } else { + console.log(colors.red('✖ data-sets/readme-example-1.json: Test failed. Unexpected response.')); + process.exit(); + } + }).catch(e => { + console.log(colors.red('✖ data-sets/readme-example-1.json: Test failed. Unexpected response.')); + console.log(JSON.stringify(e, null, 2)); + + process.exit(); + }); +}; + +verifyDataImport();