diff --git a/.github/workflows/coder.yaml b/.github/workflows/coder.yaml index 8c1b36cc92..366553bcc0 100644 --- a/.github/workflows/coder.yaml +++ b/.github/workflows/coder.yaml @@ -89,6 +89,7 @@ jobs: - run: go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26 - run: go install storj.io/drpc/cmd/protoc-gen-go-drpc@v0.0.26 + - run: go install golang.org/x/tools/cmd/goimports@latest - run: "make --output-sync -j gen" - run: ./scripts/check_unstaged.sh diff --git a/Makefile b/Makefile index 9d6e66a1b8..91baebe6cc 100644 --- a/Makefile +++ b/Makefile @@ -15,10 +15,8 @@ coderd/database/dump.sql: $(wildcard coderd/database/migrations/*.sql) .PHONY: coderd/database/dump.sql # Generates Go code for querying the database. -coderd/database/generate: fmt/sql coderd/database/dump.sql coderd/database/query.sql - cd coderd/database && sqlc generate && rm db_tmp.go - cd coderd/database && gofmt -w -r 'Querier -> querier' *.go - cd coderd/database && gofmt -w -r 'Queries -> sqlQuerier' *.go +coderd/database/generate: fmt/sql coderd/database/dump.sql $(wildcard coderd/database/queries/*.sql) + coderd/database/generate.sh .PHONY: coderd/database/generate fmt/prettier: @@ -31,13 +29,18 @@ else endif .PHONY: fmt/prettier -fmt/sql: ./coderd/database/query.sql - npx sql-formatter \ - --language postgresql \ - --lines-between-queries 2 \ - ./coderd/database/query.sql \ - --output ./coderd/database/query.sql - sed -i 's/@ /@/g' ./coderd/database/query.sql +fmt/sql: $(wildcard coderd/database/queries/*.sql) + # TODO: this is slightly slow + for fi in coderd/database/queries/*.sql; do \ + npx sql-formatter \ + --language postgresql \ + --lines-between-queries 2 \ + --tab-indent \ + $$fi \ + --output $$fi; \ + done + + sed -i 's/@ /@/g' ./coderd/database/queries/*.sql fmt: fmt/prettier fmt/sql .PHONY: fmt diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 64f3525a3c..3ee32b5f98 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -362,10 +362,14 @@ CREATE UNIQUE INDEX idx_organization_name ON organizations USING btree (name); CREATE UNIQUE INDEX idx_organization_name_lower ON organizations USING btree (lower(name)); +CREATE UNIQUE INDEX idx_projects_name_lower ON projects USING btree (lower((name)::text)); + CREATE UNIQUE INDEX idx_users_email ON users USING btree (email); CREATE UNIQUE INDEX idx_users_username ON users USING btree (username); +CREATE UNIQUE INDEX idx_workspaces_name_lower ON workspaces USING btree (lower((name)::text)); + CREATE UNIQUE INDEX projects_organization_id_name_idx ON projects USING btree (organization_id, name) WHERE (deleted = false); CREATE UNIQUE INDEX users_username_lower_idx ON users USING btree (lower(username)); diff --git a/coderd/database/generate.sh b/coderd/database/generate.sh new file mode 100755 index 0000000000..7e5eb96574 --- /dev/null +++ b/coderd/database/generate.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +# This script turns many *.sql.go files into a single queries.sql.go file. This +# is due to sqlc's behavior when using multiple sql files to output them to +# multiple Go files. We decided it would be cleaner to move these to a single +# file for readability. We should probably contribute the option to do this +# upstream instead, because this is quite janky. + +set -euo pipefail + +cd "$(dirname "$0")" + +sqlc generate + +first=true +for fi in queries/*.sql.go; do + # Find the last line from the imports section and add 1. + cut=$(grep -n ')' "$fi" | head -n 1 | cut -d: -f1) + cut=$((cut + 1)) + + # Copy the header from the first file only, ignoring the source comment. + if $first; then + head -n 4 < "$fi" | grep -v "source" > queries.sql.go + first=false + fi + + # Append the file past the imports section into queries.sql.go. + tail -n "+$cut" < "$fi" >> queries.sql.go +done + +# Remove temporary go files. +rm -f queries/*.go + +# Fix struct/interface names. +gofmt -w -r 'Querier -> querier' -- *.go +gofmt -w -r 'Queries -> sqlQuerier' -- *.go + +# Ensure correct imports exist. Modules must all be downloaded so we get correct +# suggestions. +go mod download +goimports -w queries.sql.go diff --git a/coderd/database/migrations/000002_projects.up.sql b/coderd/database/migrations/000002_projects.up.sql index b9b778ea69..220a076c1f 100644 --- a/coderd/database/migrations/000002_projects.up.sql +++ b/coderd/database/migrations/000002_projects.up.sql @@ -33,6 +33,7 @@ CREATE TABLE projects ( -- Enforces no active projects have the same name. CREATE UNIQUE INDEX ON projects (organization_id, name) WHERE deleted = FALSE; +CREATE UNIQUE INDEX idx_projects_name_lower ON projects USING btree (lower(name)); -- Project Versions store historical project data. When a Project Version is imported, -- an "import" job is queued to parse parameters. A Project Version diff --git a/coderd/database/migrations/000003_workspaces.up.sql b/coderd/database/migrations/000003_workspaces.up.sql index 3f8393c9cb..517a33b186 100644 --- a/coderd/database/migrations/000003_workspaces.up.sql +++ b/coderd/database/migrations/000003_workspaces.up.sql @@ -12,7 +12,8 @@ CREATE TABLE workspaces ( ); -- Enforces no active workspaces have the same name. -CREATE UNIQUE INDEX ON workspaces (owner_id, name) WHERE deleted = FALSE; +CREATE UNIQUE INDEX ON workspaces USING btree (owner_id, name) WHERE deleted = FALSE; +CREATE UNIQUE INDEX idx_workspaces_name_lower ON workspaces USING btree (lower(name)); CREATE TYPE workspace_transition AS ENUM ( 'start', diff --git a/coderd/database/query.sql.go b/coderd/database/queries.sql.go similarity index 81% rename from coderd/database/query.sql.go rename to coderd/database/queries.sql.go index f0572bc561..49f0669143 100644 --- a/coderd/database/query.sql.go +++ b/coderd/database/queries.sql.go @@ -1,5 +1,4 @@ // Code generated by sqlc. DO NOT EDIT. -// source: query.sql package database @@ -14,89 +13,15 @@ import ( "github.com/tabbed/pqtype" ) -const acquireProvisionerJob = `-- name: AcquireProvisionerJob :one -UPDATE - provisioner_jobs -SET - started_at = $1, - updated_at = $1, - worker_id = $2 -WHERE - id = ( - SELECT - id - FROM - provisioner_jobs AS nested - WHERE - nested.started_at IS NULL - AND nested.canceled_at IS NULL - AND nested.completed_at IS NULL - AND nested.provisioner = ANY($3 :: provisioner_type [ ]) - ORDER BY - nested.created_at FOR - UPDATE - SKIP LOCKED - LIMIT - 1 - ) RETURNING id, created_at, updated_at, started_at, canceled_at, completed_at, error, organization_id, initiator_id, provisioner, storage_method, storage_source, type, input, worker_id -` - -type AcquireProvisionerJobParams struct { - StartedAt sql.NullTime `db:"started_at" json:"started_at"` - WorkerID uuid.NullUUID `db:"worker_id" json:"worker_id"` - Types []ProvisionerType `db:"types" json:"types"` -} - -// Acquires the lock for a single job that isn't started, completed, -// canceled, and that matches an array of provisioner types. -// -// SKIP LOCKED is used to jump over locked rows. This prevents -// multiple provisioners from acquiring the same jobs. See: -// https://www.postgresql.org/docs/9.5/sql-select.html#SQL-FOR-UPDATE-SHARE -func (q *sqlQuerier) AcquireProvisionerJob(ctx context.Context, arg AcquireProvisionerJobParams) (ProvisionerJob, error) { - row := q.db.QueryRowContext(ctx, acquireProvisionerJob, arg.StartedAt, arg.WorkerID, pq.Array(arg.Types)) - var i ProvisionerJob - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.StartedAt, - &i.CanceledAt, - &i.CompletedAt, - &i.Error, - &i.OrganizationID, - &i.InitiatorID, - &i.Provisioner, - &i.StorageMethod, - &i.StorageSource, - &i.Type, - &i.Input, - &i.WorkerID, - ) - return i, err -} - -const deleteParameterValueByID = `-- name: DeleteParameterValueByID :exec -DELETE FROM - parameter_values -WHERE - id = $1 -` - -func (q *sqlQuerier) DeleteParameterValueByID(ctx context.Context, id uuid.UUID) error { - _, err := q.db.ExecContext(ctx, deleteParameterValueByID, id) - return err -} - const getAPIKeyByID = `-- name: GetAPIKeyByID :one SELECT - id, hashed_secret, user_id, application, name, last_used, expires_at, created_at, updated_at, login_type, oidc_access_token, oidc_refresh_token, oidc_id_token, oidc_expiry, devurl_token + id, hashed_secret, user_id, application, name, last_used, expires_at, created_at, updated_at, login_type, oidc_access_token, oidc_refresh_token, oidc_id_token, oidc_expiry, devurl_token FROM - api_keys + api_keys WHERE - id = $1 + id = $1 LIMIT - 1 + 1 ` func (q *sqlQuerier) GetAPIKeyByID(ctx context.Context, id string) (APIKey, error) { @@ -122,1432 +47,43 @@ func (q *sqlQuerier) GetAPIKeyByID(ctx context.Context, id string) (APIKey, erro return i, err } -const getFileByHash = `-- name: GetFileByHash :one -SELECT - hash, created_at, created_by, mimetype, data -FROM - files -WHERE - hash = $1 -LIMIT - 1 -` - -func (q *sqlQuerier) GetFileByHash(ctx context.Context, hash string) (File, error) { - row := q.db.QueryRowContext(ctx, getFileByHash, hash) - var i File - err := row.Scan( - &i.Hash, - &i.CreatedAt, - &i.CreatedBy, - &i.Mimetype, - &i.Data, - ) - return i, err -} - -const getOrganizationByID = `-- name: GetOrganizationByID :one -SELECT - id, name, description, created_at, updated_at -FROM - organizations -WHERE - id = $1 -` - -func (q *sqlQuerier) GetOrganizationByID(ctx context.Context, id uuid.UUID) (Organization, error) { - row := q.db.QueryRowContext(ctx, getOrganizationByID, id) - var i Organization - err := row.Scan( - &i.ID, - &i.Name, - &i.Description, - &i.CreatedAt, - &i.UpdatedAt, - ) - return i, err -} - -const getOrganizationByName = `-- name: GetOrganizationByName :one -SELECT - id, name, description, created_at, updated_at -FROM - organizations -WHERE - LOWER(name) = LOWER($1) -LIMIT - 1 -` - -func (q *sqlQuerier) GetOrganizationByName(ctx context.Context, name string) (Organization, error) { - row := q.db.QueryRowContext(ctx, getOrganizationByName, name) - var i Organization - err := row.Scan( - &i.ID, - &i.Name, - &i.Description, - &i.CreatedAt, - &i.UpdatedAt, - ) - return i, err -} - -const getOrganizationMemberByUserID = `-- name: GetOrganizationMemberByUserID :one -SELECT - user_id, organization_id, created_at, updated_at, roles -FROM - organization_members -WHERE - organization_id = $1 - AND user_id = $2 -LIMIT - 1 -` - -type GetOrganizationMemberByUserIDParams struct { - OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` - UserID uuid.UUID `db:"user_id" json:"user_id"` -} - -func (q *sqlQuerier) GetOrganizationMemberByUserID(ctx context.Context, arg GetOrganizationMemberByUserIDParams) (OrganizationMember, error) { - row := q.db.QueryRowContext(ctx, getOrganizationMemberByUserID, arg.OrganizationID, arg.UserID) - var i OrganizationMember - err := row.Scan( - &i.UserID, - &i.OrganizationID, - &i.CreatedAt, - &i.UpdatedAt, - pq.Array(&i.Roles), - ) - return i, err -} - -const getOrganizationsByUserID = `-- name: GetOrganizationsByUserID :many -SELECT - id, name, description, created_at, updated_at -FROM - organizations -WHERE - id = ( - SELECT - organization_id - FROM - organization_members - WHERE - user_id = $1 - ) -` - -func (q *sqlQuerier) GetOrganizationsByUserID(ctx context.Context, userID uuid.UUID) ([]Organization, error) { - rows, err := q.db.QueryContext(ctx, getOrganizationsByUserID, userID) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Organization - for rows.Next() { - var i Organization - if err := rows.Scan( - &i.ID, - &i.Name, - &i.Description, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getParameterSchemasByJobID = `-- name: GetParameterSchemasByJobID :many -SELECT - id, created_at, job_id, name, description, default_source_scheme, default_source_value, allow_override_source, default_destination_scheme, allow_override_destination, default_refresh, redisplay_value, validation_error, validation_condition, validation_type_system, validation_value_type -FROM - parameter_schemas -WHERE - job_id = $1 -` - -func (q *sqlQuerier) GetParameterSchemasByJobID(ctx context.Context, jobID uuid.UUID) ([]ParameterSchema, error) { - rows, err := q.db.QueryContext(ctx, getParameterSchemasByJobID, jobID) - if err != nil { - return nil, err - } - defer rows.Close() - var items []ParameterSchema - for rows.Next() { - var i ParameterSchema - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.JobID, - &i.Name, - &i.Description, - &i.DefaultSourceScheme, - &i.DefaultSourceValue, - &i.AllowOverrideSource, - &i.DefaultDestinationScheme, - &i.AllowOverrideDestination, - &i.DefaultRefresh, - &i.RedisplayValue, - &i.ValidationError, - &i.ValidationCondition, - &i.ValidationTypeSystem, - &i.ValidationValueType, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getParameterValueByScopeAndName = `-- name: GetParameterValueByScopeAndName :one -SELECT - id, created_at, updated_at, scope, scope_id, name, source_scheme, source_value, destination_scheme -FROM - parameter_values -WHERE - scope = $1 - AND scope_id = $2 - AND name = $3 -LIMIT - 1 -` - -type GetParameterValueByScopeAndNameParams struct { - Scope ParameterScope `db:"scope" json:"scope"` - ScopeID uuid.UUID `db:"scope_id" json:"scope_id"` - Name string `db:"name" json:"name"` -} - -func (q *sqlQuerier) GetParameterValueByScopeAndName(ctx context.Context, arg GetParameterValueByScopeAndNameParams) (ParameterValue, error) { - row := q.db.QueryRowContext(ctx, getParameterValueByScopeAndName, arg.Scope, arg.ScopeID, arg.Name) - var i ParameterValue - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.Scope, - &i.ScopeID, - &i.Name, - &i.SourceScheme, - &i.SourceValue, - &i.DestinationScheme, - ) - return i, err -} - -const getParameterValuesByScope = `-- name: GetParameterValuesByScope :many -SELECT - id, created_at, updated_at, scope, scope_id, name, source_scheme, source_value, destination_scheme -FROM - parameter_values -WHERE - scope = $1 - AND scope_id = $2 -` - -type GetParameterValuesByScopeParams struct { - Scope ParameterScope `db:"scope" json:"scope"` - ScopeID uuid.UUID `db:"scope_id" json:"scope_id"` -} - -func (q *sqlQuerier) GetParameterValuesByScope(ctx context.Context, arg GetParameterValuesByScopeParams) ([]ParameterValue, error) { - rows, err := q.db.QueryContext(ctx, getParameterValuesByScope, arg.Scope, arg.ScopeID) - if err != nil { - return nil, err - } - defer rows.Close() - var items []ParameterValue - for rows.Next() { - var i ParameterValue - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.Scope, - &i.ScopeID, - &i.Name, - &i.SourceScheme, - &i.SourceValue, - &i.DestinationScheme, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getProjectByID = `-- name: GetProjectByID :one -SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id -FROM - projects -WHERE - id = $1 -LIMIT - 1 -` - -func (q *sqlQuerier) GetProjectByID(ctx context.Context, id uuid.UUID) (Project, error) { - row := q.db.QueryRowContext(ctx, getProjectByID, id) - var i Project - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OrganizationID, - &i.Deleted, - &i.Name, - &i.Provisioner, - &i.ActiveVersionID, - ) - return i, err -} - -const getProjectByOrganizationAndName = `-- name: GetProjectByOrganizationAndName :one -SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id -FROM - projects -WHERE - organization_id = $1 - AND deleted = $2 - AND LOWER(name) = LOWER($3) -LIMIT - 1 -` - -type GetProjectByOrganizationAndNameParams struct { - OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` - Deleted bool `db:"deleted" json:"deleted"` - Name string `db:"name" json:"name"` -} - -func (q *sqlQuerier) GetProjectByOrganizationAndName(ctx context.Context, arg GetProjectByOrganizationAndNameParams) (Project, error) { - row := q.db.QueryRowContext(ctx, getProjectByOrganizationAndName, arg.OrganizationID, arg.Deleted, arg.Name) - var i Project - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OrganizationID, - &i.Deleted, - &i.Name, - &i.Provisioner, - &i.ActiveVersionID, - ) - return i, err -} - -const getProjectVersionByID = `-- name: GetProjectVersionByID :one -SELECT - id, project_id, organization_id, created_at, updated_at, name, description, job_id -FROM - project_versions -WHERE - id = $1 -` - -func (q *sqlQuerier) GetProjectVersionByID(ctx context.Context, id uuid.UUID) (ProjectVersion, error) { - row := q.db.QueryRowContext(ctx, getProjectVersionByID, id) - var i ProjectVersion - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.OrganizationID, - &i.CreatedAt, - &i.UpdatedAt, - &i.Name, - &i.Description, - &i.JobID, - ) - return i, err -} - -const getProjectVersionByJobID = `-- name: GetProjectVersionByJobID :one -SELECT - id, project_id, organization_id, created_at, updated_at, name, description, job_id -FROM - project_versions -WHERE - job_id = $1 -` - -func (q *sqlQuerier) GetProjectVersionByJobID(ctx context.Context, jobID uuid.UUID) (ProjectVersion, error) { - row := q.db.QueryRowContext(ctx, getProjectVersionByJobID, jobID) - var i ProjectVersion - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.OrganizationID, - &i.CreatedAt, - &i.UpdatedAt, - &i.Name, - &i.Description, - &i.JobID, - ) - return i, err -} - -const getProjectVersionByProjectIDAndName = `-- name: GetProjectVersionByProjectIDAndName :one -SELECT - id, project_id, organization_id, created_at, updated_at, name, description, job_id -FROM - project_versions -WHERE - project_id = $1 - AND name = $2 -` - -type GetProjectVersionByProjectIDAndNameParams struct { - ProjectID uuid.NullUUID `db:"project_id" json:"project_id"` - Name string `db:"name" json:"name"` -} - -func (q *sqlQuerier) GetProjectVersionByProjectIDAndName(ctx context.Context, arg GetProjectVersionByProjectIDAndNameParams) (ProjectVersion, error) { - row := q.db.QueryRowContext(ctx, getProjectVersionByProjectIDAndName, arg.ProjectID, arg.Name) - var i ProjectVersion - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.OrganizationID, - &i.CreatedAt, - &i.UpdatedAt, - &i.Name, - &i.Description, - &i.JobID, - ) - return i, err -} - -const getProjectVersionsByProjectID = `-- name: GetProjectVersionsByProjectID :many -SELECT - id, project_id, organization_id, created_at, updated_at, name, description, job_id -FROM - project_versions -WHERE - project_id = $1 :: uuid -` - -func (q *sqlQuerier) GetProjectVersionsByProjectID(ctx context.Context, dollar_1 uuid.UUID) ([]ProjectVersion, error) { - rows, err := q.db.QueryContext(ctx, getProjectVersionsByProjectID, dollar_1) - if err != nil { - return nil, err - } - defer rows.Close() - var items []ProjectVersion - for rows.Next() { - var i ProjectVersion - if err := rows.Scan( - &i.ID, - &i.ProjectID, - &i.OrganizationID, - &i.CreatedAt, - &i.UpdatedAt, - &i.Name, - &i.Description, - &i.JobID, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getProjectsByIDs = `-- name: GetProjectsByIDs :many -SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id -FROM - projects -WHERE - id = ANY($1 :: uuid [ ]) -` - -func (q *sqlQuerier) GetProjectsByIDs(ctx context.Context, ids []uuid.UUID) ([]Project, error) { - rows, err := q.db.QueryContext(ctx, getProjectsByIDs, pq.Array(ids)) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Project - for rows.Next() { - var i Project - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OrganizationID, - &i.Deleted, - &i.Name, - &i.Provisioner, - &i.ActiveVersionID, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getProjectsByOrganization = `-- name: GetProjectsByOrganization :many -SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id -FROM - projects -WHERE - organization_id = $1 - AND deleted = $2 -` - -type GetProjectsByOrganizationParams struct { - OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` - Deleted bool `db:"deleted" json:"deleted"` -} - -func (q *sqlQuerier) GetProjectsByOrganization(ctx context.Context, arg GetProjectsByOrganizationParams) ([]Project, error) { - rows, err := q.db.QueryContext(ctx, getProjectsByOrganization, arg.OrganizationID, arg.Deleted) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Project - for rows.Next() { - var i Project - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OrganizationID, - &i.Deleted, - &i.Name, - &i.Provisioner, - &i.ActiveVersionID, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getProvisionerDaemonByID = `-- name: GetProvisionerDaemonByID :one -SELECT - id, created_at, updated_at, organization_id, name, provisioners -FROM - provisioner_daemons -WHERE - id = $1 -` - -func (q *sqlQuerier) GetProvisionerDaemonByID(ctx context.Context, id uuid.UUID) (ProvisionerDaemon, error) { - row := q.db.QueryRowContext(ctx, getProvisionerDaemonByID, id) - var i ProvisionerDaemon - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OrganizationID, - &i.Name, - pq.Array(&i.Provisioners), - ) - return i, err -} - -const getProvisionerDaemons = `-- name: GetProvisionerDaemons :many -SELECT - id, created_at, updated_at, organization_id, name, provisioners -FROM - provisioner_daemons -` - -func (q *sqlQuerier) GetProvisionerDaemons(ctx context.Context) ([]ProvisionerDaemon, error) { - rows, err := q.db.QueryContext(ctx, getProvisionerDaemons) - if err != nil { - return nil, err - } - defer rows.Close() - var items []ProvisionerDaemon - for rows.Next() { - var i ProvisionerDaemon - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OrganizationID, - &i.Name, - pq.Array(&i.Provisioners), - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getProvisionerJobByID = `-- name: GetProvisionerJobByID :one -SELECT - id, created_at, updated_at, started_at, canceled_at, completed_at, error, organization_id, initiator_id, provisioner, storage_method, storage_source, type, input, worker_id -FROM - provisioner_jobs -WHERE - id = $1 -` - -func (q *sqlQuerier) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (ProvisionerJob, error) { - row := q.db.QueryRowContext(ctx, getProvisionerJobByID, id) - var i ProvisionerJob - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.StartedAt, - &i.CanceledAt, - &i.CompletedAt, - &i.Error, - &i.OrganizationID, - &i.InitiatorID, - &i.Provisioner, - &i.StorageMethod, - &i.StorageSource, - &i.Type, - &i.Input, - &i.WorkerID, - ) - return i, err -} - -const getProvisionerJobsByIDs = `-- name: GetProvisionerJobsByIDs :many -SELECT - id, created_at, updated_at, started_at, canceled_at, completed_at, error, organization_id, initiator_id, provisioner, storage_method, storage_source, type, input, worker_id -FROM - provisioner_jobs -WHERE - id = ANY($1 :: uuid [ ]) -` - -func (q *sqlQuerier) GetProvisionerJobsByIDs(ctx context.Context, ids []uuid.UUID) ([]ProvisionerJob, error) { - rows, err := q.db.QueryContext(ctx, getProvisionerJobsByIDs, pq.Array(ids)) - if err != nil { - return nil, err - } - defer rows.Close() - var items []ProvisionerJob - for rows.Next() { - var i ProvisionerJob - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.StartedAt, - &i.CanceledAt, - &i.CompletedAt, - &i.Error, - &i.OrganizationID, - &i.InitiatorID, - &i.Provisioner, - &i.StorageMethod, - &i.StorageSource, - &i.Type, - &i.Input, - &i.WorkerID, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getProvisionerLogsByIDBetween = `-- name: GetProvisionerLogsByIDBetween :many -SELECT - id, job_id, created_at, source, level, stage, output -FROM - provisioner_job_logs -WHERE - job_id = $1 - AND ( - created_at >= $2 - OR created_at <= $3 - ) -ORDER BY - created_at -` - -type GetProvisionerLogsByIDBetweenParams struct { - JobID uuid.UUID `db:"job_id" json:"job_id"` - CreatedAfter time.Time `db:"created_after" json:"created_after"` - CreatedBefore time.Time `db:"created_before" json:"created_before"` -} - -func (q *sqlQuerier) GetProvisionerLogsByIDBetween(ctx context.Context, arg GetProvisionerLogsByIDBetweenParams) ([]ProvisionerJobLog, error) { - rows, err := q.db.QueryContext(ctx, getProvisionerLogsByIDBetween, arg.JobID, arg.CreatedAfter, arg.CreatedBefore) - if err != nil { - return nil, err - } - defer rows.Close() - var items []ProvisionerJobLog - for rows.Next() { - var i ProvisionerJobLog - if err := rows.Scan( - &i.ID, - &i.JobID, - &i.CreatedAt, - &i.Source, - &i.Level, - &i.Stage, - &i.Output, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getUserByEmailOrUsername = `-- name: GetUserByEmailOrUsername :one -SELECT - id, email, name, revoked, login_type, hashed_password, created_at, updated_at, username -FROM - users -WHERE - LOWER(username) = LOWER($1) - OR email = $2 -LIMIT - 1 -` - -type GetUserByEmailOrUsernameParams struct { - Username string `db:"username" json:"username"` - Email string `db:"email" json:"email"` -} - -func (q *sqlQuerier) GetUserByEmailOrUsername(ctx context.Context, arg GetUserByEmailOrUsernameParams) (User, error) { - row := q.db.QueryRowContext(ctx, getUserByEmailOrUsername, arg.Username, arg.Email) - var i User - err := row.Scan( - &i.ID, - &i.Email, - &i.Name, - &i.Revoked, - &i.LoginType, - &i.HashedPassword, - &i.CreatedAt, - &i.UpdatedAt, - &i.Username, - ) - return i, err -} - -const getUserByID = `-- name: GetUserByID :one -SELECT - id, email, name, revoked, login_type, hashed_password, created_at, updated_at, username -FROM - users -WHERE - id = $1 -LIMIT - 1 -` - -func (q *sqlQuerier) GetUserByID(ctx context.Context, id uuid.UUID) (User, error) { - row := q.db.QueryRowContext(ctx, getUserByID, id) - var i User - err := row.Scan( - &i.ID, - &i.Email, - &i.Name, - &i.Revoked, - &i.LoginType, - &i.HashedPassword, - &i.CreatedAt, - &i.UpdatedAt, - &i.Username, - ) - return i, err -} - -const getUserCount = `-- name: GetUserCount :one -SELECT - COUNT(*) -FROM - users -` - -func (q *sqlQuerier) GetUserCount(ctx context.Context) (int64, error) { - row := q.db.QueryRowContext(ctx, getUserCount) - var count int64 - err := row.Scan(&count) - return count, err -} - -const getWorkspaceAgentByAuthToken = `-- name: GetWorkspaceAgentByAuthToken :one -SELECT - id, created_at, updated_at, first_connected_at, last_connected_at, disconnected_at, resource_id, auth_token, auth_instance_id, environment_variables, startup_script, instance_metadata, resource_metadata -FROM - workspace_agents -WHERE - auth_token = $1 -ORDER BY - created_at DESC -` - -func (q *sqlQuerier) GetWorkspaceAgentByAuthToken(ctx context.Context, authToken uuid.UUID) (WorkspaceAgent, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceAgentByAuthToken, authToken) - var i WorkspaceAgent - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.FirstConnectedAt, - &i.LastConnectedAt, - &i.DisconnectedAt, - &i.ResourceID, - &i.AuthToken, - &i.AuthInstanceID, - &i.EnvironmentVariables, - &i.StartupScript, - &i.InstanceMetadata, - &i.ResourceMetadata, - ) - return i, err -} - -const getWorkspaceAgentByInstanceID = `-- name: GetWorkspaceAgentByInstanceID :one -SELECT - id, created_at, updated_at, first_connected_at, last_connected_at, disconnected_at, resource_id, auth_token, auth_instance_id, environment_variables, startup_script, instance_metadata, resource_metadata -FROM - workspace_agents -WHERE - auth_instance_id = $1 :: text -ORDER BY - created_at DESC -` - -func (q *sqlQuerier) GetWorkspaceAgentByInstanceID(ctx context.Context, authInstanceID string) (WorkspaceAgent, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceAgentByInstanceID, authInstanceID) - var i WorkspaceAgent - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.FirstConnectedAt, - &i.LastConnectedAt, - &i.DisconnectedAt, - &i.ResourceID, - &i.AuthToken, - &i.AuthInstanceID, - &i.EnvironmentVariables, - &i.StartupScript, - &i.InstanceMetadata, - &i.ResourceMetadata, - ) - return i, err -} - -const getWorkspaceAgentByResourceID = `-- name: GetWorkspaceAgentByResourceID :one -SELECT - id, created_at, updated_at, first_connected_at, last_connected_at, disconnected_at, resource_id, auth_token, auth_instance_id, environment_variables, startup_script, instance_metadata, resource_metadata -FROM - workspace_agents -WHERE - resource_id = $1 -` - -func (q *sqlQuerier) GetWorkspaceAgentByResourceID(ctx context.Context, resourceID uuid.UUID) (WorkspaceAgent, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceAgentByResourceID, resourceID) - var i WorkspaceAgent - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.FirstConnectedAt, - &i.LastConnectedAt, - &i.DisconnectedAt, - &i.ResourceID, - &i.AuthToken, - &i.AuthInstanceID, - &i.EnvironmentVariables, - &i.StartupScript, - &i.InstanceMetadata, - &i.ResourceMetadata, - ) - return i, err -} - -const getWorkspaceBuildByID = `-- name: GetWorkspaceBuildByID :one -SELECT - id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id -FROM - workspace_builds -WHERE - id = $1 -LIMIT - 1 -` - -func (q *sqlQuerier) GetWorkspaceBuildByID(ctx context.Context, id uuid.UUID) (WorkspaceBuild, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceBuildByID, id) - var i WorkspaceBuild - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.WorkspaceID, - &i.ProjectVersionID, - &i.Name, - &i.BeforeID, - &i.AfterID, - &i.Transition, - &i.InitiatorID, - &i.ProvisionerState, - &i.JobID, - ) - return i, err -} - -const getWorkspaceBuildByJobID = `-- name: GetWorkspaceBuildByJobID :one -SELECT - id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id -FROM - workspace_builds -WHERE - job_id = $1 -LIMIT - 1 -` - -func (q *sqlQuerier) GetWorkspaceBuildByJobID(ctx context.Context, jobID uuid.UUID) (WorkspaceBuild, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceBuildByJobID, jobID) - var i WorkspaceBuild - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.WorkspaceID, - &i.ProjectVersionID, - &i.Name, - &i.BeforeID, - &i.AfterID, - &i.Transition, - &i.InitiatorID, - &i.ProvisionerState, - &i.JobID, - ) - return i, err -} - -const getWorkspaceBuildByWorkspaceID = `-- name: GetWorkspaceBuildByWorkspaceID :many -SELECT - id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id -FROM - workspace_builds -WHERE - workspace_id = $1 -` - -func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceID(ctx context.Context, workspaceID uuid.UUID) ([]WorkspaceBuild, error) { - rows, err := q.db.QueryContext(ctx, getWorkspaceBuildByWorkspaceID, workspaceID) - if err != nil { - return nil, err - } - defer rows.Close() - var items []WorkspaceBuild - for rows.Next() { - var i WorkspaceBuild - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.WorkspaceID, - &i.ProjectVersionID, - &i.Name, - &i.BeforeID, - &i.AfterID, - &i.Transition, - &i.InitiatorID, - &i.ProvisionerState, - &i.JobID, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getWorkspaceBuildByWorkspaceIDAndName = `-- name: GetWorkspaceBuildByWorkspaceIDAndName :one -SELECT - id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id -FROM - workspace_builds -WHERE - workspace_id = $1 - AND name = $2 -` - -type GetWorkspaceBuildByWorkspaceIDAndNameParams struct { - WorkspaceID uuid.UUID `db:"workspace_id" json:"workspace_id"` - Name string `db:"name" json:"name"` -} - -func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceIDAndName(ctx context.Context, arg GetWorkspaceBuildByWorkspaceIDAndNameParams) (WorkspaceBuild, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceBuildByWorkspaceIDAndName, arg.WorkspaceID, arg.Name) - var i WorkspaceBuild - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.WorkspaceID, - &i.ProjectVersionID, - &i.Name, - &i.BeforeID, - &i.AfterID, - &i.Transition, - &i.InitiatorID, - &i.ProvisionerState, - &i.JobID, - ) - return i, err -} - -const getWorkspaceBuildByWorkspaceIDWithoutAfter = `-- name: GetWorkspaceBuildByWorkspaceIDWithoutAfter :one -SELECT - id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id -FROM - workspace_builds -WHERE - workspace_id = $1 - AND after_id IS NULL -LIMIT - 1 -` - -func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceIDWithoutAfter(ctx context.Context, workspaceID uuid.UUID) (WorkspaceBuild, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceBuildByWorkspaceIDWithoutAfter, workspaceID) - var i WorkspaceBuild - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.WorkspaceID, - &i.ProjectVersionID, - &i.Name, - &i.BeforeID, - &i.AfterID, - &i.Transition, - &i.InitiatorID, - &i.ProvisionerState, - &i.JobID, - ) - return i, err -} - -const getWorkspaceBuildsByWorkspaceIDsWithoutAfter = `-- name: GetWorkspaceBuildsByWorkspaceIDsWithoutAfter :many -SELECT - id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id -FROM - workspace_builds -WHERE - workspace_id = ANY($1 :: uuid [ ]) - AND after_id IS NULL -` - -func (q *sqlQuerier) GetWorkspaceBuildsByWorkspaceIDsWithoutAfter(ctx context.Context, ids []uuid.UUID) ([]WorkspaceBuild, error) { - rows, err := q.db.QueryContext(ctx, getWorkspaceBuildsByWorkspaceIDsWithoutAfter, pq.Array(ids)) - if err != nil { - return nil, err - } - defer rows.Close() - var items []WorkspaceBuild - for rows.Next() { - var i WorkspaceBuild - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.WorkspaceID, - &i.ProjectVersionID, - &i.Name, - &i.BeforeID, - &i.AfterID, - &i.Transition, - &i.InitiatorID, - &i.ProvisionerState, - &i.JobID, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getWorkspaceByID = `-- name: GetWorkspaceByID :one -SELECT - id, created_at, updated_at, owner_id, project_id, deleted, name -FROM - workspaces -WHERE - id = $1 -LIMIT - 1 -` - -func (q *sqlQuerier) GetWorkspaceByID(ctx context.Context, id uuid.UUID) (Workspace, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceByID, id) - var i Workspace - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OwnerID, - &i.ProjectID, - &i.Deleted, - &i.Name, - ) - return i, err -} - -const getWorkspaceByUserIDAndName = `-- name: GetWorkspaceByUserIDAndName :one -SELECT - id, created_at, updated_at, owner_id, project_id, deleted, name -FROM - workspaces -WHERE - owner_id = $1 - AND deleted = $2 - AND LOWER(name) = LOWER($3) -` - -type GetWorkspaceByUserIDAndNameParams struct { - OwnerID uuid.UUID `db:"owner_id" json:"owner_id"` - Deleted bool `db:"deleted" json:"deleted"` - Name string `db:"name" json:"name"` -} - -func (q *sqlQuerier) GetWorkspaceByUserIDAndName(ctx context.Context, arg GetWorkspaceByUserIDAndNameParams) (Workspace, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceByUserIDAndName, arg.OwnerID, arg.Deleted, arg.Name) - var i Workspace - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OwnerID, - &i.ProjectID, - &i.Deleted, - &i.Name, - ) - return i, err -} - -const getWorkspaceOwnerCountsByProjectIDs = `-- name: GetWorkspaceOwnerCountsByProjectIDs :many -SELECT - project_id, - COUNT(DISTINCT owner_id) -FROM - workspaces -WHERE - project_id = ANY($1 :: uuid [ ]) -GROUP BY - project_id, - owner_id -` - -type GetWorkspaceOwnerCountsByProjectIDsRow struct { - ProjectID uuid.UUID `db:"project_id" json:"project_id"` - Count int64 `db:"count" json:"count"` -} - -func (q *sqlQuerier) GetWorkspaceOwnerCountsByProjectIDs(ctx context.Context, ids []uuid.UUID) ([]GetWorkspaceOwnerCountsByProjectIDsRow, error) { - rows, err := q.db.QueryContext(ctx, getWorkspaceOwnerCountsByProjectIDs, pq.Array(ids)) - if err != nil { - return nil, err - } - defer rows.Close() - var items []GetWorkspaceOwnerCountsByProjectIDsRow - for rows.Next() { - var i GetWorkspaceOwnerCountsByProjectIDsRow - if err := rows.Scan(&i.ProjectID, &i.Count); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getWorkspaceResourceByID = `-- name: GetWorkspaceResourceByID :one -SELECT - id, created_at, job_id, transition, address, type, name, agent_id -FROM - workspace_resources -WHERE - id = $1 -` - -func (q *sqlQuerier) GetWorkspaceResourceByID(ctx context.Context, id uuid.UUID) (WorkspaceResource, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceResourceByID, id) - var i WorkspaceResource - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.JobID, - &i.Transition, - &i.Address, - &i.Type, - &i.Name, - &i.AgentID, - ) - return i, err -} - -const getWorkspaceResourcesByJobID = `-- name: GetWorkspaceResourcesByJobID :many -SELECT - id, created_at, job_id, transition, address, type, name, agent_id -FROM - workspace_resources -WHERE - job_id = $1 -` - -func (q *sqlQuerier) GetWorkspaceResourcesByJobID(ctx context.Context, jobID uuid.UUID) ([]WorkspaceResource, error) { - rows, err := q.db.QueryContext(ctx, getWorkspaceResourcesByJobID, jobID) - if err != nil { - return nil, err - } - defer rows.Close() - var items []WorkspaceResource - for rows.Next() { - var i WorkspaceResource - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.JobID, - &i.Transition, - &i.Address, - &i.Type, - &i.Name, - &i.AgentID, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getWorkspacesByProjectID = `-- name: GetWorkspacesByProjectID :many -SELECT - id, created_at, updated_at, owner_id, project_id, deleted, name -FROM - workspaces -WHERE - project_id = $1 - AND deleted = $2 -` - -type GetWorkspacesByProjectIDParams struct { - ProjectID uuid.UUID `db:"project_id" json:"project_id"` - Deleted bool `db:"deleted" json:"deleted"` -} - -func (q *sqlQuerier) GetWorkspacesByProjectID(ctx context.Context, arg GetWorkspacesByProjectIDParams) ([]Workspace, error) { - rows, err := q.db.QueryContext(ctx, getWorkspacesByProjectID, arg.ProjectID, arg.Deleted) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Workspace - for rows.Next() { - var i Workspace - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OwnerID, - &i.ProjectID, - &i.Deleted, - &i.Name, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getWorkspacesByUserID = `-- name: GetWorkspacesByUserID :many -SELECT - id, created_at, updated_at, owner_id, project_id, deleted, name -FROM - workspaces -WHERE - owner_id = $1 - AND deleted = $2 -` - -type GetWorkspacesByUserIDParams struct { - OwnerID uuid.UUID `db:"owner_id" json:"owner_id"` - Deleted bool `db:"deleted" json:"deleted"` -} - -func (q *sqlQuerier) GetWorkspacesByUserID(ctx context.Context, arg GetWorkspacesByUserIDParams) ([]Workspace, error) { - rows, err := q.db.QueryContext(ctx, getWorkspacesByUserID, arg.OwnerID, arg.Deleted) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Workspace - for rows.Next() { - var i Workspace - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OwnerID, - &i.ProjectID, - &i.Deleted, - &i.Name, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const insertAPIKey = `-- name: InsertAPIKey :one INSERT INTO - api_keys ( - id, - hashed_secret, - user_id, - application, - name, - last_used, - expires_at, - created_at, - updated_at, - login_type, - oidc_access_token, - oidc_refresh_token, - oidc_id_token, - oidc_expiry, - devurl_token - ) + api_keys ( + id, + hashed_secret, + user_id, + application, + "name", + last_used, + expires_at, + created_at, + updated_at, + login_type, + oidc_access_token, + oidc_refresh_token, + oidc_id_token, + oidc_expiry, + devurl_token + ) VALUES - ( - $1, - $2, - $3, - $4, - $5, - $6, - $7, - $8, - $9, - $10, - $11, - $12, - $13, - $14, - $15 - ) RETURNING id, hashed_secret, user_id, application, name, last_used, expires_at, created_at, updated_at, login_type, oidc_access_token, oidc_refresh_token, oidc_id_token, oidc_expiry, devurl_token + ( + $1, + $2, + $3, + $4, + $5, + $6, + $7, + $8, + $9, + $10, + $11, + $12, + $13, + $14, + $15 + ) RETURNING id, hashed_secret, user_id, application, name, last_used, expires_at, created_at, updated_at, login_type, oidc_access_token, oidc_refresh_token, oidc_id_token, oidc_expiry, devurl_token ` type InsertAPIKeyParams struct { @@ -1607,11 +143,69 @@ func (q *sqlQuerier) InsertAPIKey(ctx context.Context, arg InsertAPIKeyParams) ( return i, err } +const updateAPIKeyByID = `-- name: UpdateAPIKeyByID :exec +UPDATE + api_keys +SET + last_used = $2, + expires_at = $3, + oidc_access_token = $4, + oidc_refresh_token = $5, + oidc_expiry = $6 +WHERE + id = $1 +` + +type UpdateAPIKeyByIDParams struct { + ID string `db:"id" json:"id"` + LastUsed time.Time `db:"last_used" json:"last_used"` + ExpiresAt time.Time `db:"expires_at" json:"expires_at"` + OIDCAccessToken string `db:"oidc_access_token" json:"oidc_access_token"` + OIDCRefreshToken string `db:"oidc_refresh_token" json:"oidc_refresh_token"` + OIDCExpiry time.Time `db:"oidc_expiry" json:"oidc_expiry"` +} + +func (q *sqlQuerier) UpdateAPIKeyByID(ctx context.Context, arg UpdateAPIKeyByIDParams) error { + _, err := q.db.ExecContext(ctx, updateAPIKeyByID, + arg.ID, + arg.LastUsed, + arg.ExpiresAt, + arg.OIDCAccessToken, + arg.OIDCRefreshToken, + arg.OIDCExpiry, + ) + return err +} + +const getFileByHash = `-- name: GetFileByHash :one +SELECT + hash, created_at, created_by, mimetype, data +FROM + files +WHERE + hash = $1 +LIMIT + 1 +` + +func (q *sqlQuerier) GetFileByHash(ctx context.Context, hash string) (File, error) { + row := q.db.QueryRowContext(ctx, getFileByHash, hash) + var i File + err := row.Scan( + &i.Hash, + &i.CreatedAt, + &i.CreatedBy, + &i.Mimetype, + &i.Data, + ) + return i, err +} + const insertFile = `-- name: InsertFile :one INSERT INTO - files (hash, created_at, created_by, mimetype, data) + files (hash, created_at, created_by, mimetype, "data") VALUES - ($1, $2, $3, $4, $5) RETURNING hash, created_at, created_by, mimetype, data + ($1, $2, $3, $4, $5) RETURNING hash, created_at, created_by, mimetype, data ` type InsertFileParams struct { @@ -1641,51 +235,47 @@ func (q *sqlQuerier) InsertFile(ctx context.Context, arg InsertFileParams) (File return i, err } -const insertOrganization = `-- name: InsertOrganization :one -INSERT INTO - organizations (id, name, description, created_at, updated_at) -VALUES - ($1, $2, $3, $4, $5) RETURNING id, name, description, created_at, updated_at +const getOrganizationMemberByUserID = `-- name: GetOrganizationMemberByUserID :one +SELECT + user_id, organization_id, created_at, updated_at, roles +FROM + organization_members +WHERE + organization_id = $1 + AND user_id = $2 +LIMIT + 1 ` -type InsertOrganizationParams struct { - ID uuid.UUID `db:"id" json:"id"` - Name string `db:"name" json:"name"` - Description string `db:"description" json:"description"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` +type GetOrganizationMemberByUserIDParams struct { + OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` + UserID uuid.UUID `db:"user_id" json:"user_id"` } -func (q *sqlQuerier) InsertOrganization(ctx context.Context, arg InsertOrganizationParams) (Organization, error) { - row := q.db.QueryRowContext(ctx, insertOrganization, - arg.ID, - arg.Name, - arg.Description, - arg.CreatedAt, - arg.UpdatedAt, - ) - var i Organization +func (q *sqlQuerier) GetOrganizationMemberByUserID(ctx context.Context, arg GetOrganizationMemberByUserIDParams) (OrganizationMember, error) { + row := q.db.QueryRowContext(ctx, getOrganizationMemberByUserID, arg.OrganizationID, arg.UserID) + var i OrganizationMember err := row.Scan( - &i.ID, - &i.Name, - &i.Description, + &i.UserID, + &i.OrganizationID, &i.CreatedAt, &i.UpdatedAt, + pq.Array(&i.Roles), ) return i, err } const insertOrganizationMember = `-- name: InsertOrganizationMember :one INSERT INTO - organization_members ( - organization_id, - user_id, - created_at, - updated_at, - roles - ) + organization_members ( + organization_id, + user_id, + created_at, + updated_at, + roles + ) VALUES - ($1, $2, $3, $4, $5) RETURNING user_id, organization_id, created_at, updated_at, roles + ($1, $2, $3, $4, $5) RETURNING user_id, organization_id, created_at, updated_at, roles ` type InsertOrganizationMemberParams struct { @@ -1715,45 +305,219 @@ func (q *sqlQuerier) InsertOrganizationMember(ctx context.Context, arg InsertOrg return i, err } +const getOrganizationByID = `-- name: GetOrganizationByID :one +SELECT + id, name, description, created_at, updated_at +FROM + organizations +WHERE + id = $1 +` + +func (q *sqlQuerier) GetOrganizationByID(ctx context.Context, id uuid.UUID) (Organization, error) { + row := q.db.QueryRowContext(ctx, getOrganizationByID, id) + var i Organization + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getOrganizationByName = `-- name: GetOrganizationByName :one +SELECT + id, name, description, created_at, updated_at +FROM + organizations +WHERE + LOWER("name") = LOWER($1) +LIMIT + 1 +` + +func (q *sqlQuerier) GetOrganizationByName(ctx context.Context, name string) (Organization, error) { + row := q.db.QueryRowContext(ctx, getOrganizationByName, name) + var i Organization + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getOrganizationsByUserID = `-- name: GetOrganizationsByUserID :many +SELECT + id, name, description, created_at, updated_at +FROM + organizations +WHERE + id = ( + SELECT + organization_id + FROM + organization_members + WHERE + user_id = $1 + ) +` + +func (q *sqlQuerier) GetOrganizationsByUserID(ctx context.Context, userID uuid.UUID) ([]Organization, error) { + rows, err := q.db.QueryContext(ctx, getOrganizationsByUserID, userID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Organization + for rows.Next() { + var i Organization + if err := rows.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.CreatedAt, + &i.UpdatedAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const insertOrganization = `-- name: InsertOrganization :one +INSERT INTO + organizations (id, "name", description, created_at, updated_at) +VALUES + ($1, $2, $3, $4, $5) RETURNING id, name, description, created_at, updated_at +` + +type InsertOrganizationParams struct { + ID uuid.UUID `db:"id" json:"id"` + Name string `db:"name" json:"name"` + Description string `db:"description" json:"description"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` +} + +func (q *sqlQuerier) InsertOrganization(ctx context.Context, arg InsertOrganizationParams) (Organization, error) { + row := q.db.QueryRowContext(ctx, insertOrganization, + arg.ID, + arg.Name, + arg.Description, + arg.CreatedAt, + arg.UpdatedAt, + ) + var i Organization + err := row.Scan( + &i.ID, + &i.Name, + &i.Description, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getParameterSchemasByJobID = `-- name: GetParameterSchemasByJobID :many +SELECT + id, created_at, job_id, name, description, default_source_scheme, default_source_value, allow_override_source, default_destination_scheme, allow_override_destination, default_refresh, redisplay_value, validation_error, validation_condition, validation_type_system, validation_value_type +FROM + parameter_schemas +WHERE + job_id = $1 +` + +func (q *sqlQuerier) GetParameterSchemasByJobID(ctx context.Context, jobID uuid.UUID) ([]ParameterSchema, error) { + rows, err := q.db.QueryContext(ctx, getParameterSchemasByJobID, jobID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ParameterSchema + for rows.Next() { + var i ParameterSchema + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.JobID, + &i.Name, + &i.Description, + &i.DefaultSourceScheme, + &i.DefaultSourceValue, + &i.AllowOverrideSource, + &i.DefaultDestinationScheme, + &i.AllowOverrideDestination, + &i.DefaultRefresh, + &i.RedisplayValue, + &i.ValidationError, + &i.ValidationCondition, + &i.ValidationTypeSystem, + &i.ValidationValueType, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const insertParameterSchema = `-- name: InsertParameterSchema :one INSERT INTO - parameter_schemas ( - id, - created_at, - job_id, - name, - description, - default_source_scheme, - default_source_value, - allow_override_source, - default_destination_scheme, - allow_override_destination, - default_refresh, - redisplay_value, - validation_error, - validation_condition, - validation_type_system, - validation_value_type - ) + parameter_schemas ( + id, + created_at, + job_id, + "name", + description, + default_source_scheme, + default_source_value, + allow_override_source, + default_destination_scheme, + allow_override_destination, + default_refresh, + redisplay_value, + validation_error, + validation_condition, + validation_type_system, + validation_value_type + ) VALUES - ( - $1, - $2, - $3, - $4, - $5, - $6, - $7, - $8, - $9, - $10, - $11, - $12, - $13, - $14, - $15, - $16 - ) RETURNING id, created_at, job_id, name, description, default_source_scheme, default_source_value, allow_override_source, default_destination_scheme, allow_override_destination, default_refresh, redisplay_value, validation_error, validation_condition, validation_type_system, validation_value_type + ( + $1, + $2, + $3, + $4, + $5, + $6, + $7, + $8, + $9, + $10, + $11, + $12, + $13, + $14, + $15, + $16 + ) RETURNING id, created_at, job_id, name, description, default_source_scheme, default_source_value, allow_override_source, default_destination_scheme, allow_override_destination, default_refresh, redisplay_value, validation_error, validation_condition, validation_type_system, validation_value_type ` type InsertParameterSchemaParams struct { @@ -1816,21 +580,117 @@ func (q *sqlQuerier) InsertParameterSchema(ctx context.Context, arg InsertParame return i, err } +const deleteParameterValueByID = `-- name: DeleteParameterValueByID :exec +DELETE FROM + parameter_values +WHERE + id = $1 +` + +func (q *sqlQuerier) DeleteParameterValueByID(ctx context.Context, id uuid.UUID) error { + _, err := q.db.ExecContext(ctx, deleteParameterValueByID, id) + return err +} + +const getParameterValueByScopeAndName = `-- name: GetParameterValueByScopeAndName :one +SELECT + id, created_at, updated_at, scope, scope_id, name, source_scheme, source_value, destination_scheme +FROM + parameter_values +WHERE + scope = $1 + AND scope_id = $2 + AND NAME = $3 +LIMIT + 1 +` + +type GetParameterValueByScopeAndNameParams struct { + Scope ParameterScope `db:"scope" json:"scope"` + ScopeID uuid.UUID `db:"scope_id" json:"scope_id"` + Name string `db:"name" json:"name"` +} + +func (q *sqlQuerier) GetParameterValueByScopeAndName(ctx context.Context, arg GetParameterValueByScopeAndNameParams) (ParameterValue, error) { + row := q.db.QueryRowContext(ctx, getParameterValueByScopeAndName, arg.Scope, arg.ScopeID, arg.Name) + var i ParameterValue + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Scope, + &i.ScopeID, + &i.Name, + &i.SourceScheme, + &i.SourceValue, + &i.DestinationScheme, + ) + return i, err +} + +const getParameterValuesByScope = `-- name: GetParameterValuesByScope :many +SELECT + id, created_at, updated_at, scope, scope_id, name, source_scheme, source_value, destination_scheme +FROM + parameter_values +WHERE + scope = $1 + AND scope_id = $2 +` + +type GetParameterValuesByScopeParams struct { + Scope ParameterScope `db:"scope" json:"scope"` + ScopeID uuid.UUID `db:"scope_id" json:"scope_id"` +} + +func (q *sqlQuerier) GetParameterValuesByScope(ctx context.Context, arg GetParameterValuesByScopeParams) ([]ParameterValue, error) { + rows, err := q.db.QueryContext(ctx, getParameterValuesByScope, arg.Scope, arg.ScopeID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ParameterValue + for rows.Next() { + var i ParameterValue + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Scope, + &i.ScopeID, + &i.Name, + &i.SourceScheme, + &i.SourceValue, + &i.DestinationScheme, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const insertParameterValue = `-- name: InsertParameterValue :one INSERT INTO - parameter_values ( - id, - name, - created_at, - updated_at, - scope, - scope_id, - source_scheme, - source_value, - destination_scheme - ) + parameter_values ( + id, + "name", + created_at, + updated_at, + scope, + scope_id, + source_scheme, + source_value, + destination_scheme + ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id, created_at, updated_at, scope, scope_id, name, source_scheme, source_value, destination_scheme + ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id, created_at, updated_at, scope, scope_id, name, source_scheme, source_value, destination_scheme ` type InsertParameterValueParams struct { @@ -1872,19 +732,169 @@ func (q *sqlQuerier) InsertParameterValue(ctx context.Context, arg InsertParamet return i, err } +const getProjectByID = `-- name: GetProjectByID :one +SELECT + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id +FROM + projects +WHERE + id = $1 +LIMIT + 1 +` + +func (q *sqlQuerier) GetProjectByID(ctx context.Context, id uuid.UUID) (Project, error) { + row := q.db.QueryRowContext(ctx, getProjectByID, id) + var i Project + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OrganizationID, + &i.Deleted, + &i.Name, + &i.Provisioner, + &i.ActiveVersionID, + ) + return i, err +} + +const getProjectByOrganizationAndName = `-- name: GetProjectByOrganizationAndName :one +SELECT + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id +FROM + projects +WHERE + organization_id = $1 + AND deleted = $2 + AND LOWER("name") = LOWER($3) +LIMIT + 1 +` + +type GetProjectByOrganizationAndNameParams struct { + OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` + Deleted bool `db:"deleted" json:"deleted"` + Name string `db:"name" json:"name"` +} + +func (q *sqlQuerier) GetProjectByOrganizationAndName(ctx context.Context, arg GetProjectByOrganizationAndNameParams) (Project, error) { + row := q.db.QueryRowContext(ctx, getProjectByOrganizationAndName, arg.OrganizationID, arg.Deleted, arg.Name) + var i Project + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OrganizationID, + &i.Deleted, + &i.Name, + &i.Provisioner, + &i.ActiveVersionID, + ) + return i, err +} + +const getProjectsByIDs = `-- name: GetProjectsByIDs :many +SELECT + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id +FROM + projects +WHERE + id = ANY($1 :: uuid [ ]) +` + +func (q *sqlQuerier) GetProjectsByIDs(ctx context.Context, ids []uuid.UUID) ([]Project, error) { + rows, err := q.db.QueryContext(ctx, getProjectsByIDs, pq.Array(ids)) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Project + for rows.Next() { + var i Project + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OrganizationID, + &i.Deleted, + &i.Name, + &i.Provisioner, + &i.ActiveVersionID, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getProjectsByOrganization = `-- name: GetProjectsByOrganization :many +SELECT + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id +FROM + projects +WHERE + organization_id = $1 + AND deleted = $2 +` + +type GetProjectsByOrganizationParams struct { + OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` + Deleted bool `db:"deleted" json:"deleted"` +} + +func (q *sqlQuerier) GetProjectsByOrganization(ctx context.Context, arg GetProjectsByOrganizationParams) ([]Project, error) { + rows, err := q.db.QueryContext(ctx, getProjectsByOrganization, arg.OrganizationID, arg.Deleted) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Project + for rows.Next() { + var i Project + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OrganizationID, + &i.Deleted, + &i.Name, + &i.Provisioner, + &i.ActiveVersionID, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const insertProject = `-- name: InsertProject :one INSERT INTO - projects ( - id, - created_at, - updated_at, - organization_id, - name, - provisioner, - active_version_id - ) + projects ( + id, + created_at, + updated_at, + organization_id, + "name", + provisioner, + active_version_id + ) VALUES - ($1, $2, $3, $4, $5, $6, $7) RETURNING id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id + ($1, $2, $3, $4, $5, $6, $7) RETURNING id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id ` type InsertProjectParams struct { @@ -1921,20 +931,180 @@ func (q *sqlQuerier) InsertProject(ctx context.Context, arg InsertProjectParams) return i, err } +const updateProjectActiveVersionByID = `-- name: UpdateProjectActiveVersionByID :exec +UPDATE + projects +SET + active_version_id = $2 +WHERE + id = $1 +` + +type UpdateProjectActiveVersionByIDParams struct { + ID uuid.UUID `db:"id" json:"id"` + ActiveVersionID uuid.UUID `db:"active_version_id" json:"active_version_id"` +} + +func (q *sqlQuerier) UpdateProjectActiveVersionByID(ctx context.Context, arg UpdateProjectActiveVersionByIDParams) error { + _, err := q.db.ExecContext(ctx, updateProjectActiveVersionByID, arg.ID, arg.ActiveVersionID) + return err +} + +const updateProjectDeletedByID = `-- name: UpdateProjectDeletedByID :exec +UPDATE + projects +SET + deleted = $2 +WHERE + id = $1 +` + +type UpdateProjectDeletedByIDParams struct { + ID uuid.UUID `db:"id" json:"id"` + Deleted bool `db:"deleted" json:"deleted"` +} + +func (q *sqlQuerier) UpdateProjectDeletedByID(ctx context.Context, arg UpdateProjectDeletedByIDParams) error { + _, err := q.db.ExecContext(ctx, updateProjectDeletedByID, arg.ID, arg.Deleted) + return err +} + +const getProjectVersionByID = `-- name: GetProjectVersionByID :one +SELECT + id, project_id, organization_id, created_at, updated_at, name, description, job_id +FROM + project_versions +WHERE + id = $1 +` + +func (q *sqlQuerier) GetProjectVersionByID(ctx context.Context, id uuid.UUID) (ProjectVersion, error) { + row := q.db.QueryRowContext(ctx, getProjectVersionByID, id) + var i ProjectVersion + err := row.Scan( + &i.ID, + &i.ProjectID, + &i.OrganizationID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Name, + &i.Description, + &i.JobID, + ) + return i, err +} + +const getProjectVersionByJobID = `-- name: GetProjectVersionByJobID :one +SELECT + id, project_id, organization_id, created_at, updated_at, name, description, job_id +FROM + project_versions +WHERE + job_id = $1 +` + +func (q *sqlQuerier) GetProjectVersionByJobID(ctx context.Context, jobID uuid.UUID) (ProjectVersion, error) { + row := q.db.QueryRowContext(ctx, getProjectVersionByJobID, jobID) + var i ProjectVersion + err := row.Scan( + &i.ID, + &i.ProjectID, + &i.OrganizationID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Name, + &i.Description, + &i.JobID, + ) + return i, err +} + +const getProjectVersionByProjectIDAndName = `-- name: GetProjectVersionByProjectIDAndName :one +SELECT + id, project_id, organization_id, created_at, updated_at, name, description, job_id +FROM + project_versions +WHERE + project_id = $1 + AND "name" = $2 +` + +type GetProjectVersionByProjectIDAndNameParams struct { + ProjectID uuid.NullUUID `db:"project_id" json:"project_id"` + Name string `db:"name" json:"name"` +} + +func (q *sqlQuerier) GetProjectVersionByProjectIDAndName(ctx context.Context, arg GetProjectVersionByProjectIDAndNameParams) (ProjectVersion, error) { + row := q.db.QueryRowContext(ctx, getProjectVersionByProjectIDAndName, arg.ProjectID, arg.Name) + var i ProjectVersion + err := row.Scan( + &i.ID, + &i.ProjectID, + &i.OrganizationID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Name, + &i.Description, + &i.JobID, + ) + return i, err +} + +const getProjectVersionsByProjectID = `-- name: GetProjectVersionsByProjectID :many +SELECT + id, project_id, organization_id, created_at, updated_at, name, description, job_id +FROM + project_versions +WHERE + project_id = $1 :: uuid +` + +func (q *sqlQuerier) GetProjectVersionsByProjectID(ctx context.Context, dollar_1 uuid.UUID) ([]ProjectVersion, error) { + rows, err := q.db.QueryContext(ctx, getProjectVersionsByProjectID, dollar_1) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ProjectVersion + for rows.Next() { + var i ProjectVersion + if err := rows.Scan( + &i.ID, + &i.ProjectID, + &i.OrganizationID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Name, + &i.Description, + &i.JobID, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const insertProjectVersion = `-- name: InsertProjectVersion :one INSERT INTO - project_versions ( - id, - project_id, - organization_id, - created_at, - updated_at, - name, - description, - job_id - ) + project_versions ( + id, + project_id, + organization_id, + created_at, + updated_at, + "name", + description, + job_id + ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id, project_id, organization_id, created_at, updated_at, name, description, job_id + ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id, project_id, organization_id, created_at, updated_at, name, description, job_id ` type InsertProjectVersionParams struct { @@ -1973,11 +1143,98 @@ func (q *sqlQuerier) InsertProjectVersion(ctx context.Context, arg InsertProject return i, err } +const updateProjectVersionByID = `-- name: UpdateProjectVersionByID :exec +UPDATE + project_versions +SET + project_id = $2, + updated_at = $3 +WHERE + id = $1 +` + +type UpdateProjectVersionByIDParams struct { + ID uuid.UUID `db:"id" json:"id"` + ProjectID uuid.NullUUID `db:"project_id" json:"project_id"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` +} + +func (q *sqlQuerier) UpdateProjectVersionByID(ctx context.Context, arg UpdateProjectVersionByIDParams) error { + _, err := q.db.ExecContext(ctx, updateProjectVersionByID, arg.ID, arg.ProjectID, arg.UpdatedAt) + return err +} + +const getProvisionerDaemonByID = `-- name: GetProvisionerDaemonByID :one +SELECT + id, created_at, updated_at, organization_id, name, provisioners +FROM + provisioner_daemons +WHERE + id = $1 +` + +func (q *sqlQuerier) GetProvisionerDaemonByID(ctx context.Context, id uuid.UUID) (ProvisionerDaemon, error) { + row := q.db.QueryRowContext(ctx, getProvisionerDaemonByID, id) + var i ProvisionerDaemon + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OrganizationID, + &i.Name, + pq.Array(&i.Provisioners), + ) + return i, err +} + +const getProvisionerDaemons = `-- name: GetProvisionerDaemons :many +SELECT + id, created_at, updated_at, organization_id, name, provisioners +FROM + provisioner_daemons +` + +func (q *sqlQuerier) GetProvisionerDaemons(ctx context.Context) ([]ProvisionerDaemon, error) { + rows, err := q.db.QueryContext(ctx, getProvisionerDaemons) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ProvisionerDaemon + for rows.Next() { + var i ProvisionerDaemon + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OrganizationID, + &i.Name, + pq.Array(&i.Provisioners), + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const insertProvisionerDaemon = `-- name: InsertProvisionerDaemon :one INSERT INTO - provisioner_daemons (id, created_at, organization_id, name, provisioners) + provisioner_daemons ( + id, + created_at, + organization_id, + "name", + provisioners + ) VALUES - ($1, $2, $3, $4, $5) RETURNING id, created_at, updated_at, organization_id, name, provisioners + ($1, $2, $3, $4, $5) RETURNING id, created_at, updated_at, organization_id, name, provisioners ` type InsertProvisionerDaemonParams struct { @@ -2008,82 +1265,90 @@ func (q *sqlQuerier) InsertProvisionerDaemon(ctx context.Context, arg InsertProv return i, err } -const insertProvisionerJob = `-- name: InsertProvisionerJob :one -INSERT INTO - provisioner_jobs ( - id, - created_at, - updated_at, - organization_id, - initiator_id, - provisioner, - storage_method, - storage_source, - type, - input - ) -VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING id, created_at, updated_at, started_at, canceled_at, completed_at, error, organization_id, initiator_id, provisioner, storage_method, storage_source, type, input, worker_id +const updateProvisionerDaemonByID = `-- name: UpdateProvisionerDaemonByID :exec +UPDATE + provisioner_daemons +SET + updated_at = $2, + provisioners = $3 +WHERE + id = $1 ` -type InsertProvisionerJobParams struct { - ID uuid.UUID `db:"id" json:"id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` - InitiatorID uuid.UUID `db:"initiator_id" json:"initiator_id"` - Provisioner ProvisionerType `db:"provisioner" json:"provisioner"` - StorageMethod ProvisionerStorageMethod `db:"storage_method" json:"storage_method"` - StorageSource string `db:"storage_source" json:"storage_source"` - Type ProvisionerJobType `db:"type" json:"type"` - Input json.RawMessage `db:"input" json:"input"` +type UpdateProvisionerDaemonByIDParams struct { + ID uuid.UUID `db:"id" json:"id"` + UpdatedAt sql.NullTime `db:"updated_at" json:"updated_at"` + Provisioners []ProvisionerType `db:"provisioners" json:"provisioners"` } -func (q *sqlQuerier) InsertProvisionerJob(ctx context.Context, arg InsertProvisionerJobParams) (ProvisionerJob, error) { - row := q.db.QueryRowContext(ctx, insertProvisionerJob, - arg.ID, - arg.CreatedAt, - arg.UpdatedAt, - arg.OrganizationID, - arg.InitiatorID, - arg.Provisioner, - arg.StorageMethod, - arg.StorageSource, - arg.Type, - arg.Input, +func (q *sqlQuerier) UpdateProvisionerDaemonByID(ctx context.Context, arg UpdateProvisionerDaemonByIDParams) error { + _, err := q.db.ExecContext(ctx, updateProvisionerDaemonByID, arg.ID, arg.UpdatedAt, pq.Array(arg.Provisioners)) + return err +} + +const getProvisionerLogsByIDBetween = `-- name: GetProvisionerLogsByIDBetween :many +SELECT + id, job_id, created_at, source, level, stage, output +FROM + provisioner_job_logs +WHERE + job_id = $1 + AND ( + created_at >= $2 + OR created_at <= $3 ) - var i ProvisionerJob - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.StartedAt, - &i.CanceledAt, - &i.CompletedAt, - &i.Error, - &i.OrganizationID, - &i.InitiatorID, - &i.Provisioner, - &i.StorageMethod, - &i.StorageSource, - &i.Type, - &i.Input, - &i.WorkerID, - ) - return i, err +ORDER BY + created_at DESC +` + +type GetProvisionerLogsByIDBetweenParams struct { + JobID uuid.UUID `db:"job_id" json:"job_id"` + CreatedAfter time.Time `db:"created_after" json:"created_after"` + CreatedBefore time.Time `db:"created_before" json:"created_before"` +} + +func (q *sqlQuerier) GetProvisionerLogsByIDBetween(ctx context.Context, arg GetProvisionerLogsByIDBetweenParams) ([]ProvisionerJobLog, error) { + rows, err := q.db.QueryContext(ctx, getProvisionerLogsByIDBetween, arg.JobID, arg.CreatedAfter, arg.CreatedBefore) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ProvisionerJobLog + for rows.Next() { + var i ProvisionerJobLog + if err := rows.Scan( + &i.ID, + &i.JobID, + &i.CreatedAt, + &i.Source, + &i.Level, + &i.Stage, + &i.Output, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil } const insertProvisionerJobLogs = `-- name: InsertProvisionerJobLogs :many INSERT INTO - provisioner_job_logs + provisioner_job_logs SELECT - unnest($1 :: uuid [ ]) AS id, - $2 :: uuid AS job_id, - unnest($3 :: timestamptz [ ]) AS created_at, - unnest($4 :: log_source [ ]) as source, - unnest($5 :: log_level [ ]) as level, - unnest($6 :: varchar(128) [ ]) as stage, - unnest($7 :: varchar(1024) [ ]) as output RETURNING id, job_id, created_at, source, level, stage, output + unnest($1 :: uuid [ ]) AS id, + $2 :: uuid AS job_id, + unnest($3 :: timestamptz [ ]) AS created_at, + unnest($4 :: log_source [ ]) AS source, + unnest($5 :: log_level [ ]) AS LEVEL, + unnest($6 :: VARCHAR(128) [ ]) AS stage, + unnest($7 :: VARCHAR(1024) [ ]) AS output RETURNING id, job_id, created_at, source, level, stage, output ` type InsertProvisionerJobLogsParams struct { @@ -2135,21 +1400,370 @@ func (q *sqlQuerier) InsertProvisionerJobLogs(ctx context.Context, arg InsertPro return items, nil } +const acquireProvisionerJob = `-- name: AcquireProvisionerJob :one +UPDATE + provisioner_jobs +SET + started_at = $1, + updated_at = $1, + worker_id = $2 +WHERE + id = ( + SELECT + id + FROM + provisioner_jobs AS nested + WHERE + nested.started_at IS NULL + AND nested.canceled_at IS NULL + AND nested.completed_at IS NULL + AND nested.provisioner = ANY($3 :: provisioner_type [ ]) + ORDER BY + nested.created_at FOR + UPDATE + SKIP LOCKED + LIMIT + 1 + ) RETURNING id, created_at, updated_at, started_at, canceled_at, completed_at, error, organization_id, initiator_id, provisioner, storage_method, storage_source, type, input, worker_id +` + +type AcquireProvisionerJobParams struct { + StartedAt sql.NullTime `db:"started_at" json:"started_at"` + WorkerID uuid.NullUUID `db:"worker_id" json:"worker_id"` + Types []ProvisionerType `db:"types" json:"types"` +} + +// Acquires the lock for a single job that isn't started, completed, +// canceled, and that matches an array of provisioner types. +// +// SKIP LOCKED is used to jump over locked rows. This prevents +// multiple provisioners from acquiring the same jobs. See: +// https://www.postgresql.org/docs/9.5/sql-select.html#SQL-FOR-UPDATE-SHARE +func (q *sqlQuerier) AcquireProvisionerJob(ctx context.Context, arg AcquireProvisionerJobParams) (ProvisionerJob, error) { + row := q.db.QueryRowContext(ctx, acquireProvisionerJob, arg.StartedAt, arg.WorkerID, pq.Array(arg.Types)) + var i ProvisionerJob + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.StartedAt, + &i.CanceledAt, + &i.CompletedAt, + &i.Error, + &i.OrganizationID, + &i.InitiatorID, + &i.Provisioner, + &i.StorageMethod, + &i.StorageSource, + &i.Type, + &i.Input, + &i.WorkerID, + ) + return i, err +} + +const getProvisionerJobByID = `-- name: GetProvisionerJobByID :one +SELECT + id, created_at, updated_at, started_at, canceled_at, completed_at, error, organization_id, initiator_id, provisioner, storage_method, storage_source, type, input, worker_id +FROM + provisioner_jobs +WHERE + id = $1 +` + +func (q *sqlQuerier) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (ProvisionerJob, error) { + row := q.db.QueryRowContext(ctx, getProvisionerJobByID, id) + var i ProvisionerJob + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.StartedAt, + &i.CanceledAt, + &i.CompletedAt, + &i.Error, + &i.OrganizationID, + &i.InitiatorID, + &i.Provisioner, + &i.StorageMethod, + &i.StorageSource, + &i.Type, + &i.Input, + &i.WorkerID, + ) + return i, err +} + +const getProvisionerJobsByIDs = `-- name: GetProvisionerJobsByIDs :many +SELECT + id, created_at, updated_at, started_at, canceled_at, completed_at, error, organization_id, initiator_id, provisioner, storage_method, storage_source, type, input, worker_id +FROM + provisioner_jobs +WHERE + id = ANY($1 :: uuid [ ]) +` + +func (q *sqlQuerier) GetProvisionerJobsByIDs(ctx context.Context, ids []uuid.UUID) ([]ProvisionerJob, error) { + rows, err := q.db.QueryContext(ctx, getProvisionerJobsByIDs, pq.Array(ids)) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ProvisionerJob + for rows.Next() { + var i ProvisionerJob + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.StartedAt, + &i.CanceledAt, + &i.CompletedAt, + &i.Error, + &i.OrganizationID, + &i.InitiatorID, + &i.Provisioner, + &i.StorageMethod, + &i.StorageSource, + &i.Type, + &i.Input, + &i.WorkerID, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const insertProvisionerJob = `-- name: InsertProvisionerJob :one +INSERT INTO + provisioner_jobs ( + id, + created_at, + updated_at, + organization_id, + initiator_id, + provisioner, + storage_method, + storage_source, + "type", + "input" + ) +VALUES + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING id, created_at, updated_at, started_at, canceled_at, completed_at, error, organization_id, initiator_id, provisioner, storage_method, storage_source, type, input, worker_id +` + +type InsertProvisionerJobParams struct { + ID uuid.UUID `db:"id" json:"id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` + InitiatorID uuid.UUID `db:"initiator_id" json:"initiator_id"` + Provisioner ProvisionerType `db:"provisioner" json:"provisioner"` + StorageMethod ProvisionerStorageMethod `db:"storage_method" json:"storage_method"` + StorageSource string `db:"storage_source" json:"storage_source"` + Type ProvisionerJobType `db:"type" json:"type"` + Input json.RawMessage `db:"input" json:"input"` +} + +func (q *sqlQuerier) InsertProvisionerJob(ctx context.Context, arg InsertProvisionerJobParams) (ProvisionerJob, error) { + row := q.db.QueryRowContext(ctx, insertProvisionerJob, + arg.ID, + arg.CreatedAt, + arg.UpdatedAt, + arg.OrganizationID, + arg.InitiatorID, + arg.Provisioner, + arg.StorageMethod, + arg.StorageSource, + arg.Type, + arg.Input, + ) + var i ProvisionerJob + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.StartedAt, + &i.CanceledAt, + &i.CompletedAt, + &i.Error, + &i.OrganizationID, + &i.InitiatorID, + &i.Provisioner, + &i.StorageMethod, + &i.StorageSource, + &i.Type, + &i.Input, + &i.WorkerID, + ) + return i, err +} + +const updateProvisionerJobByID = `-- name: UpdateProvisionerJobByID :exec +UPDATE + provisioner_jobs +SET + updated_at = $2 +WHERE + id = $1 +` + +type UpdateProvisionerJobByIDParams struct { + ID uuid.UUID `db:"id" json:"id"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` +} + +func (q *sqlQuerier) UpdateProvisionerJobByID(ctx context.Context, arg UpdateProvisionerJobByIDParams) error { + _, err := q.db.ExecContext(ctx, updateProvisionerJobByID, arg.ID, arg.UpdatedAt) + return err +} + +const updateProvisionerJobWithCancelByID = `-- name: UpdateProvisionerJobWithCancelByID :exec +UPDATE + provisioner_jobs +SET + canceled_at = $2 +WHERE + id = $1 +` + +type UpdateProvisionerJobWithCancelByIDParams struct { + ID uuid.UUID `db:"id" json:"id"` + CanceledAt sql.NullTime `db:"canceled_at" json:"canceled_at"` +} + +func (q *sqlQuerier) UpdateProvisionerJobWithCancelByID(ctx context.Context, arg UpdateProvisionerJobWithCancelByIDParams) error { + _, err := q.db.ExecContext(ctx, updateProvisionerJobWithCancelByID, arg.ID, arg.CanceledAt) + return err +} + +const updateProvisionerJobWithCompleteByID = `-- name: UpdateProvisionerJobWithCompleteByID :exec +UPDATE + provisioner_jobs +SET + updated_at = $2, + completed_at = $3, + error = $4 +WHERE + id = $1 +` + +type UpdateProvisionerJobWithCompleteByIDParams struct { + ID uuid.UUID `db:"id" json:"id"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + CompletedAt sql.NullTime `db:"completed_at" json:"completed_at"` + Error sql.NullString `db:"error" json:"error"` +} + +func (q *sqlQuerier) UpdateProvisionerJobWithCompleteByID(ctx context.Context, arg UpdateProvisionerJobWithCompleteByIDParams) error { + _, err := q.db.ExecContext(ctx, updateProvisionerJobWithCompleteByID, + arg.ID, + arg.UpdatedAt, + arg.CompletedAt, + arg.Error, + ) + return err +} + +const getUserByEmailOrUsername = `-- name: GetUserByEmailOrUsername :one +SELECT + id, email, name, revoked, login_type, hashed_password, created_at, updated_at, username +FROM + users +WHERE + LOWER(username) = LOWER($1) + OR email = $2 +LIMIT + 1 +` + +type GetUserByEmailOrUsernameParams struct { + Username string `db:"username" json:"username"` + Email string `db:"email" json:"email"` +} + +func (q *sqlQuerier) GetUserByEmailOrUsername(ctx context.Context, arg GetUserByEmailOrUsernameParams) (User, error) { + row := q.db.QueryRowContext(ctx, getUserByEmailOrUsername, arg.Username, arg.Email) + var i User + err := row.Scan( + &i.ID, + &i.Email, + &i.Name, + &i.Revoked, + &i.LoginType, + &i.HashedPassword, + &i.CreatedAt, + &i.UpdatedAt, + &i.Username, + ) + return i, err +} + +const getUserByID = `-- name: GetUserByID :one +SELECT + id, email, name, revoked, login_type, hashed_password, created_at, updated_at, username +FROM + users +WHERE + id = $1 +LIMIT + 1 +` + +func (q *sqlQuerier) GetUserByID(ctx context.Context, id uuid.UUID) (User, error) { + row := q.db.QueryRowContext(ctx, getUserByID, id) + var i User + err := row.Scan( + &i.ID, + &i.Email, + &i.Name, + &i.Revoked, + &i.LoginType, + &i.HashedPassword, + &i.CreatedAt, + &i.UpdatedAt, + &i.Username, + ) + return i, err +} + +const getUserCount = `-- name: GetUserCount :one +SELECT + COUNT(*) +FROM + users +` + +func (q *sqlQuerier) GetUserCount(ctx context.Context) (int64, error) { + row := q.db.QueryRowContext(ctx, getUserCount) + var count int64 + err := row.Scan(&count) + return count, err +} + const insertUser = `-- name: InsertUser :one INSERT INTO - users ( - id, - email, - name, - login_type, - revoked, - hashed_password, - created_at, - updated_at, - username - ) + users ( + id, + email, + "name", + login_type, + revoked, + hashed_password, + created_at, + updated_at, + username + ) VALUES - ($1, $2, $3, $4, false, $5, $6, $7, $8) RETURNING id, email, name, revoked, login_type, hashed_password, created_at, updated_at, username + ($1, $2, $3, $4, FALSE, $5, $6, $7, $8) RETURNING id, email, name, revoked, login_type, hashed_password, created_at, updated_at, username ` type InsertUserParams struct { @@ -2189,67 +1803,116 @@ func (q *sqlQuerier) InsertUser(ctx context.Context, arg InsertUserParams) (User return i, err } -const insertWorkspace = `-- name: InsertWorkspace :one -INSERT INTO - workspaces ( - id, - created_at, - updated_at, - owner_id, - project_id, - name - ) -VALUES - ($1, $2, $3, $4, $5, $6) RETURNING id, created_at, updated_at, owner_id, project_id, deleted, name +const getWorkspaceAgentByAuthToken = `-- name: GetWorkspaceAgentByAuthToken :one +SELECT + id, created_at, updated_at, first_connected_at, last_connected_at, disconnected_at, resource_id, auth_token, auth_instance_id, environment_variables, startup_script, instance_metadata, resource_metadata +FROM + workspace_agents +WHERE + auth_token = $1 +ORDER BY + created_at DESC ` -type InsertWorkspaceParams struct { - ID uuid.UUID `db:"id" json:"id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - OwnerID uuid.UUID `db:"owner_id" json:"owner_id"` - ProjectID uuid.UUID `db:"project_id" json:"project_id"` - Name string `db:"name" json:"name"` -} - -func (q *sqlQuerier) InsertWorkspace(ctx context.Context, arg InsertWorkspaceParams) (Workspace, error) { - row := q.db.QueryRowContext(ctx, insertWorkspace, - arg.ID, - arg.CreatedAt, - arg.UpdatedAt, - arg.OwnerID, - arg.ProjectID, - arg.Name, - ) - var i Workspace +func (q *sqlQuerier) GetWorkspaceAgentByAuthToken(ctx context.Context, authToken uuid.UUID) (WorkspaceAgent, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceAgentByAuthToken, authToken) + var i WorkspaceAgent err := row.Scan( &i.ID, &i.CreatedAt, &i.UpdatedAt, - &i.OwnerID, - &i.ProjectID, - &i.Deleted, - &i.Name, + &i.FirstConnectedAt, + &i.LastConnectedAt, + &i.DisconnectedAt, + &i.ResourceID, + &i.AuthToken, + &i.AuthInstanceID, + &i.EnvironmentVariables, + &i.StartupScript, + &i.InstanceMetadata, + &i.ResourceMetadata, + ) + return i, err +} + +const getWorkspaceAgentByInstanceID = `-- name: GetWorkspaceAgentByInstanceID :one +SELECT + id, created_at, updated_at, first_connected_at, last_connected_at, disconnected_at, resource_id, auth_token, auth_instance_id, environment_variables, startup_script, instance_metadata, resource_metadata +FROM + workspace_agents +WHERE + auth_instance_id = $1 :: TEXT +ORDER BY + created_at DESC +` + +func (q *sqlQuerier) GetWorkspaceAgentByInstanceID(ctx context.Context, authInstanceID string) (WorkspaceAgent, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceAgentByInstanceID, authInstanceID) + var i WorkspaceAgent + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.FirstConnectedAt, + &i.LastConnectedAt, + &i.DisconnectedAt, + &i.ResourceID, + &i.AuthToken, + &i.AuthInstanceID, + &i.EnvironmentVariables, + &i.StartupScript, + &i.InstanceMetadata, + &i.ResourceMetadata, + ) + return i, err +} + +const getWorkspaceAgentByResourceID = `-- name: GetWorkspaceAgentByResourceID :one +SELECT + id, created_at, updated_at, first_connected_at, last_connected_at, disconnected_at, resource_id, auth_token, auth_instance_id, environment_variables, startup_script, instance_metadata, resource_metadata +FROM + workspace_agents +WHERE + resource_id = $1 +` + +func (q *sqlQuerier) GetWorkspaceAgentByResourceID(ctx context.Context, resourceID uuid.UUID) (WorkspaceAgent, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceAgentByResourceID, resourceID) + var i WorkspaceAgent + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.FirstConnectedAt, + &i.LastConnectedAt, + &i.DisconnectedAt, + &i.ResourceID, + &i.AuthToken, + &i.AuthInstanceID, + &i.EnvironmentVariables, + &i.StartupScript, + &i.InstanceMetadata, + &i.ResourceMetadata, ) return i, err } const insertWorkspaceAgent = `-- name: InsertWorkspaceAgent :one INSERT INTO - workspace_agents ( - id, - created_at, - updated_at, - resource_id, - auth_token, - auth_instance_id, - environment_variables, - startup_script, - instance_metadata, - resource_metadata - ) + workspace_agents ( + id, + created_at, + updated_at, + resource_id, + auth_token, + auth_instance_id, + environment_variables, + startup_script, + instance_metadata, + resource_metadata + ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING id, created_at, updated_at, first_connected_at, last_connected_at, disconnected_at, resource_id, auth_token, auth_instance_id, environment_variables, startup_script, instance_metadata, resource_metadata + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING id, created_at, updated_at, first_connected_at, last_connected_at, disconnected_at, resource_id, auth_token, auth_instance_id, environment_variables, startup_script, instance_metadata, resource_metadata ` type InsertWorkspaceAgentParams struct { @@ -2297,23 +1960,271 @@ func (q *sqlQuerier) InsertWorkspaceAgent(ctx context.Context, arg InsertWorkspa return i, err } +const updateWorkspaceAgentConnectionByID = `-- name: UpdateWorkspaceAgentConnectionByID :exec +UPDATE + workspace_agents +SET + first_connected_at = $2, + last_connected_at = $3, + disconnected_at = $4 +WHERE + id = $1 +` + +type UpdateWorkspaceAgentConnectionByIDParams struct { + ID uuid.UUID `db:"id" json:"id"` + FirstConnectedAt sql.NullTime `db:"first_connected_at" json:"first_connected_at"` + LastConnectedAt sql.NullTime `db:"last_connected_at" json:"last_connected_at"` + DisconnectedAt sql.NullTime `db:"disconnected_at" json:"disconnected_at"` +} + +func (q *sqlQuerier) UpdateWorkspaceAgentConnectionByID(ctx context.Context, arg UpdateWorkspaceAgentConnectionByIDParams) error { + _, err := q.db.ExecContext(ctx, updateWorkspaceAgentConnectionByID, + arg.ID, + arg.FirstConnectedAt, + arg.LastConnectedAt, + arg.DisconnectedAt, + ) + return err +} + +const getWorkspaceBuildByID = `-- name: GetWorkspaceBuildByID :one +SELECT + id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id +FROM + workspace_builds +WHERE + id = $1 +LIMIT + 1 +` + +func (q *sqlQuerier) GetWorkspaceBuildByID(ctx context.Context, id uuid.UUID) (WorkspaceBuild, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceBuildByID, id) + var i WorkspaceBuild + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.WorkspaceID, + &i.ProjectVersionID, + &i.Name, + &i.BeforeID, + &i.AfterID, + &i.Transition, + &i.InitiatorID, + &i.ProvisionerState, + &i.JobID, + ) + return i, err +} + +const getWorkspaceBuildByJobID = `-- name: GetWorkspaceBuildByJobID :one +SELECT + id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id +FROM + workspace_builds +WHERE + job_id = $1 +LIMIT + 1 +` + +func (q *sqlQuerier) GetWorkspaceBuildByJobID(ctx context.Context, jobID uuid.UUID) (WorkspaceBuild, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceBuildByJobID, jobID) + var i WorkspaceBuild + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.WorkspaceID, + &i.ProjectVersionID, + &i.Name, + &i.BeforeID, + &i.AfterID, + &i.Transition, + &i.InitiatorID, + &i.ProvisionerState, + &i.JobID, + ) + return i, err +} + +const getWorkspaceBuildByWorkspaceID = `-- name: GetWorkspaceBuildByWorkspaceID :many +SELECT + id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id +FROM + workspace_builds +WHERE + workspace_id = $1 +` + +func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceID(ctx context.Context, workspaceID uuid.UUID) ([]WorkspaceBuild, error) { + rows, err := q.db.QueryContext(ctx, getWorkspaceBuildByWorkspaceID, workspaceID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []WorkspaceBuild + for rows.Next() { + var i WorkspaceBuild + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.WorkspaceID, + &i.ProjectVersionID, + &i.Name, + &i.BeforeID, + &i.AfterID, + &i.Transition, + &i.InitiatorID, + &i.ProvisionerState, + &i.JobID, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getWorkspaceBuildByWorkspaceIDAndName = `-- name: GetWorkspaceBuildByWorkspaceIDAndName :one +SELECT + id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id +FROM + workspace_builds +WHERE + workspace_id = $1 + AND "name" = $2 +` + +type GetWorkspaceBuildByWorkspaceIDAndNameParams struct { + WorkspaceID uuid.UUID `db:"workspace_id" json:"workspace_id"` + Name string `db:"name" json:"name"` +} + +func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceIDAndName(ctx context.Context, arg GetWorkspaceBuildByWorkspaceIDAndNameParams) (WorkspaceBuild, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceBuildByWorkspaceIDAndName, arg.WorkspaceID, arg.Name) + var i WorkspaceBuild + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.WorkspaceID, + &i.ProjectVersionID, + &i.Name, + &i.BeforeID, + &i.AfterID, + &i.Transition, + &i.InitiatorID, + &i.ProvisionerState, + &i.JobID, + ) + return i, err +} + +const getWorkspaceBuildByWorkspaceIDWithoutAfter = `-- name: GetWorkspaceBuildByWorkspaceIDWithoutAfter :one +SELECT + id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id +FROM + workspace_builds +WHERE + workspace_id = $1 + AND after_id IS NULL +LIMIT + 1 +` + +func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceIDWithoutAfter(ctx context.Context, workspaceID uuid.UUID) (WorkspaceBuild, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceBuildByWorkspaceIDWithoutAfter, workspaceID) + var i WorkspaceBuild + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.WorkspaceID, + &i.ProjectVersionID, + &i.Name, + &i.BeforeID, + &i.AfterID, + &i.Transition, + &i.InitiatorID, + &i.ProvisionerState, + &i.JobID, + ) + return i, err +} + +const getWorkspaceBuildsByWorkspaceIDsWithoutAfter = `-- name: GetWorkspaceBuildsByWorkspaceIDsWithoutAfter :many +SELECT + id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id +FROM + workspace_builds +WHERE + workspace_id = ANY($1 :: uuid [ ]) + AND after_id IS NULL +` + +func (q *sqlQuerier) GetWorkspaceBuildsByWorkspaceIDsWithoutAfter(ctx context.Context, ids []uuid.UUID) ([]WorkspaceBuild, error) { + rows, err := q.db.QueryContext(ctx, getWorkspaceBuildsByWorkspaceIDsWithoutAfter, pq.Array(ids)) + if err != nil { + return nil, err + } + defer rows.Close() + var items []WorkspaceBuild + for rows.Next() { + var i WorkspaceBuild + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.WorkspaceID, + &i.ProjectVersionID, + &i.Name, + &i.BeforeID, + &i.AfterID, + &i.Transition, + &i.InitiatorID, + &i.ProvisionerState, + &i.JobID, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const insertWorkspaceBuild = `-- name: InsertWorkspaceBuild :one INSERT INTO - workspace_builds ( - id, - created_at, - updated_at, - workspace_id, - project_version_id, - before_id, - name, - transition, - initiator_id, - job_id, - provisioner_state - ) + workspace_builds ( + id, + created_at, + updated_at, + workspace_id, + project_version_id, + before_id, + "name", + transition, + initiator_id, + job_id, + provisioner_state + ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id ` type InsertWorkspaceBuildParams struct { @@ -2362,20 +2273,114 @@ func (q *sqlQuerier) InsertWorkspaceBuild(ctx context.Context, arg InsertWorkspa return i, err } +const updateWorkspaceBuildByID = `-- name: UpdateWorkspaceBuildByID :exec +UPDATE + workspace_builds +SET + updated_at = $2, + after_id = $3, + provisioner_state = $4 +WHERE + id = $1 +` + +type UpdateWorkspaceBuildByIDParams struct { + ID uuid.UUID `db:"id" json:"id"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + AfterID uuid.NullUUID `db:"after_id" json:"after_id"` + ProvisionerState []byte `db:"provisioner_state" json:"provisioner_state"` +} + +func (q *sqlQuerier) UpdateWorkspaceBuildByID(ctx context.Context, arg UpdateWorkspaceBuildByIDParams) error { + _, err := q.db.ExecContext(ctx, updateWorkspaceBuildByID, + arg.ID, + arg.UpdatedAt, + arg.AfterID, + arg.ProvisionerState, + ) + return err +} + +const getWorkspaceResourceByID = `-- name: GetWorkspaceResourceByID :one +SELECT + id, created_at, job_id, transition, address, type, name, agent_id +FROM + workspace_resources +WHERE + id = $1 +` + +func (q *sqlQuerier) GetWorkspaceResourceByID(ctx context.Context, id uuid.UUID) (WorkspaceResource, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceResourceByID, id) + var i WorkspaceResource + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.JobID, + &i.Transition, + &i.Address, + &i.Type, + &i.Name, + &i.AgentID, + ) + return i, err +} + +const getWorkspaceResourcesByJobID = `-- name: GetWorkspaceResourcesByJobID :many +SELECT + id, created_at, job_id, transition, address, type, name, agent_id +FROM + workspace_resources +WHERE + job_id = $1 +` + +func (q *sqlQuerier) GetWorkspaceResourcesByJobID(ctx context.Context, jobID uuid.UUID) ([]WorkspaceResource, error) { + rows, err := q.db.QueryContext(ctx, getWorkspaceResourcesByJobID, jobID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []WorkspaceResource + for rows.Next() { + var i WorkspaceResource + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.JobID, + &i.Transition, + &i.Address, + &i.Type, + &i.Name, + &i.AgentID, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const insertWorkspaceResource = `-- name: InsertWorkspaceResource :one INSERT INTO - workspace_resources ( - id, - created_at, - job_id, - transition, - address, - type, - name, - agent_id - ) + workspace_resources ( + id, + created_at, + job_id, + transition, + address, + type, + name, + agent_id + ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id, created_at, job_id, transition, address, type, name, agent_id + ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id, created_at, job_id, transition, address, type, name, agent_id ` type InsertWorkspaceResourceParams struct { @@ -2414,249 +2419,249 @@ func (q *sqlQuerier) InsertWorkspaceResource(ctx context.Context, arg InsertWork return i, err } -const updateAPIKeyByID = `-- name: UpdateAPIKeyByID :exec -UPDATE - api_keys -SET - last_used = $2, - expires_at = $3, - oidc_access_token = $4, - oidc_refresh_token = $5, - oidc_expiry = $6 +const getWorkspaceByID = `-- name: GetWorkspaceByID :one +SELECT + id, created_at, updated_at, owner_id, project_id, deleted, name +FROM + workspaces WHERE - id = $1 + id = $1 +LIMIT + 1 ` -type UpdateAPIKeyByIDParams struct { - ID string `db:"id" json:"id"` - LastUsed time.Time `db:"last_used" json:"last_used"` - ExpiresAt time.Time `db:"expires_at" json:"expires_at"` - OIDCAccessToken string `db:"oidc_access_token" json:"oidc_access_token"` - OIDCRefreshToken string `db:"oidc_refresh_token" json:"oidc_refresh_token"` - OIDCExpiry time.Time `db:"oidc_expiry" json:"oidc_expiry"` -} - -func (q *sqlQuerier) UpdateAPIKeyByID(ctx context.Context, arg UpdateAPIKeyByIDParams) error { - _, err := q.db.ExecContext(ctx, updateAPIKeyByID, - arg.ID, - arg.LastUsed, - arg.ExpiresAt, - arg.OIDCAccessToken, - arg.OIDCRefreshToken, - arg.OIDCExpiry, +func (q *sqlQuerier) GetWorkspaceByID(ctx context.Context, id uuid.UUID) (Workspace, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceByID, id) + var i Workspace + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OwnerID, + &i.ProjectID, + &i.Deleted, + &i.Name, ) - return err + return i, err } -const updateProjectActiveVersionByID = `-- name: UpdateProjectActiveVersionByID :exec -UPDATE - projects -SET - active_version_id = $2 +const getWorkspaceByUserIDAndName = `-- name: GetWorkspaceByUserIDAndName :one +SELECT + id, created_at, updated_at, owner_id, project_id, deleted, name +FROM + workspaces WHERE - id = $1 + owner_id = $1 + AND deleted = $2 + AND LOWER("name") = LOWER($3) ` -type UpdateProjectActiveVersionByIDParams struct { - ID uuid.UUID `db:"id" json:"id"` - ActiveVersionID uuid.UUID `db:"active_version_id" json:"active_version_id"` +type GetWorkspaceByUserIDAndNameParams struct { + OwnerID uuid.UUID `db:"owner_id" json:"owner_id"` + Deleted bool `db:"deleted" json:"deleted"` + Name string `db:"name" json:"name"` } -func (q *sqlQuerier) UpdateProjectActiveVersionByID(ctx context.Context, arg UpdateProjectActiveVersionByIDParams) error { - _, err := q.db.ExecContext(ctx, updateProjectActiveVersionByID, arg.ID, arg.ActiveVersionID) - return err +func (q *sqlQuerier) GetWorkspaceByUserIDAndName(ctx context.Context, arg GetWorkspaceByUserIDAndNameParams) (Workspace, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceByUserIDAndName, arg.OwnerID, arg.Deleted, arg.Name) + var i Workspace + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OwnerID, + &i.ProjectID, + &i.Deleted, + &i.Name, + ) + return i, err } -const updateProjectDeletedByID = `-- name: UpdateProjectDeletedByID :exec -UPDATE - projects -SET - deleted = $2 +const getWorkspaceOwnerCountsByProjectIDs = `-- name: GetWorkspaceOwnerCountsByProjectIDs :many +SELECT + project_id, + COUNT(DISTINCT owner_id) +FROM + workspaces WHERE - id = $1 + project_id = ANY($1 :: uuid [ ]) +GROUP BY + project_id, + owner_id ` -type UpdateProjectDeletedByIDParams struct { - ID uuid.UUID `db:"id" json:"id"` +type GetWorkspaceOwnerCountsByProjectIDsRow struct { + ProjectID uuid.UUID `db:"project_id" json:"project_id"` + Count int64 `db:"count" json:"count"` +} + +func (q *sqlQuerier) GetWorkspaceOwnerCountsByProjectIDs(ctx context.Context, ids []uuid.UUID) ([]GetWorkspaceOwnerCountsByProjectIDsRow, error) { + rows, err := q.db.QueryContext(ctx, getWorkspaceOwnerCountsByProjectIDs, pq.Array(ids)) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetWorkspaceOwnerCountsByProjectIDsRow + for rows.Next() { + var i GetWorkspaceOwnerCountsByProjectIDsRow + if err := rows.Scan(&i.ProjectID, &i.Count); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getWorkspacesByProjectID = `-- name: GetWorkspacesByProjectID :many +SELECT + id, created_at, updated_at, owner_id, project_id, deleted, name +FROM + workspaces +WHERE + project_id = $1 + AND deleted = $2 +` + +type GetWorkspacesByProjectIDParams struct { + ProjectID uuid.UUID `db:"project_id" json:"project_id"` + Deleted bool `db:"deleted" json:"deleted"` +} + +func (q *sqlQuerier) GetWorkspacesByProjectID(ctx context.Context, arg GetWorkspacesByProjectIDParams) ([]Workspace, error) { + rows, err := q.db.QueryContext(ctx, getWorkspacesByProjectID, arg.ProjectID, arg.Deleted) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Workspace + for rows.Next() { + var i Workspace + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OwnerID, + &i.ProjectID, + &i.Deleted, + &i.Name, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getWorkspacesByUserID = `-- name: GetWorkspacesByUserID :many +SELECT + id, created_at, updated_at, owner_id, project_id, deleted, name +FROM + workspaces +WHERE + owner_id = $1 + AND deleted = $2 +` + +type GetWorkspacesByUserIDParams struct { + OwnerID uuid.UUID `db:"owner_id" json:"owner_id"` Deleted bool `db:"deleted" json:"deleted"` } -func (q *sqlQuerier) UpdateProjectDeletedByID(ctx context.Context, arg UpdateProjectDeletedByIDParams) error { - _, err := q.db.ExecContext(ctx, updateProjectDeletedByID, arg.ID, arg.Deleted) - return err +func (q *sqlQuerier) GetWorkspacesByUserID(ctx context.Context, arg GetWorkspacesByUserIDParams) ([]Workspace, error) { + rows, err := q.db.QueryContext(ctx, getWorkspacesByUserID, arg.OwnerID, arg.Deleted) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Workspace + for rows.Next() { + var i Workspace + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OwnerID, + &i.ProjectID, + &i.Deleted, + &i.Name, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil } -const updateProjectVersionByID = `-- name: UpdateProjectVersionByID :exec -UPDATE - project_versions -SET - project_id = $2, - updated_at = $3 -WHERE - id = $1 +const insertWorkspace = `-- name: InsertWorkspace :one +INSERT INTO + workspaces ( + id, + created_at, + updated_at, + owner_id, + project_id, + name + ) +VALUES + ($1, $2, $3, $4, $5, $6) RETURNING id, created_at, updated_at, owner_id, project_id, deleted, name ` -type UpdateProjectVersionByIDParams struct { - ID uuid.UUID `db:"id" json:"id"` - ProjectID uuid.NullUUID `db:"project_id" json:"project_id"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` -} - -func (q *sqlQuerier) UpdateProjectVersionByID(ctx context.Context, arg UpdateProjectVersionByIDParams) error { - _, err := q.db.ExecContext(ctx, updateProjectVersionByID, arg.ID, arg.ProjectID, arg.UpdatedAt) - return err -} - -const updateProvisionerDaemonByID = `-- name: UpdateProvisionerDaemonByID :exec -UPDATE - provisioner_daemons -SET - updated_at = $2, - provisioners = $3 -WHERE - id = $1 -` - -type UpdateProvisionerDaemonByIDParams struct { - ID uuid.UUID `db:"id" json:"id"` - UpdatedAt sql.NullTime `db:"updated_at" json:"updated_at"` - Provisioners []ProvisionerType `db:"provisioners" json:"provisioners"` -} - -func (q *sqlQuerier) UpdateProvisionerDaemonByID(ctx context.Context, arg UpdateProvisionerDaemonByIDParams) error { - _, err := q.db.ExecContext(ctx, updateProvisionerDaemonByID, arg.ID, arg.UpdatedAt, pq.Array(arg.Provisioners)) - return err -} - -const updateProvisionerJobByID = `-- name: UpdateProvisionerJobByID :exec -UPDATE - provisioner_jobs -SET - updated_at = $2 -WHERE - id = $1 -` - -type UpdateProvisionerJobByIDParams struct { +type InsertWorkspaceParams struct { ID uuid.UUID `db:"id" json:"id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + OwnerID uuid.UUID `db:"owner_id" json:"owner_id"` + ProjectID uuid.UUID `db:"project_id" json:"project_id"` + Name string `db:"name" json:"name"` } -func (q *sqlQuerier) UpdateProvisionerJobByID(ctx context.Context, arg UpdateProvisionerJobByIDParams) error { - _, err := q.db.ExecContext(ctx, updateProvisionerJobByID, arg.ID, arg.UpdatedAt) - return err -} - -const updateProvisionerJobWithCancelByID = `-- name: UpdateProvisionerJobWithCancelByID :exec -UPDATE - provisioner_jobs -SET - canceled_at = $2 -WHERE - id = $1 -` - -type UpdateProvisionerJobWithCancelByIDParams struct { - ID uuid.UUID `db:"id" json:"id"` - CanceledAt sql.NullTime `db:"canceled_at" json:"canceled_at"` -} - -func (q *sqlQuerier) UpdateProvisionerJobWithCancelByID(ctx context.Context, arg UpdateProvisionerJobWithCancelByIDParams) error { - _, err := q.db.ExecContext(ctx, updateProvisionerJobWithCancelByID, arg.ID, arg.CanceledAt) - return err -} - -const updateProvisionerJobWithCompleteByID = `-- name: UpdateProvisionerJobWithCompleteByID :exec -UPDATE - provisioner_jobs -SET - updated_at = $2, - completed_at = $3, - error = $4 -WHERE - id = $1 -` - -type UpdateProvisionerJobWithCompleteByIDParams struct { - ID uuid.UUID `db:"id" json:"id"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - CompletedAt sql.NullTime `db:"completed_at" json:"completed_at"` - Error sql.NullString `db:"error" json:"error"` -} - -func (q *sqlQuerier) UpdateProvisionerJobWithCompleteByID(ctx context.Context, arg UpdateProvisionerJobWithCompleteByIDParams) error { - _, err := q.db.ExecContext(ctx, updateProvisionerJobWithCompleteByID, +func (q *sqlQuerier) InsertWorkspace(ctx context.Context, arg InsertWorkspaceParams) (Workspace, error) { + row := q.db.QueryRowContext(ctx, insertWorkspace, arg.ID, + arg.CreatedAt, arg.UpdatedAt, - arg.CompletedAt, - arg.Error, + arg.OwnerID, + arg.ProjectID, + arg.Name, ) - return err -} - -const updateWorkspaceAgentConnectionByID = `-- name: UpdateWorkspaceAgentConnectionByID :exec -UPDATE - workspace_agents -SET - first_connected_at = $2, - last_connected_at = $3, - disconnected_at = $4 -WHERE - id = $1 -` - -type UpdateWorkspaceAgentConnectionByIDParams struct { - ID uuid.UUID `db:"id" json:"id"` - FirstConnectedAt sql.NullTime `db:"first_connected_at" json:"first_connected_at"` - LastConnectedAt sql.NullTime `db:"last_connected_at" json:"last_connected_at"` - DisconnectedAt sql.NullTime `db:"disconnected_at" json:"disconnected_at"` -} - -func (q *sqlQuerier) UpdateWorkspaceAgentConnectionByID(ctx context.Context, arg UpdateWorkspaceAgentConnectionByIDParams) error { - _, err := q.db.ExecContext(ctx, updateWorkspaceAgentConnectionByID, - arg.ID, - arg.FirstConnectedAt, - arg.LastConnectedAt, - arg.DisconnectedAt, + var i Workspace + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OwnerID, + &i.ProjectID, + &i.Deleted, + &i.Name, ) - return err -} - -const updateWorkspaceBuildByID = `-- name: UpdateWorkspaceBuildByID :exec -UPDATE - workspace_builds -SET - updated_at = $2, - after_id = $3, - provisioner_state = $4 -WHERE - id = $1 -` - -type UpdateWorkspaceBuildByIDParams struct { - ID uuid.UUID `db:"id" json:"id"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - AfterID uuid.NullUUID `db:"after_id" json:"after_id"` - ProvisionerState []byte `db:"provisioner_state" json:"provisioner_state"` -} - -func (q *sqlQuerier) UpdateWorkspaceBuildByID(ctx context.Context, arg UpdateWorkspaceBuildByIDParams) error { - _, err := q.db.ExecContext(ctx, updateWorkspaceBuildByID, - arg.ID, - arg.UpdatedAt, - arg.AfterID, - arg.ProvisionerState, - ) - return err + return i, err } const updateWorkspaceDeletedByID = `-- name: UpdateWorkspaceDeletedByID :exec UPDATE - workspaces + workspaces SET - deleted = $2 + deleted = $2 WHERE - id = $1 + id = $1 ` type UpdateWorkspaceDeletedByIDParams struct { diff --git a/coderd/database/queries/README.md b/coderd/database/queries/README.md new file mode 100644 index 0000000000..4538607087 --- /dev/null +++ b/coderd/database/queries/README.md @@ -0,0 +1,6 @@ +# queries + +Database queries are generated using sqlc. See: [sqlc +docs](https://docs.sqlc.dev/en/latest/tutorials/getting-started-postgresql.html) + +Run `make gen` to generate models and query functions. diff --git a/coderd/database/queries/apikeys.sql b/coderd/database/queries/apikeys.sql new file mode 100644 index 0000000000..62dc38ed2c --- /dev/null +++ b/coderd/database/queries/apikeys.sql @@ -0,0 +1,59 @@ +-- name: GetAPIKeyByID :one +SELECT + * +FROM + api_keys +WHERE + id = $1 +LIMIT + 1; + +-- name: InsertAPIKey :one +INSERT INTO + api_keys ( + id, + hashed_secret, + user_id, + application, + "name", + last_used, + expires_at, + created_at, + updated_at, + login_type, + oidc_access_token, + oidc_refresh_token, + oidc_id_token, + oidc_expiry, + devurl_token + ) +VALUES + ( + $1, + $2, + $3, + $4, + $5, + $6, + $7, + $8, + $9, + $10, + $11, + $12, + $13, + $14, + $15 + ) RETURNING *; + +-- name: UpdateAPIKeyByID :exec +UPDATE + api_keys +SET + last_used = $2, + expires_at = $3, + oidc_access_token = $4, + oidc_refresh_token = $5, + oidc_expiry = $6 +WHERE + id = $1; diff --git a/coderd/database/queries/files.sql b/coderd/database/queries/files.sql new file mode 100644 index 0000000000..a91513d31a --- /dev/null +++ b/coderd/database/queries/files.sql @@ -0,0 +1,15 @@ +-- name: GetFileByHash :one +SELECT + * +FROM + files +WHERE + hash = $1 +LIMIT + 1; + +-- name: InsertFile :one +INSERT INTO + files (hash, created_at, created_by, mimetype, "data") +VALUES + ($1, $2, $3, $4, $5) RETURNING *; diff --git a/coderd/database/queries/organizationmembers.sql b/coderd/database/queries/organizationmembers.sql new file mode 100644 index 0000000000..243bdc26c9 --- /dev/null +++ b/coderd/database/queries/organizationmembers.sql @@ -0,0 +1,22 @@ +-- name: GetOrganizationMemberByUserID :one +SELECT + * +FROM + organization_members +WHERE + organization_id = $1 + AND user_id = $2 +LIMIT + 1; + +-- name: InsertOrganizationMember :one +INSERT INTO + organization_members ( + organization_id, + user_id, + created_at, + updated_at, + roles + ) +VALUES + ($1, $2, $3, $4, $5) RETURNING *; diff --git a/coderd/database/queries/organizations.sql b/coderd/database/queries/organizations.sql new file mode 100644 index 0000000000..1682c04a8f --- /dev/null +++ b/coderd/database/queries/organizations.sql @@ -0,0 +1,38 @@ +-- name: GetOrganizationByID :one +SELECT + * +FROM + organizations +WHERE + id = $1; + +-- name: GetOrganizationByName :one +SELECT + * +FROM + organizations +WHERE + LOWER("name") = LOWER(@name) +LIMIT + 1; + +-- name: GetOrganizationsByUserID :many +SELECT + * +FROM + organizations +WHERE + id = ( + SELECT + organization_id + FROM + organization_members + WHERE + user_id = $1 + ); + +-- name: InsertOrganization :one +INSERT INTO + organizations (id, "name", description, created_at, updated_at) +VALUES + ($1, $2, $3, $4, $5) RETURNING *; diff --git a/coderd/database/queries/parameterschemas.sql b/coderd/database/queries/parameterschemas.sql new file mode 100644 index 0000000000..e813138a8a --- /dev/null +++ b/coderd/database/queries/parameterschemas.sql @@ -0,0 +1,47 @@ +-- name: GetParameterSchemasByJobID :many +SELECT + * +FROM + parameter_schemas +WHERE + job_id = $1; + +-- name: InsertParameterSchema :one +INSERT INTO + parameter_schemas ( + id, + created_at, + job_id, + "name", + description, + default_source_scheme, + default_source_value, + allow_override_source, + default_destination_scheme, + allow_override_destination, + default_refresh, + redisplay_value, + validation_error, + validation_condition, + validation_type_system, + validation_value_type + ) +VALUES + ( + $1, + $2, + $3, + $4, + $5, + $6, + $7, + $8, + $9, + $10, + $11, + $12, + $13, + $14, + $15, + $16 + ) RETURNING *; diff --git a/coderd/database/queries/parametervalues.sql b/coderd/database/queries/parametervalues.sql new file mode 100644 index 0000000000..5a6ea6ece2 --- /dev/null +++ b/coderd/database/queries/parametervalues.sql @@ -0,0 +1,42 @@ +-- name: DeleteParameterValueByID :exec +DELETE FROM + parameter_values +WHERE + id = $1; + +-- name: GetParameterValuesByScope :many +SELECT + * +FROM + parameter_values +WHERE + scope = $1 + AND scope_id = $2; + +-- name: GetParameterValueByScopeAndName :one +SELECT + * +FROM + parameter_values +WHERE + scope = $1 + AND scope_id = $2 + AND NAME = $3 +LIMIT + 1; + +-- name: InsertParameterValue :one +INSERT INTO + parameter_values ( + id, + "name", + created_at, + updated_at, + scope, + scope_id, + source_scheme, + source_value, + destination_scheme + ) +VALUES + ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING *; diff --git a/coderd/database/queries/projects.sql b/coderd/database/queries/projects.sql new file mode 100644 index 0000000000..6b134bc8b1 --- /dev/null +++ b/coderd/database/queries/projects.sql @@ -0,0 +1,68 @@ +-- name: GetProjectByID :one +SELECT + * +FROM + projects +WHERE + id = $1 +LIMIT + 1; + +-- name: GetProjectsByIDs :many +SELECT + * +FROM + projects +WHERE + id = ANY(@ids :: uuid [ ]); + +-- name: GetProjectByOrganizationAndName :one +SELECT + * +FROM + projects +WHERE + organization_id = @organization_id + AND deleted = @deleted + AND LOWER("name") = LOWER(@name) +LIMIT + 1; + +-- name: GetProjectsByOrganization :many +SELECT + * +FROM + projects +WHERE + organization_id = $1 + AND deleted = $2; + +-- name: InsertProject :one +INSERT INTO + projects ( + id, + created_at, + updated_at, + organization_id, + "name", + provisioner, + active_version_id + ) +VALUES + ($1, $2, $3, $4, $5, $6, $7) RETURNING *; + +-- name: UpdateProjectActiveVersionByID :exec +UPDATE + projects +SET + active_version_id = $2 +WHERE + id = $1; + +-- name: UpdateProjectDeletedByID :exec +UPDATE + projects +SET + deleted = $2 +WHERE + id = $1; diff --git a/coderd/database/queries/projectversions.sql b/coderd/database/queries/projectversions.sql new file mode 100644 index 0000000000..ad07f0e9b6 --- /dev/null +++ b/coderd/database/queries/projectversions.sql @@ -0,0 +1,56 @@ +-- name: GetProjectVersionsByProjectID :many +SELECT + * +FROM + project_versions +WHERE + project_id = $1 :: uuid; + +-- name: GetProjectVersionByJobID :one +SELECT + * +FROM + project_versions +WHERE + job_id = $1; + +-- name: GetProjectVersionByProjectIDAndName :one +SELECT + * +FROM + project_versions +WHERE + project_id = $1 + AND "name" = $2; + +-- name: GetProjectVersionByID :one +SELECT + * +FROM + project_versions +WHERE + id = $1; + +-- name: InsertProjectVersion :one +INSERT INTO + project_versions ( + id, + project_id, + organization_id, + created_at, + updated_at, + "name", + description, + job_id + ) +VALUES + ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *; + +-- name: UpdateProjectVersionByID :exec +UPDATE + project_versions +SET + project_id = $2, + updated_at = $3 +WHERE + id = $1; diff --git a/coderd/database/queries/provisionerdaemons.sql b/coderd/database/queries/provisionerdaemons.sql new file mode 100644 index 0000000000..0051c5428f --- /dev/null +++ b/coderd/database/queries/provisionerdaemons.sql @@ -0,0 +1,34 @@ +-- name: GetProvisionerDaemonByID :one +SELECT + * +FROM + provisioner_daemons +WHERE + id = $1; + +-- name: GetProvisionerDaemons :many +SELECT + * +FROM + provisioner_daemons; + +-- name: InsertProvisionerDaemon :one +INSERT INTO + provisioner_daemons ( + id, + created_at, + organization_id, + "name", + provisioners + ) +VALUES + ($1, $2, $3, $4, $5) RETURNING *; + +-- name: UpdateProvisionerDaemonByID :exec +UPDATE + provisioner_daemons +SET + updated_at = $2, + provisioners = $3 +WHERE + id = $1; diff --git a/coderd/database/queries/provisionerjoblogs.sql b/coderd/database/queries/provisionerjoblogs.sql new file mode 100644 index 0000000000..d9fb35af47 --- /dev/null +++ b/coderd/database/queries/provisionerjoblogs.sql @@ -0,0 +1,25 @@ +-- name: GetProvisionerLogsByIDBetween :many +SELECT + * +FROM + provisioner_job_logs +WHERE + job_id = @job_id + AND ( + created_at >= @created_after + OR created_at <= @created_before + ) +ORDER BY + created_at DESC; + +-- name: InsertProvisionerJobLogs :many +INSERT INTO + provisioner_job_logs +SELECT + unnest(@id :: uuid [ ]) AS id, + @job_id :: uuid AS job_id, + unnest(@created_at :: timestamptz [ ]) AS created_at, + unnest(@source :: log_source [ ]) AS source, + unnest(@level :: log_level [ ]) AS LEVEL, + unnest(@stage :: VARCHAR(128) [ ]) AS stage, + unnest(@output :: VARCHAR(1024) [ ]) AS output RETURNING *; diff --git a/coderd/database/queries/provisionerjobs.sql b/coderd/database/queries/provisionerjobs.sql new file mode 100644 index 0000000000..116299804c --- /dev/null +++ b/coderd/database/queries/provisionerjobs.sql @@ -0,0 +1,90 @@ +-- Acquires the lock for a single job that isn't started, completed, +-- canceled, and that matches an array of provisioner types. +-- +-- SKIP LOCKED is used to jump over locked rows. This prevents +-- multiple provisioners from acquiring the same jobs. See: +-- https://www.postgresql.org/docs/9.5/sql-select.html#SQL-FOR-UPDATE-SHARE +-- name: AcquireProvisionerJob :one +UPDATE + provisioner_jobs +SET + started_at = @started_at, + updated_at = @started_at, + worker_id = @worker_id +WHERE + id = ( + SELECT + id + FROM + provisioner_jobs AS nested + WHERE + nested.started_at IS NULL + AND nested.canceled_at IS NULL + AND nested.completed_at IS NULL + AND nested.provisioner = ANY(@types :: provisioner_type [ ]) + ORDER BY + nested.created_at FOR + UPDATE + SKIP LOCKED + LIMIT + 1 + ) RETURNING *; + +-- name: GetProvisionerJobByID :one +SELECT + * +FROM + provisioner_jobs +WHERE + id = $1; + +-- name: GetProvisionerJobsByIDs :many +SELECT + * +FROM + provisioner_jobs +WHERE + id = ANY(@ids :: uuid [ ]); + +-- name: InsertProvisionerJob :one +INSERT INTO + provisioner_jobs ( + id, + created_at, + updated_at, + organization_id, + initiator_id, + provisioner, + storage_method, + storage_source, + "type", + "input" + ) +VALUES + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *; + +-- name: UpdateProvisionerJobByID :exec +UPDATE + provisioner_jobs +SET + updated_at = $2 +WHERE + id = $1; + +-- name: UpdateProvisionerJobWithCancelByID :exec +UPDATE + provisioner_jobs +SET + canceled_at = $2 +WHERE + id = $1; + +-- name: UpdateProvisionerJobWithCompleteByID :exec +UPDATE + provisioner_jobs +SET + updated_at = $2, + completed_at = $3, + error = $4 +WHERE + id = $1; diff --git a/coderd/database/queries/users.sql b/coderd/database/queries/users.sql new file mode 100644 index 0000000000..08589699be --- /dev/null +++ b/coderd/database/queries/users.sql @@ -0,0 +1,42 @@ +-- name: GetUserByID :one +SELECT + * +FROM + users +WHERE + id = $1 +LIMIT + 1; + +-- name: GetUserByEmailOrUsername :one +SELECT + * +FROM + users +WHERE + LOWER(username) = LOWER(@username) + OR email = @email +LIMIT + 1; + +-- name: GetUserCount :one +SELECT + COUNT(*) +FROM + users; + +-- name: InsertUser :one +INSERT INTO + users ( + id, + email, + "name", + login_type, + revoked, + hashed_password, + created_at, + updated_at, + username + ) +VALUES + ($1, $2, $3, $4, FALSE, $5, $6, $7, $8) RETURNING *; diff --git a/coderd/database/queries/workspaceagents.sql b/coderd/database/queries/workspaceagents.sql new file mode 100644 index 0000000000..a2a206bba0 --- /dev/null +++ b/coderd/database/queries/workspaceagents.sql @@ -0,0 +1,54 @@ +-- name: GetWorkspaceAgentByAuthToken :one +SELECT + * +FROM + workspace_agents +WHERE + auth_token = $1 +ORDER BY + created_at DESC; + +-- name: GetWorkspaceAgentByInstanceID :one +SELECT + * +FROM + workspace_agents +WHERE + auth_instance_id = @auth_instance_id :: TEXT +ORDER BY + created_at DESC; + +-- name: GetWorkspaceAgentByResourceID :one +SELECT + * +FROM + workspace_agents +WHERE + resource_id = $1; + +-- name: InsertWorkspaceAgent :one +INSERT INTO + workspace_agents ( + id, + created_at, + updated_at, + resource_id, + auth_token, + auth_instance_id, + environment_variables, + startup_script, + instance_metadata, + resource_metadata + ) +VALUES + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *; + +-- name: UpdateWorkspaceAgentConnectionByID :exec +UPDATE + workspace_agents +SET + first_connected_at = $2, + last_connected_at = $3, + disconnected_at = $4 +WHERE + id = $1; diff --git a/coderd/database/queries/workspacebuilds.sql b/coderd/database/queries/workspacebuilds.sql new file mode 100644 index 0000000000..a73d8bf19d --- /dev/null +++ b/coderd/database/queries/workspacebuilds.sql @@ -0,0 +1,84 @@ +-- name: GetWorkspaceBuildByID :one +SELECT + * +FROM + workspace_builds +WHERE + id = $1 +LIMIT + 1; + +-- name: GetWorkspaceBuildByJobID :one +SELECT + * +FROM + workspace_builds +WHERE + job_id = $1 +LIMIT + 1; + +-- name: GetWorkspaceBuildByWorkspaceIDAndName :one +SELECT + * +FROM + workspace_builds +WHERE + workspace_id = $1 + AND "name" = $2; + +-- name: GetWorkspaceBuildByWorkspaceID :many +SELECT + * +FROM + workspace_builds +WHERE + workspace_id = $1; + +-- name: GetWorkspaceBuildByWorkspaceIDWithoutAfter :one +SELECT + * +FROM + workspace_builds +WHERE + workspace_id = $1 + AND after_id IS NULL +LIMIT + 1; + +-- name: GetWorkspaceBuildsByWorkspaceIDsWithoutAfter :many +SELECT + * +FROM + workspace_builds +WHERE + workspace_id = ANY(@ids :: uuid [ ]) + AND after_id IS NULL; + +-- name: InsertWorkspaceBuild :one +INSERT INTO + workspace_builds ( + id, + created_at, + updated_at, + workspace_id, + project_version_id, + before_id, + "name", + transition, + initiator_id, + job_id, + provisioner_state + ) +VALUES + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING *; + +-- name: UpdateWorkspaceBuildByID :exec +UPDATE + workspace_builds +SET + updated_at = $2, + after_id = $3, + provisioner_state = $4 +WHERE + id = $1; diff --git a/coderd/database/queries/workspaceresources.sql b/coderd/database/queries/workspaceresources.sql new file mode 100644 index 0000000000..17a352a67f --- /dev/null +++ b/coderd/database/queries/workspaceresources.sql @@ -0,0 +1,30 @@ +-- name: GetWorkspaceResourceByID :one +SELECT + * +FROM + workspace_resources +WHERE + id = $1; + +-- name: GetWorkspaceResourcesByJobID :many +SELECT + * +FROM + workspace_resources +WHERE + job_id = $1; + +-- name: InsertWorkspaceResource :one +INSERT INTO + workspace_resources ( + id, + created_at, + job_id, + transition, + address, + type, + name, + agent_id + ) +VALUES + ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *; diff --git a/coderd/database/queries/workspaces.sql b/coderd/database/queries/workspaces.sql new file mode 100644 index 0000000000..99237a8cf7 --- /dev/null +++ b/coderd/database/queries/workspaces.sql @@ -0,0 +1,70 @@ +-- name: GetWorkspaceByID :one +SELECT + * +FROM + workspaces +WHERE + id = $1 +LIMIT + 1; + +-- name: GetWorkspacesByProjectID :many +SELECT + * +FROM + workspaces +WHERE + project_id = $1 + AND deleted = $2; + +-- name: GetWorkspacesByUserID :many +SELECT + * +FROM + workspaces +WHERE + owner_id = $1 + AND deleted = $2; + +-- name: GetWorkspaceByUserIDAndName :one +SELECT + * +FROM + workspaces +WHERE + owner_id = @owner_id + AND deleted = @deleted + AND LOWER("name") = LOWER(@name); + +-- name: GetWorkspaceOwnerCountsByProjectIDs :many +SELECT + project_id, + COUNT(DISTINCT owner_id) +FROM + workspaces +WHERE + project_id = ANY(@ids :: uuid [ ]) +GROUP BY + project_id, + owner_id; + +-- name: InsertWorkspace :one +INSERT INTO + workspaces ( + id, + created_at, + updated_at, + owner_id, + project_id, + name + ) +VALUES + ($1, $2, $3, $4, $5, $6) RETURNING *; + +-- name: UpdateWorkspaceDeletedByID :exec +UPDATE + workspaces +SET + deleted = $2 +WHERE + id = $1; diff --git a/coderd/database/query.sql b/coderd/database/query.sql deleted file mode 100644 index bfe1dc5afa..0000000000 --- a/coderd/database/query.sql +++ /dev/null @@ -1,791 +0,0 @@ --- Database queries are generated using sqlc. See: --- https://docs.sqlc.dev/en/latest/tutorials/getting-started-postgresql.html --- --- Run "make gen" to generate models and query functions. -; - --- Acquires the lock for a single job that isn't started, completed, --- canceled, and that matches an array of provisioner types. --- --- SKIP LOCKED is used to jump over locked rows. This prevents --- multiple provisioners from acquiring the same jobs. See: --- https://www.postgresql.org/docs/9.5/sql-select.html#SQL-FOR-UPDATE-SHARE --- name: AcquireProvisionerJob :one -UPDATE - provisioner_jobs -SET - started_at = @started_at, - updated_at = @started_at, - worker_id = @worker_id -WHERE - id = ( - SELECT - id - FROM - provisioner_jobs AS nested - WHERE - nested.started_at IS NULL - AND nested.canceled_at IS NULL - AND nested.completed_at IS NULL - AND nested.provisioner = ANY(@types :: provisioner_type [ ]) - ORDER BY - nested.created_at FOR - UPDATE - SKIP LOCKED - LIMIT - 1 - ) RETURNING *; - --- name: DeleteParameterValueByID :exec -DELETE FROM - parameter_values -WHERE - id = $1; - --- name: GetAPIKeyByID :one -SELECT - * -FROM - api_keys -WHERE - id = $1 -LIMIT - 1; - --- name: GetFileByHash :one -SELECT - * -FROM - files -WHERE - hash = $1 -LIMIT - 1; - --- name: GetUserByID :one -SELECT - * -FROM - users -WHERE - id = $1 -LIMIT - 1; - --- name: GetUserByEmailOrUsername :one -SELECT - * -FROM - users -WHERE - LOWER(username) = LOWER(@username) - OR email = @email -LIMIT - 1; - --- name: GetUserCount :one -SELECT - COUNT(*) -FROM - users; - --- name: GetOrganizationByID :one -SELECT - * -FROM - organizations -WHERE - id = $1; - --- name: GetOrganizationByName :one -SELECT - * -FROM - organizations -WHERE - LOWER(name) = LOWER(@name) -LIMIT - 1; - --- name: GetOrganizationsByUserID :many -SELECT - * -FROM - organizations -WHERE - id = ( - SELECT - organization_id - FROM - organization_members - WHERE - user_id = $1 - ); - --- name: GetOrganizationMemberByUserID :one -SELECT - * -FROM - organization_members -WHERE - organization_id = $1 - AND user_id = $2 -LIMIT - 1; - --- name: GetParameterValuesByScope :many -SELECT - * -FROM - parameter_values -WHERE - scope = $1 - AND scope_id = $2; - --- name: GetParameterValueByScopeAndName :one -SELECT - * -FROM - parameter_values -WHERE - scope = $1 - AND scope_id = $2 - AND name = $3 -LIMIT - 1; - --- name: GetProjectByID :one -SELECT - * -FROM - projects -WHERE - id = $1 -LIMIT - 1; - --- name: GetProjectsByIDs :many -SELECT - * -FROM - projects -WHERE - id = ANY(@ids :: uuid [ ]); - --- name: GetProjectByOrganizationAndName :one -SELECT - * -FROM - projects -WHERE - organization_id = @organization_id - AND deleted = @deleted - AND LOWER(name) = LOWER(@name) -LIMIT - 1; - --- name: GetProjectsByOrganization :many -SELECT - * -FROM - projects -WHERE - organization_id = $1 - AND deleted = $2; - --- name: GetParameterSchemasByJobID :many -SELECT - * -FROM - parameter_schemas -WHERE - job_id = $1; - --- name: GetProjectVersionsByProjectID :many -SELECT - * -FROM - project_versions -WHERE - project_id = $1 :: uuid; - --- name: GetProjectVersionByJobID :one -SELECT - * -FROM - project_versions -WHERE - job_id = $1; - --- name: GetProjectVersionByProjectIDAndName :one -SELECT - * -FROM - project_versions -WHERE - project_id = $1 - AND name = $2; - --- name: GetProjectVersionByID :one -SELECT - * -FROM - project_versions -WHERE - id = $1; - --- name: GetProvisionerLogsByIDBetween :many -SELECT - * -FROM - provisioner_job_logs -WHERE - job_id = @job_id - AND ( - created_at >= @created_after - OR created_at <= @created_before - ) -ORDER BY - created_at; - --- name: GetProvisionerDaemonByID :one -SELECT - * -FROM - provisioner_daemons -WHERE - id = $1; - --- name: GetProvisionerDaemons :many -SELECT - * -FROM - provisioner_daemons; - --- name: GetWorkspaceAgentByAuthToken :one -SELECT - * -FROM - workspace_agents -WHERE - auth_token = $1 -ORDER BY - created_at DESC; - --- name: GetWorkspaceAgentByInstanceID :one -SELECT - * -FROM - workspace_agents -WHERE - auth_instance_id = @auth_instance_id :: text -ORDER BY - created_at DESC; - --- name: GetProvisionerJobByID :one -SELECT - * -FROM - provisioner_jobs -WHERE - id = $1; - --- name: GetProvisionerJobsByIDs :many -SELECT - * -FROM - provisioner_jobs -WHERE - id = ANY(@ids :: uuid [ ]); - --- name: GetWorkspaceByID :one -SELECT - * -FROM - workspaces -WHERE - id = $1 -LIMIT - 1; - --- name: GetWorkspacesByProjectID :many -SELECT - * -FROM - workspaces -WHERE - project_id = $1 - AND deleted = $2; - --- name: GetWorkspacesByUserID :many -SELECT - * -FROM - workspaces -WHERE - owner_id = $1 - AND deleted = $2; - --- name: GetWorkspaceByUserIDAndName :one -SELECT - * -FROM - workspaces -WHERE - owner_id = @owner_id - AND deleted = @deleted - AND LOWER(name) = LOWER(@name); - --- name: GetWorkspaceOwnerCountsByProjectIDs :many -SELECT - project_id, - COUNT(DISTINCT owner_id) -FROM - workspaces -WHERE - project_id = ANY(@ids :: uuid [ ]) -GROUP BY - project_id, - owner_id; - --- name: GetWorkspaceBuildByID :one -SELECT - * -FROM - workspace_builds -WHERE - id = $1 -LIMIT - 1; - --- name: GetWorkspaceBuildByJobID :one -SELECT - * -FROM - workspace_builds -WHERE - job_id = $1 -LIMIT - 1; - --- name: GetWorkspaceBuildByWorkspaceIDAndName :one -SELECT - * -FROM - workspace_builds -WHERE - workspace_id = $1 - AND name = $2; - --- name: GetWorkspaceBuildByWorkspaceID :many -SELECT - * -FROM - workspace_builds -WHERE - workspace_id = $1; - --- name: GetWorkspaceBuildByWorkspaceIDWithoutAfter :one -SELECT - * -FROM - workspace_builds -WHERE - workspace_id = $1 - AND after_id IS NULL -LIMIT - 1; - --- name: GetWorkspaceBuildsByWorkspaceIDsWithoutAfter :many -SELECT - * -FROM - workspace_builds -WHERE - workspace_id = ANY(@ids :: uuid [ ]) - AND after_id IS NULL; - --- name: GetWorkspaceResourceByID :one -SELECT - * -FROM - workspace_resources -WHERE - id = $1; - --- name: GetWorkspaceResourcesByJobID :many -SELECT - * -FROM - workspace_resources -WHERE - job_id = $1; - --- name: GetWorkspaceAgentByResourceID :one -SELECT - * -FROM - workspace_agents -WHERE - resource_id = $1; - --- name: InsertAPIKey :one -INSERT INTO - api_keys ( - id, - hashed_secret, - user_id, - application, - name, - last_used, - expires_at, - created_at, - updated_at, - login_type, - oidc_access_token, - oidc_refresh_token, - oidc_id_token, - oidc_expiry, - devurl_token - ) -VALUES - ( - $1, - $2, - $3, - $4, - $5, - $6, - $7, - $8, - $9, - $10, - $11, - $12, - $13, - $14, - $15 - ) RETURNING *; - --- name: InsertFile :one -INSERT INTO - files (hash, created_at, created_by, mimetype, data) -VALUES - ($1, $2, $3, $4, $5) RETURNING *; - --- name: InsertProvisionerJobLogs :many -INSERT INTO - provisioner_job_logs -SELECT - unnest(@id :: uuid [ ]) AS id, - @job_id :: uuid AS job_id, - unnest(@created_at :: timestamptz [ ]) AS created_at, - unnest(@source :: log_source [ ]) as source, - unnest(@level :: log_level [ ]) as level, - unnest(@stage :: varchar(128) [ ]) as stage, - unnest(@output :: varchar(1024) [ ]) as output RETURNING *; - --- name: InsertOrganization :one -INSERT INTO - organizations (id, name, description, created_at, updated_at) -VALUES - ($1, $2, $3, $4, $5) RETURNING *; - --- name: InsertOrganizationMember :one -INSERT INTO - organization_members ( - organization_id, - user_id, - created_at, - updated_at, - roles - ) -VALUES - ($1, $2, $3, $4, $5) RETURNING *; - --- name: InsertParameterValue :one -INSERT INTO - parameter_values ( - id, - name, - created_at, - updated_at, - scope, - scope_id, - source_scheme, - source_value, - destination_scheme - ) -VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING *; - --- name: InsertProject :one -INSERT INTO - projects ( - id, - created_at, - updated_at, - organization_id, - name, - provisioner, - active_version_id - ) -VALUES - ($1, $2, $3, $4, $5, $6, $7) RETURNING *; - --- name: InsertWorkspaceResource :one -INSERT INTO - workspace_resources ( - id, - created_at, - job_id, - transition, - address, - type, - name, - agent_id - ) -VALUES - ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *; - --- name: InsertProjectVersion :one -INSERT INTO - project_versions ( - id, - project_id, - organization_id, - created_at, - updated_at, - name, - description, - job_id - ) -VALUES - ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *; - --- name: InsertParameterSchema :one -INSERT INTO - parameter_schemas ( - id, - created_at, - job_id, - name, - description, - default_source_scheme, - default_source_value, - allow_override_source, - default_destination_scheme, - allow_override_destination, - default_refresh, - redisplay_value, - validation_error, - validation_condition, - validation_type_system, - validation_value_type - ) -VALUES - ( - $1, - $2, - $3, - $4, - $5, - $6, - $7, - $8, - $9, - $10, - $11, - $12, - $13, - $14, - $15, - $16 - ) RETURNING *; - --- name: InsertProvisionerDaemon :one -INSERT INTO - provisioner_daemons (id, created_at, organization_id, name, provisioners) -VALUES - ($1, $2, $3, $4, $5) RETURNING *; - --- name: InsertProvisionerJob :one -INSERT INTO - provisioner_jobs ( - id, - created_at, - updated_at, - organization_id, - initiator_id, - provisioner, - storage_method, - storage_source, - type, - input - ) -VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *; - --- name: InsertUser :one -INSERT INTO - users ( - id, - email, - name, - login_type, - revoked, - hashed_password, - created_at, - updated_at, - username - ) -VALUES - ($1, $2, $3, $4, false, $5, $6, $7, $8) RETURNING *; - --- name: InsertWorkspace :one -INSERT INTO - workspaces ( - id, - created_at, - updated_at, - owner_id, - project_id, - name - ) -VALUES - ($1, $2, $3, $4, $5, $6) RETURNING *; - --- name: InsertWorkspaceAgent :one -INSERT INTO - workspace_agents ( - id, - created_at, - updated_at, - resource_id, - auth_token, - auth_instance_id, - environment_variables, - startup_script, - instance_metadata, - resource_metadata - ) -VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *; - --- name: InsertWorkspaceBuild :one -INSERT INTO - workspace_builds ( - id, - created_at, - updated_at, - workspace_id, - project_version_id, - before_id, - name, - transition, - initiator_id, - job_id, - provisioner_state - ) -VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING *; - --- name: UpdateAPIKeyByID :exec -UPDATE - api_keys -SET - last_used = $2, - expires_at = $3, - oidc_access_token = $4, - oidc_refresh_token = $5, - oidc_expiry = $6 -WHERE - id = $1; - --- name: UpdateProjectActiveVersionByID :exec -UPDATE - projects -SET - active_version_id = $2 -WHERE - id = $1; - --- name: UpdateProjectDeletedByID :exec -UPDATE - projects -SET - deleted = $2 -WHERE - id = $1; - --- name: UpdateProjectVersionByID :exec -UPDATE - project_versions -SET - project_id = $2, - updated_at = $3 -WHERE - id = $1; - --- name: UpdateProvisionerDaemonByID :exec -UPDATE - provisioner_daemons -SET - updated_at = $2, - provisioners = $3 -WHERE - id = $1; - --- name: UpdateProvisionerJobByID :exec -UPDATE - provisioner_jobs -SET - updated_at = $2 -WHERE - id = $1; - --- name: UpdateProvisionerJobWithCancelByID :exec -UPDATE - provisioner_jobs -SET - canceled_at = $2 -WHERE - id = $1; - --- name: UpdateProvisionerJobWithCompleteByID :exec -UPDATE - provisioner_jobs -SET - updated_at = $2, - completed_at = $3, - error = $4 -WHERE - id = $1; - --- name: UpdateWorkspaceDeletedByID :exec -UPDATE - workspaces -SET - deleted = $2 -WHERE - id = $1; - --- name: UpdateWorkspaceAgentConnectionByID :exec -UPDATE - workspace_agents -SET - first_connected_at = $2, - last_connected_at = $3, - disconnected_at = $4 -WHERE - id = $1; - --- name: UpdateWorkspaceBuildByID :exec -UPDATE - workspace_builds -SET - updated_at = $2, - after_id = $3, - provisioner_state = $4 -WHERE - id = $1; diff --git a/coderd/database/sqlc.yaml b/coderd/database/sqlc.yaml index 01ad9dc733..8248ad8a72 100644 --- a/coderd/database/sqlc.yaml +++ b/coderd/database/sqlc.yaml @@ -4,8 +4,8 @@ version: "1" packages: - name: "database" - path: "." - queries: "./query.sql" + path: "./queries" + queries: "./queries" schema: "./dump.sql" engine: "postgresql" emit_interface: true diff --git a/go.mod b/go.mod index 9594fa2e37..2a96acb125 100644 --- a/go.mod +++ b/go.mod @@ -40,6 +40,7 @@ require ( github.com/briandowns/spinner v1.18.1 github.com/charmbracelet/charm v0.11.0 github.com/charmbracelet/lipgloss v0.5.0 + github.com/cli/safeexec v1.0.0 github.com/cloudflare/cloudflared v0.0.0-20220308214351-5352b3cf0489 github.com/coder/retry v1.3.0 github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf @@ -93,8 +94,6 @@ require ( storj.io/drpc v0.0.30 ) -require github.com/cli/safeexec v1.0.0 - require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/BurntSushi/toml v1.0.0 // indirect