Merge pull request #20 from twentyhq/charles-bochet-hasura-init
Setup API (Hasura) console to version changes in code
This commit is contained in:
38
README.md
38
README.md
@ -21,7 +21,7 @@ Make sure to have the latest Docker and Docker-compose versions installed on you
|
|||||||
### Step 2: docker build
|
### Step 2: docker build
|
||||||
Build docker containers.
|
Build docker containers.
|
||||||
|
|
||||||
The whole setup/development experience is happening in `infra/dev` folder. Make sure to be in this folder:
|
The whole setup experience is happening in `infra/dev` folder. Make sure to be in this folder:
|
||||||
```
|
```
|
||||||
cd infra/dev
|
cd infra/dev
|
||||||
```
|
```
|
||||||
@ -49,38 +49,60 @@ Browse Hasura console on http://localhost:8080, go to settings and import metada
|
|||||||
|
|
||||||
## Developping on Frontend
|
## Developping on Frontend
|
||||||
|
|
||||||
|
The whole development experience is happening in `infra/dev` folder.
|
||||||
|
```
|
||||||
|
cd infra/dev
|
||||||
|
```
|
||||||
|
|
||||||
The development FE server is running on docker up and is exposing the `twenty-front` on port http://localhost:3001. As you modify the `/front` folder on your computer, this folder is synced with your `twenty-front` container and the frontend application is automatically refreshed.
|
The development FE server is running on docker up and is exposing the `twenty-front` on port http://localhost:3001. As you modify the `/front` folder on your computer, this folder is synced with your `twenty-front` container and the frontend application is automatically refreshed.
|
||||||
|
|
||||||
### Develop
|
### Develop
|
||||||
|
|
||||||
Recommended: as you modify frontend code, here is how to access `twenty-front` server logs in order to debug / watch typescript issues:
|
Recommended: as you modify frontend code, here is how to access `twenty-front` server logs in order to debug / watch typescript issues:
|
||||||
```
|
```
|
||||||
docker-compose up
|
make up
|
||||||
docker-compose logs twenty-front -f
|
make logs container=twenty-front
|
||||||
```
|
```
|
||||||
|
|
||||||
### Open a shell into the container
|
### Open a shell into the container
|
||||||
```
|
```
|
||||||
docker-compose exec twenty-front sh
|
make front-sh
|
||||||
```
|
```
|
||||||
|
|
||||||
### Tests
|
### Tests
|
||||||
|
|
||||||
#### Unit tests:
|
#### Unit tests:
|
||||||
```
|
```
|
||||||
docker-compose exec twenty-front sh -c "npm run test"
|
make front-test
|
||||||
# coverage
|
# coverage
|
||||||
docker-compose exec twenty-front sh -c "npm run coverage"
|
make front-coverage
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Storybook:
|
#### Storybook:
|
||||||
```
|
```
|
||||||
docker-compose exec twenty-front sh -c "npm run storybook"
|
make front-storybook
|
||||||
```
|
```
|
||||||
|
|
||||||
## Developping on API
|
## Developping on API
|
||||||
|
|
||||||
The API is a Hasura instance which is a no-code container. To modify API behavior, you'll need to connect to Hasura console on: http://localhost:8080/console
|
The whole development experience is happening in `infra/dev` folder.
|
||||||
|
```
|
||||||
|
cd infra/dev
|
||||||
|
```
|
||||||
|
|
||||||
|
The API is a Hasura instance which is a no-code container.
|
||||||
|
To modify API behavior, you'll need to connect to run Hasura console through the CLI
|
||||||
|
```
|
||||||
|
make api-console
|
||||||
|
```
|
||||||
|
|
||||||
|
Once your local changes in the console are finished you can export them into the filesystem (in order to version them, and deploy them to other environments), depending on your needs:
|
||||||
|
|
||||||
|
```
|
||||||
|
make api-make-migration name=my_migration_name
|
||||||
|
make api-make-metadata
|
||||||
|
make api-make-seeds
|
||||||
|
```
|
||||||
|
|
||||||
## Developping on server
|
## Developping on server
|
||||||
|
|
||||||
|
|||||||
6
api/config.yaml
Normal file
6
api/config.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
version: 3
|
||||||
|
endpoint: http://localhost:8080
|
||||||
|
metadata_directory: metadata
|
||||||
|
actions:
|
||||||
|
kind: synchronous
|
||||||
|
handler_webhook_baseurl: http://localhost:3000
|
||||||
0
api/metadata/actions.graphql
Normal file
0
api/metadata/actions.graphql
Normal file
6
api/metadata/actions.yaml
Normal file
6
api/metadata/actions.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
actions: []
|
||||||
|
custom_types:
|
||||||
|
enums: []
|
||||||
|
input_objects: []
|
||||||
|
objects: []
|
||||||
|
scalars: []
|
||||||
1
api/metadata/allow_list.yaml
Normal file
1
api/metadata/allow_list.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
1
api/metadata/api_limits.yaml
Normal file
1
api/metadata/api_limits.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
api/metadata/backend_configs.yaml
Normal file
1
api/metadata/backend_configs.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
api/metadata/cron_triggers.yaml
Normal file
1
api/metadata/cron_triggers.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
9
api/metadata/databases/databases.yaml
Normal file
9
api/metadata/databases/databases.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
- name: twenty
|
||||||
|
kind: postgres
|
||||||
|
configuration:
|
||||||
|
connection_info:
|
||||||
|
database_url:
|
||||||
|
from_env: HASURA_GRAPHQL_PG_DATABASE_URL
|
||||||
|
isolation_level: read-committed
|
||||||
|
use_prepared_statements: false
|
||||||
|
tables: "!include twenty/tables/tables.yaml"
|
||||||
23
api/metadata/databases/twenty/tables/public_tenants.yaml
Normal file
23
api/metadata/databases/twenty/tables/public_tenants.yaml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
table:
|
||||||
|
name: tenants
|
||||||
|
schema: public
|
||||||
|
array_relationships:
|
||||||
|
- name: users
|
||||||
|
using:
|
||||||
|
foreign_key_constraint_on:
|
||||||
|
column: tenant_id
|
||||||
|
table:
|
||||||
|
name: users
|
||||||
|
schema: public
|
||||||
|
select_permissions:
|
||||||
|
- role: user
|
||||||
|
permission:
|
||||||
|
columns:
|
||||||
|
- id
|
||||||
|
- name
|
||||||
|
- uuid
|
||||||
|
- email_domain
|
||||||
|
filter:
|
||||||
|
users:
|
||||||
|
email:
|
||||||
|
_eq: X-Hasura-User-Email
|
||||||
23
api/metadata/databases/twenty/tables/public_users.yaml
Normal file
23
api/metadata/databases/twenty/tables/public_users.yaml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
table:
|
||||||
|
name: users
|
||||||
|
schema: public
|
||||||
|
object_relationships:
|
||||||
|
- name: tenant
|
||||||
|
using:
|
||||||
|
foreign_key_constraint_on: tenant_id
|
||||||
|
select_permissions:
|
||||||
|
- role: user
|
||||||
|
permission:
|
||||||
|
columns:
|
||||||
|
- id
|
||||||
|
- tenant_id
|
||||||
|
- email
|
||||||
|
- first_name
|
||||||
|
- last_name
|
||||||
|
- created_at
|
||||||
|
- updated_at
|
||||||
|
filter:
|
||||||
|
tenant:
|
||||||
|
users:
|
||||||
|
email:
|
||||||
|
_eq: X-Hasura-User-Email
|
||||||
2
api/metadata/databases/twenty/tables/tables.yaml
Normal file
2
api/metadata/databases/twenty/tables/tables.yaml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
- "!include public_tenants.yaml"
|
||||||
|
- "!include public_users.yaml"
|
||||||
1
api/metadata/graphql_schema_introspection.yaml
Normal file
1
api/metadata/graphql_schema_introspection.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
disabled_for_roles: []
|
||||||
1
api/metadata/inherited_roles.yaml
Normal file
1
api/metadata/inherited_roles.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
1
api/metadata/metrics_config.yaml
Normal file
1
api/metadata/metrics_config.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
api/metadata/network.yaml
Normal file
1
api/metadata/network.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
api/metadata/opentelemetry.yaml
Normal file
1
api/metadata/opentelemetry.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1
api/metadata/query_collections.yaml
Normal file
1
api/metadata/query_collections.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
1
api/metadata/remote_schemas.yaml
Normal file
1
api/metadata/remote_schemas.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
1
api/metadata/rest_endpoints.yaml
Normal file
1
api/metadata/rest_endpoints.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
1
api/metadata/version.yaml
Normal file
1
api/metadata/version.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
version: 3
|
||||||
57
api/migrations/twenty/1675027570991_init/up.sql
Normal file
57
api/migrations/twenty/1675027570991_init/up.sql
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
SET check_function_bodies = false;
|
||||||
|
CREATE FUNCTION public.set_current_timestamp_updated_at() RETURNS trigger
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
_new record;
|
||||||
|
BEGIN
|
||||||
|
_new := NEW;
|
||||||
|
_new."updated_at" = NOW();
|
||||||
|
RETURN _new;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
CREATE TABLE public.tenants (
|
||||||
|
id integer NOT NULL,
|
||||||
|
name text NOT NULL,
|
||||||
|
uuid uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||||
|
email_domain text NOT NULL
|
||||||
|
);
|
||||||
|
CREATE SEQUENCE public.tenants_id_seq
|
||||||
|
AS integer
|
||||||
|
START WITH 1
|
||||||
|
INCREMENT BY 1
|
||||||
|
NO MINVALUE
|
||||||
|
NO MAXVALUE
|
||||||
|
CACHE 1;
|
||||||
|
ALTER SEQUENCE public.tenants_id_seq OWNED BY public.tenants.id;
|
||||||
|
CREATE TABLE public.users (
|
||||||
|
id integer NOT NULL,
|
||||||
|
email text NOT NULL,
|
||||||
|
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||||
|
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||||
|
first_name text NOT NULL,
|
||||||
|
last_name text NOT NULL,
|
||||||
|
tenant_id integer NOT NULL
|
||||||
|
);
|
||||||
|
CREATE SEQUENCE public.users_id_seq
|
||||||
|
AS integer
|
||||||
|
START WITH 1
|
||||||
|
INCREMENT BY 1
|
||||||
|
NO MINVALUE
|
||||||
|
NO MAXVALUE
|
||||||
|
CACHE 1;
|
||||||
|
ALTER SEQUENCE public.users_id_seq OWNED BY public.users.id;
|
||||||
|
ALTER TABLE ONLY public.tenants ALTER COLUMN id SET DEFAULT nextval('public.tenants_id_seq'::regclass);
|
||||||
|
ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass);
|
||||||
|
ALTER TABLE ONLY public.tenants
|
||||||
|
ADD CONSTRAINT tenants_email_domain_key UNIQUE (email_domain);
|
||||||
|
ALTER TABLE ONLY public.tenants
|
||||||
|
ADD CONSTRAINT tenants_pkey PRIMARY KEY (id);
|
||||||
|
ALTER TABLE ONLY public.tenants
|
||||||
|
ADD CONSTRAINT tenants_uuid_key UNIQUE (uuid);
|
||||||
|
ALTER TABLE ONLY public.users
|
||||||
|
ADD CONSTRAINT users_pkey PRIMARY KEY (id);
|
||||||
|
CREATE TRIGGER set_public_users_updated_at BEFORE UPDATE ON public.users FOR EACH ROW EXECUTE FUNCTION public.set_current_timestamp_updated_at();
|
||||||
|
COMMENT ON TRIGGER set_public_users_updated_at ON public.users IS 'trigger to set value of column "updated_at" to current timestamp on row update';
|
||||||
|
ALTER TABLE ONLY public.users
|
||||||
|
ADD CONSTRAINT users_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON UPDATE RESTRICT ON DELETE RESTRICT;
|
||||||
0
api/seeds/twenty/1675183813451_seed.sql
Normal file
0
api/seeds/twenty/1675183813451_seed.sql
Normal file
6
api/seeds/twenty/1675183931547_seed.sql
Normal file
6
api/seeds/twenty/1675183931547_seed.sql
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
SET check_function_bodies = false;
|
||||||
|
INSERT INTO public.users (id, email, created_at, updated_at, first_name, last_name, tenant_id) VALUES (1, 'charles@twenty.com', '2023-01-31 16:46:43.02666+00', '2023-01-31 16:46:43.02666+00', 'Charles', 'Bochet', 1);
|
||||||
|
INSERT INTO public.users (id, email, created_at, updated_at, first_name, last_name, tenant_id) VALUES (2, 'charles@ouihelp.twenty.com', '2023-01-31 16:46:49.72368+00', '2023-01-31 16:46:49.72368+00', 'Charles', 'Bochet', 2);
|
||||||
|
INSERT INTO public.users (id, email, created_at, updated_at, first_name, last_name, tenant_id) VALUES (3, 'felix@twenty.com', '2023-01-31 16:47:06.516066+00', '2023-01-31 16:47:06.516066+00', 'Félix', 'Malfait', 1);
|
||||||
|
INSERT INTO public.users (id, email, created_at, updated_at, first_name, last_name, tenant_id) VALUES (4, 'felix@ouihelp.twenty.com', '2023-01-31 16:47:13.684386+00', '2023-01-31 16:47:13.684386+00', 'Félix', 'Malfait', 2);
|
||||||
|
SELECT pg_catalog.setval('public.users_id_seq', 4, true);
|
||||||
4
api/seeds/twenty/1675183944004_seed.sql
Normal file
4
api/seeds/twenty/1675183944004_seed.sql
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
SET check_function_bodies = false;
|
||||||
|
INSERT INTO public.tenants (id, name, uuid, email_domain) VALUES (1, 'pilot', '8375f69d-47bd-4baa-a3c1-f8aaef8d8b2b', 'twenty.com');
|
||||||
|
INSERT INTO public.tenants (id, name, uuid, email_domain) VALUES (2, 'ouihelp', 'c71becee-2cd6-4b31-827e-6cbef4e66879', 'ouihelp.twenty.com');
|
||||||
|
SELECT pg_catalog.setval('public.tenants_id_seq', 2, true);
|
||||||
39
infra/dev/Makefile
Normal file
39
infra/dev/Makefile
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
up: ##
|
||||||
|
@docker-compose up -d
|
||||||
|
|
||||||
|
logs: ##
|
||||||
|
@docker-compose logs $(container) -f
|
||||||
|
|
||||||
|
api-sh: ##
|
||||||
|
@docker-compose exec twenty-api bash
|
||||||
|
|
||||||
|
api-console: ##
|
||||||
|
@docker-compose exec twenty-api bash -c "cd /api; \
|
||||||
|
socat TCP-LISTEN:8080,fork TCP:twenty-api:8080 & \
|
||||||
|
socat TCP-LISTEN:9695,fork,reuseaddr,bind=twenty-api TCP:127.0.0.1:9695 & \
|
||||||
|
socat TCP-LISTEN:9693,fork,reuseaddr,bind=twenty-api TCP:127.0.0.1:9693 & \
|
||||||
|
hasura console --log-level DEBUG --address "127.0.0.1" --no-browser || exit 1"
|
||||||
|
|
||||||
|
api-make-seed: ##
|
||||||
|
@docker-compose exec twenty-api bash -c "cd /api; \
|
||||||
|
hasura seeds create seed --from-table $(table)"
|
||||||
|
|
||||||
|
api-make-migrations: ##
|
||||||
|
@docker-compose exec twenty-api bash -c "cd /api; \
|
||||||
|
hasura migrate create $(name)"
|
||||||
|
|
||||||
|
api-make-metadata: ##
|
||||||
|
@docker-compose exec twenty-api bash -c "cd /api; \
|
||||||
|
hasura metadata export"
|
||||||
|
|
||||||
|
front-sh: ##
|
||||||
|
@docker-compose exec twenty-front bash
|
||||||
|
|
||||||
|
front-test: ##
|
||||||
|
@docker-compose exec twenty-front sh -c "npm run test"
|
||||||
|
|
||||||
|
front-coverage: ##
|
||||||
|
@docker-compose exec twenty-front sh -c "npm run coverage"
|
||||||
|
|
||||||
|
front-storybook: ##
|
||||||
|
@docker-compose exec twenty-front sh -c "npm run storybook"
|
||||||
@ -24,12 +24,16 @@ services:
|
|||||||
build: ./twenty-api
|
build: ./twenty-api
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
|
- "9695:9695"
|
||||||
|
- "9693:9693"
|
||||||
|
volumes:
|
||||||
|
- ../../api:/api
|
||||||
depends_on:
|
depends_on:
|
||||||
- "postgres"
|
- "postgres"
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
HASURA_GRAPHQL_METADATA_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/hasura
|
HASURA_GRAPHQL_METADATA_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/hasura
|
||||||
PG_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/twenty
|
HASURA_GRAPHQL_PG_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/twenty
|
||||||
HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
|
HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
|
||||||
HASURA_GRAPHQL_DEV_MODE: "true"
|
HASURA_GRAPHQL_DEV_MODE: "true"
|
||||||
HASURA_GRAPHQL_ADMIN_SECRET: ${HASURA_GRAPHQL_ADMIN_SECRET}
|
HASURA_GRAPHQL_ADMIN_SECRET: ${HASURA_GRAPHQL_ADMIN_SECRET}
|
||||||
|
|||||||
@ -1,3 +1,9 @@
|
|||||||
FROM hasura/graphql-engine:latest as api
|
FROM hasura/graphql-engine:latest as api
|
||||||
|
|
||||||
|
RUN apt-get update
|
||||||
|
RUN apt-get install -y curl
|
||||||
|
RUN apt-get install -y socat
|
||||||
|
RUN apt-get install -y vim
|
||||||
|
RUN curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash
|
||||||
|
|
||||||
CMD ["sh", "-c", "graphql-engine serve"]
|
CMD ["sh", "-c", "graphql-engine serve"]
|
||||||
|
|||||||
@ -1,3 +1,7 @@
|
|||||||
FROM hasura/graphql-engine:latest as api
|
FROM hasura/graphql-engine:latest as api
|
||||||
|
|
||||||
|
RUN apt-get update
|
||||||
|
RUN apt-get install -y curl
|
||||||
|
RUN curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash
|
||||||
|
|
||||||
CMD ["sh", "-c", "graphql-engine serve"]
|
CMD ["sh", "-c", "graphql-engine serve"]
|
||||||
|
|||||||
Reference in New Issue
Block a user