Giter Site home page Giter Site logo

hasura-ecommerce's Introduction

Hasura Super App

To test this application, see the Setup docs.

Disclaimer/Notice: This application was a passion project for a number of engineers and other team members internally. Initial developments began long prior to v2.0 releases and before the Metadata V3 spec. As you might assume given the circumstances, there are some irregularitaries in the codebase, and small parts of the UI/design exist solely for aesthetic purposes/inspiration. Our hope was that the "big picture" product here could be useful for others both as a learning exercise or quick reference for particular featuresets. We wish and intend to continue to build out & integrate features of Hasura so that this repo can serve as a cannonical community reference for whatever your implementation/architecture question is.

Introduction

The Hasura Super App is a full featured reference application demonstrating many of the powerful featues of Hasura's GraphQL Engine. This is free and open software and you are invited to take and use as much of it as you would like, though it was designed for educational purposes.

Getting Started

tl;dr = Clone the repo, run Docker.

$ git clone https://github.com/hasura/hasura-ecommerce
$ cp .env.example .env
<modify ".env" to have your real Stripe test keys if you want checkout to work>
$ docker-compose up -d
$ cd hasura
<assuming you have Hasura CLI installed>
$ hasura seeds apply

Visit http://localhost:3000 for Next.js frontend
  Login at /account/login has default credentials "[email protected]:password"
  Login at /admin/account/login has default credentials "[email protected]:password"
Visit http://localhost:8080 for Hasura console (admin secret = "my-secret")
Visit http://localhost:9000 for Minio dashboard (login = "minio:minio123")

2 Minute Video Demo

hasura-super-app-brief-tour.mp4

Application Technical Overview

This example is a dockerized project with the following services: Postgres, GraphQL Engine, Minio, and Next.js. The project has one external service dependency for payment handling, which we've chosen to implement with Stripe. User authentication and authorization, cart management, order management and product information management is stored in Postgres and architected through Hasura GraphQL Engine. Minio is utilized for asset storage as it implements a common S3 interface.

Service Functionality Licensing
Postgres PIM, Cart Management, User Management, User Authentication, Order Management OSS
Hasura Business Logic Routing, Unified API, Access Control Management OSS
NextJS Serverless business logic handlers, web application framework OSS
Minio S3-compatible object storage (file and image upload) OSS
Stripe Payment handling Freemium

Application Architectural Overview

See the Architecture Documentation.

app_architecture_diagram

Authentication Flow

The Authentication leverages Hasura Actions and NextJs serverless routes to handle JWT based authentication. The client sends a login mutation, the mutation is forwarded via action to a serverless function where a unique JWT is created, the token is passed back to Hasura where it is stored with client credentials, and the JWT along with helpful client information is forwarded back to the client and set as a sever-set cookie.

The login flow is similar but instead of creating a user in the action, the user is verified.

graph TD
    website[Website]
    hasura[(Postgres)]
    server[Server]
    action[[Hasura Action]]

    website -->|Signup| action
    action -.->|Handler| server
    server -.-> |Save User| hasura
    server -.-> |return token| action
    action -.-> website

Checkout Flow

  • User visits the Checkout page, presses payment button
  • GraphQL request is sent to Hasura to invoke custom Hasura Action
  • Hasura forwards the request parameters to the Action REST API handler on the Next.js Server
  • The API handler calls the Stripe API and invokes stripe.paymentIntents.create(), then returns the client_secret for the tokenized PaymentIntent
  • Hasura forwards the response from the Action REST API handler to the client, as GraphQL

graph TD
    website[Website]
    server[Server - REST API]
    hasura[Hasura]
    stripe[Stripe]


    website -->|Checkout| hasura
    hasura --> |Hasura Action| server
    server --> |REST API Call| stripe
    stripe .-> |PaymentIntent Client Secret| server
    server .-> |Forward| hasura
    hasura .-> |Forward| website

Product Management Flow

Product management occurs through the /admin paths of the client application. New product images are uploaded to the Minio instance and the resource url is saved along with the product details. Again, as a client wrapper to a single GraphQL endpoint, it becomes very easy to expose additional functionality like PIM management without the need for incorporating excessive additional tooling.

GraphQL SDK

This project uses an innovative, generated, GraphQl Client SDK. For more information, see the SDK documentation.

