Files
Ruben Fiszel f2be625348 feat: store hashed tokens instead of plaintext (#8217)
* feat: store hashed tokens in the token table instead of plaintext

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: address review issues in token hash migration

- Update all base.sql fixtures to include token_hash/token_prefix columns
- Keep plaintext token for webhook tokens (needed for URL reconstruction)
- Restore get_token_by_prefix to query DB for webhook tokens
- Fix down migration to delete NULL-token rows before restoring NOT NULL
- Update parser fixture standalone schema
- Update EE dedicated_worker_ee.rs to use token_hash/token_prefix

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: restore sqlx offline cache (only add new query files)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: keep writing plaintext token column for backward compat

Write to token column alongside token_hash until MIN_VERSION_SUPPORTS_TOKEN_HASH
(1.649.0) is reached. This ensures older workers can still authenticate
during rolling upgrades. Remove the separate UPDATE in new_webhook_token
since create_token_internal now writes plaintext directly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: branch on MIN_VERSION to write plaintext token or null

Check MIN_VERSION_SUPPORTS_TOKEN_HASH at runtime: write plaintext to
token column while old workers exist, switch to NULL once all workers
are >= 1.649.0.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: set MIN_VERSION_SUPPORTS_TOKEN_HASH to 1.650.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: use token_hash for email lookup and expiry notifications

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: rotate webhook tokens instead of recovering plaintext from DB

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: use token_hash for native trigger token lookups and deletes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* sqlx

* refactor: drop webhook_token_prefix from native_trigger table

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: backward compat for token rotation and make webhook_token_hash NOT NULL

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: prevent panic on short superadmin secret token prefix

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: prevent panic on short superadmin secret token prefix

Replace all `token[0..TOKEN_PREFIX_LEN]` slicing with
`token.get(..TOKEN_PREFIX_LEN).unwrap_or(token)` to prevent
panics when a token shorter than 10 chars is provided (e.g.
malformed Authorization header, short superadmin secret).

Co-authored-by: hugocasa <hugocasa@users.noreply.github.com>

* fix: prevent panic on short token prefix slicing

Replace all `token[0..TOKEN_PREFIX_LEN]` with safe
`token.get(..TOKEN_PREFIX_LEN).unwrap_or(token)` to prevent panics
on malformed tokens shorter than 10 characters.

Co-authored-by: hugocasa <hugocasa@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Revert "fix: prevent panic on short superadmin secret token prefix"

This reverts commit 37ec2e5ad5.

* revert: remove unnecessary defensive token prefix slicing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: add token_hash to end_user_email test fixture

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* test: add integration tests for token hash migration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: correct token_hash test assertions for cache and version

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* chore: add plaintext column removal reminder to test fixtures

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: log count of orphaned triggers deleted during migration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: preserve orphaned triggers with error instead of deleting

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: rename token_expiry_notification.token to token_hash and copy owner/expiration in rotate

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: hash existing plaintext values before renaming token_expiry_notification column

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: remove unnecessary length check in token_expiry_notification migration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* update dates and version

* updat ee ref + sqlx

* improve mcp migration

* fix: atomic token rotation with rollback on trigger update failure

rotate_webhook_token now atomically inserts the new token and deletes
the old one in a single transaction, preventing token leaks.

Returns new_token_hash so callers can clean up the new token if their
subsequent trigger update fails (which involves external HTTP calls
and cannot be in the same DB transaction).

- Handler: wraps post-rotation work; deletes new token on failure
- Google renewal: deletes new token if service_config update fails
- Tests updated to match new atomic semantics

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* higher min version

* fix: defer old token deletion to avoid breaking triggers on update failure

rotate_webhook_token now keeps the old token alive and returns
old_token_hash. Callers delete it only after the trigger row has been
successfully updated. If the external service call or DB update fails,
the trigger keeps working with the old token.

Worst case: if the best-effort delete fails, the old token leaks as an
extra DB row — harmless compared to breaking the trigger.

Also update summarized_schema.txt for renamed columns.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: update ee-repo-ref to 2d0823a471014e2bc2d898c63518323946b7474f

This commit updates the EE repository reference after PR #437 was merged in windmill-ee-private.

Previous ee-repo-ref: 7aef8b06cb6f54c2bc89dd57b70947deed72553c

New ee-repo-ref: 2d0823a471014e2bc2d898c63518323946b7474f

Automated by sync-ee-ref workflow.

* fix: prevent panic on short tokens by using safe prefix extraction

Add safe_token_prefix() helper that uses .get(..TOKEN_PREFIX_LEN).unwrap_or(token)
instead of direct slice indexing, preventing panics when tokens are shorter than
10 characters (e.g., short superadmin secrets or malformed Bearer tokens).

Co-authored-by: Ruben Fiszel <rubenfiszel@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: HugoCasa <hugo@casademont.ch>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: hugocasa <hugocasa@users.noreply.github.com>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
Co-authored-by: Ruben Fiszel <rubenfiszel@users.noreply.github.com>
2026-03-17 01:15:38 +00:00

2685 lines
79 KiB
SQL

--
-- PostgreSQL database dump
--
-- Dumped from database version 15.3
-- Dumped by pg_dump version 15.3
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
--
-- Name: _sqlx_test; Type: SCHEMA; Schema: -; Owner: postgres
--
CREATE SCHEMA _sqlx_test;
ALTER SCHEMA _sqlx_test OWNER TO postgres;
--
-- Name: extensions; Type: SCHEMA; Schema: -; Owner: postgres
--
CREATE SCHEMA extensions;
ALTER SCHEMA extensions OWNER TO postgres;
--
-- Name: uuid-ossp; Type: EXTENSION; Schema: -; Owner: -
--
CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA extensions;
--
-- Name: EXTENSION "uuid-ossp"; Type: COMMENT; Schema: -; Owner:
--
COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UUIDs)';
--
-- Name: action_kind; Type: TYPE; Schema: public; Owner: postgres
--
CREATE TYPE public.action_kind AS ENUM (
'create',
'update',
'delete',
'execute'
);
ALTER TYPE public.action_kind OWNER TO postgres;
--
-- Name: draft_type; Type: TYPE; Schema: public; Owner: postgres
--
CREATE TYPE public.draft_type AS ENUM (
'script',
'flow',
'app'
);
ALTER TYPE public.draft_type OWNER TO postgres;
--
-- Name: favorite_kind; Type: TYPE; Schema: public; Owner: postgres
--
CREATE TYPE public.favorite_kind AS ENUM (
'app',
'script',
'flow',
'raw_app'
);
ALTER TYPE public.favorite_kind OWNER TO postgres;
--
-- Name: job_kind; Type: TYPE; Schema: public; Owner: postgres
--
CREATE TYPE public.job_kind AS ENUM (
'script',
'preview',
'flow',
'dependencies',
'flowpreview',
'script_hub',
'identity',
'flowdependencies',
'http',
'graphql',
'postgresql',
'noop'
);
ALTER TYPE public.job_kind OWNER TO postgres;
--
-- Name: login_type; Type: TYPE; Schema: public; Owner: postgres
--
CREATE TYPE public.login_type AS ENUM (
'password',
'github'
);
ALTER TYPE public.login_type OWNER TO postgres;
--
-- Name: runnable_type; Type: TYPE; Schema: public; Owner: postgres
--
CREATE TYPE public.runnable_type AS ENUM (
'ScriptHash',
'ScriptPath',
'FlowPath'
);
ALTER TYPE public.runnable_type OWNER TO postgres;
--
-- Name: script_kind; Type: TYPE; Schema: public; Owner: postgres
--
CREATE TYPE public.script_kind AS ENUM (
'script',
'trigger',
'failure',
'command',
'approval'
);
ALTER TYPE public.script_kind OWNER TO postgres;
--
-- Name: script_lang; Type: TYPE; Schema: public; Owner: postgres
--
CREATE TYPE public.script_lang AS ENUM (
'python3',
'deno',
'go',
'bash',
'postgresql',
'nativets',
'Nativets',
'bun',
'mysql'
);
ALTER TYPE public.script_lang OWNER TO postgres;
--
-- Name: workspace_key_kind; Type: TYPE; Schema: public; Owner: postgres
--
CREATE TYPE public.workspace_key_kind AS ENUM (
'cloud'
);
ALTER TYPE public.workspace_key_kind OWNER TO postgres;
--
-- Name: database_ids; Type: SEQUENCE; Schema: _sqlx_test; Owner: postgres
--
CREATE SEQUENCE _sqlx_test.database_ids
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE _sqlx_test.database_ids OWNER TO postgres;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: databases; Type: TABLE; Schema: _sqlx_test; Owner: postgres
--
CREATE TABLE _sqlx_test.databases (
db_name text NOT NULL,
test_path text NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL
);
ALTER TABLE _sqlx_test.databases OWNER TO postgres;
--
-- Name: _sqlx_migrations; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public._sqlx_migrations (
version bigint NOT NULL,
description text NOT NULL,
installed_on timestamp with time zone DEFAULT now() NOT NULL,
success boolean NOT NULL,
checksum bytea NOT NULL,
execution_time bigint NOT NULL
);
ALTER TABLE public._sqlx_migrations OWNER TO postgres;
--
-- Name: account; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.account (
workspace_id character varying(50) NOT NULL,
id integer NOT NULL,
expires_at timestamp with time zone NOT NULL,
refresh_token character varying(1500) NOT NULL,
owner character varying(50) NOT NULL,
client character varying(50) NOT NULL,
refresh_error text
);
ALTER TABLE public.account OWNER TO postgres;
--
-- Name: account_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.account_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.account_id_seq OWNER TO postgres;
--
-- Name: account_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.account_id_seq OWNED BY public.account.id;
--
-- Name: app; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.app (
id bigint NOT NULL,
workspace_id character varying(50) NOT NULL,
path character varying(255) NOT NULL,
summary character varying(1000) DEFAULT ''::character varying NOT NULL,
policy jsonb NOT NULL,
versions bigint[] NOT NULL,
extra_perms jsonb DEFAULT '{}'::jsonb NOT NULL,
draft_only boolean
);
ALTER TABLE public.app OWNER TO postgres;
--
-- Name: app_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.app_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.app_id_seq OWNER TO postgres;
--
-- Name: app_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.app_id_seq OWNED BY public.app.id;
--
-- Name: app_version; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.app_version (
id bigint NOT NULL,
app_id bigint NOT NULL,
value json NOT NULL,
created_by character varying(50) NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL
);
ALTER TABLE public.app_version OWNER TO postgres;
--
-- Name: app_version_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.app_version_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.app_version_id_seq OWNER TO postgres;
--
-- Name: app_version_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.app_version_id_seq OWNED BY public.app_version.id;
--
-- Name: audit; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.audit (
workspace_id character varying(50) NOT NULL,
id integer NOT NULL,
"timestamp" timestamp with time zone DEFAULT now() NOT NULL,
username character varying(255) NOT NULL,
operation character varying(50) NOT NULL,
action_kind public.action_kind NOT NULL,
resource character varying(255),
parameters jsonb
);
ALTER TABLE public.audit OWNER TO postgres;
--
-- Name: audit_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.audit_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.audit_id_seq OWNER TO postgres;
--
-- Name: audit_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.audit_id_seq OWNED BY public.audit.id;
--
-- Name: capture; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.capture (
workspace_id character varying(50) NOT NULL,
path character varying(255) NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
created_by character varying(50) NOT NULL,
payload jsonb DEFAULT 'null'::jsonb NOT NULL,
CONSTRAINT capture_payload_too_big CHECK ((length((payload)::text) < (512 * 1024)))
);
ALTER TABLE public.capture OWNER TO postgres;
--
-- Name: completed_job; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.completed_job (
id uuid NOT NULL,
workspace_id character varying(50) NOT NULL,
parent_job uuid,
created_by character varying(255) NOT NULL,
created_at timestamp with time zone NOT NULL,
duration_ms integer NOT NULL,
success boolean NOT NULL,
script_hash bigint,
script_path character varying(255),
args jsonb,
result jsonb,
logs text,
deleted boolean DEFAULT false NOT NULL,
raw_code text,
canceled boolean DEFAULT false NOT NULL,
canceled_by character varying(50),
canceled_reason text,
job_kind public.job_kind DEFAULT 'script'::public.job_kind NOT NULL,
env_id integer DEFAULT 0 NOT NULL,
schedule_path character varying(255),
permissioned_as character varying(55) DEFAULT 'g/all'::character varying NOT NULL,
flow_status jsonb,
raw_flow jsonb,
is_flow_step boolean DEFAULT false,
language public.script_lang DEFAULT 'python3'::public.script_lang,
started_at timestamp with time zone DEFAULT now() NOT NULL,
is_skipped boolean DEFAULT false NOT NULL,
raw_lock text,
email character varying(50) DEFAULT 'missing@email.xyz'::character varying NOT NULL,
visible_to_owner boolean DEFAULT true,
mem_peak integer,
tag character varying(50) DEFAULT 'other'::character varying NOT NULL
);
ALTER TABLE public.completed_job OWNER TO postgres;
--
-- Name: demo; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.demo (
key text,
value bigint
);
ALTER TABLE public.demo OWNER TO postgres;
--
-- Name: draft; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.draft (
workspace_id character varying(50) NOT NULL,
path character varying(255) NOT NULL,
typ public.draft_type NOT NULL,
value json NOT NULL,
created_at timestamp without time zone DEFAULT now() NOT NULL
);
ALTER TABLE public.draft OWNER TO postgres;
--
-- Name: email_to_igroup; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.email_to_igroup (
email character varying(255) NOT NULL,
igroup character varying(255) NOT NULL
);
ALTER TABLE public.email_to_igroup OWNER TO postgres;
--
-- Name: favorite; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.favorite (
usr character varying(50) NOT NULL,
workspace_id character varying(50) NOT NULL,
path character varying(255) NOT NULL,
favorite_kind public.favorite_kind NOT NULL
);
ALTER TABLE public.favorite OWNER TO postgres;
--
-- Name: flow; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.flow (
workspace_id character varying(50) NOT NULL,
path character varying(255) NOT NULL,
summary text NOT NULL,
description text NOT NULL,
value jsonb NOT NULL,
edited_by character varying(50) NOT NULL,
edited_at timestamp with time zone DEFAULT now() NOT NULL,
archived boolean DEFAULT false NOT NULL,
schema json,
extra_perms jsonb DEFAULT '{}'::jsonb NOT NULL,
dependency_job uuid,
draft_only boolean,
tag character varying(50),
CONSTRAINT proper_id CHECK (((path)::text ~ '^[ufg](\/[\w-]+){2,}$'::text))
);
ALTER TABLE public.flow OWNER TO postgres;
--
-- Name: folder; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.folder (
name character varying(255) NOT NULL,
workspace_id character varying(50) NOT NULL,
display_name character varying(100) NOT NULL,
owners character varying(255)[] NOT NULL,
extra_perms jsonb DEFAULT '{}'::jsonb NOT NULL
);
ALTER TABLE public.folder OWNER TO postgres;
--
-- Name: group_; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.group_ (
workspace_id character varying(50) NOT NULL,
name character varying(50) NOT NULL,
summary text,
extra_perms jsonb DEFAULT '{}'::jsonb NOT NULL,
CONSTRAINT proper_name CHECK (((name)::text ~ '^[\w-]+$'::text))
);
ALTER TABLE public.group_ OWNER TO postgres;
--
-- Name: input; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.input (
id uuid NOT NULL,
workspace_id character varying(50) NOT NULL,
runnable_id character varying(255) NOT NULL,
runnable_type public.runnable_type NOT NULL,
name text NOT NULL,
args jsonb NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
created_by character varying(50) NOT NULL,
is_public boolean DEFAULT false NOT NULL
);
ALTER TABLE public.input OWNER TO postgres;
--
-- Name: instance_group; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.instance_group (
name character varying(255) NOT NULL,
summary character varying(2000),
external_id character varying(1000)
);
ALTER TABLE public.instance_group OWNER TO postgres;
--
-- Name: magic_link; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.magic_link (
email character varying(50) NOT NULL,
token character varying(100) NOT NULL,
expiration timestamp with time zone DEFAULT (now() + '1 day'::interval) NOT NULL
);
ALTER TABLE public.magic_link OWNER TO postgres;
--
-- Name: password; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.password (
email character varying(50) NOT NULL,
password_hash character varying(100),
login_type character varying(50) NOT NULL,
super_admin boolean DEFAULT false NOT NULL,
verified boolean DEFAULT false NOT NULL,
name character varying(255),
company character varying(255),
first_time_user boolean DEFAULT false NOT NULL
);
ALTER TABLE public.password OWNER TO postgres;
--
-- Name: pip_resolution_cache; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.pip_resolution_cache (
hash character varying(255) NOT NULL,
expiration timestamp without time zone NOT NULL,
lockfile text NOT NULL
);
ALTER TABLE public.pip_resolution_cache OWNER TO postgres;
--
-- Name: queue; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.queue (
id uuid NOT NULL,
workspace_id character varying(50) NOT NULL,
parent_job uuid,
created_by character varying(255) NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
started_at timestamp with time zone,
scheduled_for timestamp with time zone NOT NULL,
running boolean DEFAULT false NOT NULL,
script_hash bigint,
script_path character varying(255),
args jsonb,
logs text,
raw_code text,
canceled boolean DEFAULT false NOT NULL,
canceled_by character varying(50),
canceled_reason text,
last_ping timestamp with time zone DEFAULT now() NOT NULL,
job_kind public.job_kind DEFAULT 'script'::public.job_kind NOT NULL,
env_id integer,
schedule_path character varying(255),
permissioned_as character varying(55) DEFAULT 'g/all'::character varying NOT NULL,
flow_status jsonb,
raw_flow jsonb,
is_flow_step boolean DEFAULT false,
language public.script_lang DEFAULT 'python3'::public.script_lang,
suspend integer DEFAULT 0 NOT NULL,
suspend_until timestamp with time zone,
same_worker boolean DEFAULT false,
raw_lock text,
pre_run_error text,
email character varying(50) DEFAULT 'missing@email.xyz'::character varying NOT NULL,
visible_to_owner boolean DEFAULT true,
mem_peak integer,
root_job uuid,
leaf_jobs jsonb,
tag character varying(50) DEFAULT 'other'::character varying NOT NULL,
concurrent_limit integer,
concurrency_time_window_s integer
);
ALTER TABLE public.queue OWNER TO postgres;
--
-- Name: raw_app; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.raw_app (
path character varying(255) NOT NULL,
version integer DEFAULT 0 NOT NULL,
workspace_id character varying(50) NOT NULL,
summary character varying(1000) DEFAULT ''::character varying NOT NULL,
edited_at timestamp with time zone DEFAULT now() NOT NULL,
data text NOT NULL,
extra_perms jsonb DEFAULT '{}'::jsonb NOT NULL
);
ALTER TABLE public.raw_app OWNER TO postgres;
--
-- Name: resource; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.resource (
workspace_id character varying(50) NOT NULL,
path character varying(255) NOT NULL,
value jsonb,
description text,
resource_type character varying(50) NOT NULL,
extra_perms jsonb DEFAULT '{}'::jsonb NOT NULL,
CONSTRAINT proper_id CHECK (((path)::text ~ '^[ufg](\/[\w-]+){2,}$'::text))
);
ALTER TABLE public.resource OWNER TO postgres;
--
-- Name: resource_type; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.resource_type (
workspace_id character varying(50) NOT NULL,
name character varying(50) NOT NULL,
schema jsonb,
description text,
CONSTRAINT proper_name CHECK (((name)::text ~ '^[\w-]+$'::text))
);
ALTER TABLE public.resource_type OWNER TO postgres;
--
-- Name: resume_job; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.resume_job (
id uuid NOT NULL,
job uuid NOT NULL,
flow uuid NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
value jsonb DEFAULT 'null'::jsonb NOT NULL,
approver character varying(50),
resume_id integer DEFAULT 0 NOT NULL,
CONSTRAINT resume_job_value_check CHECK ((length((value)::text) < (10 * 1024)))
);
ALTER TABLE public.resume_job OWNER TO postgres;
--
-- Name: schedule; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.schedule (
workspace_id character varying(50) NOT NULL,
path character varying(255) NOT NULL,
edited_by character varying(255) NOT NULL,
edited_at timestamp with time zone DEFAULT now() NOT NULL,
schedule character varying(255) NOT NULL,
enabled boolean DEFAULT true NOT NULL,
script_path character varying(255) NOT NULL,
args jsonb,
extra_perms jsonb DEFAULT '{}'::jsonb NOT NULL,
is_flow boolean DEFAULT false NOT NULL,
email character varying(50) DEFAULT 'missing@email.xyz'::character varying NOT NULL,
error text,
timezone character varying(255) DEFAULT 'UTC'::character varying NOT NULL,
on_failure character varying(1000) DEFAULT NULL::character varying,
CONSTRAINT proper_id CHECK (((path)::text ~ '^[ufg](\/[\w-]+){2,}$'::text))
);
ALTER TABLE public.schedule OWNER TO postgres;
--
-- Name: script; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.script (
workspace_id character varying(50) NOT NULL,
hash bigint NOT NULL,
path character varying(255) NOT NULL,
parent_hashes bigint[],
summary text NOT NULL,
description text NOT NULL,
content text NOT NULL,
created_by character varying(50) NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
archived boolean DEFAULT false NOT NULL,
schema json,
deleted boolean DEFAULT false NOT NULL,
is_template boolean DEFAULT false,
extra_perms jsonb DEFAULT '{}'::jsonb NOT NULL,
lock text,
lock_error_logs text,
language public.script_lang DEFAULT 'python3'::public.script_lang NOT NULL,
kind public.script_kind DEFAULT 'script'::public.script_kind NOT NULL,
tag character varying(50),
draft_only boolean,
envs character varying(1000)[],
concurrent_limit integer,
concurrency_time_window_s integer,
dedicated_worker boolean,
CONSTRAINT proper_id CHECK (((path)::text ~ '^[ufg](\/[\w-]+){2,}$'::text))
);
ALTER TABLE public.script OWNER TO postgres;
--
-- Name: token; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.token (
token_hash character varying(64) NOT NULL,
token_prefix character varying(10) NOT NULL,
token character varying(50),
label character varying(50),
expiration timestamp with time zone,
workspace_id character varying(50),
owner character varying(55),
email character varying(50),
super_admin boolean DEFAULT false NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
last_used_at timestamp with time zone DEFAULT now() NOT NULL,
scopes text[]
);
ALTER TABLE public.token OWNER TO postgres;
--
-- Name: usage; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.usage (
id character varying(50) NOT NULL,
is_workspace boolean NOT NULL,
month_ integer NOT NULL,
usage integer NOT NULL
);
ALTER TABLE public.usage OWNER TO postgres;
--
-- Name: usr; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.usr (
workspace_id character varying(50) NOT NULL,
username character varying(50) NOT NULL,
email character varying(50) NOT NULL,
is_admin boolean DEFAULT false NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
operator boolean DEFAULT false NOT NULL,
disabled boolean DEFAULT false NOT NULL,
role character varying(50),
CONSTRAINT proper_email CHECK (((email)::text ~* '^(?:[a-z0-9!#$%&''*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$'::text)),
CONSTRAINT proper_username CHECK (((username)::text ~ '^[\w-]+$'::text))
);
ALTER TABLE public.usr OWNER TO postgres;
--
-- Name: usr_to_group; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.usr_to_group (
workspace_id character varying(50) NOT NULL,
group_ character varying(50) NOT NULL,
usr character varying(50) DEFAULT 'ruben'::character varying NOT NULL
);
ALTER TABLE public.usr_to_group OWNER TO postgres;
--
-- Name: variable; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.variable (
workspace_id character varying(50) NOT NULL,
path character varying(255) NOT NULL,
value character varying(15000) NOT NULL,
is_secret boolean DEFAULT false NOT NULL,
description character varying(255) DEFAULT ''::character varying NOT NULL,
extra_perms jsonb DEFAULT '{}'::jsonb NOT NULL,
account integer,
is_oauth boolean DEFAULT false NOT NULL,
CONSTRAINT proper_id CHECK (((path)::text ~ '^[ufg](\/[\w-]+){2,}$'::text))
);
ALTER TABLE public.variable OWNER TO postgres;
--
-- Name: worker_ping; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.worker_ping (
worker character varying(50) NOT NULL,
worker_instance character varying(50) NOT NULL,
ping_at timestamp with time zone DEFAULT now() NOT NULL,
started_at timestamp with time zone DEFAULT now() NOT NULL,
ip character varying(50) DEFAULT 'NO IP'::character varying NOT NULL,
jobs_executed integer DEFAULT 0 NOT NULL,
custom_tags text[]
);
ALTER TABLE public.worker_ping OWNER TO postgres;
--
-- Name: workspace; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.workspace (
id character varying(50) NOT NULL,
name character varying(50) NOT NULL,
owner character varying(50) NOT NULL,
deleted boolean DEFAULT false NOT NULL,
premium boolean DEFAULT false NOT NULL,
CONSTRAINT proper_id CHECK (((id)::text ~ '^\w+(-\w+)*$'::text))
);
ALTER TABLE public.workspace OWNER TO postgres;
--
-- Name: workspace_invite; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.workspace_invite (
workspace_id character varying(50) NOT NULL,
email character varying(50) NOT NULL,
is_admin boolean DEFAULT false NOT NULL,
operator boolean DEFAULT false NOT NULL,
CONSTRAINT proper_email CHECK (((email)::text ~* '^(?:[a-z0-9!#$%&''*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$'::text))
);
ALTER TABLE public.workspace_invite OWNER TO postgres;
--
-- Name: workspace_key; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.workspace_key (
workspace_id character varying(50) NOT NULL,
kind public.workspace_key_kind NOT NULL,
key character varying(255) DEFAULT 'changeme'::character varying NOT NULL
);
ALTER TABLE public.workspace_key OWNER TO postgres;
--
-- Name: workspace_settings; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.workspace_settings (
workspace_id character varying(50) NOT NULL,
slack_team_id character varying(50),
slack_name character varying(50),
slack_command_script character varying(255),
slack_email character varying(50) DEFAULT 'missing@email.xyz'::character varying NOT NULL,
auto_invite_domain character varying(50),
auto_invite_operator boolean DEFAULT false,
customer_id character varying(100),
plan character varying(40),
webhook text,
deploy_to character varying(255),
error_handler character varying(1000),
openai_resource_path character varying(1000)
);
ALTER TABLE public.workspace_settings OWNER TO postgres;
--
-- Name: account id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.account ALTER COLUMN id SET DEFAULT nextval('public.account_id_seq'::regclass);
--
-- Name: app id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.app ALTER COLUMN id SET DEFAULT nextval('public.app_id_seq'::regclass);
--
-- Name: app_version id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.app_version ALTER COLUMN id SET DEFAULT nextval('public.app_version_id_seq'::regclass);
--
-- Name: audit id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.audit ALTER COLUMN id SET DEFAULT nextval('public.audit_id_seq'::regclass);
--
-- Name: databases databases_pkey; Type: CONSTRAINT; Schema: _sqlx_test; Owner: postgres
--
ALTER TABLE ONLY _sqlx_test.databases
ADD CONSTRAINT databases_pkey PRIMARY KEY (db_name);
--
-- Name: _sqlx_migrations _sqlx_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public._sqlx_migrations
ADD CONSTRAINT _sqlx_migrations_pkey PRIMARY KEY (version);
--
-- Name: account account_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.account
ADD CONSTRAINT account_pkey PRIMARY KEY (workspace_id, id);
--
-- Name: app app_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.app
ADD CONSTRAINT app_pkey PRIMARY KEY (id);
--
-- Name: app_version app_version_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.app_version
ADD CONSTRAINT app_version_pkey PRIMARY KEY (id);
--
-- Name: audit audit_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.audit
ADD CONSTRAINT audit_pkey PRIMARY KEY (workspace_id, id);
--
-- Name: capture capture_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.capture
ADD CONSTRAINT capture_pkey PRIMARY KEY (workspace_id, path);
--
-- Name: completed_job completed_job_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.completed_job
ADD CONSTRAINT completed_job_pkey PRIMARY KEY (id);
--
-- Name: draft draft_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.draft
ADD CONSTRAINT draft_pkey PRIMARY KEY (workspace_id, path, typ);
--
-- Name: email_to_igroup email_to_igroup_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.email_to_igroup
ADD CONSTRAINT email_to_igroup_pkey PRIMARY KEY (email, igroup);
--
-- Name: favorite favorite_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.favorite
ADD CONSTRAINT favorite_pkey PRIMARY KEY (usr, workspace_id, favorite_kind, path);
--
-- Name: flow flow_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.flow
ADD CONSTRAINT flow_pkey PRIMARY KEY (workspace_id, path);
--
-- Name: folder folder_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.folder
ADD CONSTRAINT folder_pkey PRIMARY KEY (workspace_id, name);
--
-- Name: group_ group__pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.group_
ADD CONSTRAINT group__pkey PRIMARY KEY (workspace_id, name);
--
-- Name: input input_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.input
ADD CONSTRAINT input_pkey PRIMARY KEY (id);
--
-- Name: instance_group instance_group_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.instance_group
ADD CONSTRAINT instance_group_pkey PRIMARY KEY (name);
--
-- Name: magic_link magic_link_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.magic_link
ADD CONSTRAINT magic_link_pkey PRIMARY KEY (email, token);
--
-- Name: password password_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.password
ADD CONSTRAINT password_pkey PRIMARY KEY (email);
--
-- Name: pip_resolution_cache pip_resolution_cache_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.pip_resolution_cache
ADD CONSTRAINT pip_resolution_cache_pkey PRIMARY KEY (hash);
--
-- Name: queue queue_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.queue
ADD CONSTRAINT queue_pkey PRIMARY KEY (id);
--
-- Name: raw_app raw_app_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.raw_app
ADD CONSTRAINT raw_app_pkey PRIMARY KEY (path);
--
-- Name: resource resource_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.resource
ADD CONSTRAINT resource_pkey PRIMARY KEY (workspace_id, path);
--
-- Name: resource_type resource_type_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.resource_type
ADD CONSTRAINT resource_type_pkey PRIMARY KEY (workspace_id, name);
--
-- Name: resume_job resume_job_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.resume_job
ADD CONSTRAINT resume_job_pkey PRIMARY KEY (id);
--
-- Name: schedule schedule_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.schedule
ADD CONSTRAINT schedule_pkey PRIMARY KEY (workspace_id, path);
--
-- Name: script script_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.script
ADD CONSTRAINT script_pkey PRIMARY KEY (workspace_id, hash);
--
-- Name: token token_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.token
ADD CONSTRAINT token_pkey PRIMARY KEY (token_hash);
--
-- Name: app unique_path_workspace_id; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.app
ADD CONSTRAINT unique_path_workspace_id UNIQUE (workspace_id, path);
--
-- Name: usage usage_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.usage
ADD CONSTRAINT usage_pkey PRIMARY KEY (id, is_workspace, month_);
--
-- Name: usr usr_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.usr
ADD CONSTRAINT usr_pkey PRIMARY KEY (workspace_id, username);
--
-- Name: usr_to_group usr_to_group_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.usr_to_group
ADD CONSTRAINT usr_to_group_pkey PRIMARY KEY (workspace_id, usr, group_);
--
-- Name: variable variable_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.variable
ADD CONSTRAINT variable_pkey PRIMARY KEY (workspace_id, path);
--
-- Name: worker_ping worker_ping_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.worker_ping
ADD CONSTRAINT worker_ping_pkey PRIMARY KEY (worker);
--
-- Name: workspace_invite workspace_invite_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.workspace_invite
ADD CONSTRAINT workspace_invite_pkey PRIMARY KEY (workspace_id, email);
--
-- Name: workspace_key workspace_key_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.workspace_key
ADD CONSTRAINT workspace_key_pkey PRIMARY KEY (workspace_id, kind);
--
-- Name: workspace workspace_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.workspace
ADD CONSTRAINT workspace_pkey PRIMARY KEY (id);
--
-- Name: workspace_settings workspace_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.workspace_settings
ADD CONSTRAINT workspace_settings_pkey PRIMARY KEY (workspace_id);
--
-- Name: workspace_settings workspace_settings_slack_team_id_key; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.workspace_settings
ADD CONSTRAINT workspace_settings_slack_team_id_key UNIQUE (slack_team_id);
--
-- Name: databases_created_at; Type: INDEX; Schema: _sqlx_test; Owner: postgres
--
CREATE INDEX databases_created_at ON _sqlx_test.databases USING btree (created_at);
--
-- Name: flow_extra_perms; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX flow_extra_perms ON public.flow USING gin (extra_perms);
--
-- Name: folder_extra_perms; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX folder_extra_perms ON public.folder USING gin (extra_perms);
--
-- Name: folder_owners; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX folder_owners ON public.folder USING gin (owners);
--
-- Name: group_extra_perms; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX group_extra_perms ON public.group_ USING gin (extra_perms);
--
-- Name: index_completed_on_created; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_completed_on_created ON public.completed_job USING btree (created_at);
--
-- Name: index_completed_on_script_hash; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_completed_on_script_hash ON public.completed_job USING btree (script_hash);
--
-- Name: index_completed_on_script_path; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_completed_on_script_path ON public.completed_job USING btree (script_path);
--
-- Name: index_completed_on_workspace_id; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_completed_on_workspace_id ON public.completed_job USING btree (workspace_id);
--
-- Name: index_magic_link_exp; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_magic_link_exp ON public.magic_link USING btree (expiration);
--
-- Name: index_queue_on_created; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_queue_on_created ON public.queue USING btree (created_at);
--
-- Name: index_queue_on_running; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_queue_on_running ON public.queue USING btree (running);
--
-- Name: index_queue_on_scheduled_for; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_queue_on_scheduled_for ON public.queue USING btree (scheduled_for);
--
-- Name: index_queue_on_script_hash; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_queue_on_script_hash ON public.queue USING btree (script_hash);
--
-- Name: index_queue_on_script_path; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_queue_on_script_path ON public.queue USING btree (script_path);
--
-- Name: index_queue_on_workspace_id; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_queue_on_workspace_id ON public.queue USING btree (workspace_id);
--
-- Name: index_script_on_path_created_at; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_script_on_path_created_at ON public.script USING btree (path, created_at);
--
-- Name: index_token_exp; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_token_exp ON public.token USING btree (expiration);
--
-- Name: index_usr_email; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX index_usr_email ON public.usr USING btree (email);
--
-- Name: resource_extra_perms; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX resource_extra_perms ON public.resource USING gin (extra_perms);
--
-- Name: schedule_extra_perms; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX schedule_extra_perms ON public.schedule USING gin (extra_perms);
--
-- Name: script_extra_perms; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX script_extra_perms ON public.script USING gin (extra_perms);
--
-- Name: variable_extra_perms; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX variable_extra_perms ON public.variable USING gin (extra_perms);
--
-- Name: worker_ping_on_ping_at; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX worker_ping_on_ping_at ON public.worker_ping USING btree (ping_at);
--
-- Name: account account_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.account
ADD CONSTRAINT account_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: app_version app_version_flow_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.app_version
ADD CONSTRAINT app_version_flow_id_fkey FOREIGN KEY (app_id) REFERENCES public.app(id) ON DELETE CASCADE;
--
-- Name: app app_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.app
ADD CONSTRAINT app_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: capture capture_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.capture
ADD CONSTRAINT capture_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: completed_job completed_job_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.completed_job
ADD CONSTRAINT completed_job_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: draft draft_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.draft
ADD CONSTRAINT draft_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: usr_to_group fk_group; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.usr_to_group
ADD CONSTRAINT fk_group FOREIGN KEY (workspace_id, group_) REFERENCES public.group_(workspace_id, name);
--
-- Name: flow flow_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.flow
ADD CONSTRAINT flow_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: folder folder_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.folder
ADD CONSTRAINT folder_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id) ON DELETE CASCADE;
--
-- Name: group_ group__workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.group_
ADD CONSTRAINT group__workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: input input_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.input
ADD CONSTRAINT input_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: queue queue_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.queue
ADD CONSTRAINT queue_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: raw_app raw_app_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.raw_app
ADD CONSTRAINT raw_app_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: resource_type resource_type_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.resource_type
ADD CONSTRAINT resource_type_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: resource resource_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.resource
ADD CONSTRAINT resource_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: resume_job resume_job_flow_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.resume_job
ADD CONSTRAINT resume_job_flow_fkey FOREIGN KEY (flow) REFERENCES public.queue(id) ON DELETE CASCADE;
--
-- Name: schedule schedule_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.schedule
ADD CONSTRAINT schedule_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: script script_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.script
ADD CONSTRAINT script_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: token token_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.token
ADD CONSTRAINT token_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: usr_to_group usr_to_group_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.usr_to_group
ADD CONSTRAINT usr_to_group_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: usr usr_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.usr
ADD CONSTRAINT usr_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: variable variable_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.variable
ADD CONSTRAINT variable_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: workspace_invite workspace_invite_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.workspace_invite
ADD CONSTRAINT workspace_invite_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: workspace_key workspace_key_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.workspace_key
ADD CONSTRAINT workspace_key_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: workspace_settings workspace_settings_workspace_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.workspace_settings
ADD CONSTRAINT workspace_settings_workspace_id_fkey FOREIGN KEY (workspace_id) REFERENCES public.workspace(id);
--
-- Name: account; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.account ENABLE ROW LEVEL SECURITY;
--
-- Name: app; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.app ENABLE ROW LEVEL SECURITY;
--
-- Name: audit; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.audit ENABLE ROW LEVEL SECURITY;
--
-- Name: capture; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.capture ENABLE ROW LEVEL SECURITY;
--
-- Name: completed_job; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.completed_job ENABLE ROW LEVEL SECURITY;
--
-- Name: flow; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.flow ENABLE ROW LEVEL SECURITY;
--
-- Name: folder; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.folder ENABLE ROW LEVEL SECURITY;
--
-- Name: queue; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.queue ENABLE ROW LEVEL SECURITY;
--
-- Name: raw_app; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.raw_app ENABLE ROW LEVEL SECURITY;
--
-- Name: resource; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.resource ENABLE ROW LEVEL SECURITY;
--
-- Name: audit schedule; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY schedule ON public.audit FOR INSERT WITH CHECK (((username)::text ~~ 'schedule-%'::text));
--
-- Name: schedule; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.schedule ENABLE ROW LEVEL SECURITY;
--
-- Name: script; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.script ENABLE ROW LEVEL SECURITY;
--
-- Name: app see_extra_perms_groups; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_groups ON public.app USING ((extra_perms ?| regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) WITH CHECK ((EXISTS ( SELECT jsonb_each_text.key,
jsonb_each_text.value
FROM jsonb_each_text(app.extra_perms) jsonb_each_text(key, value)
WHERE ((split_part(jsonb_each_text.key, '/'::text, 1) = 'g'::text) AND (jsonb_each_text.key = ANY (regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) AND (jsonb_each_text.value)::boolean))));
--
-- Name: flow see_extra_perms_groups; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_groups ON public.flow USING ((extra_perms ?| regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) WITH CHECK ((EXISTS ( SELECT jsonb_each_text.key,
jsonb_each_text.value
FROM jsonb_each_text(flow.extra_perms) jsonb_each_text(key, value)
WHERE ((split_part(jsonb_each_text.key, '/'::text, 1) = 'g'::text) AND (jsonb_each_text.key = ANY (regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) AND (jsonb_each_text.value)::boolean))));
--
-- Name: folder see_extra_perms_groups; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_groups ON public.folder USING (((extra_perms ?| regexp_split_to_array(current_setting('session.pgroups'::text), ','::text)) OR (EXISTS ( SELECT o.o
FROM unnest(folder.owners) o(o)
WHERE ((o.o)::text = ANY (regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))))))) WITH CHECK ((EXISTS ( SELECT o.o
FROM unnest(folder.owners) o(o)
WHERE ((o.o)::text = ANY (regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))))));
--
-- Name: raw_app see_extra_perms_groups; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_groups ON public.raw_app USING ((extra_perms ?| regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) WITH CHECK ((EXISTS ( SELECT jsonb_each_text.key,
jsonb_each_text.value
FROM jsonb_each_text(raw_app.extra_perms) jsonb_each_text(key, value)
WHERE ((split_part(jsonb_each_text.key, '/'::text, 1) = 'g'::text) AND (jsonb_each_text.key = ANY (regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) AND (jsonb_each_text.value)::boolean))));
--
-- Name: resource see_extra_perms_groups; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_groups ON public.resource USING ((extra_perms ?| regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) WITH CHECK ((EXISTS ( SELECT jsonb_each_text.key,
jsonb_each_text.value
FROM jsonb_each_text(resource.extra_perms) jsonb_each_text(key, value)
WHERE ((split_part(jsonb_each_text.key, '/'::text, 1) = 'g'::text) AND (jsonb_each_text.key = ANY (regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) AND (jsonb_each_text.value)::boolean))));
--
-- Name: schedule see_extra_perms_groups; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_groups ON public.schedule USING ((extra_perms ?| regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) WITH CHECK ((EXISTS ( SELECT jsonb_each_text.key,
jsonb_each_text.value
FROM jsonb_each_text(schedule.extra_perms) jsonb_each_text(key, value)
WHERE ((split_part(jsonb_each_text.key, '/'::text, 1) = 'g'::text) AND (jsonb_each_text.key = ANY (regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) AND (jsonb_each_text.value)::boolean))));
--
-- Name: script see_extra_perms_groups; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_groups ON public.script USING ((extra_perms ?| regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) WITH CHECK ((EXISTS ( SELECT jsonb_each_text.key,
jsonb_each_text.value
FROM jsonb_each_text(script.extra_perms) jsonb_each_text(key, value)
WHERE ((split_part(jsonb_each_text.key, '/'::text, 1) = 'g'::text) AND (jsonb_each_text.key = ANY (regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) AND (jsonb_each_text.value)::boolean))));
--
-- Name: usr_to_group see_extra_perms_groups; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_groups ON public.usr_to_group USING (true) WITH CHECK ((EXISTS ( SELECT f.key,
f.value
FROM public.group_ g,
LATERAL jsonb_each_text(g.extra_perms) f(key, value)
WHERE (((usr_to_group.group_)::text = (g.name)::text) AND ((usr_to_group.workspace_id)::text = (g.workspace_id)::text) AND (split_part(f.key, '/'::text, 1) = 'g'::text) AND (f.key = ANY (regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) AND (f.value)::boolean))));
--
-- Name: variable see_extra_perms_groups; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_groups ON public.variable USING ((extra_perms ?| regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) WITH CHECK ((EXISTS ( SELECT jsonb_each_text.key,
jsonb_each_text.value
FROM jsonb_each_text(variable.extra_perms) jsonb_each_text(key, value)
WHERE ((split_part(jsonb_each_text.key, '/'::text, 1) = 'g'::text) AND (jsonb_each_text.key = ANY (regexp_split_to_array(current_setting('session.pgroups'::text), ','::text))) AND (jsonb_each_text.value)::boolean))));
--
-- Name: app see_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_user ON public.app USING ((extra_perms ? concat('u/', current_setting('session.user'::text)))) WITH CHECK (((extra_perms ->> concat('u/', current_setting('session.user'::text))))::boolean);
--
-- Name: flow see_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_user ON public.flow USING ((extra_perms ? concat('u/', current_setting('session.user'::text)))) WITH CHECK (((extra_perms ->> concat('u/', current_setting('session.user'::text))))::boolean);
--
-- Name: folder see_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_user ON public.folder USING (((extra_perms ? concat('u/', current_setting('session.user'::text))) OR (concat('u/', current_setting('session.user'::text)) = ANY ((owners)::text[])))) WITH CHECK ((concat('u/', current_setting('session.user'::text)) = ANY ((owners)::text[])));
--
-- Name: raw_app see_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_user ON public.raw_app USING ((extra_perms ? concat('u/', current_setting('session.user'::text)))) WITH CHECK (((extra_perms ->> concat('u/', current_setting('session.user'::text))))::boolean);
--
-- Name: resource see_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_user ON public.resource USING ((extra_perms ? concat('u/', current_setting('session.user'::text)))) WITH CHECK (((extra_perms ->> concat('u/', current_setting('session.user'::text))))::boolean);
--
-- Name: schedule see_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_user ON public.schedule USING ((extra_perms ? concat('u/', current_setting('session.user'::text)))) WITH CHECK (((extra_perms ->> concat('u/', current_setting('session.user'::text))))::boolean);
--
-- Name: script see_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_user ON public.script USING ((extra_perms ? concat('u/', current_setting('session.user'::text)))) WITH CHECK (((extra_perms ->> concat('u/', current_setting('session.user'::text))))::boolean);
--
-- Name: usr_to_group see_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_user ON public.usr_to_group USING (true) WITH CHECK ((EXISTS ( SELECT 1
FROM public.group_
WHERE (((usr_to_group.group_)::text = (group_.name)::text) AND ((usr_to_group.workspace_id)::text = (group_.workspace_id)::text) AND ((group_.extra_perms ->> concat('u/', current_setting('session.user'::text))))::boolean))));
--
-- Name: variable see_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_extra_perms_user ON public.variable USING ((extra_perms ? concat('u/', current_setting('session.user'::text)))) WITH CHECK (((extra_perms ->> concat('u/', current_setting('session.user'::text))))::boolean);
--
-- Name: account see_folder_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_folder_extra_perms_user ON public.account USING (((split_part((owner)::text, '/'::text, 1) = 'f'::text) AND (split_part((owner)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_read'::text), ','::text))))) WITH CHECK (((split_part((owner)::text, '/'::text, 1) = 'f'::text) AND (split_part((owner)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_write'::text), ','::text)))));
--
-- Name: app see_folder_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_folder_extra_perms_user ON public.app USING (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_read'::text), ','::text))))) WITH CHECK (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_write'::text), ','::text)))));
--
-- Name: capture see_folder_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_folder_extra_perms_user ON public.capture USING (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_read'::text), ','::text))))) WITH CHECK (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_write'::text), ','::text)))));
--
-- Name: completed_job see_folder_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_folder_extra_perms_user ON public.completed_job USING (((visible_to_owner IS TRUE) AND (split_part((script_path)::text, '/'::text, 1) = 'f'::text) AND (split_part((script_path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_read'::text), ','::text)))));
--
-- Name: flow see_folder_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_folder_extra_perms_user ON public.flow USING (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_read'::text), ','::text))))) WITH CHECK (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_write'::text), ','::text)))));
--
-- Name: queue see_folder_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_folder_extra_perms_user ON public.queue USING (((visible_to_owner IS TRUE) AND (split_part((script_path)::text, '/'::text, 1) = 'f'::text) AND (split_part((script_path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_read'::text), ','::text)))));
--
-- Name: raw_app see_folder_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_folder_extra_perms_user ON public.raw_app USING (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_read'::text), ','::text))))) WITH CHECK (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_write'::text), ','::text)))));
--
-- Name: resource see_folder_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_folder_extra_perms_user ON public.resource USING (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_read'::text), ','::text))))) WITH CHECK (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_write'::text), ','::text)))));
--
-- Name: schedule see_folder_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_folder_extra_perms_user ON public.schedule USING (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_read'::text), ','::text))))) WITH CHECK (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_write'::text), ','::text)))));
--
-- Name: script see_folder_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_folder_extra_perms_user ON public.script USING (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_read'::text), ','::text))))) WITH CHECK (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_write'::text), ','::text)))));
--
-- Name: variable see_folder_extra_perms_user; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_folder_extra_perms_user ON public.variable USING (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_read'::text), ','::text))))) WITH CHECK (((split_part((path)::text, '/'::text, 1) = 'f'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.folders_write'::text), ','::text)))));
--
-- Name: account see_member; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member ON public.account USING (((split_part((owner)::text, '/'::text, 1) = 'g'::text) AND (split_part((owner)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: app see_member; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member ON public.app USING (((split_part((path)::text, '/'::text, 1) = 'g'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: capture see_member; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member ON public.capture USING (((split_part((path)::text, '/'::text, 1) = 'g'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: completed_job see_member; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member ON public.completed_job USING (((split_part((permissioned_as)::text, '/'::text, 1) = 'g'::text) AND (split_part((permissioned_as)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: flow see_member; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member ON public.flow USING (((split_part((path)::text, '/'::text, 1) = 'g'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: queue see_member; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member ON public.queue USING (((split_part((permissioned_as)::text, '/'::text, 1) = 'g'::text) AND (split_part((permissioned_as)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: raw_app see_member; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member ON public.raw_app USING (((split_part((path)::text, '/'::text, 1) = 'g'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: resource see_member; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member ON public.resource USING (((split_part((path)::text, '/'::text, 1) = 'g'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: schedule see_member; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member ON public.schedule USING (((split_part((path)::text, '/'::text, 1) = 'g'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: script see_member; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member ON public.script USING (((split_part((path)::text, '/'::text, 1) = 'g'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: variable see_member; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member ON public.variable USING (((split_part((path)::text, '/'::text, 1) = 'g'::text) AND (split_part((path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: completed_job see_member_path; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member_path ON public.completed_job USING (((visible_to_owner IS TRUE) AND (split_part((script_path)::text, '/'::text, 1) = 'g'::text) AND (split_part((script_path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: queue see_member_path; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_member_path ON public.queue USING (((visible_to_owner IS TRUE) AND (split_part((script_path)::text, '/'::text, 1) = 'g'::text) AND (split_part((script_path)::text, '/'::text, 2) = ANY (regexp_split_to_array(current_setting('session.groups'::text), ','::text)))));
--
-- Name: account see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.account USING (((split_part((owner)::text, '/'::text, 1) = 'u'::text) AND (split_part((owner)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: app see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.app USING (((split_part((path)::text, '/'::text, 1) = 'u'::text) AND (split_part((path)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: audit see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.audit USING (((username)::text = current_setting('session.user'::text)));
--
-- Name: capture see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.capture USING (((split_part((path)::text, '/'::text, 1) = 'u'::text) AND (split_part((path)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: completed_job see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.completed_job USING (((split_part((permissioned_as)::text, '/'::text, 1) = 'u'::text) AND (split_part((permissioned_as)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: flow see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.flow USING (((split_part((path)::text, '/'::text, 1) = 'u'::text) AND (split_part((path)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: queue see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.queue USING (((split_part((permissioned_as)::text, '/'::text, 1) = 'u'::text) AND (split_part((permissioned_as)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: raw_app see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.raw_app USING (((split_part((path)::text, '/'::text, 1) = 'u'::text) AND (split_part((path)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: resource see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.resource USING (((split_part((path)::text, '/'::text, 1) = 'u'::text) AND (split_part((path)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: schedule see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.schedule USING (((split_part((path)::text, '/'::text, 1) = 'u'::text) AND (split_part((path)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: script see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.script USING (((split_part((path)::text, '/'::text, 1) = 'u'::text) AND (split_part((path)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: variable see_own; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own ON public.variable USING (((split_part((path)::text, '/'::text, 1) = 'u'::text) AND (split_part((path)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: completed_job see_own_path; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own_path ON public.completed_job USING (((visible_to_owner IS TRUE) AND (split_part((script_path)::text, '/'::text, 1) = 'u'::text) AND (split_part((script_path)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: queue see_own_path; Type: POLICY; Schema: public; Owner: postgres
--
CREATE POLICY see_own_path ON public.queue USING (((visible_to_owner IS TRUE) AND (split_part((script_path)::text, '/'::text, 1) = 'u'::text) AND (split_part((script_path)::text, '/'::text, 2) = current_setting('session.user'::text))));
--
-- Name: usr_to_group; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.usr_to_group ENABLE ROW LEVEL SECURITY;
--
-- Name: variable; Type: ROW SECURITY; Schema: public; Owner: postgres
--
ALTER TABLE public.variable ENABLE ROW LEVEL SECURITY;
--
-- Name: TABLE _sqlx_migrations; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public._sqlx_migrations TO windmill_user;
GRANT ALL ON TABLE public._sqlx_migrations TO windmill_admin;
--
-- Name: TABLE account; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.account TO windmill_user;
GRANT ALL ON TABLE public.account TO windmill_admin;
--
-- Name: SEQUENCE account_id_seq; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON SEQUENCE public.account_id_seq TO windmill_user;
GRANT ALL ON SEQUENCE public.account_id_seq TO windmill_admin;
--
-- Name: TABLE app; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.app TO windmill_user;
GRANT ALL ON TABLE public.app TO windmill_admin;
--
-- Name: SEQUENCE app_id_seq; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON SEQUENCE public.app_id_seq TO windmill_user;
GRANT ALL ON SEQUENCE public.app_id_seq TO windmill_admin;
--
-- Name: TABLE app_version; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.app_version TO windmill_user;
GRANT ALL ON TABLE public.app_version TO windmill_admin;
--
-- Name: SEQUENCE app_version_id_seq; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON SEQUENCE public.app_version_id_seq TO windmill_user;
GRANT ALL ON SEQUENCE public.app_version_id_seq TO windmill_admin;
--
-- Name: TABLE audit; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.audit TO windmill_user;
GRANT ALL ON TABLE public.audit TO windmill_admin;
--
-- Name: SEQUENCE audit_id_seq; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON SEQUENCE public.audit_id_seq TO windmill_user;
GRANT ALL ON SEQUENCE public.audit_id_seq TO windmill_admin;
--
-- Name: TABLE capture; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.capture TO windmill_user;
GRANT ALL ON TABLE public.capture TO windmill_admin;
--
-- Name: TABLE completed_job; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.completed_job TO windmill_user;
GRANT ALL ON TABLE public.completed_job TO windmill_admin;
--
-- Name: TABLE demo; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.demo TO windmill_user;
--
-- Name: TABLE draft; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.draft TO windmill_user;
GRANT ALL ON TABLE public.draft TO windmill_admin;
--
-- Name: TABLE email_to_igroup; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.email_to_igroup TO windmill_user;
GRANT ALL ON TABLE public.email_to_igroup TO windmill_admin;
--
-- Name: TABLE favorite; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.favorite TO windmill_user;
GRANT ALL ON TABLE public.favorite TO windmill_admin;
--
-- Name: TABLE flow; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.flow TO windmill_user;
GRANT ALL ON TABLE public.flow TO windmill_admin;
--
-- Name: TABLE folder; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.folder TO windmill_user;
GRANT ALL ON TABLE public.folder TO windmill_admin;
--
-- Name: TABLE group_; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.group_ TO windmill_user;
GRANT ALL ON TABLE public.group_ TO windmill_admin;
--
-- Name: TABLE input; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.input TO windmill_user;
GRANT ALL ON TABLE public.input TO windmill_admin;
--
-- Name: TABLE instance_group; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.instance_group TO windmill_user;
GRANT ALL ON TABLE public.instance_group TO windmill_admin;
--
-- Name: TABLE magic_link; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.magic_link TO windmill_user;
GRANT ALL ON TABLE public.magic_link TO windmill_admin;
--
-- Name: TABLE password; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.password TO windmill_user;
GRANT ALL ON TABLE public.password TO windmill_admin;
--
-- Name: TABLE pip_resolution_cache; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.pip_resolution_cache TO windmill_user;
--
-- Name: TABLE queue; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.queue TO windmill_user;
GRANT ALL ON TABLE public.queue TO windmill_admin;
--
-- Name: TABLE raw_app; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.raw_app TO windmill_user;
GRANT ALL ON TABLE public.raw_app TO windmill_admin;
--
-- Name: TABLE resource; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.resource TO windmill_user;
GRANT ALL ON TABLE public.resource TO windmill_admin;
--
-- Name: TABLE resource_type; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.resource_type TO windmill_user;
GRANT ALL ON TABLE public.resource_type TO windmill_admin;
--
-- Name: TABLE resume_job; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.resume_job TO windmill_user;
GRANT ALL ON TABLE public.resume_job TO windmill_admin;
--
-- Name: TABLE schedule; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.schedule TO windmill_user;
GRANT ALL ON TABLE public.schedule TO windmill_admin;
--
-- Name: TABLE script; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.script TO windmill_user;
GRANT ALL ON TABLE public.script TO windmill_admin;
--
-- Name: TABLE token; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.token TO windmill_user;
GRANT ALL ON TABLE public.token TO windmill_admin;
--
-- Name: TABLE usage; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.usage TO windmill_user;
GRANT ALL ON TABLE public.usage TO windmill_admin;
--
-- Name: TABLE usr; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.usr TO windmill_user;
GRANT ALL ON TABLE public.usr TO windmill_admin;
--
-- Name: TABLE usr_to_group; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.usr_to_group TO windmill_user;
GRANT ALL ON TABLE public.usr_to_group TO windmill_admin;
--
-- Name: TABLE variable; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.variable TO windmill_user;
GRANT ALL ON TABLE public.variable TO windmill_admin;
--
-- Name: TABLE worker_ping; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.worker_ping TO windmill_user;
GRANT ALL ON TABLE public.worker_ping TO windmill_admin;
--
-- Name: TABLE workspace; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.workspace TO windmill_user;
GRANT ALL ON TABLE public.workspace TO windmill_admin;
--
-- Name: TABLE workspace_invite; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.workspace_invite TO windmill_user;
GRANT ALL ON TABLE public.workspace_invite TO windmill_admin;
--
-- Name: TABLE workspace_key; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.workspace_key TO windmill_user;
GRANT ALL ON TABLE public.workspace_key TO windmill_admin;
--
-- Name: TABLE workspace_settings; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON TABLE public.workspace_settings TO windmill_user;
GRANT ALL ON TABLE public.workspace_settings TO windmill_admin;
--
-- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: public; Owner: postgres
--
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO windmill_user;
--
-- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: public; Owner: postgres
--
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO windmill_user;
--
-- PostgreSQL database dump complete
--
-- used for backend automated testing
-- https://docs.rs/sqlx/latest/sqlx/attr.test.html
INSERT INTO public.workspace
(id, name, owner)
VALUES ('test-workspace', 'test-workspace', 'test-user');
INSERT INTO public.usr(workspace_id, email, username, is_admin, role) VALUES
('test-workspace', 'test@windmill.dev', 'test-user', true, 'Admin');
INSERT INTO public.workspace_key(workspace_id, kind, key) VALUES
('test-workspace', 'cloud', 'test-key');
insert INTO public.token(token_hash, token_prefix, token, email, label, super_admin) VALUES (encode(sha256('SECRET_TOKEN'::bytea), 'hex'), 'SECRET_TOK', 'SECRET_TOKEN', 'test@windmill.dev', 'test token', true);
INSERT INTO public.script(workspace_id, created_by, content, schema, summary, description, path, hash, language, lock) VALUES (
'test-workspace',
'system',
'
import pandas as pd
import pandas2
',
'{}',
'',
'',
'f/foo/bar', -28028598712388162, 'python3', '');
INSERT INTO public.script(workspace_id, created_by, content, schema, summary, description, path, hash, language, lock) VALUES (
'test-workspace',
'system',
'
import numpy as np
',
'{}',
'',
'',
'f/foo/baz', -28028598712388161, 'python3', '');
INSERT INTO public.script(workspace_id, created_by, content, schema, summary, description, path, hash, language, lock) VALUES (
'test-workspace',
'system',
'
import difffolder
from .bar import main
',
'{}',
'',
'',
'f/foobar/baz', -28028598712388160, 'python3', '');
INSERT INTO public.script(workspace_id, created_by, content, schema, summary, description, path, hash, language, lock) VALUES (
'test-workspace',
'system',
'
import innerdifffolder
',
'{}',
'',
'',
'f/foobar/bar', -28028598712388159, 'python3', '');
--
-- Name: workspace_dependencies_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.workspace_dependencies_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE public.workspace_dependencies_id_seq OWNER TO postgres;
--
-- Name: workspace_dependencies_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
SELECT pg_catalog.setval('public.workspace_dependencies_id_seq', 7, true);
--
-- Name: SEQUENCE workspace_dependencies_id_seq; Type: ACL; Schema: public; Owner: postgres
--
GRANT ALL ON SEQUENCE public.workspace_dependencies_id_seq TO windmill_user;
GRANT ALL ON SEQUENCE public.workspace_dependencies_id_seq TO windmill_admin;
--
-- Name: workspace_dependencies; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.workspace_dependencies (
id bigint DEFAULT nextval('public.workspace_dependencies_id_seq'::regclass) NOT NULL,
name character varying(255),
content text NOT NULL,
language public.script_lang NOT NULL,
description text DEFAULT ''::text NOT NULL,
archived boolean DEFAULT false NOT NULL,
workspace_id character varying(50) NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL
);
ALTER TABLE public.workspace_dependencies OWNER TO postgres;
--
-- Name: workspace_dependencies workspace_dependencies_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.workspace_dependencies
ADD CONSTRAINT workspace_dependencies_pkey PRIMARY KEY (id);
--
-- Name: one_non_archived_per_name_language_constraint; Type: INDEX; Schema: public; Owner: postgres
--
CREATE UNIQUE INDEX one_non_archived_per_name_language_constraint ON public.workspace_dependencies USING btree (name, language, workspace_id) WHERE ((archived = false) AND (name IS NOT NULL));
--
-- Name: one_non_archived_per_null_name_language_constraint; Type: INDEX; Schema: public; Owner: postgres
--
CREATE UNIQUE INDEX one_non_archived_per_null_name_language_constraint ON public.workspace_dependencies USING btree (language, workspace_id) WHERE ((archived = false) AND (name IS NULL));
--
-- Name: workspace_dependencies_workspace_archived_idx; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX workspace_dependencies_workspace_archived_idx ON public.workspace_dependencies USING btree (workspace_id, archived) WHERE (archived = false);
--
-- Name: workspace_dependencies_workspace_lang_name_idx; Type: INDEX; Schema: public; Owner: postgres
--
CREATE INDEX workspace_dependencies_workspace_lang_name_idx ON public.workspace_dependencies USING btree (workspace_id, language, name);
--
-- Name: TABLE workspace_dependencies; Type: ACL; Schema: public; Owner: postgres
--
GRANT SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.workspace_dependencies TO windmill_user;
GRANT SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.workspace_dependencies TO windmill_admin;
--
-- PostgreSQL database dump complete
--