Skip to content

Commit

Permalink
Setup API (Hasura) console to version changes in code
Browse files Browse the repository at this point in the history
  • Loading branch information
Charles Bochet committed Jan 31, 2023
1 parent f91f14e commit e72ea96
Show file tree
Hide file tree
Showing 29 changed files with 233 additions and 9 deletions.
38 changes: 30 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Make sure to have the latest Docker and Docker-compose versions installed on you
### Step 2: docker build
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
```
Expand Down Expand Up @@ -49,38 +49,60 @@ Browse Hasura console on http://localhost:8080, go to settings and import metada

## 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.

### Develop

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
docker-compose logs twenty-front -f
make up
make logs container=twenty-front
```

### Open a shell into the container
```
docker-compose exec twenty-front sh
make front-sh
```

### Tests

#### Unit tests:
```
docker-compose exec twenty-front sh -c "npm run test"
make front-test
# coverage
docker-compose exec twenty-front sh -c "npm run coverage"
make front-coverage
```

#### Storybook:
```
docker-compose exec twenty-front sh -c "npm run storybook"
make front-storybook
```

## 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

Expand Down
6 changes: 6 additions & 0 deletions api/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
version: 3
endpoint: http://localhost:8080
metadata_directory: metadata
actions:
kind: synchronous
handler_webhook_baseurl: http://localhost:3000
Empty file added api/metadata/actions.graphql
Empty file.
6 changes: 6 additions & 0 deletions api/metadata/actions.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
actions: []
custom_types:
enums: []
input_objects: []
objects: []
scalars: []
1 change: 1 addition & 0 deletions api/metadata/allow_list.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[]
1 change: 1 addition & 0 deletions api/metadata/api_limits.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
1 change: 1 addition & 0 deletions api/metadata/backend_configs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
1 change: 1 addition & 0 deletions api/metadata/cron_triggers.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[]
9 changes: 9 additions & 0 deletions api/metadata/databases/databases.yaml
Original file line number Diff line number Diff line change
@@ -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 changes: 23 additions & 0 deletions api/metadata/databases/twenty/tables/public_tenants.yaml
Original file line number Diff line number Diff line change
@@ -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 changes: 23 additions & 0 deletions api/metadata/databases/twenty/tables/public_users.yaml
Original file line number Diff line number Diff line change
@@ -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 changes: 2 additions & 0 deletions api/metadata/databases/twenty/tables/tables.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- "!include public_tenants.yaml"
- "!include public_users.yaml"
1 change: 1 addition & 0 deletions api/metadata/graphql_schema_introspection.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
disabled_for_roles: []
1 change: 1 addition & 0 deletions api/metadata/inherited_roles.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[]
1 change: 1 addition & 0 deletions api/metadata/metrics_config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
1 change: 1 addition & 0 deletions api/metadata/network.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
1 change: 1 addition & 0 deletions api/metadata/opentelemetry.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
1 change: 1 addition & 0 deletions api/metadata/query_collections.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[]
1 change: 1 addition & 0 deletions api/metadata/remote_schemas.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[]
1 change: 1 addition & 0 deletions api/metadata/rest_endpoints.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[]
1 change: 1 addition & 0 deletions api/metadata/version.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
version: 3
57 changes: 57 additions & 0 deletions api/migrations/twenty/1675027570991_init/up.sql
Original file line number Diff line number Diff line change
@@ -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;
Empty file.
6 changes: 6 additions & 0 deletions api/seeds/twenty/1675183931547_seed.sql
Original file line number Diff line number Diff line change
@@ -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, '[email protected]', '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, '[email protected]', '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, '[email protected]', '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, '[email protected]', '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 changes: 4 additions & 0 deletions api/seeds/twenty/1675183944004_seed.sql
Original file line number Diff line number Diff line change
@@ -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 changes: 39 additions & 0 deletions infra/dev/Makefile
Original file line number Diff line number Diff line change
@@ -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"
6 changes: 5 additions & 1 deletion infra/dev/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,16 @@ services:
build: ./twenty-api
ports:
- "8080:8080"
- "9695:9695"
- "9693:9693"
volumes:
- ../../api:/api
depends_on:
- "postgres"
restart: always
environment:
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_DEV_MODE: "true"
HASURA_GRAPHQL_ADMIN_SECRET: ${HASURA_GRAPHQL_ADMIN_SECRET}
Expand Down
6 changes: 6 additions & 0 deletions infra/dev/twenty-api/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
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"]
4 changes: 4 additions & 0 deletions infra/prod/twenty-api/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
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"]

0 comments on commit e72ea96

Please sign in to comment.