Hasura Migration Flow

Hasura is a powerful backend provider that has offline development primitives baked in. You can define, iterate on, and deploy your migrations through the helpful CLI. For more information see the migration guide.

3 Factor Applications

This application follows the 3 Factor App principles which are composed of robust client-side state management and a centralized API layer that manages the business logic, architecture and service routing. For more information on 3 factor apps, visit the website.

hasura-ecommerce's People

Contributors

arjunyel avatar gavinray97 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hasura-ecommerce's Issues

How to deploy to hasura cloud?

Hello

I can run this locally but would like to know how I can run it on your cloud.

And similarly, if I am building a hasura application on your cloud, can I export it as code?

Try to deploy the App from Hasura Git

Just try to have some fun make it from git deployment

Selected Specific Holder

"\hasura\

Got the following error

##Apply Meta

--- project
+++ server
@@ -1,580 +1,36 @@
-- array_relationships:
-  - name: orders_with_billing_address
-    using:
-      foreign_key_constraint_on:
-        column: billing_address_id
-        table: order
-  - name: orders_with_shipping_address
-    using:
-      foreign_key_constraint_on:
-        column: shipping_address_id
-        table: order
-  delete_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  - permission:
-      columns: '*'
-      filter:
-        user_id:
-          _eq: X-Hasura-User-Id
-    role: user
-  insert_permissions:
-  - permission:
-      check: {}
-      columns: '*'
-    role: site-admin
-  - permission:
-      check:
-        user_id:
-          _eq: X-Hasura-User-Id
-      columns: '*'
-    role: user
-  object_relationships:
-  - name: user
-    using:
-      foreign_key_constraint_on: user_id
-  select_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  - permission:
-      columns: '*'
-      filter:
-        user_id:
-          _eq: X-Hasura-User-Id
-    role: user
-  table:
-    name: address
+- table:
+    name: online_users
-  update_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  - permission:
-      columns: '*'
-      filter:
-        user_id:
-          _eq: X-Hasura-User-Id
-    role: user
-- delete_permissions:
-  - permission:
-      filter: {}
-    role: site-admin
-  insert_permissions:
-  - permission:
-      check: {}
-      columns: '*'
-    role: site-admin
-  select_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  table:
-    name: site_admin
+- table:
+    name: restaurant_tables
-  update_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-- array_relationships:
-  - name: products
-    using:
-      foreign_key_constraint_on:
-        column: order_id
-        table: order_product
-  delete_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  insert_permissions:
-  - permission:
-      check: {}
-      columns: '*'
-    role: site-admin
-  - permission:
-      check:
-        user_id:
-          _eq: X-Hasura-User-Id
-      columns: '*'
-    role: user
-  object_relationships:
-  - name: user
-    using:
-      foreign_key_constraint_on: user_id
-  - name: billing_address
-    using:
-      foreign_key_constraint_on: billing_address_id
-  - name: shipping_address
-    using:
-      foreign_key_constraint_on: shipping_address_id
-  - name: order_status
-    using:
-      foreign_key_constraint_on: status
-  select_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  - permission:
-      columns: '*'
-      filter:
-        user_id:
-          _eq: X-Hasura-User-Id
-    role: user
-  table:
-    name: order
+- table:
+    name: todos
-  update_permissions:
+- select_permissions:
-      columns: '*'
-      filter: {}
-    role: site-admin
-- delete_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  insert_permissions:
-  - permission:
-      check: {}
-      columns: '*'
-    role: site-admin
-  - permission:
-      check:
-        order:
-          user_id:
-            _eq: X-Hasura-User-Id
-      columns: '*'
-    role: user
-  object_relationships:
-  - name: order
-    using:
-      foreign_key_constraint_on: order_id
-  - name: product
-    using:
-      foreign_key_constraint_on: product_id
-  select_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  - permission:
-      columns: '*'
-      filter:
-        order:
-          user_id:
-            _eq: X-Hasura-User-Id
-    role: user
-  table:
-    name: order_product
-    schema: public
-  update_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-- array_relationships:
-  - name: orders
-    using:
-      foreign_key_constraint_on:
-        column: status
-        table: order
-  delete_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  insert_permissions:
-  - permission:
-      check: {}
-      columns: '*'
-    role: site-admin
-  is_enum: true
-  select_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  - permission:
-      columns: '*'
-      filter: {}
-    role: user
-  table:
-    name: order_status
-    schema: public
-  update_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-- array_relationships:
-  - name: orders
-    using:
-      foreign_key_constraint_on:
-        column: product_id
-        table: order_product
-  - name: product_reviews
-    using:
-      foreign_key_constraint_on:
-        column: product_id
-        table: product_review
-  delete_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  insert_permissions:
-  - permission:
-      check: {}
-      columns: '*'
-    role: site-admin
-  object_relationships:
-  - name: category
-    using:
-      foreign_key_constraint_on: category_display_name
-  select_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  - permission:
-      columns: '*'
-      filter: {}
-    role: anonymous
-  - permission:
-      columns: '*'
-      filter: {}
-    role: user
-  table:
-    name: product
-    schema: public
-  update_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-- array_relationships:
-  - name: products
-    using:
-      foreign_key_constraint_on:
-        column: category_display_name
-        table: product
-  delete_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  insert_permissions:
-  - permission:
-      check: {}
-      columns: '*'
-    role: site-admin
-  is_enum: true
-  select_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  - permission:
-      columns: '*'
-      filter: {}
-    role: anonymous
-  - permission:
-      columns: '*'
-      filter: {}
-    role: user
-  table:
-    name: product_category_enum
-    schema: public
-  update_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-- delete_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  - permission:
-      filter:
-        user:
-          id:
-            _eq: X-Hasura-User-Id
-          orders:
-            products:
-              id:
-                _ceq: product_id
-    role: user
-  insert_permissions:
-  - permission:
-      check: {}
-      columns: '*'
-    role: site-admin
-  - permission:
-      check:
-        user:
-          id:
-            _eq: X-Hasura-User-Id
-          orders:
-            products:
-              id:
-                _ceq: product_id
-      - product_id
-      - rating
-      - comment
-      set:
-        user_id: X-Hasura-User-Id
-    role: user
-  object_relationships:
-  - name: user
-    using:
-      foreign_key_constraint_on: user_id
-  - name: product
-    using:
-      foreign_key_constraint_on: product_id
-  select_permissions:
-  - permission:
-      columns: '*'
+      - photo_desc
+      - photo_url
+      - created_at
+      - updated_at
+      - id
-    role: user
-  - permission:
-      columns: '*'
-      filter: {}
-      columns: '*'
-      filter: {}
-    role: site-admin
-  table:
-    name: product_review
-    schema: public
-  update_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  - permission:
-      - product_id
-      - rating
-      - comment
-      filter:
-        user:
-          id:
-            _eq: X-Hasura-User-Id
-          orders:
-            products:
-              id:
-                _ceq: product_id
-      set:
-        user_id: X-Hasura-User-Id
-    role: user
-- array_relationships:
-  - name: addresses
-    using:
-      foreign_key_constraint_on:
-        column: user_id
-        table: address
-  - name: orders
-    using:
-      foreign_key_constraint_on:
-        column: user_id
-        table: order
-  - name: product_reviews
-    using:
-      foreign_key_constraint_on:
-        column: user_id
-        table: product_review
-  delete_permissions:
-  - permission:
+      - id
+      - photo_url
+      - photo_desc
+      - created_at
+      - updated_at
-    role: site-admin
-  insert_permissions:
-  - permission:
-      check: {}
-      columns: '*'
-    role: site-admin
-  select_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-  - permission:
-      columns: '*'
-      filter:
-        id:
-          _eq: X-Hasura-User-Id
-    role: user
+    role: public
-    name: user
+    name: user_photos
-  update_permissions:
-  - permission:
-      columns: '*'
-      filter: {}
-    role: site-admin
-actions:
-- name: adminLogin
-  definition:
-    kind: ""
-    type: query
-    handler: '{{NEXTJS_SERVER_URL}}/api/actions/admin-login'
-    arguments:
-    - name: params
-      type: AdminLoginInput!
-      description: null
-    output_type: JWT
-  permissions:
-  - role: anonymous
-- name: adminSignup
-  definition:
-    kind: synchronous
-    type: mutation
-    handler: '{{NEXTJS_SERVER_URL}}/api/actions/admin-signup'
-    arguments:
-    - name: params
-      type: AdminSignupInput!
-      description: null
-    output_type: JWT
-  permissions:
-  - role: site-admin
-- name: createPaymentIntent
-  definition:
-    kind: synchronous
-    type: mutation
-    handler: '{{NEXTJS_SERVER_URL}}/api/actions/create-payment-intent'
-    arguments:
-    - name: params
-      type: CreatePaymentIntentInput!
-      description: null
-    output_type: PaymentIntentClientSecret
-  permissions:
-  - role: anonymous
-  - role: site-admin
-  - role: user
-- name: login
-  definition:
-    kind: synchronous
-    type: mutation
-    handler: '{{NEXTJS_SERVER_URL}}/api/actions/login'
-    arguments:
-    - name: params
-      type: LoginInput!
-      description: null
-    output_type: JWT
-  permissions:
-  - role: anonymous
-- name: refreshToken
-  definition:
-    kind: ""
-    type: query
-    handler: '{{NEXTJS_SERVER_URL}}/api/actions/refresh-token'
-    arguments:
-    - name: params
-      type: RefreshTokenInput!
-      description: null
-    output_type: RefreshTokenJWT
-  permissions:
-  - role: anonymous
-  - role: site-admin
-  - role: user
-- name: signup
-  definition:
-    kind: synchronous
-    type: mutation
-    handler: '{{NEXTJS_SERVER_URL}}/api/actions/signup'
-    arguments:
-    - name: params
-      type: SignupInput!
-      description: null
-    output_type: JWT
-  permissions:
-  - role: anonymous
-custom_types:
-  enums: []
-  input_objects:
-  - name: SignupInput
-    fields:
-    - name: name
-      type: String!
-      description: null
-    - name: email
-      type: String!
-      description: null
-    - name: password
-      type: String!
-      description: null
-  - name: LoginInput
-    fields:
-    - name: email
-      type: String!
-      description: null
-    - name: password
-      type: String!
-      description: null
-  - name: AdminLoginInput
-    fields:
-    - name: email
-      type: String!
-      description: null
-    - name: password
-      type: String!
-      description: null
-  - name: AdminSignupInput
-    fields:
-    - name: name
-      type: String!
-      description: null
-    - name: email
-      type: String!
-      description: null
-    - name: password
-      type: String!
-      description: null
-  - name: CreatePaymentIntentInput
-    fields:
-    - name: paymentAmount
-      type: Float!
-      description: null
-  - name: RefreshTokenInput
-    fields:
-    - name: refreshToken
-      type: String!
-      description: null
-  objects:
-  - name: PaymentIntentClientSecret
-    fields:
-    - name: clientSecret
-      type: String!
-      description: null
-  - name: JWT
-    fields:
-    - name: name
-      type: String!
-      description: null
-    - name: email
-      type: String!
-      description: null
-    - name: token
-      type: String!
-      description: null
-    - name: refreshToken
-      type: String!
-      description: null
-  - name: RefreshTokenJWT
-    fields:
-    - name: token
-      type: String!
-      description: null
-  scalars: []
+- table:
+    name: users
+    schema: public

