diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 80ee328e98b63..b9d782486eb89 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -1539,6 +1539,26 @@ CREATE TABLE tailnet_tunnels ( updated_at timestamp with time zone NOT NULL ); +CREATE TABLE task_workspace_apps ( + task_id uuid NOT NULL, + workspace_build_id uuid NOT NULL, + workspace_agent_id uuid NOT NULL, + workspace_app_id uuid NOT NULL +); + +CREATE TABLE tasks ( + id uuid NOT NULL, + organization_id uuid NOT NULL, + owner_id uuid NOT NULL, + name text NOT NULL, + workspace_id uuid, + template_version_id uuid NOT NULL, + template_parameters jsonb DEFAULT '{}'::jsonb NOT NULL, + prompt text NOT NULL, + created_at timestamp with time zone NOT NULL, + deleted_at timestamp with time zone +); + CREATE TABLE telemetry_items ( key text NOT NULL, value text NOT NULL, @@ -2717,6 +2737,9 @@ ALTER TABLE ONLY tailnet_peers ALTER TABLE ONLY tailnet_tunnels ADD CONSTRAINT tailnet_tunnels_pkey PRIMARY KEY (coordinator_id, src_id, dst_id); +ALTER TABLE ONLY tasks + ADD CONSTRAINT tasks_pkey PRIMARY KEY (id); + ALTER TABLE ONLY telemetry_items ADD CONSTRAINT telemetry_items_pkey PRIMARY KEY (key); @@ -3230,6 +3253,30 @@ ALTER TABLE ONLY tailnet_peers ALTER TABLE ONLY tailnet_tunnels ADD CONSTRAINT tailnet_tunnels_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; +ALTER TABLE ONLY task_workspace_apps + ADD CONSTRAINT task_workspace_apps_task_id_fkey FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE; + +ALTER TABLE ONLY task_workspace_apps + ADD CONSTRAINT task_workspace_apps_workspace_agent_id_fkey FOREIGN KEY (workspace_agent_id) REFERENCES workspace_agents(id) ON DELETE CASCADE; + +ALTER TABLE ONLY task_workspace_apps + ADD CONSTRAINT task_workspace_apps_workspace_app_id_fkey FOREIGN KEY (workspace_app_id) REFERENCES workspace_apps(id) ON DELETE CASCADE; + +ALTER TABLE ONLY task_workspace_apps + ADD CONSTRAINT task_workspace_apps_workspace_build_id_fkey FOREIGN KEY (workspace_build_id) REFERENCES workspace_builds(id) ON DELETE CASCADE; + +ALTER TABLE ONLY tasks + ADD CONSTRAINT tasks_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE; + +ALTER TABLE ONLY tasks + ADD CONSTRAINT tasks_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE; + +ALTER TABLE ONLY tasks + ADD CONSTRAINT tasks_template_version_id_fkey FOREIGN KEY (template_version_id) REFERENCES template_versions(id) ON DELETE CASCADE; + +ALTER TABLE ONLY tasks + ADD CONSTRAINT tasks_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE; + ALTER TABLE ONLY template_version_parameters ADD CONSTRAINT template_version_parameters_template_version_id_fkey FOREIGN KEY (template_version_id) REFERENCES template_versions(id) ON DELETE CASCADE; diff --git a/coderd/database/foreign_key_constraint.go b/coderd/database/foreign_key_constraint.go index 33aa8edd69032..8497ac2bcd4b4 100644 --- a/coderd/database/foreign_key_constraint.go +++ b/coderd/database/foreign_key_constraint.go @@ -45,6 +45,14 @@ const ( ForeignKeyTailnetClientsCoordinatorID ForeignKeyConstraint = "tailnet_clients_coordinator_id_fkey" // ALTER TABLE ONLY tailnet_clients ADD CONSTRAINT tailnet_clients_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; ForeignKeyTailnetPeersCoordinatorID ForeignKeyConstraint = "tailnet_peers_coordinator_id_fkey" // ALTER TABLE ONLY tailnet_peers ADD CONSTRAINT tailnet_peers_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; ForeignKeyTailnetTunnelsCoordinatorID ForeignKeyConstraint = "tailnet_tunnels_coordinator_id_fkey" // ALTER TABLE ONLY tailnet_tunnels ADD CONSTRAINT tailnet_tunnels_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; + ForeignKeyTaskWorkspaceAppsTaskID ForeignKeyConstraint = "task_workspace_apps_task_id_fkey" // ALTER TABLE ONLY task_workspace_apps ADD CONSTRAINT task_workspace_apps_task_id_fkey FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE; + ForeignKeyTaskWorkspaceAppsWorkspaceAgentID ForeignKeyConstraint = "task_workspace_apps_workspace_agent_id_fkey" // ALTER TABLE ONLY task_workspace_apps ADD CONSTRAINT task_workspace_apps_workspace_agent_id_fkey FOREIGN KEY (workspace_agent_id) REFERENCES workspace_agents(id) ON DELETE CASCADE; + ForeignKeyTaskWorkspaceAppsWorkspaceAppID ForeignKeyConstraint = "task_workspace_apps_workspace_app_id_fkey" // ALTER TABLE ONLY task_workspace_apps ADD CONSTRAINT task_workspace_apps_workspace_app_id_fkey FOREIGN KEY (workspace_app_id) REFERENCES workspace_apps(id) ON DELETE CASCADE; + ForeignKeyTaskWorkspaceAppsWorkspaceBuildID ForeignKeyConstraint = "task_workspace_apps_workspace_build_id_fkey" // ALTER TABLE ONLY task_workspace_apps ADD CONSTRAINT task_workspace_apps_workspace_build_id_fkey FOREIGN KEY (workspace_build_id) REFERENCES workspace_builds(id) ON DELETE CASCADE; + ForeignKeyTasksOrganizationID ForeignKeyConstraint = "tasks_organization_id_fkey" // ALTER TABLE ONLY tasks ADD CONSTRAINT tasks_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE; + ForeignKeyTasksOwnerID ForeignKeyConstraint = "tasks_owner_id_fkey" // ALTER TABLE ONLY tasks ADD CONSTRAINT tasks_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE; + ForeignKeyTasksTemplateVersionID ForeignKeyConstraint = "tasks_template_version_id_fkey" // ALTER TABLE ONLY tasks ADD CONSTRAINT tasks_template_version_id_fkey FOREIGN KEY (template_version_id) REFERENCES template_versions(id) ON DELETE CASCADE; + ForeignKeyTasksWorkspaceID ForeignKeyConstraint = "tasks_workspace_id_fkey" // ALTER TABLE ONLY tasks ADD CONSTRAINT tasks_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE; ForeignKeyTemplateVersionParametersTemplateVersionID ForeignKeyConstraint = "template_version_parameters_template_version_id_fkey" // ALTER TABLE ONLY template_version_parameters ADD CONSTRAINT template_version_parameters_template_version_id_fkey FOREIGN KEY (template_version_id) REFERENCES template_versions(id) ON DELETE CASCADE; ForeignKeyTemplateVersionPresetParametTemplateVersionPresetID ForeignKeyConstraint = "template_version_preset_paramet_template_version_preset_id_fkey" // ALTER TABLE ONLY template_version_preset_parameters ADD CONSTRAINT template_version_preset_paramet_template_version_preset_id_fkey FOREIGN KEY (template_version_preset_id) REFERENCES template_version_presets(id) ON DELETE CASCADE; ForeignKeyTemplateVersionPresetPrebuildSchedulesPresetID ForeignKeyConstraint = "template_version_preset_prebuild_schedules_preset_id_fkey" // ALTER TABLE ONLY template_version_preset_prebuild_schedules ADD CONSTRAINT template_version_preset_prebuild_schedules_preset_id_fkey FOREIGN KEY (preset_id) REFERENCES template_version_presets(id) ON DELETE CASCADE; diff --git a/coderd/database/migrations/000366_create_tasks_data_model.down.sql b/coderd/database/migrations/000366_create_tasks_data_model.down.sql new file mode 100644 index 0000000000000..6467f5263ad77 --- /dev/null +++ b/coderd/database/migrations/000366_create_tasks_data_model.down.sql @@ -0,0 +1,2 @@ +DROP TABLE task_workspace_apps; +DROP TABLE tasks; diff --git a/coderd/database/migrations/000366_create_tasks_data_model.up.sql b/coderd/database/migrations/000366_create_tasks_data_model.up.sql new file mode 100644 index 0000000000000..a2dad356a4cb8 --- /dev/null +++ b/coderd/database/migrations/000366_create_tasks_data_model.up.sql @@ -0,0 +1,19 @@ +CREATE TABLE tasks ( + id UUID NOT NULL PRIMARY KEY, + organization_id UUID NOT NULL REFERENCES organizations (id) ON DELETE CASCADE, + owner_id UUID NOT NULL REFERENCES users (id) ON DELETE CASCADE, + name TEXT NOT NULL, + workspace_id UUID REFERENCES workspaces (id) ON DELETE CASCADE, + template_version_id UUID NOT NULL REFERENCES template_versions (id) ON DELETE CASCADE, + template_parameters JSONB NOT NULL DEFAULT '{}'::JSONB, + prompt TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL, + deleted_at TIMESTAMPTZ +); + +CREATE TABLE task_workspace_apps ( + task_id UUID NOT NULL REFERENCES tasks (id) ON DELETE CASCADE, + workspace_build_id UUID NOT NULL REFERENCES workspace_builds (id) ON DELETE CASCADE, + workspace_agent_id UUID NOT NULL REFERENCES workspace_agents (id) ON DELETE CASCADE, + workspace_app_id UUID NOT NULL REFERENCES workspace_apps (id) ON DELETE CASCADE +); diff --git a/coderd/database/migrations/testdata/fixtures/000366_create_tasks_data_model.up.sql b/coderd/database/migrations/testdata/fixtures/000366_create_tasks_data_model.up.sql new file mode 100644 index 0000000000000..b96ffc771d01e --- /dev/null +++ b/coderd/database/migrations/testdata/fixtures/000366_create_tasks_data_model.up.sql @@ -0,0 +1,19 @@ +INSERT INTO public.tasks VALUES ( + 'f5a1c3e4-8b2d-4f6a-9d7e-2a8b5c9e1f3d', -- id + 'bb640d07-ca8a-4869-b6bc-ae61ebb2fda1', -- organization_id + '30095c71-380b-457a-8995-97b8ee6e5307', -- owner_id + 'Test Task 1', -- name + '3a9a1feb-e89d-457c-9d53-ac751b198ebe', -- workspace_id + '920baba5-4c64-4686-8b7d-d1bef5683eae', -- template_version_id + '{}'::JSONB, -- template_parameters + 'Create a React component for tasks', -- prompt + '2024-11-02 13:10:00.000000+02', -- created_at + NULL -- deleted_at +) ON CONFLICT DO NOTHING; + +INSERT INTO public.task_workspace_apps VALUES ( + 'f5a1c3e4-8b2d-4f6a-9d7e-2a8b5c9e1f3d', -- task_id + 'a8c0b8c5-c9a8-4f33-93a4-8142e6858244', -- workspace_build_id + '8fa17bbd-c48c-44c7-91ae-d4acbc755fad', -- workspace_agent_id + 'a47965a2-0a25-4810-8cc9-d283c86ab34c' -- workspace_app_id +) ON CONFLICT DO NOTHING; diff --git a/coderd/database/models.go b/coderd/database/models.go index 99107713b080b..625730ebb79a3 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -3500,6 +3500,26 @@ type TailnetTunnel struct { UpdatedAt time.Time `db:"updated_at" json:"updated_at"` } +type Task struct { + ID uuid.UUID `db:"id" json:"id"` + OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` + OwnerID uuid.UUID `db:"owner_id" json:"owner_id"` + Name string `db:"name" json:"name"` + WorkspaceID uuid.NullUUID `db:"workspace_id" json:"workspace_id"` + TemplateVersionID uuid.UUID `db:"template_version_id" json:"template_version_id"` + TemplateParameters json.RawMessage `db:"template_parameters" json:"template_parameters"` + Prompt string `db:"prompt" json:"prompt"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + DeletedAt sql.NullTime `db:"deleted_at" json:"deleted_at"` +} + +type TaskWorkspaceApp struct { + TaskID uuid.UUID `db:"task_id" json:"task_id"` + WorkspaceBuildID uuid.UUID `db:"workspace_build_id" json:"workspace_build_id"` + WorkspaceAgentID uuid.UUID `db:"workspace_agent_id" json:"workspace_agent_id"` + WorkspaceAppID uuid.UUID `db:"workspace_app_id" json:"workspace_app_id"` +} + type TelemetryItem struct { Key string `db:"key" json:"key"` Value string `db:"value" json:"value"` diff --git a/coderd/database/unique_constraint.go b/coderd/database/unique_constraint.go index ddb83a339f0cf..02982edc517fb 100644 --- a/coderd/database/unique_constraint.go +++ b/coderd/database/unique_constraint.go @@ -55,6 +55,7 @@ const ( UniqueTailnetCoordinatorsPkey UniqueConstraint = "tailnet_coordinators_pkey" // ALTER TABLE ONLY tailnet_coordinators ADD CONSTRAINT tailnet_coordinators_pkey PRIMARY KEY (id); UniqueTailnetPeersPkey UniqueConstraint = "tailnet_peers_pkey" // ALTER TABLE ONLY tailnet_peers ADD CONSTRAINT tailnet_peers_pkey PRIMARY KEY (id, coordinator_id); UniqueTailnetTunnelsPkey UniqueConstraint = "tailnet_tunnels_pkey" // ALTER TABLE ONLY tailnet_tunnels ADD CONSTRAINT tailnet_tunnels_pkey PRIMARY KEY (coordinator_id, src_id, dst_id); + UniqueTasksPkey UniqueConstraint = "tasks_pkey" // ALTER TABLE ONLY tasks ADD CONSTRAINT tasks_pkey PRIMARY KEY (id); UniqueTelemetryItemsPkey UniqueConstraint = "telemetry_items_pkey" // ALTER TABLE ONLY telemetry_items ADD CONSTRAINT telemetry_items_pkey PRIMARY KEY (key); UniqueTemplateUsageStatsPkey UniqueConstraint = "template_usage_stats_pkey" // ALTER TABLE ONLY template_usage_stats ADD CONSTRAINT template_usage_stats_pkey PRIMARY KEY (start_time, template_id, user_id); UniqueTemplateVersionParametersTemplateVersionIDNameKey UniqueConstraint = "template_version_parameters_template_version_id_name_key" // ALTER TABLE ONLY template_version_parameters ADD CONSTRAINT template_version_parameters_template_version_id_name_key UNIQUE (template_version_id, name);