diff --git a/.github/workflows/coder.yaml b/.github/workflows/coder.yaml index 8c1b36cc92bae..366553bcc0b86 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 9d6e66a1b84c0..91baebe6cc1ee 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 64f3525a3c336..3ee32b5f98d07 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 0000000000000..7e5eb965742c1 --- /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 b9b778ea69eb0..220a076c1f532 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 3f8393c9cb750..517a33b186873 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 f0572bc5610e6..49f0669143f38 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,93 +13,115 @@ import ( "github.com/tabbed/pqtype" ) -const acquireProvisionerJob = `-- name: AcquireProvisionerJob :one -UPDATE - provisioner_jobs -SET - started_at = $1, - updated_at = $1, - worker_id = $2 +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 +FROM + api_keys 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 + id = $1 +LIMIT + 1 ` -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 +func (q *sqlQuerier) GetAPIKeyByID(ctx context.Context, id string) (APIKey, error) { + row := q.db.QueryRowContext(ctx, getAPIKeyByID, id) + var i APIKey err := row.Scan( &i.ID, + &i.HashedSecret, + &i.UserID, + &i.Application, + &i.Name, + &i.LastUsed, + &i.ExpiresAt, &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, + &i.LoginType, + &i.OIDCAccessToken, + &i.OIDCRefreshToken, + &i.OIDCIDToken, + &i.OIDCExpiry, + &i.DevurlToken, ) return i, err } -const deleteParameterValueByID = `-- name: DeleteParameterValueByID :exec -DELETE FROM - parameter_values -WHERE - id = $1 +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 + ) +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 ` -func (q *sqlQuerier) DeleteParameterValueByID(ctx context.Context, id uuid.UUID) error { - _, err := q.db.ExecContext(ctx, deleteParameterValueByID, id) - return err +type InsertAPIKeyParams struct { + ID string `db:"id" json:"id"` + HashedSecret []byte `db:"hashed_secret" json:"hashed_secret"` + UserID uuid.UUID `db:"user_id" json:"user_id"` + Application bool `db:"application" json:"application"` + Name string `db:"name" json:"name"` + LastUsed time.Time `db:"last_used" json:"last_used"` + ExpiresAt time.Time `db:"expires_at" json:"expires_at"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + LoginType LoginType `db:"login_type" json:"login_type"` + OIDCAccessToken string `db:"oidc_access_token" json:"oidc_access_token"` + OIDCRefreshToken string `db:"oidc_refresh_token" json:"oidc_refresh_token"` + OIDCIDToken string `db:"oidc_id_token" json:"oidc_id_token"` + OIDCExpiry time.Time `db:"oidc_expiry" json:"oidc_expiry"` + DevurlToken bool `db:"devurl_token" json:"devurl_token"` } -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 -FROM - api_keys -WHERE - id = $1 -LIMIT - 1 -` - -func (q *sqlQuerier) GetAPIKeyByID(ctx context.Context, id string) (APIKey, error) { - row := q.db.QueryRowContext(ctx, getAPIKeyByID, id) +func (q *sqlQuerier) InsertAPIKey(ctx context.Context, arg InsertAPIKeyParams) (APIKey, error) { + row := q.db.QueryRowContext(ctx, insertAPIKey, + arg.ID, + arg.HashedSecret, + arg.UserID, + arg.Application, + arg.Name, + arg.LastUsed, + arg.ExpiresAt, + arg.CreatedAt, + arg.UpdatedAt, + arg.LoginType, + arg.OIDCAccessToken, + arg.OIDCRefreshToken, + arg.OIDCIDToken, + arg.OIDCExpiry, + arg.DevurlToken, + ) var i APIKey err := row.Scan( &i.ID, @@ -122,15 +143,49 @@ func (q *sqlQuerier) GetAPIKeyByID(ctx context.Context, id string) (APIKey, erro 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 + hash, created_at, created_by, mimetype, data FROM - files + files WHERE - hash = $1 + hash = $1 LIMIT - 1 + 1 ` func (q *sqlQuerier) GetFileByHash(ctx context.Context, hash string) (File, error) { @@ -146,41 +201,121 @@ func (q *sqlQuerier) GetFileByHash(ctx context.Context, hash string) (File, erro return i, err } -const getOrganizationByID = `-- name: GetOrganizationByID :one +const insertFile = `-- name: InsertFile :one +INSERT INTO + files (hash, created_at, created_by, mimetype, "data") +VALUES + ($1, $2, $3, $4, $5) RETURNING hash, created_at, created_by, mimetype, data +` + +type InsertFileParams struct { + Hash string `db:"hash" json:"hash"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + CreatedBy uuid.UUID `db:"created_by" json:"created_by"` + Mimetype string `db:"mimetype" json:"mimetype"` + Data []byte `db:"data" json:"data"` +} + +func (q *sqlQuerier) InsertFile(ctx context.Context, arg InsertFileParams) (File, error) { + row := q.db.QueryRowContext(ctx, insertFile, + arg.Hash, + arg.CreatedAt, + arg.CreatedBy, + arg.Mimetype, + arg.Data, + ) + var i File + err := row.Scan( + &i.Hash, + &i.CreatedAt, + &i.CreatedBy, + &i.Mimetype, + &i.Data, + ) + return i, err +} + +const getOrganizationMemberByUserID = `-- name: GetOrganizationMemberByUserID :one SELECT - id, name, description, created_at, updated_at + user_id, organization_id, created_at, updated_at, roles FROM - organizations + organization_members WHERE - id = $1 + organization_id = $1 + AND user_id = $2 +LIMIT + 1 ` -func (q *sqlQuerier) GetOrganizationByID(ctx context.Context, id uuid.UUID) (Organization, error) { - row := q.db.QueryRowContext(ctx, getOrganizationByID, id) - var i Organization +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.ID, - &i.Name, - &i.Description, + &i.UserID, + &i.OrganizationID, &i.CreatedAt, &i.UpdatedAt, + pq.Array(&i.Roles), ) return i, err } -const getOrganizationByName = `-- name: GetOrganizationByName :one +const insertOrganizationMember = `-- name: InsertOrganizationMember :one +INSERT INTO + 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 +` + +type InsertOrganizationMemberParams struct { + OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` + UserID uuid.UUID `db:"user_id" json:"user_id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + Roles []string `db:"roles" json:"roles"` +} + +func (q *sqlQuerier) InsertOrganizationMember(ctx context.Context, arg InsertOrganizationMemberParams) (OrganizationMember, error) { + row := q.db.QueryRowContext(ctx, insertOrganizationMember, + arg.OrganizationID, + arg.UserID, + arg.CreatedAt, + arg.UpdatedAt, + pq.Array(arg.Roles), + ) + var i OrganizationMember + err := row.Scan( + &i.UserID, + &i.OrganizationID, + &i.CreatedAt, + &i.UpdatedAt, + pq.Array(&i.Roles), + ) + return i, err +} + +const getOrganizationByID = `-- name: GetOrganizationByID :one SELECT - id, name, description, created_at, updated_at + id, name, description, created_at, updated_at FROM - organizations + organizations WHERE - LOWER(name) = LOWER($1) -LIMIT - 1 + id = $1 ` -func (q *sqlQuerier) GetOrganizationByName(ctx context.Context, name string) (Organization, error) { - row := q.db.QueryRowContext(ctx, getOrganizationByName, name) +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, @@ -192,50 +327,44 @@ func (q *sqlQuerier) GetOrganizationByName(ctx context.Context, name string) (Or return i, err } -const getOrganizationMemberByUserID = `-- name: GetOrganizationMemberByUserID :one +const getOrganizationByName = `-- name: GetOrganizationByName :one SELECT - user_id, organization_id, created_at, updated_at, roles + id, name, description, created_at, updated_at FROM - organization_members + organizations WHERE - organization_id = $1 - AND user_id = $2 + LOWER("name") = LOWER($1) LIMIT - 1 + 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 +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.UserID, - &i.OrganizationID, + &i.ID, + &i.Name, + &i.Description, &i.CreatedAt, &i.UpdatedAt, - pq.Array(&i.Roles), ) return i, err } const getOrganizationsByUserID = `-- name: GetOrganizationsByUserID :many SELECT - id, name, description, created_at, updated_at + id, name, description, created_at, updated_at FROM - organizations + organizations WHERE - id = ( - SELECT - organization_id - FROM - organization_members - WHERE - user_id = $1 - ) + id = ( + SELECT + organization_id + FROM + organization_members + WHERE + user_id = $1 + ) ` func (q *sqlQuerier) GetOrganizationsByUserID(ctx context.Context, userID uuid.UUID) ([]Organization, error) { @@ -267,23 +396,57 @@ func (q *sqlQuerier) GetOrganizationsByUserID(ctx context.Context, userID uuid.U 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 +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 ` -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() { +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, @@ -316,17 +479,130 @@ func (q *sqlQuerier) GetParameterSchemasByJobID(ctx context.Context, jobID uuid. 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 + ) +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 +` + +type InsertParameterSchemaParams struct { + ID uuid.UUID `db:"id" json:"id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + JobID uuid.UUID `db:"job_id" json:"job_id"` + Name string `db:"name" json:"name"` + Description string `db:"description" json:"description"` + DefaultSourceScheme ParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` + DefaultSourceValue string `db:"default_source_value" json:"default_source_value"` + AllowOverrideSource bool `db:"allow_override_source" json:"allow_override_source"` + DefaultDestinationScheme ParameterDestinationScheme `db:"default_destination_scheme" json:"default_destination_scheme"` + AllowOverrideDestination bool `db:"allow_override_destination" json:"allow_override_destination"` + DefaultRefresh string `db:"default_refresh" json:"default_refresh"` + RedisplayValue bool `db:"redisplay_value" json:"redisplay_value"` + ValidationError string `db:"validation_error" json:"validation_error"` + ValidationCondition string `db:"validation_condition" json:"validation_condition"` + ValidationTypeSystem ParameterTypeSystem `db:"validation_type_system" json:"validation_type_system"` + ValidationValueType string `db:"validation_value_type" json:"validation_value_type"` +} + +func (q *sqlQuerier) InsertParameterSchema(ctx context.Context, arg InsertParameterSchemaParams) (ParameterSchema, error) { + row := q.db.QueryRowContext(ctx, insertParameterSchema, + arg.ID, + arg.CreatedAt, + arg.JobID, + arg.Name, + arg.Description, + arg.DefaultSourceScheme, + arg.DefaultSourceValue, + arg.AllowOverrideSource, + arg.DefaultDestinationScheme, + arg.AllowOverrideDestination, + arg.DefaultRefresh, + arg.RedisplayValue, + arg.ValidationError, + arg.ValidationCondition, + arg.ValidationTypeSystem, + arg.ValidationValueType, + ) + var i ParameterSchema + err := row.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, + ) + 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 + id, created_at, updated_at, scope, scope_id, name, source_scheme, source_value, destination_scheme FROM - parameter_values + parameter_values WHERE - scope = $1 - AND scope_id = $2 - AND name = $3 + scope = $1 + AND scope_id = $2 + AND NAME = $3 LIMIT - 1 + 1 ` type GetParameterValueByScopeAndNameParams struct { @@ -354,12 +630,12 @@ func (q *sqlQuerier) GetParameterValueByScopeAndName(ctx context.Context, arg Ge const getParameterValuesByScope = `-- name: GetParameterValuesByScope :many SELECT - id, created_at, updated_at, scope, scope_id, name, source_scheme, source_value, destination_scheme + id, created_at, updated_at, scope, scope_id, name, source_scheme, source_value, destination_scheme FROM - parameter_values + parameter_values WHERE - scope = $1 - AND scope_id = $2 + scope = $1 + AND scope_id = $2 ` type GetParameterValuesByScopeParams struct { @@ -400,15 +676,71 @@ func (q *sqlQuerier) GetParameterValuesByScope(ctx context.Context, arg GetParam 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 + ) +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 +` + +type InsertParameterValueParams struct { + ID uuid.UUID `db:"id" json:"id"` + Name string `db:"name" json:"name"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + Scope ParameterScope `db:"scope" json:"scope"` + ScopeID uuid.UUID `db:"scope_id" json:"scope_id"` + SourceScheme ParameterSourceScheme `db:"source_scheme" json:"source_scheme"` + SourceValue string `db:"source_value" json:"source_value"` + DestinationScheme ParameterDestinationScheme `db:"destination_scheme" json:"destination_scheme"` +} + +func (q *sqlQuerier) InsertParameterValue(ctx context.Context, arg InsertParameterValueParams) (ParameterValue, error) { + row := q.db.QueryRowContext(ctx, insertParameterValue, + arg.ID, + arg.Name, + arg.CreatedAt, + arg.UpdatedAt, + arg.Scope, + arg.ScopeID, + arg.SourceScheme, + arg.SourceValue, + arg.DestinationScheme, + ) + 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 getProjectByID = `-- name: GetProjectByID :one SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id FROM - projects + projects WHERE - id = $1 + id = $1 LIMIT - 1 + 1 ` func (q *sqlQuerier) GetProjectByID(ctx context.Context, id uuid.UUID) (Project, error) { @@ -429,15 +761,15 @@ func (q *sqlQuerier) GetProjectByID(ctx context.Context, id uuid.UUID) (Project, const getProjectByOrganizationAndName = `-- name: GetProjectByOrganizationAndName :one SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id FROM - projects + projects WHERE - organization_id = $1 - AND deleted = $2 - AND LOWER(name) = LOWER($3) + organization_id = $1 + AND deleted = $2 + AND LOWER("name") = LOWER($3) LIMIT - 1 + 1 ` type GetProjectByOrganizationAndNameParams struct { @@ -462,114 +794,33 @@ func (q *sqlQuerier) GetProjectByOrganizationAndName(ctx context.Context, arg Ge 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 +const getProjectsByIDs = `-- name: GetProjectsByIDs :many SELECT - id, project_id, organization_id, created_at, updated_at, name, description, job_id + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id FROM - project_versions + projects WHERE - project_id = $1 :: uuid + id = ANY($1 :: uuid [ ]) ` -func (q *sqlQuerier) GetProjectVersionsByProjectID(ctx context.Context, dollar_1 uuid.UUID) ([]ProjectVersion, error) { - rows, err := q.db.QueryContext(ctx, getProjectVersionsByProjectID, dollar_1) +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 []ProjectVersion + var items []Project for rows.Next() { - var i ProjectVersion + var i Project if err := rows.Scan( &i.ID, - &i.ProjectID, - &i.OrganizationID, &i.CreatedAt, &i.UpdatedAt, + &i.OrganizationID, + &i.Deleted, &i.Name, - &i.Description, - &i.JobID, + &i.Provisioner, + &i.ActiveVersionID, ); err != nil { return nil, err } @@ -584,18 +835,24 @@ func (q *sqlQuerier) GetProjectVersionsByProjectID(ctx context.Context, dollar_1 return items, nil } -const getProjectsByIDs = `-- name: GetProjectsByIDs :many +const getProjectsByOrganization = `-- name: GetProjectsByOrganization :many SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id FROM - projects + projects WHERE - id = ANY($1 :: uuid [ ]) + organization_id = $1 + AND deleted = $2 ` -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 { +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() @@ -625,39 +882,201 @@ func (q *sqlQuerier) GetProjectsByIDs(ctx context.Context, ids []uuid.UUID) ([]P return items, nil } -const getProjectsByOrganization = `-- name: GetProjectsByOrganization :many +const insertProject = `-- 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 id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id +` + +type InsertProjectParams 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"` + Name string `db:"name" json:"name"` + Provisioner ProvisionerType `db:"provisioner" json:"provisioner"` + ActiveVersionID uuid.UUID `db:"active_version_id" json:"active_version_id"` +} + +func (q *sqlQuerier) InsertProject(ctx context.Context, arg InsertProjectParams) (Project, error) { + row := q.db.QueryRowContext(ctx, insertProject, + arg.ID, + arg.CreatedAt, + arg.UpdatedAt, + arg.OrganizationID, + arg.Name, + arg.Provisioner, + arg.ActiveVersionID, + ) + 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 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, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id + id, project_id, organization_id, created_at, updated_at, name, description, job_id FROM - projects + project_versions WHERE - organization_id = $1 - AND deleted = $2 + id = $1 ` -type GetProjectsByOrganizationParams struct { - OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` - Deleted bool `db:"deleted" json:"deleted"` +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 } -func (q *sqlQuerier) GetProjectsByOrganization(ctx context.Context, arg GetProjectsByOrganizationParams) ([]Project, error) { - rows, err := q.db.QueryContext(ctx, getProjectsByOrganization, arg.OrganizationID, arg.Deleted) +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 []Project + var items []ProjectVersion for rows.Next() { - var i Project + var i ProjectVersion if err := rows.Scan( &i.ID, + &i.ProjectID, + &i.OrganizationID, &i.CreatedAt, &i.UpdatedAt, - &i.OrganizationID, - &i.Deleted, &i.Name, - &i.Provisioner, - &i.ActiveVersionID, + &i.Description, + &i.JobID, ); err != nil { return nil, err } @@ -672,13 +1091,86 @@ func (q *sqlQuerier) GetProjectsByOrganization(ctx context.Context, arg GetProje 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 + ) +VALUES + ($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 { + ID uuid.UUID `db:"id" json:"id"` + ProjectID uuid.NullUUID `db:"project_id" json:"project_id"` + OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + Name string `db:"name" json:"name"` + Description string `db:"description" json:"description"` + JobID uuid.UUID `db:"job_id" json:"job_id"` +} + +func (q *sqlQuerier) InsertProjectVersion(ctx context.Context, arg InsertProjectVersionParams) (ProjectVersion, error) { + row := q.db.QueryRowContext(ctx, insertProjectVersion, + arg.ID, + arg.ProjectID, + arg.OrganizationID, + arg.CreatedAt, + arg.UpdatedAt, + arg.Name, + arg.Description, + arg.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 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 + id, created_at, updated_at, organization_id, name, provisioners FROM - provisioner_daemons + provisioner_daemons WHERE - id = $1 + id = $1 ` func (q *sqlQuerier) GetProvisionerDaemonByID(ctx context.Context, id uuid.UUID) (ProvisionerDaemon, error) { @@ -697,9 +1189,9 @@ func (q *sqlQuerier) GetProvisionerDaemonByID(ctx context.Context, id uuid.UUID) const getProvisionerDaemons = `-- name: GetProvisionerDaemons :many SELECT - id, created_at, updated_at, organization_id, name, provisioners + id, created_at, updated_at, organization_id, name, provisioners FROM - provisioner_daemons + provisioner_daemons ` func (q *sqlQuerier) GetProvisionerDaemons(ctx context.Context) ([]ProvisionerDaemon, error) { @@ -732,72 +1224,106 @@ func (q *sqlQuerier) GetProvisionerDaemons(ctx context.Context) ([]ProvisionerDa 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 +const insertProvisionerDaemon = `-- name: InsertProvisionerDaemon :one +INSERT INTO + 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 ` -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, +type InsertProvisionerDaemonParams struct { + ID uuid.UUID `db:"id" json:"id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + OrganizationID uuid.NullUUID `db:"organization_id" json:"organization_id"` + Name string `db:"name" json:"name"` + Provisioners []ProvisionerType `db:"provisioners" json:"provisioners"` +} + +func (q *sqlQuerier) InsertProvisionerDaemon(ctx context.Context, arg InsertProvisionerDaemonParams) (ProvisionerDaemon, error) { + row := q.db.QueryRowContext(ctx, insertProvisionerDaemon, + arg.ID, + arg.CreatedAt, + arg.OrganizationID, + arg.Name, + pq.Array(arg.Provisioners), + ) + var i ProvisionerDaemon + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.OrganizationID, + &i.Name, + pq.Array(&i.Provisioners), ) return i, err } -const getProvisionerJobsByIDs = `-- name: GetProvisionerJobsByIDs :many +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 getProvisionerLogsByIDBetween = `-- name: GetProvisionerLogsByIDBetween :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 + id, job_id, created_at, source, level, stage, output FROM - provisioner_jobs + provisioner_job_logs WHERE - id = ANY($1 :: uuid [ ]) + job_id = $1 + AND ( + created_at >= $2 + OR created_at <= $3 + ) +ORDER BY + created_at DESC ` -func (q *sqlQuerier) GetProvisionerJobsByIDs(ctx context.Context, ids []uuid.UUID) ([]ProvisionerJob, error) { - rows, err := q.db.QueryContext(ctx, getProvisionerJobsByIDs, pq.Array(ids)) +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 []ProvisionerJob + var items []ProvisionerJobLog for rows.Next() { - var i ProvisionerJob + var i ProvisionerJobLog if err := rows.Scan( &i.ID, + &i.JobID, &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, + &i.Source, + &i.Level, + &i.Stage, + &i.Output, ); err != nil { return nil, err } @@ -812,29 +1338,39 @@ func (q *sqlQuerier) GetProvisionerJobsByIDs(ctx context.Context, ids []uuid.UUI return items, nil } -const getProvisionerLogsByIDBetween = `-- name: GetProvisionerLogsByIDBetween :many +const insertProvisionerJobLogs = `-- name: InsertProvisionerJobLogs :many +INSERT INTO + provisioner_job_logs 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 + 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 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"` +type InsertProvisionerJobLogsParams struct { + ID []uuid.UUID `db:"id" json:"id"` + JobID uuid.UUID `db:"job_id" json:"job_id"` + CreatedAt []time.Time `db:"created_at" json:"created_at"` + Source []LogSource `db:"source" json:"source"` + Level []LogLevel `db:"level" json:"level"` + Stage []string `db:"stage" json:"stage"` + Output []string `db:"output" json:"output"` } -func (q *sqlQuerier) GetProvisionerLogsByIDBetween(ctx context.Context, arg GetProvisionerLogsByIDBetweenParams) ([]ProvisionerJobLog, error) { - rows, err := q.db.QueryContext(ctx, getProvisionerLogsByIDBetween, arg.JobID, arg.CreatedAfter, arg.CreatedBefore) +func (q *sqlQuerier) InsertProvisionerJobLogs(ctx context.Context, arg InsertProvisionerJobLogsParams) ([]ProvisionerJobLog, error) { + rows, err := q.db.QueryContext(ctx, insertProvisionerJobLogs, + pq.Array(arg.ID), + arg.JobID, + pq.Array(arg.CreatedAt), + pq.Array(arg.Source), + pq.Array(arg.Level), + pq.Array(arg.Stage), + pq.Array(arg.Output), + ) if err != nil { return nil, err } @@ -864,127 +1400,422 @@ func (q *sqlQuerier) GetProvisionerLogsByIDBetween(ctx context.Context, arg GetP return items, nil } -const getUserByEmailOrUsername = `-- name: GetUserByEmailOrUsername :one -SELECT - id, email, name, revoked, login_type, hashed_password, created_at, updated_at, username -FROM - users +const acquireProvisionerJob = `-- name: AcquireProvisionerJob :one +UPDATE + provisioner_jobs +SET + started_at = $1, + updated_at = $1, + worker_id = $2 WHERE - LOWER(username) = LOWER($1) - OR email = $2 -LIMIT - 1 + 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 GetUserByEmailOrUsernameParams struct { - Username string `db:"username" json:"username"` - Email string `db:"email" json:"email"` +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"` } -func (q *sqlQuerier) GetUserByEmailOrUsername(ctx context.Context, arg GetUserByEmailOrUsernameParams) (User, error) { - row := q.db.QueryRowContext(ctx, getUserByEmailOrUsername, arg.Username, arg.Email) - var i User +// 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.Email, - &i.Name, - &i.Revoked, - &i.LoginType, - &i.HashedPassword, &i.CreatedAt, &i.UpdatedAt, - &i.Username, + &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 getUserByID = `-- name: GetUserByID :one +const getProvisionerJobByID = `-- name: GetProvisionerJobByID :one SELECT - id, email, name, revoked, login_type, hashed_password, created_at, updated_at, username + 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 - users + provisioner_jobs WHERE - id = $1 -LIMIT - 1 + id = $1 ` -func (q *sqlQuerier) GetUserByID(ctx context.Context, id uuid.UUID) (User, error) { - row := q.db.QueryRowContext(ctx, getUserByID, id) - var i User +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.Email, - &i.Name, - &i.Revoked, - &i.LoginType, - &i.HashedPassword, &i.CreatedAt, &i.UpdatedAt, - &i.Username, + &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 getUserCount = `-- name: GetUserCount :one +const getProvisionerJobsByIDs = `-- name: GetProvisionerJobsByIDs :many SELECT - COUNT(*) + 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 - users + provisioner_jobs +WHERE + id = ANY($1 :: uuid [ ]) ` -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 +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 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, +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" ) - return i, err -} +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 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 +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 + ) +VALUES + ($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 { + ID uuid.UUID `db:"id" json:"id"` + Email string `db:"email" json:"email"` + Name string `db:"name" json:"name"` + LoginType LoginType `db:"login_type" json:"login_type"` + HashedPassword []byte `db:"hashed_password" json:"hashed_password"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + Username string `db:"username" json:"username"` +} + +func (q *sqlQuerier) InsertUser(ctx context.Context, arg InsertUserParams) (User, error) { + row := q.db.QueryRowContext(ctx, insertUser, + arg.ID, + arg.Email, + arg.Name, + arg.LoginType, + arg.HashedPassword, + arg.CreatedAt, + arg.UpdatedAt, + arg.Username, + ) + 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 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_instance_id = $1 :: text + auth_token = $1 ORDER BY - created_at DESC + created_at DESC ` -func (q *sqlQuerier) GetWorkspaceAgentByInstanceID(ctx context.Context, authInstanceID string) (WorkspaceAgent, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceAgentByInstanceID, authInstanceID) +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, @@ -1004,17 +1835,19 @@ func (q *sqlQuerier) GetWorkspaceAgentByInstanceID(ctx context.Context, authInst return i, err } -const getWorkspaceAgentByResourceID = `-- name: GetWorkspaceAgentByResourceID :one +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 + 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 + workspace_agents WHERE - resource_id = $1 + auth_instance_id = $1 :: TEXT +ORDER BY + created_at DESC ` -func (q *sqlQuerier) GetWorkspaceAgentByResourceID(ctx context.Context, resourceID uuid.UUID) (WorkspaceAgent, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceAgentByResourceID, resourceID) +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, @@ -1034,46 +1867,167 @@ func (q *sqlQuerier) GetWorkspaceAgentByResourceID(ctx context.Context, resource return i, err } -const getWorkspaceBuildByID = `-- name: GetWorkspaceBuildByID :one +const getWorkspaceAgentByResourceID = `-- name: GetWorkspaceAgentByResourceID :one SELECT - id, created_at, updated_at, workspace_id, project_version_id, name, before_id, after_id, transition, initiator_id, provisioner_state, job_id + 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_builds + workspace_agents WHERE - id = $1 -LIMIT - 1 + resource_id = $1 ` -func (q *sqlQuerier) GetWorkspaceBuildByID(ctx context.Context, id uuid.UUID) (WorkspaceBuild, error) { - row := q.db.QueryRowContext(ctx, getWorkspaceBuildByID, id) - var i WorkspaceBuild +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.WorkspaceID, - &i.ProjectVersionID, - &i.Name, - &i.BeforeID, - &i.AfterID, - &i.Transition, - &i.InitiatorID, - &i.ProvisionerState, - &i.JobID, + &i.FirstConnectedAt, + &i.LastConnectedAt, + &i.DisconnectedAt, + &i.ResourceID, + &i.AuthToken, + &i.AuthInstanceID, + &i.EnvironmentVariables, + &i.StartupScript, + &i.InstanceMetadata, + &i.ResourceMetadata, ) 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 +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 + ) +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 +` + +type InsertWorkspaceAgentParams 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"` + ResourceID uuid.UUID `db:"resource_id" json:"resource_id"` + AuthToken uuid.UUID `db:"auth_token" json:"auth_token"` + AuthInstanceID sql.NullString `db:"auth_instance_id" json:"auth_instance_id"` + EnvironmentVariables pqtype.NullRawMessage `db:"environment_variables" json:"environment_variables"` + StartupScript sql.NullString `db:"startup_script" json:"startup_script"` + InstanceMetadata pqtype.NullRawMessage `db:"instance_metadata" json:"instance_metadata"` + ResourceMetadata pqtype.NullRawMessage `db:"resource_metadata" json:"resource_metadata"` +} + +func (q *sqlQuerier) InsertWorkspaceAgent(ctx context.Context, arg InsertWorkspaceAgentParams) (WorkspaceAgent, error) { + row := q.db.QueryRowContext(ctx, insertWorkspaceAgent, + arg.ID, + arg.CreatedAt, + arg.UpdatedAt, + arg.ResourceID, + arg.AuthToken, + arg.AuthInstanceID, + arg.EnvironmentVariables, + arg.StartupScript, + arg.InstanceMetadata, + arg.ResourceMetadata, + ) + 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 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 + 1 ` func (q *sqlQuerier) GetWorkspaceBuildByJobID(ctx context.Context, jobID uuid.UUID) (WorkspaceBuild, error) { @@ -1098,11 +2052,11 @@ func (q *sqlQuerier) GetWorkspaceBuildByJobID(ctx context.Context, jobID uuid.UU 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 + 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 + workspace_builds WHERE - workspace_id = $1 + workspace_id = $1 ` func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceID(ctx context.Context, workspaceID uuid.UUID) ([]WorkspaceBuild, error) { @@ -1143,12 +2097,12 @@ func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceID(ctx context.Context, workspa 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 + 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 + workspace_builds WHERE - workspace_id = $1 - AND name = $2 + workspace_id = $1 + AND "name" = $2 ` type GetWorkspaceBuildByWorkspaceIDAndNameParams struct { @@ -1178,14 +2132,14 @@ func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceIDAndName(ctx context.Context, 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 + 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 + workspace_builds WHERE - workspace_id = $1 - AND after_id IS NULL + workspace_id = $1 + AND after_id IS NULL LIMIT - 1 + 1 ` func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceIDWithoutAfter(ctx context.Context, workspaceID uuid.UUID) (WorkspaceBuild, error) { @@ -1210,12 +2164,12 @@ func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceIDWithoutAfter(ctx context.Cont 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 + 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 + workspace_builds WHERE - workspace_id = ANY($1 :: uuid [ ]) - AND after_id IS NULL + workspace_id = ANY($1 :: uuid [ ]) + AND after_id IS NULL ` func (q *sqlQuerier) GetWorkspaceBuildsByWorkspaceIDsWithoutAfter(ctx context.Context, ids []uuid.UUID) ([]WorkspaceBuild, error) { @@ -1254,112 +2208,106 @@ func (q *sqlQuerier) GetWorkspaceBuildsByWorkspaceIDsWithoutAfter(ctx context.Co 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, +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 ) - 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) +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 ` -type GetWorkspaceByUserIDAndNameParams struct { - OwnerID uuid.UUID `db:"owner_id" json:"owner_id"` - Deleted bool `db:"deleted" json:"deleted"` - Name string `db:"name" json:"name"` +type InsertWorkspaceBuildParams 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"` + WorkspaceID uuid.UUID `db:"workspace_id" json:"workspace_id"` + ProjectVersionID uuid.UUID `db:"project_version_id" json:"project_version_id"` + BeforeID uuid.NullUUID `db:"before_id" json:"before_id"` + Name string `db:"name" json:"name"` + Transition WorkspaceTransition `db:"transition" json:"transition"` + InitiatorID uuid.UUID `db:"initiator_id" json:"initiator_id"` + JobID uuid.UUID `db:"job_id" json:"job_id"` + ProvisionerState []byte `db:"provisioner_state" json:"provisioner_state"` } -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 +func (q *sqlQuerier) InsertWorkspaceBuild(ctx context.Context, arg InsertWorkspaceBuildParams) (WorkspaceBuild, error) { + row := q.db.QueryRowContext(ctx, insertWorkspaceBuild, + arg.ID, + arg.CreatedAt, + arg.UpdatedAt, + arg.WorkspaceID, + arg.ProjectVersionID, + arg.BeforeID, + arg.Name, + arg.Transition, + arg.InitiatorID, + arg.JobID, + arg.ProvisionerState, + ) + var i WorkspaceBuild err := row.Scan( &i.ID, &i.CreatedAt, &i.UpdatedAt, - &i.OwnerID, - &i.ProjectID, - &i.Deleted, + &i.WorkspaceID, + &i.ProjectVersionID, &i.Name, + &i.BeforeID, + &i.AfterID, + &i.Transition, + &i.InitiatorID, + &i.ProvisionerState, + &i.JobID, ) return i, err } -const getWorkspaceOwnerCountsByProjectIDs = `-- name: GetWorkspaceOwnerCountsByProjectIDs :many -SELECT - project_id, - COUNT(DISTINCT owner_id) -FROM - workspaces +const updateWorkspaceBuildByID = `-- name: UpdateWorkspaceBuildByID :exec +UPDATE + workspace_builds +SET + updated_at = $2, + after_id = $3, + provisioner_state = $4 WHERE - project_id = ANY($1 :: uuid [ ]) -GROUP BY - project_id, - owner_id + id = $1 ` -type GetWorkspaceOwnerCountsByProjectIDsRow struct { - ProjectID uuid.UUID `db:"project_id" json:"project_id"` - Count int64 `db:"count" json:"count"` +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) 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 +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 + id, created_at, job_id, transition, address, type, name, agent_id FROM - workspace_resources + workspace_resources WHERE - id = $1 + id = $1 ` func (q *sqlQuerier) GetWorkspaceResourceByID(ctx context.Context, id uuid.UUID) (WorkspaceResource, error) { @@ -1380,11 +2328,11 @@ func (q *sqlQuerier) GetWorkspaceResourceByID(ctx context.Context, id uuid.UUID) const getWorkspaceResourcesByJobID = `-- name: GetWorkspaceResourcesByJobID :many SELECT - id, created_at, job_id, transition, address, type, name, agent_id + id, created_at, job_id, transition, address, type, name, agent_id FROM - workspace_resources + workspace_resources WHERE - job_id = $1 + job_id = $1 ` func (q *sqlQuerier) GetWorkspaceResourcesByJobID(ctx context.Context, jobID uuid.UUID) ([]WorkspaceResource, error) { @@ -1419,35 +2367,186 @@ func (q *sqlQuerier) GetWorkspaceResourcesByJobID(ctx context.Context, jobID uui 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 +const insertWorkspaceResource = `-- 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 id, created_at, job_id, transition, address, type, name, agent_id ` -type GetWorkspacesByProjectIDParams struct { - ProjectID uuid.UUID `db:"project_id" json:"project_id"` - Deleted bool `db:"deleted" json:"deleted"` +type InsertWorkspaceResourceParams struct { + ID uuid.UUID `db:"id" json:"id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + JobID uuid.UUID `db:"job_id" json:"job_id"` + Transition WorkspaceTransition `db:"transition" json:"transition"` + Address string `db:"address" json:"address"` + Type string `db:"type" json:"type"` + Name string `db:"name" json:"name"` + AgentID uuid.NullUUID `db:"agent_id" json:"agent_id"` } -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, +func (q *sqlQuerier) InsertWorkspaceResource(ctx context.Context, arg InsertWorkspaceResourceParams) (WorkspaceResource, error) { + row := q.db.QueryRowContext(ctx, insertWorkspaceResource, + arg.ID, + arg.CreatedAt, + arg.JobID, + arg.Transition, + arg.Address, + arg.Type, + arg.Name, + arg.AgentID, + ) + 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 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 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, @@ -1467,12 +2566,12 @@ func (q *sqlQuerier) GetWorkspacesByProjectID(ctx context.Context, arg GetWorksp const getWorkspacesByUserID = `-- name: GetWorkspacesByUserID :many SELECT - id, created_at, updated_at, owner_id, project_id, deleted, name + id, created_at, updated_at, owner_id, project_id, deleted, name FROM - workspaces + workspaces WHERE - owner_id = $1 - AND deleted = $2 + owner_id = $1 + AND deleted = $2 ` type GetWorkspacesByUserIDParams struct { @@ -1511,1152 +2610,58 @@ func (q *sqlQuerier) GetWorkspacesByUserID(ctx context.Context, arg GetWorkspace return items, nil } -const insertAPIKey = `-- name: InsertAPIKey :one +const insertWorkspace = `-- name: InsertWorkspace :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 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 { - ID string `db:"id" json:"id"` - HashedSecret []byte `db:"hashed_secret" json:"hashed_secret"` - UserID uuid.UUID `db:"user_id" json:"user_id"` - Application bool `db:"application" json:"application"` - Name string `db:"name" json:"name"` - LastUsed time.Time `db:"last_used" json:"last_used"` - ExpiresAt time.Time `db:"expires_at" json:"expires_at"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - LoginType LoginType `db:"login_type" json:"login_type"` - OIDCAccessToken string `db:"oidc_access_token" json:"oidc_access_token"` - OIDCRefreshToken string `db:"oidc_refresh_token" json:"oidc_refresh_token"` - OIDCIDToken string `db:"oidc_id_token" json:"oidc_id_token"` - OIDCExpiry time.Time `db:"oidc_expiry" json:"oidc_expiry"` - DevurlToken bool `db:"devurl_token" json:"devurl_token"` -} - -func (q *sqlQuerier) InsertAPIKey(ctx context.Context, arg InsertAPIKeyParams) (APIKey, error) { - row := q.db.QueryRowContext(ctx, insertAPIKey, - arg.ID, - arg.HashedSecret, - arg.UserID, - arg.Application, - arg.Name, - arg.LastUsed, - arg.ExpiresAt, - arg.CreatedAt, - arg.UpdatedAt, - arg.LoginType, - arg.OIDCAccessToken, - arg.OIDCRefreshToken, - arg.OIDCIDToken, - arg.OIDCExpiry, - arg.DevurlToken, - ) - var i APIKey - err := row.Scan( - &i.ID, - &i.HashedSecret, - &i.UserID, - &i.Application, - &i.Name, - &i.LastUsed, - &i.ExpiresAt, - &i.CreatedAt, - &i.UpdatedAt, - &i.LoginType, - &i.OIDCAccessToken, - &i.OIDCRefreshToken, - &i.OIDCIDToken, - &i.OIDCExpiry, - &i.DevurlToken, + workspaces ( + id, + created_at, + updated_at, + owner_id, + project_id, + name ) - return i, err -} - -const insertFile = `-- name: InsertFile :one -INSERT INTO - 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, $6) RETURNING id, created_at, updated_at, owner_id, project_id, deleted, name ` -type InsertFileParams struct { - Hash string `db:"hash" json:"hash"` +type InsertWorkspaceParams struct { + ID uuid.UUID `db:"id" json:"id"` CreatedAt time.Time `db:"created_at" json:"created_at"` - CreatedBy uuid.UUID `db:"created_by" json:"created_by"` - Mimetype string `db:"mimetype" json:"mimetype"` - Data []byte `db:"data" json:"data"` -} - -func (q *sqlQuerier) InsertFile(ctx context.Context, arg InsertFileParams) (File, error) { - row := q.db.QueryRowContext(ctx, insertFile, - arg.Hash, - arg.CreatedAt, - arg.CreatedBy, - arg.Mimetype, - arg.Data, - ) - var i File - err := row.Scan( - &i.Hash, - &i.CreatedAt, - &i.CreatedBy, - &i.Mimetype, - &i.Data, - ) - 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 -` - -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"` + 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) InsertOrganization(ctx context.Context, arg InsertOrganizationParams) (Organization, error) { - row := q.db.QueryRowContext(ctx, insertOrganization, +func (q *sqlQuerier) InsertWorkspace(ctx context.Context, arg InsertWorkspaceParams) (Workspace, error) { + row := q.db.QueryRowContext(ctx, insertWorkspace, arg.ID, - arg.Name, - arg.Description, arg.CreatedAt, arg.UpdatedAt, + arg.OwnerID, + arg.ProjectID, + arg.Name, ) - var i Organization + var i Workspace err := row.Scan( &i.ID, - &i.Name, - &i.Description, &i.CreatedAt, &i.UpdatedAt, - ) - return i, err -} - -const insertOrganizationMember = `-- name: InsertOrganizationMember :one -INSERT INTO - 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 -` - -type InsertOrganizationMemberParams struct { - OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` - UserID uuid.UUID `db:"user_id" json:"user_id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - Roles []string `db:"roles" json:"roles"` -} - -func (q *sqlQuerier) InsertOrganizationMember(ctx context.Context, arg InsertOrganizationMemberParams) (OrganizationMember, error) { - row := q.db.QueryRowContext(ctx, insertOrganizationMember, - arg.OrganizationID, - arg.UserID, - arg.CreatedAt, - arg.UpdatedAt, - pq.Array(arg.Roles), - ) - var i OrganizationMember - err := row.Scan( - &i.UserID, - &i.OrganizationID, - &i.CreatedAt, - &i.UpdatedAt, - pq.Array(&i.Roles), - ) - return i, err -} - -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 - ) -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 -` - -type InsertParameterSchemaParams struct { - ID uuid.UUID `db:"id" json:"id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - JobID uuid.UUID `db:"job_id" json:"job_id"` - Name string `db:"name" json:"name"` - Description string `db:"description" json:"description"` - DefaultSourceScheme ParameterSourceScheme `db:"default_source_scheme" json:"default_source_scheme"` - DefaultSourceValue string `db:"default_source_value" json:"default_source_value"` - AllowOverrideSource bool `db:"allow_override_source" json:"allow_override_source"` - DefaultDestinationScheme ParameterDestinationScheme `db:"default_destination_scheme" json:"default_destination_scheme"` - AllowOverrideDestination bool `db:"allow_override_destination" json:"allow_override_destination"` - DefaultRefresh string `db:"default_refresh" json:"default_refresh"` - RedisplayValue bool `db:"redisplay_value" json:"redisplay_value"` - ValidationError string `db:"validation_error" json:"validation_error"` - ValidationCondition string `db:"validation_condition" json:"validation_condition"` - ValidationTypeSystem ParameterTypeSystem `db:"validation_type_system" json:"validation_type_system"` - ValidationValueType string `db:"validation_value_type" json:"validation_value_type"` -} - -func (q *sqlQuerier) InsertParameterSchema(ctx context.Context, arg InsertParameterSchemaParams) (ParameterSchema, error) { - row := q.db.QueryRowContext(ctx, insertParameterSchema, - arg.ID, - arg.CreatedAt, - arg.JobID, - arg.Name, - arg.Description, - arg.DefaultSourceScheme, - arg.DefaultSourceValue, - arg.AllowOverrideSource, - arg.DefaultDestinationScheme, - arg.AllowOverrideDestination, - arg.DefaultRefresh, - arg.RedisplayValue, - arg.ValidationError, - arg.ValidationCondition, - arg.ValidationTypeSystem, - arg.ValidationValueType, - ) - var i ParameterSchema - err := row.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, - ) - return i, err -} - -const insertParameterValue = `-- 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 id, created_at, updated_at, scope, scope_id, name, source_scheme, source_value, destination_scheme -` - -type InsertParameterValueParams struct { - ID uuid.UUID `db:"id" json:"id"` - Name string `db:"name" json:"name"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - Scope ParameterScope `db:"scope" json:"scope"` - ScopeID uuid.UUID `db:"scope_id" json:"scope_id"` - SourceScheme ParameterSourceScheme `db:"source_scheme" json:"source_scheme"` - SourceValue string `db:"source_value" json:"source_value"` - DestinationScheme ParameterDestinationScheme `db:"destination_scheme" json:"destination_scheme"` -} - -func (q *sqlQuerier) InsertParameterValue(ctx context.Context, arg InsertParameterValueParams) (ParameterValue, error) { - row := q.db.QueryRowContext(ctx, insertParameterValue, - arg.ID, - arg.Name, - arg.CreatedAt, - arg.UpdatedAt, - arg.Scope, - arg.ScopeID, - arg.SourceScheme, - arg.SourceValue, - arg.DestinationScheme, - ) - 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 insertProject = `-- 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 id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id -` - -type InsertProjectParams 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"` - Name string `db:"name" json:"name"` - Provisioner ProvisionerType `db:"provisioner" json:"provisioner"` - ActiveVersionID uuid.UUID `db:"active_version_id" json:"active_version_id"` -} - -func (q *sqlQuerier) InsertProject(ctx context.Context, arg InsertProjectParams) (Project, error) { - row := q.db.QueryRowContext(ctx, insertProject, - arg.ID, - arg.CreatedAt, - arg.UpdatedAt, - arg.OrganizationID, - arg.Name, - arg.Provisioner, - arg.ActiveVersionID, - ) - 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 insertProjectVersion = `-- 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 id, project_id, organization_id, created_at, updated_at, name, description, job_id -` - -type InsertProjectVersionParams struct { - ID uuid.UUID `db:"id" json:"id"` - ProjectID uuid.NullUUID `db:"project_id" json:"project_id"` - OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - Name string `db:"name" json:"name"` - Description string `db:"description" json:"description"` - JobID uuid.UUID `db:"job_id" json:"job_id"` -} - -func (q *sqlQuerier) InsertProjectVersion(ctx context.Context, arg InsertProjectVersionParams) (ProjectVersion, error) { - row := q.db.QueryRowContext(ctx, insertProjectVersion, - arg.ID, - arg.ProjectID, - arg.OrganizationID, - arg.CreatedAt, - arg.UpdatedAt, - arg.Name, - arg.Description, - arg.JobID, - ) - var i ProjectVersion - err := row.Scan( - &i.ID, + &i.OwnerID, &i.ProjectID, - &i.OrganizationID, - &i.CreatedAt, - &i.UpdatedAt, - &i.Name, - &i.Description, - &i.JobID, - ) - return i, err -} - -const insertProvisionerDaemon = `-- name: InsertProvisionerDaemon :one -INSERT INTO - 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 -` - -type InsertProvisionerDaemonParams struct { - ID uuid.UUID `db:"id" json:"id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - OrganizationID uuid.NullUUID `db:"organization_id" json:"organization_id"` - Name string `db:"name" json:"name"` - Provisioners []ProvisionerType `db:"provisioners" json:"provisioners"` -} - -func (q *sqlQuerier) InsertProvisionerDaemon(ctx context.Context, arg InsertProvisionerDaemonParams) (ProvisionerDaemon, error) { - row := q.db.QueryRowContext(ctx, insertProvisionerDaemon, - arg.ID, - arg.CreatedAt, - arg.OrganizationID, - arg.Name, - pq.Array(arg.Provisioners), - ) - var i ProvisionerDaemon - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OrganizationID, + &i.Deleted, &i.Name, - pq.Array(&i.Provisioners), ) 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 -` - -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 insertProvisionerJobLogs = `-- name: InsertProvisionerJobLogs :many -INSERT INTO - 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 -` - -type InsertProvisionerJobLogsParams struct { - ID []uuid.UUID `db:"id" json:"id"` - JobID uuid.UUID `db:"job_id" json:"job_id"` - CreatedAt []time.Time `db:"created_at" json:"created_at"` - Source []LogSource `db:"source" json:"source"` - Level []LogLevel `db:"level" json:"level"` - Stage []string `db:"stage" json:"stage"` - Output []string `db:"output" json:"output"` -} - -func (q *sqlQuerier) InsertProvisionerJobLogs(ctx context.Context, arg InsertProvisionerJobLogsParams) ([]ProvisionerJobLog, error) { - rows, err := q.db.QueryContext(ctx, insertProvisionerJobLogs, - pq.Array(arg.ID), - arg.JobID, - pq.Array(arg.CreatedAt), - pq.Array(arg.Source), - pq.Array(arg.Level), - pq.Array(arg.Stage), - pq.Array(arg.Output), - ) - 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 insertUser = `-- 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 id, email, name, revoked, login_type, hashed_password, created_at, updated_at, username -` - -type InsertUserParams struct { - ID uuid.UUID `db:"id" json:"id"` - Email string `db:"email" json:"email"` - Name string `db:"name" json:"name"` - LoginType LoginType `db:"login_type" json:"login_type"` - HashedPassword []byte `db:"hashed_password" json:"hashed_password"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - Username string `db:"username" json:"username"` -} - -func (q *sqlQuerier) InsertUser(ctx context.Context, arg InsertUserParams) (User, error) { - row := q.db.QueryRowContext(ctx, insertUser, - arg.ID, - arg.Email, - arg.Name, - arg.LoginType, - arg.HashedPassword, - arg.CreatedAt, - arg.UpdatedAt, - arg.Username, - ) - 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 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 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 - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.OwnerID, - &i.ProjectID, - &i.Deleted, - &i.Name, - ) - 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 - ) -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 -` - -type InsertWorkspaceAgentParams 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"` - ResourceID uuid.UUID `db:"resource_id" json:"resource_id"` - AuthToken uuid.UUID `db:"auth_token" json:"auth_token"` - AuthInstanceID sql.NullString `db:"auth_instance_id" json:"auth_instance_id"` - EnvironmentVariables pqtype.NullRawMessage `db:"environment_variables" json:"environment_variables"` - StartupScript sql.NullString `db:"startup_script" json:"startup_script"` - InstanceMetadata pqtype.NullRawMessage `db:"instance_metadata" json:"instance_metadata"` - ResourceMetadata pqtype.NullRawMessage `db:"resource_metadata" json:"resource_metadata"` -} - -func (q *sqlQuerier) InsertWorkspaceAgent(ctx context.Context, arg InsertWorkspaceAgentParams) (WorkspaceAgent, error) { - row := q.db.QueryRowContext(ctx, insertWorkspaceAgent, - arg.ID, - arg.CreatedAt, - arg.UpdatedAt, - arg.ResourceID, - arg.AuthToken, - arg.AuthInstanceID, - arg.EnvironmentVariables, - arg.StartupScript, - arg.InstanceMetadata, - arg.ResourceMetadata, - ) - 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 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 - ) -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 -` - -type InsertWorkspaceBuildParams 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"` - WorkspaceID uuid.UUID `db:"workspace_id" json:"workspace_id"` - ProjectVersionID uuid.UUID `db:"project_version_id" json:"project_version_id"` - BeforeID uuid.NullUUID `db:"before_id" json:"before_id"` - Name string `db:"name" json:"name"` - Transition WorkspaceTransition `db:"transition" json:"transition"` - InitiatorID uuid.UUID `db:"initiator_id" json:"initiator_id"` - JobID uuid.UUID `db:"job_id" json:"job_id"` - ProvisionerState []byte `db:"provisioner_state" json:"provisioner_state"` -} - -func (q *sqlQuerier) InsertWorkspaceBuild(ctx context.Context, arg InsertWorkspaceBuildParams) (WorkspaceBuild, error) { - row := q.db.QueryRowContext(ctx, insertWorkspaceBuild, - arg.ID, - arg.CreatedAt, - arg.UpdatedAt, - arg.WorkspaceID, - arg.ProjectVersionID, - arg.BeforeID, - arg.Name, - arg.Transition, - arg.InitiatorID, - arg.JobID, - arg.ProvisionerState, - ) - 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 insertWorkspaceResource = `-- 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 id, created_at, job_id, transition, address, type, name, agent_id -` - -type InsertWorkspaceResourceParams struct { - ID uuid.UUID `db:"id" json:"id"` - CreatedAt time.Time `db:"created_at" json:"created_at"` - JobID uuid.UUID `db:"job_id" json:"job_id"` - Transition WorkspaceTransition `db:"transition" json:"transition"` - Address string `db:"address" json:"address"` - Type string `db:"type" json:"type"` - Name string `db:"name" json:"name"` - AgentID uuid.NullUUID `db:"agent_id" json:"agent_id"` -} - -func (q *sqlQuerier) InsertWorkspaceResource(ctx context.Context, arg InsertWorkspaceResourceParams) (WorkspaceResource, error) { - row := q.db.QueryRowContext(ctx, insertWorkspaceResource, - arg.ID, - arg.CreatedAt, - arg.JobID, - arg.Transition, - arg.Address, - arg.Type, - arg.Name, - arg.AgentID, - ) - 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 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 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 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 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 { - 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 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 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 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 0000000000000..4538607087139 --- /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 0000000000000..62dc38ed2ca59 --- /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 0000000000000..a91513d31a345 --- /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 0000000000000..243bdc26c9878 --- /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 0000000000000..1682c04a8fd95 --- /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 0000000000000..e813138a8a89f --- /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 0000000000000..5a6ea6ece2818 --- /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 0000000000000..6b134bc8b1314 --- /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 0000000000000..ad07f0e9b6730 --- /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 0000000000000..0051c5428fb45 --- /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 0000000000000..d9fb35af477c8 --- /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 0000000000000..116299804c6b1 --- /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 0000000000000..08589699beb39 --- /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 0000000000000..a2a206bba07b0 --- /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 0000000000000..a73d8bf19dd0c --- /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 0000000000000..17a352a67f702 --- /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 0000000000000..99237a8cf77fb --- /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 bfe1dc5afa33f..0000000000000 --- 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 01ad9dc733882..8248ad8a72259 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 9594fa2e37411..2a96acb125815 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