{
  "internal": [
    {
      "definition": {
        "schema": "public",
        "name": "order_status"
      },
      "reason": "Inconsistent object: no such table/view exists in source: \"order_status\"",
      "name": "table order_status in source default",
      "type": "table"
    },
    {
      "definition": {
        "schema": "public",
        "name": "order"
      },
      "reason": "Inconsistent object: no such table/view exists in source: \"order\"",
      "name": "table order in source default",
      "type": "table"
    },
    {
      "definition": {
        "schema": "public",
        "name": "site_admin"
      },
      "reason": "Inconsistent object: no such table/view exists in source: \"site_admin\"",
      "name": "table site_admin in source default",
      "type": "table"
    },
    {
      "definition": {
        "schema": "public",
        "name": "product_review"
      },
      "reason": "Inconsistent object: no such table/view exists in source: \"product_review\"",
      "name": "table product_review in source default",
      "type": "table"
    },
    {
      "definition": {
        "schema": "public",
        "name": "address"
      },
      "reason": "Inconsistent object: no such table/view exists in source: \"address\"",
      "name": "table address in source default",
      "type": "table"
    },
    {
      "definition": {
        "schema": "public",
        "name": "product"
      },
      "reason": "Inconsistent object: no such table/view exists in source: \"product\"",
      "name": "table product in source default",
      "type": "table"
    },
    {
      "definition": {
        "schema": "public",
        "name": "user"
      },
      "reason": "Inconsistent object: no such table/view exists in source: \"user\"",
      "name": "table user in source default",
      "type": "table"
    },
    {
      "definition": {
        "schema": "public",
        "name": "order_product"
      },
      "reason": "Inconsistent object: no such table/view exists in source: \"order_product\"",
      "name": "table order_product in source default",
      "type": "table"
    },
    {
      "definition": {
        "schema": "public",
        "name": "product_category_enum"
      },
      "reason": "Inconsistent object: no such table/view exists in source: \"product_category_enum\"",
      "name": "table product_category_enum in source default",
      "type": "table"
    },
    {
      "definition": {
        "definition": {
          "output_type": "JWT",
          "arguments": [
            {
              "name": "params",
              "type": "AdminLoginInput!",
              "description": null
            }
          ],
          "headers": [],
          "handler": "{{NEXTJS_SERVER_URL}}/api/actions/admin-login",
          "type": "query",
          "timeout": 30,
          "forward_client_headers": false
        },
        "name": "adminLogin",
        "comment": null
      },
      "reason": "Inconsistent object: in action \"adminLogin\"; Value for environment variables not found: NEXTJS_SERVER_URL",
      "name": "action adminLogin",
      "type": "action"
    },
    {
      "definition": {
        "definition": {
          "kind": "synchronous",
          "output_type": "PaymentIntentClientSecret",
          "arguments": [
            {
              "name": "params",
              "type": "CreatePaymentIntentInput!",
              "description": null
            }
          ],
          "headers": [],
          "handler": "{{NEXTJS_SERVER_URL}}/api/actions/create-payment-intent",
          "type": "mutation",
          "timeout": 30,
          "forward_client_headers": false
        },
        "name": "createPaymentIntent",
        "comment": null
      },
      "reason": "Inconsistent object: in action \"createPaymentIntent\"; Value for environment variables not found: NEXTJS_SERVER_URL",
      "name": "action createPaymentIntent",
      "type": "action"
    },
    {
      "definition": {
        "definition": {
          "output_type": "RefreshTokenJWT",
          "arguments": [
            {
              "name": "params",
              "type": "RefreshTokenInput!",
              "description": null
            }
          ],
          "headers": [],
          "handler": "{{NEXTJS_SERVER_URL}}/api/actions/refresh-token",
          "type": "query",
          "timeout": 30,
          "forward_client_headers": false
        },
        "name": "refreshToken",
        "comment": null
      },
      "reason": "Inconsistent object: in action \"refreshToken\"; Value for environment variables not found: NEXTJS_SERVER_URL",
      "name": "action refreshToken",
      "type": "action"
    },
    {
      "definition": {
        "definition": {
          "kind": "synchronous",
          "output_type": "JWT",
          "arguments": [
            {
              "name": "params",
              "type": "SignupInput!",
              "description": null
            }
          ],
          "headers": [],
          "handler": "{{NEXTJS_SERVER_URL}}/api/actions/signup",
          "type": "mutation",
          "timeout": 30,
          "forward_client_headers": false
        },
        "name": "signup",
        "comment": null
      },
      "reason": "Inconsistent object: in action \"signup\"; Value for environment variables not found: NEXTJS_SERVER_URL",
      "name": "action signup",
      "type": "action"
    },
    {
      "definition": {
        "definition": {
          "kind": "synchronous",
          "output_type": "JWT",
          "arguments": [
            {
              "name": "params",
              "type": "LoginInput!",
              "description": null
            }
          ],
          "headers": [],
          "handler": "{{NEXTJS_SERVER_URL}}/api/actions/login",
          "type": "mutation",
          "timeout": 30,
          "forward_client_headers": false
        },
        "name": "login",
        "comment": null
      },
      "reason": "Inconsistent object: in action \"login\"; Value for environment variables not found: NEXTJS_SERVER_URL",
      "name": "action login",
      "type": "action"
    },
    {
      "definition": {
        "definition": {
          "kind": "synchronous",
          "output_type": "JWT",
          "arguments": [
            {
              "name": "params",
              "type": "AdminSignupInput!",
              "description": null
            }
          ],
          "headers": [],
          "handler": "{{NEXTJS_SERVER_URL}}/api/actions/admin-signup",
          "type": "mutation",
          "timeout": 30,
          "forward_client_headers": false
        },
        "name": "adminSignup",
        "comment": null
      },
      "reason": "Inconsistent object: in action \"adminSignup\"; Value for environment variables not found: NEXTJS_SERVER_URL",
      "name": "action adminSignup",
      "type": "action"
    }
  ],
  "path": "$.args",
  "error": "cannot continue due to inconsistent metadata",
  "code": "unexpected"
}

