Skip to content

Commit 447b017

Browse files
authored
mig: add source environments table (#810)
This adds the source environments table that will support source environments feature
1 parent 3552ff0 commit 447b017

File tree

5 files changed

+61
-29
lines changed

5 files changed

+61
-29
lines changed

.mise-tasks/infra/start.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ docker compose "${profile[@]}" up -d || exit 1
1313
until docker compose exec gram-db psql -U "$DB_USER" -d "$DB_NAME" -c "SELECT 1" > /dev/null 2>&1; do
1414
echo "Waiting for databases to be ready..."
1515
sleep 1
16-
done
16+
done

server/database/schema.sql

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ CREATE TABLE IF NOT EXISTS assets (
146146
CREATE TABLE IF NOT EXISTS packages (
147147
id uuid NOT NULL DEFAULT generate_uuidv7(),
148148
name TEXT NOT NULL CHECK (name <> '' AND CHAR_LENGTH(name) <= 100),
149-
149+
150150
title TEXT CHECK (title <> '' AND CHAR_LENGTH(title) <= 100),
151151
summary TEXT CHECK (summary <> '' AND CHAR_LENGTH(summary) <= 80),
152152
description_raw TEXT CHECK (description_raw <> '' AND CHAR_LENGTH(description_raw) <= 10000),
@@ -183,7 +183,7 @@ CREATE TABLE IF NOT EXISTS package_versions (
183183
id uuid NOT NULL DEFAULT generate_uuidv7(),
184184
package_id uuid NOT NULL,
185185
deployment_id uuid NOT NULL,
186-
186+
187187
visibility TEXT NOT NULL CHECK (visibility <> '' AND CHAR_LENGTH(visibility) <= 20),
188188
major BIGINT NOT NULL CHECK (major >= 0 AND major <= 32767),
189189
minor BIGINT NOT NULL CHECK (minor >= 0 AND minor <= 32767),
@@ -428,7 +428,7 @@ CREATE TABLE IF NOT EXISTS fly_apps (
428428
runner_version TEXT NOT NULL,
429429
primary_region TEXT NOT NULL,
430430
status TEXT NOT NULL, -- pending, ready, failed
431-
431+
432432
reaped_at timestamptz, -- when we deleted an app and its resources on fly.io
433433
reap_error TEXT, -- error message if reaping failed
434434

@@ -479,6 +479,23 @@ CREATE TABLE IF NOT EXISTS environment_entries (
479479
CONSTRAINT environments_entries_environment_id_fkey FOREIGN KEY (environment_id) REFERENCES environments (id) ON DELETE CASCADE
480480
);
481481

482+
CREATE TABLE IF NOT EXISTS source_environments (
483+
id uuid NOT NULL DEFAULT generate_uuidv7(),
484+
source_kind TEXT NOT NULL,
485+
source_slug TEXT NOT NULL,
486+
project_id UUID NOT NULL,
487+
environment_id UUID NOT NULL,
488+
489+
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
490+
updated_at timestamptz NOT NULL DEFAULT clock_timestamp(),
491+
492+
CONSTRAINT source_environments_pkey PRIMARY KEY (id),
493+
CONSTRAINT source_environments_environment_id_fkey FOREIGN KEY (environment_id) REFERENCES environments (id) ON DELETE CASCADE,
494+
CONSTRAINT source_environments_project_id_fkey FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
495+
);
496+
497+
CREATE UNIQUE INDEX IF NOT EXISTS source_environments_source_kind_source_slug_idx ON source_environments (project_id, source_kind, source_slug);
498+
482499
CREATE TABLE IF NOT EXISTS custom_domains (
483500
id uuid NOT NULL DEFAULT generate_uuidv7(),
484501
organization_id TEXT NOT NULL,
@@ -491,9 +508,9 @@ CREATE TABLE IF NOT EXISTS custom_domains (
491508
updated_at timestamptz NOT NULL DEFAULT clock_timestamp(),
492509
deleted_at timestamptz,
493510
deleted boolean NOT NULL GENERATED ALWAYS AS (deleted_at IS NOT NULL) stored,
494-
511+
495512
CONSTRAINT custom_domains_pkey PRIMARY KEY (id)
496-
513+
497514
);
498515

499516
CREATE UNIQUE INDEX IF NOT EXISTS custom_domains_domain_key
@@ -508,15 +525,15 @@ WHERE deleted IS FALSE;
508525
CREATE TABLE IF NOT EXISTS external_oauth_server_metadata (
509526
id uuid NOT NULL DEFAULT generate_uuidv7(),
510527
project_id uuid NOT NULL,
511-
528+
512529
slug TEXT NOT NULL CHECK (slug <> '' AND CHAR_LENGTH(slug) <= 100),
513530
metadata JSONB NOT NULL,
514-
531+
515532
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
516533
updated_at timestamptz NOT NULL DEFAULT clock_timestamp(),
517534
deleted_at timestamptz,
518535
deleted boolean NOT NULL GENERATED ALWAYS AS (deleted_at IS NOT NULL) stored,
519-
536+
520537
CONSTRAINT external_oauth_server_metadata_pkey PRIMARY KEY (id),
521538
CONSTRAINT external_oauth_server_metadata_project_id_fkey FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
522539
);
@@ -531,12 +548,12 @@ CREATE TABLE IF NOT EXISTS oauth_proxy_servers (
531548
project_id uuid NOT NULL,
532549

533550
slug TEXT NOT NULL CHECK (slug <> '' AND CHAR_LENGTH(slug) <= 100),
534-
551+
535552
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
536553
updated_at timestamptz NOT NULL DEFAULT clock_timestamp(),
537554
deleted_at timestamptz,
538555
deleted boolean NOT NULL GENERATED ALWAYS AS (deleted_at IS NOT NULL) stored,
539-
556+
540557
CONSTRAINT oauth_proxy_servers_pkey PRIMARY KEY (id),
541558
CONSTRAINT oauth_proxy_servers_project_id_fkey FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
542559
);
@@ -550,27 +567,27 @@ CREATE TABLE IF NOT EXISTS oauth_proxy_providers (
550567
id uuid NOT NULL DEFAULT generate_uuidv7(),
551568
project_id uuid NOT NULL,
552569
oauth_proxy_server_id uuid NOT NULL,
553-
570+
554571
slug TEXT NOT NULL CHECK (slug <> '' AND CHAR_LENGTH(slug) <= 100),
555572
authorization_endpoint TEXT NOT NULL,
556573
token_endpoint TEXT NOT NULL,
557574
registration_endpoint TEXT,
558-
575+
559576
-- OAuth server capabilities
560577
scopes_supported TEXT[] DEFAULT ARRAY[]::TEXT[],
561578
response_types_supported TEXT[] DEFAULT ARRAY[]::TEXT[],
562579
response_modes_supported TEXT[] DEFAULT ARRAY[]::TEXT[],
563580
grant_types_supported TEXT[] DEFAULT ARRAY[]::TEXT[],
564581
token_endpoint_auth_methods_supported TEXT[] DEFAULT ARRAY[]::TEXT[],
565-
582+
566583
security_key_names TEXT[] DEFAULT ARRAY[]::TEXT[],
567584
secrets JSONB,
568-
585+
569586
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
570587
updated_at timestamptz NOT NULL DEFAULT clock_timestamp(),
571588
deleted_at timestamptz,
572589
deleted boolean NOT NULL GENERATED ALWAYS AS (deleted_at IS NOT NULL) stored,
573-
590+
574591
CONSTRAINT oauth_proxy_providers_pkey PRIMARY KEY (id),
575592
CONSTRAINT oauth_proxy_providers_project_id_fkey FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE,
576593
CONSTRAINT oauth_proxy_providers_oauth_proxy_server_id_fkey FOREIGN KEY (oauth_proxy_server_id) REFERENCES oauth_proxy_servers (id) ON DELETE CASCADE
@@ -649,7 +666,7 @@ CREATE INDEX IF NOT EXISTS toolset_versions_toolset_id_version_idx ON toolset_ve
649666

650667
CREATE TABLE IF NOT EXISTS http_security (
651668
id uuid NOT NULL DEFAULT generate_uuidv7(),
652-
669+
653670
deployment_id uuid NOT NULL,
654671
project_id uuid,
655672
openapiv3_document_id uuid,
@@ -664,37 +681,37 @@ CREATE TABLE IF NOT EXISTS http_security (
664681
oauth_flows JSONB,
665682

666683
env_variables TEXT[] DEFAULT ARRAY[]::TEXT[],
667-
684+
668685
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
669686
updated_at timestamptz NOT NULL DEFAULT clock_timestamp(),
670687
deleted_at timestamptz,
671688
deleted boolean NOT NULL GENERATED ALWAYS AS (deleted_at IS NOT NULL) stored,
672-
689+
673690
CONSTRAINT http_security_pkey PRIMARY KEY (id),
674691
CONSTRAINT http_security_deployment_id_fkey FOREIGN KEY (deployment_id) REFERENCES deployments (id) ON DELETE CASCADE,
675692
CONSTRAINT http_security_project_id_fkey FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE,
676693
CONSTRAINT http_security_openapiv3_document_id_fkey FOREIGN key (openapiv3_document_id) REFERENCES deployments_openapiv3_assets (id) ON DELETE RESTRICT
677694
);
678695

679-
CREATE INDEX IF NOT EXISTS http_security_deleted_idx
696+
CREATE INDEX IF NOT EXISTS http_security_deleted_idx
680697
ON http_security (deleted);
681698

682-
CREATE INDEX IF NOT EXISTS http_security_type_scheme_idx
699+
CREATE INDEX IF NOT EXISTS http_security_type_scheme_idx
683700
ON http_security (type, scheme);
684701

685702
CREATE TABLE IF NOT EXISTS openrouter_api_keys (
686703
organization_id TEXT NOT NULL,
687-
704+
688705
key TEXT NOT NULL,
689706
key_hash TEXT NOT NULL,
690707
monthly_credits BIGINT NOT NULL DEFAULT 0,
691708
disabled BOOLEAN NOT NULL DEFAULT FALSE,
692-
709+
693710
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
694711
updated_at timestamptz NOT NULL DEFAULT clock_timestamp(),
695712
deleted_at timestamptz,
696713
deleted boolean NOT NULL GENERATED ALWAYS AS (deleted_at IS NOT NULL) stored,
697-
714+
698715
CONSTRAINT openrouter_api_keys_pkey PRIMARY KEY (organization_id)
699716
);
700717

@@ -710,15 +727,15 @@ CREATE TABLE IF NOT EXISTS chats (
710727
updated_at timestamptz NOT NULL DEFAULT clock_timestamp(),
711728
deleted_at timestamptz,
712729
deleted boolean NOT NULL GENERATED ALWAYS AS (deleted_at IS NOT NULL) stored,
713-
730+
714731
CONSTRAINT chats_pkey PRIMARY KEY (id),
715732
CONSTRAINT chats_project_id_fkey FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
716733
);
717734

718735
-- Create the chat_messages table to store individual messages in each chat
719736
CREATE TABLE IF NOT EXISTS chat_messages (
720737
id uuid NOT NULL DEFAULT generate_uuidv7(),
721-
738+
722739
chat_id uuid NOT NULL,
723740
project_id uuid,
724741
role TEXT NOT NULL CHECK (role IN ('user', 'assistant', 'system', 'tool')),
@@ -732,9 +749,9 @@ CREATE TABLE IF NOT EXISTS chat_messages (
732749
prompt_tokens BIGINT NOT NULL DEFAULT 0,
733750
completion_tokens BIGINT NOT NULL DEFAULT 0,
734751
total_tokens BIGINT NOT NULL DEFAULT 0,
735-
752+
736753
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
737-
754+
738755
CONSTRAINT chat_messages_pkey PRIMARY KEY (id),
739756
CONSTRAINT chat_messages_chat_id_fkey FOREIGN KEY (chat_id) REFERENCES chats(id) ON DELETE CASCADE
740757
);

server/internal/database/models.go

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-- Create "source_environments" table
2+
CREATE TABLE "source_environments" ("id" uuid NOT NULL DEFAULT generate_uuidv7(), "source_kind" text NOT NULL, "source_slug" text NOT NULL, "project_id" uuid NOT NULL, "environment_id" uuid NOT NULL, "created_at" timestamptz NOT NULL DEFAULT clock_timestamp(), "updated_at" timestamptz NOT NULL DEFAULT clock_timestamp(), PRIMARY KEY ("id"), CONSTRAINT "source_environments_environment_id_fkey" FOREIGN KEY ("environment_id") REFERENCES "environments" ("id") ON UPDATE NO ACTION ON DELETE CASCADE, CONSTRAINT "source_environments_project_id_fkey" FOREIGN KEY ("project_id") REFERENCES "projects" ("id") ON UPDATE NO ACTION ON DELETE CASCADE);
3+
-- Create index "source_environments_source_kind_source_slug_idx" to table: "source_environments"
4+
CREATE UNIQUE INDEX "source_environments_source_kind_source_slug_idx" ON "source_environments" ("project_id", "source_kind", "source_slug");

server/migrations/atlas.sum

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
h1:PCVupIl2TsqOQIgZK7nhJwr3FzxoBIYF60VTUTSY6TY=
1+
h1:NR+eA6rWJ+oZ6EqJ2IM4kt93yCR93MbrljcgxYJ+oIw=
22
20250502122425_initial-tables.sql h1:Hu3O60/bB4fjZpUay8FzyOjw6vngp087zU+U/wVKn7k=
33
20250502130852_initial-indexes.sql h1:oYbnwi9y9PPTqu7uVbSPSALhCY8XF3rv03nDfG4b7mo=
44
20250502154250_relax-http-security-fields.sql h1:0+OYIDq7IHmx7CP5BChVwfpF2rOSrRDxnqawXio2EVo=
@@ -68,3 +68,4 @@ h1:PCVupIl2TsqOQIgZK7nhJwr3FzxoBIYF60VTUTSY6TY=
6868
20251111165847_add-toolset-embedding-migration.sql h1:1cuNc8gF7U8EKK7agVmvP3FdS6+U36oSwVc8G6yyzHg=
6969
20251111180235_fly-apps-reap-state.sql h1:7ml5z97oDOZwEf26Lc57uA/SA7Q7dOktOmaxv1IZ9Ck=
7070
20251111230942_tool_selection_mode.sql h1:GLV/qHo+WIcnUgmIAyBgGrRCTK/Nk64PmNX4pDDNX0o=
71+
20251112014731_add-source-environments-table.sql h1:+4SVvZtDxr+Ssk+b0YQ/IHxjDRBRzZdlQYl/1lYDPx0=

0 commit comments

Comments
 (0)