docker-compose-up -d

Did as README said:

$ git clone https://github.com/hasura/hasura-ecommerce
<modify .env.example to have your real Stripe test keys if you want checkout to work>
$ docker-compose up -d
$ cd hasura
<assuming you have Hasura CLI installed>
$ hasura seeds apply 

Visit http://localhost:3000 for Next.js frontend
Visit http://localhost:8060 for Hasura console (admin secret = "my-secret")
Visit http://localhost:9000 for Minio dashboard (login = "minio:minio123")

Got this error :

Executing task: docker-compose -f "docker-compose.yaml" up -d --build <

Traceback (most recent call last):
  File "urllib3/connectionpool.py", line 670, in urlopen
  File "urllib3/connectionpool.py", line 392, in _make_request
  File "http/client.py", line 1255, in request
  File "http/client.py", line 1301, in _send_request
  File "http/client.py", line 1250, in endheaders
  File "http/client.py", line 1010, in _send_output
  File "http/client.py", line 950, in send
  File "docker/transport/unixconn.py", line 43, in connect
FileNotFoundError: [Errno 2] No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "requests/adapters.py", line 439, in send
  File "urllib3/connectionpool.py", line 726, in urlopen
  File "urllib3/util/retry.py", line 410, in increment
  File "urllib3/packages/six.py", line 734, in reraise
  File "urllib3/connectionpool.py", line 670, in urlopen
  File "urllib3/connectionpool.py", line 392, in _make_request
  File "http/client.py", line 1255, in request
  File "http/client.py", line 1301, in _send_request
  File "http/client.py", line 1250, in endheaders
  File "http/client.py", line 1010, in _send_output
  File "http/client.py", line 950, in send
  File "docker/transport/unixconn.py", line 43, in connect
urllib3.exceptions.ProtocolError: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "docker/api/client.py", line 214, in _retrieve_server_version
  File "docker/api/daemon.py", line 181, in version
  File "docker/utils/decorators.py", line 46, in inner
  File "docker/api/client.py", line 237, in _get
  File "requests/sessions.py", line 543, in get
  File "requests/sessions.py", line 530, in request
  File "requests/sessions.py", line 643, in send
  File "requests/adapters.py", line 498, in send
requests.exceptions.ConnectionError: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "docker-compose", line 3, in <module>
  File "compose/cli/main.py", line 81, in main
  File "compose/cli/main.py", line 200, in perform_command
  File "compose/cli/command.py", line 60, in project_from_options
  File "compose/cli/command.py", line 152, in get_project
  File "compose/cli/docker_client.py", line 41, in get_client
  File "compose/cli/docker_client.py", line 170, in docker_client
  File "docker/api/client.py", line 197, in __init__
  File "docker/api/client.py", line 221, in _retrieve_server_version
docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))
[13323] Failed to execute script docker-compose
The terminal process "zsh '-c', 'docker-compose -f "docker-compose.yaml" up -d --build'" terminated with exit code: 255.

Initial users should be seeded with non-null refresh token

When initially running the app and logging in with user "[email protected]" and password "password" as instructed in the Readme, login fails with the error: expecting not null value for field "refreshToken". This is solved by putting a non-null value into the refresh_token field using the hasura console. But a better fix is to amend the seeds.

Missing documentation

The Architecture.md document mentions a file hasura/models/README.md that should have information about "You can scaffold new tables and models as well using a Yaml schema definition and then combine them through the use of some clever make scripts."

This file/folder does not exist.

Is there an alternate means of getting this documentation?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.