@yeyo11/shipcast 0.0.0-stage → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +41 -2
- package/dist/cli/shipcast.js +25240 -0
- package/dist/fonts/Fraunces-Roman.ttf +0 -0
- package/dist/fonts/Fraunces-WonkItalic.ttf +0 -0
- package/dist/fonts/InstrumentSans-Regular.ttf +0 -0
- package/dist/fonts/InstrumentSans-SemiBold.ttf +0 -0
- package/dist/fonts/OFL-Fraunces.txt +93 -0
- package/dist/fonts/OFL-InstrumentSans.txt +93 -0
- package/dist/fonts/README.md +14 -0
- package/drizzle/0000_registry.sql +54 -0
- package/drizzle/0001_post_model.sql +144 -0
- package/drizzle/0002_api_tokens.sql +9 -0
- package/drizzle/0003_jobs.sql +20 -0
- package/drizzle/0004_account_snapshots.sql +15 -0
- package/drizzle/0006_comments.sql +29 -0
- package/drizzle/0007_comments_paging.sql +2 -0
- package/drizzle/0008_assistant_sessions.sql +25 -0
- package/drizzle/0009_attention_dismissals.sql +4 -0
- package/drizzle/0010_comments_search.sql +4 -0
- package/drizzle/0011_launches_list.sql +3 -0
- package/drizzle/0012_telemetry.sql +40 -0
- package/drizzle/0013_publish_attempts.sql +18 -0
- package/drizzle/0014_secrets.sql +8 -0
- package/drizzle/0015_draft_snapshots.sql +13 -0
- package/drizzle/0016_metrics_checked_at.sql +1 -0
- package/drizzle/0017_metric_days.sql +25 -0
- package/drizzle/0018_launch_model.sql +124 -0
- package/drizzle/0019_launch_imports.sql +20 -0
- package/drizzle/0020_launch_deletions.sql +15 -0
- package/drizzle/0021_dedupe_key_backfill.sql +22 -0
- package/drizzle/0022_drop_draft_snapshots.sql +4 -0
- package/drizzle/0023_push_subscriptions.sql +14 -0
- package/drizzle/meta/0000_snapshot.json +400 -0
- package/drizzle/meta/0001_snapshot.json +537 -0
- package/drizzle/meta/0002_snapshot.json +604 -0
- package/drizzle/meta/0003_snapshot.json +732 -0
- package/drizzle/meta/0004_snapshot.json +816 -0
- package/drizzle/meta/0006_snapshot.json +1036 -0
- package/drizzle/meta/0007_snapshot.json +1084 -0
- package/drizzle/meta/0008_snapshot.json +1298 -0
- package/drizzle/meta/0009_snapshot.json +1324 -0
- package/drizzle/meta/0010_snapshot.json +1372 -0
- package/drizzle/meta/0011_snapshot.json +1448 -0
- package/drizzle/meta/0012_snapshot.json +1717 -0
- package/drizzle/meta/0013_snapshot.json +1844 -0
- package/drizzle/meta/0014_snapshot.json +1896 -0
- package/drizzle/meta/0015_snapshot.json +1978 -0
- package/drizzle/meta/0016_snapshot.json +1984 -0
- package/drizzle/meta/0017_snapshot.json +2112 -0
- package/drizzle/meta/0018_snapshot.json +3051 -0
- package/drizzle/meta/0019_snapshot.json +3198 -0
- package/drizzle/meta/0020_snapshot.json +3315 -0
- package/drizzle/meta/0021_snapshot.json +3315 -0
- package/drizzle/meta/0022_snapshot.json +3233 -0
- package/drizzle/meta/0023_snapshot.json +3333 -0
- package/drizzle/meta/_journal.json +167 -0
- package/package.json +62 -4
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
CREATE TABLE "metric_days" (
|
|
2
|
+
"launch_id" integer NOT NULL,
|
|
3
|
+
"post_id" integer,
|
|
4
|
+
"source" text NOT NULL,
|
|
5
|
+
"name" text NOT NULL,
|
|
6
|
+
"day" text NOT NULL,
|
|
7
|
+
"value" double precision NOT NULL,
|
|
8
|
+
"read_at" text NOT NULL,
|
|
9
|
+
CONSTRAINT "metric_days_unique" UNIQUE NULLS NOT DISTINCT("launch_id","post_id","source","name","day")
|
|
10
|
+
);
|
|
11
|
+
--> statement-breakpoint
|
|
12
|
+
ALTER TABLE "metric_days" ADD CONSTRAINT "metric_days_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
13
|
+
ALTER TABLE "metric_days" ADD CONSTRAINT "metric_days_post_id_posts_id_fk" FOREIGN KEY ("post_id") REFERENCES "public"."posts"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
14
|
+
CREATE INDEX "metric_days_by_launch" ON "metric_days" USING btree ("launch_id","source","name","day");--> statement-breakpoint
|
|
15
|
+
-- The one stored reading that already says its day: a repo's traffic and stars kept as `views:<day>`
|
|
16
|
+
-- (and visitors, clones, cloners, stars), the newest reading of each day
|
|
17
|
+
INSERT INTO "metric_days" ("launch_id", "post_id", "source", "name", "day", "value", "read_at")
|
|
18
|
+
SELECT DISTINCT ON ("launch_id", "name", "day") "launch_id", NULL, 'github', "name", "day", "value", coalesce("checked_at", "taken_at")
|
|
19
|
+
FROM (
|
|
20
|
+
SELECT "launch_id", split_part("name", ':', 1) AS "name", split_part("name", ':', 2) AS "day", "value", "taken_at", "checked_at"
|
|
21
|
+
FROM "metrics"
|
|
22
|
+
WHERE "source" = 'github' AND "post_id" IS NULL AND "name" ~ '^(views|visitors|clones|cloners|stars):\d{4}-\d{2}-\d{2}$'
|
|
23
|
+
) AS "dated"
|
|
24
|
+
ORDER BY "launch_id", "name", "day", "taken_at" DESC
|
|
25
|
+
ON CONFLICT DO NOTHING;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
CREATE TABLE "approvals" (
|
|
2
|
+
"id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "approvals_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
3
|
+
"launch_id" integer NOT NULL,
|
|
4
|
+
"by" text NOT NULL,
|
|
5
|
+
"at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
|
|
6
|
+
"versions" jsonb NOT NULL,
|
|
7
|
+
"revoked_at" text,
|
|
8
|
+
"note" text
|
|
9
|
+
);
|
|
10
|
+
--> statement-breakpoint
|
|
11
|
+
CREATE TABLE "draft_versions" (
|
|
12
|
+
"id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "draft_versions_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
13
|
+
"draft_id" integer NOT NULL,
|
|
14
|
+
"n" integer NOT NULL,
|
|
15
|
+
"body" text NOT NULL,
|
|
16
|
+
"fields" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
17
|
+
"origin" text NOT NULL,
|
|
18
|
+
"author" text,
|
|
19
|
+
"pack_id" integer,
|
|
20
|
+
"created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
|
|
21
|
+
CONSTRAINT "draft_versions_n_unique" UNIQUE("draft_id","n")
|
|
22
|
+
);
|
|
23
|
+
--> statement-breakpoint
|
|
24
|
+
CREATE TABLE "drafts" (
|
|
25
|
+
"id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "drafts_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
26
|
+
"launch_id" integer NOT NULL,
|
|
27
|
+
"channel" text NOT NULL,
|
|
28
|
+
"piece" text NOT NULL,
|
|
29
|
+
"current_version_id" integer,
|
|
30
|
+
"created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
|
|
31
|
+
"updated_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
|
|
32
|
+
CONSTRAINT "drafts_piece_unique" UNIQUE("launch_id","channel","piece")
|
|
33
|
+
);
|
|
34
|
+
--> statement-breakpoint
|
|
35
|
+
CREATE TABLE "launch_channels" (
|
|
36
|
+
"launch_id" integer NOT NULL,
|
|
37
|
+
"channel" text NOT NULL,
|
|
38
|
+
"mode" text NOT NULL,
|
|
39
|
+
"account_id" integer,
|
|
40
|
+
"options" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
41
|
+
"note" text,
|
|
42
|
+
"updated_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
|
|
43
|
+
CONSTRAINT "launch_channels_key" PRIMARY KEY("launch_id","channel")
|
|
44
|
+
);
|
|
45
|
+
--> statement-breakpoint
|
|
46
|
+
CREATE TABLE "launch_sources" (
|
|
47
|
+
"id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "launch_sources_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
48
|
+
"launch_id" integer NOT NULL,
|
|
49
|
+
"position" integer NOT NULL,
|
|
50
|
+
"kind" text NOT NULL,
|
|
51
|
+
"role" text DEFAULT 'context' NOT NULL,
|
|
52
|
+
"repo" text,
|
|
53
|
+
"ref" text,
|
|
54
|
+
"sha" text,
|
|
55
|
+
"url" text,
|
|
56
|
+
"fetched_at" text,
|
|
57
|
+
"http_status" integer,
|
|
58
|
+
"content_type" text,
|
|
59
|
+
"text" text,
|
|
60
|
+
"media_id" integer,
|
|
61
|
+
"meta" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
62
|
+
"content_hash" text,
|
|
63
|
+
"created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
|
|
64
|
+
CONSTRAINT "launch_sources_position_unique" UNIQUE("launch_id","position")
|
|
65
|
+
);
|
|
66
|
+
--> statement-breakpoint
|
|
67
|
+
CREATE TABLE "media" (
|
|
68
|
+
"id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "media_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
69
|
+
"launch_id" integer,
|
|
70
|
+
"sha256" text NOT NULL,
|
|
71
|
+
"kind" text NOT NULL,
|
|
72
|
+
"mime" text NOT NULL,
|
|
73
|
+
"bytes" bigint NOT NULL,
|
|
74
|
+
"width" integer,
|
|
75
|
+
"height" integer,
|
|
76
|
+
"duration_seconds" double precision,
|
|
77
|
+
"storage" text NOT NULL,
|
|
78
|
+
"path" text NOT NULL,
|
|
79
|
+
"role" text NOT NULL,
|
|
80
|
+
"public_path" text,
|
|
81
|
+
"created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
|
|
82
|
+
CONSTRAINT "media_launch_sha256_unique" UNIQUE NULLS NOT DISTINCT("launch_id","sha256")
|
|
83
|
+
);
|
|
84
|
+
--> statement-breakpoint
|
|
85
|
+
CREATE TABLE "packs" (
|
|
86
|
+
"id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "packs_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
87
|
+
"launch_id" integer NOT NULL,
|
|
88
|
+
"version" integer NOT NULL,
|
|
89
|
+
"pack" jsonb NOT NULL,
|
|
90
|
+
"ai_task" text,
|
|
91
|
+
"provider" text,
|
|
92
|
+
"chat_id" text,
|
|
93
|
+
"cost_usd" double precision,
|
|
94
|
+
"accepted" boolean DEFAULT false NOT NULL,
|
|
95
|
+
"created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
|
|
96
|
+
CONSTRAINT "packs_version_unique" UNIQUE("launch_id","version")
|
|
97
|
+
);
|
|
98
|
+
--> statement-breakpoint
|
|
99
|
+
ALTER TABLE "launches" ADD COLUMN "title" text;--> statement-breakpoint
|
|
100
|
+
ALTER TABLE "launches" ADD COLUMN "model" text DEFAULT 'legacy' NOT NULL;--> statement-breakpoint
|
|
101
|
+
ALTER TABLE "launches" ADD COLUMN "dedupe_key" text;--> statement-breakpoint
|
|
102
|
+
ALTER TABLE "launches" ADD COLUMN "channels_source" text;--> statement-breakpoint
|
|
103
|
+
ALTER TABLE "launches" ADD COLUMN "deleted_at" text;--> statement-breakpoint
|
|
104
|
+
ALTER TABLE "launches" ADD COLUMN "approved_at" text;--> statement-breakpoint
|
|
105
|
+
ALTER TABLE "posts" ADD COLUMN "draft_version_id" integer;--> statement-breakpoint
|
|
106
|
+
ALTER TABLE "publish_attempts" ADD COLUMN "draft_version_id" integer;--> statement-breakpoint
|
|
107
|
+
ALTER TABLE "publish_attempts" ADD COLUMN "approval_id" integer;--> statement-breakpoint
|
|
108
|
+
ALTER TABLE "approvals" ADD CONSTRAINT "approvals_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
109
|
+
ALTER TABLE "draft_versions" ADD CONSTRAINT "draft_versions_draft_id_drafts_id_fk" FOREIGN KEY ("draft_id") REFERENCES "public"."drafts"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
110
|
+
ALTER TABLE "draft_versions" ADD CONSTRAINT "draft_versions_pack_id_packs_id_fk" FOREIGN KEY ("pack_id") REFERENCES "public"."packs"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
|
111
|
+
ALTER TABLE "drafts" ADD CONSTRAINT "drafts_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
112
|
+
ALTER TABLE "drafts" ADD CONSTRAINT "drafts_current_version_id_draft_versions_id_fk" FOREIGN KEY ("current_version_id") REFERENCES "public"."draft_versions"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
|
113
|
+
ALTER TABLE "launch_channels" ADD CONSTRAINT "launch_channels_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
114
|
+
ALTER TABLE "launch_channels" ADD CONSTRAINT "launch_channels_account_id_accounts_id_fk" FOREIGN KEY ("account_id") REFERENCES "public"."accounts"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
|
115
|
+
ALTER TABLE "launch_sources" ADD CONSTRAINT "launch_sources_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
116
|
+
ALTER TABLE "launch_sources" ADD CONSTRAINT "launch_sources_media_id_media_id_fk" FOREIGN KEY ("media_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
|
117
|
+
ALTER TABLE "media" ADD CONSTRAINT "media_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
118
|
+
ALTER TABLE "packs" ADD CONSTRAINT "packs_launch_id_launches_id_fk" FOREIGN KEY ("launch_id") REFERENCES "public"."launches"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
119
|
+
CREATE INDEX "approvals_by_launch" ON "approvals" USING btree ("launch_id","at");--> statement-breakpoint
|
|
120
|
+
CREATE INDEX "media_by_sha256" ON "media" USING btree ("sha256");--> statement-breakpoint
|
|
121
|
+
ALTER TABLE "posts" ADD CONSTRAINT "posts_draft_version_id_draft_versions_id_fk" FOREIGN KEY ("draft_version_id") REFERENCES "public"."draft_versions"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
|
122
|
+
ALTER TABLE "publish_attempts" ADD CONSTRAINT "publish_attempts_draft_version_id_draft_versions_id_fk" FOREIGN KEY ("draft_version_id") REFERENCES "public"."draft_versions"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
|
123
|
+
ALTER TABLE "publish_attempts" ADD CONSTRAINT "publish_attempts_approval_id_approvals_id_fk" FOREIGN KEY ("approval_id") REFERENCES "public"."approvals"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
|
124
|
+
ALTER TABLE "launches" ADD CONSTRAINT "launches_dedupe_key_unique" UNIQUE("dedupe_key");
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
CREATE TABLE "launch_imports" (
|
|
2
|
+
"id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "launch_imports_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
3
|
+
"batch" text NOT NULL,
|
|
4
|
+
"launch_id" integer NOT NULL,
|
|
5
|
+
"action" text NOT NULL,
|
|
6
|
+
"before" jsonb NOT NULL,
|
|
7
|
+
"summary" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
8
|
+
"at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
|
|
9
|
+
"rolled_back_at" text
|
|
10
|
+
);
|
|
11
|
+
--> statement-breakpoint
|
|
12
|
+
ALTER TABLE "approvals" ADD COLUMN "import_batch" text;--> statement-breakpoint
|
|
13
|
+
ALTER TABLE "draft_versions" ADD COLUMN "import_batch" text;--> statement-breakpoint
|
|
14
|
+
ALTER TABLE "drafts" ADD COLUMN "import_batch" text;--> statement-breakpoint
|
|
15
|
+
ALTER TABLE "launch_channels" ADD COLUMN "import_batch" text;--> statement-breakpoint
|
|
16
|
+
ALTER TABLE "launch_sources" ADD COLUMN "import_batch" text;--> statement-breakpoint
|
|
17
|
+
ALTER TABLE "media" ADD COLUMN "import_batch" text;--> statement-breakpoint
|
|
18
|
+
ALTER TABLE "packs" ADD COLUMN "import_batch" text;--> statement-breakpoint
|
|
19
|
+
CREATE INDEX "launch_imports_by_batch" ON "launch_imports" USING btree ("batch");--> statement-breakpoint
|
|
20
|
+
CREATE INDEX "launch_imports_by_launch" ON "launch_imports" USING btree ("launch_id");
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
CREATE TABLE "launch_deletions" (
|
|
2
|
+
"id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "launch_deletions_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
3
|
+
"launch_id" integer NOT NULL,
|
|
4
|
+
"dedupe_key" text NOT NULL,
|
|
5
|
+
"repo" text NOT NULL,
|
|
6
|
+
"ref" text NOT NULL,
|
|
7
|
+
"mode" text NOT NULL,
|
|
8
|
+
"by" text NOT NULL,
|
|
9
|
+
"at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
|
|
10
|
+
"channels" jsonb DEFAULT '[]'::jsonb NOT NULL,
|
|
11
|
+
"article_links" integer
|
|
12
|
+
);
|
|
13
|
+
--> statement-breakpoint
|
|
14
|
+
CREATE INDEX "launch_deletions_by_key" ON "launch_deletions" USING btree ("dedupe_key");--> statement-breakpoint
|
|
15
|
+
CREATE INDEX "launch_deletions_by_launch" ON "launch_deletions" USING btree ("launch_id");
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
-- Every launch claimed before each claim carried its dedupe key gets the one its repo and ref imply,
|
|
2
|
+
-- as dedupeKeyOf (src/launch-keys.ts) computes it: an article by its slug, a repo gone public by the
|
|
3
|
+
-- repo, a release by repo and tag. Only fills empty keys; a key another row holds already, or that
|
|
4
|
+
-- two old rows would share (a repo gone public by webhook and by poll), goes to the oldest row alone,
|
|
5
|
+
-- so the unique constraint never fails the migration.
|
|
6
|
+
UPDATE "launches" AS l SET "dedupe_key" = k."key"
|
|
7
|
+
FROM (
|
|
8
|
+
SELECT DISTINCT ON (c."key") c."id", c."key"
|
|
9
|
+
FROM (
|
|
10
|
+
SELECT "id",
|
|
11
|
+
CASE
|
|
12
|
+
WHEN "ref" LIKE 'article:%' THEN "ref"
|
|
13
|
+
WHEN "ref" LIKE 'public:%' THEN 'github-public:' || "repo"
|
|
14
|
+
ELSE 'github-release:' || "repo" || '@' || "ref"
|
|
15
|
+
END AS "key"
|
|
16
|
+
FROM "launches"
|
|
17
|
+
WHERE "dedupe_key" IS NULL
|
|
18
|
+
) AS c
|
|
19
|
+
WHERE NOT EXISTS (SELECT 1 FROM "launches" AS t WHERE t."dedupe_key" = c."key")
|
|
20
|
+
ORDER BY c."key", c."id"
|
|
21
|
+
) AS k
|
|
22
|
+
WHERE l."id" = k."id";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
-- The one agreed exception to additive-only migrations (docs/decisions/launch-model.md, phase 8):
|
|
2
|
+
-- the drafts snapshot of the pull-request path, which nothing writes or reads since phase 8.
|
|
3
|
+
-- Dropped at the owner's decision on 2026-11-02, with no pg_dump step: he keeps his own backups.
|
|
4
|
+
DROP TABLE "draft_snapshots" CASCADE;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
CREATE TABLE "push_subscriptions" (
|
|
2
|
+
"id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (sequence name "push_subscriptions_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
|
3
|
+
"login" text NOT NULL,
|
|
4
|
+
"endpoint" text NOT NULL,
|
|
5
|
+
"p256dh" text NOT NULL,
|
|
6
|
+
"auth" text NOT NULL,
|
|
7
|
+
"label" text NOT NULL,
|
|
8
|
+
"events" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
9
|
+
"created_at" text DEFAULT to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') NOT NULL,
|
|
10
|
+
"last_success_at" text,
|
|
11
|
+
"last_failure_at" text,
|
|
12
|
+
"last_failure" text,
|
|
13
|
+
CONSTRAINT "push_subscriptions_endpoint" UNIQUE("endpoint")
|
|
14
|
+
);
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "fc1ef674-ce73-4596-9190-bde841d806c9",
|
|
3
|
+
"prevId": "00000000-0000-0000-0000-000000000000",
|
|
4
|
+
"version": "7",
|
|
5
|
+
"dialect": "postgresql",
|
|
6
|
+
"tables": {
|
|
7
|
+
"public.accounts": {
|
|
8
|
+
"name": "accounts",
|
|
9
|
+
"schema": "",
|
|
10
|
+
"columns": {
|
|
11
|
+
"id": {
|
|
12
|
+
"name": "id",
|
|
13
|
+
"type": "integer",
|
|
14
|
+
"primaryKey": true,
|
|
15
|
+
"notNull": true,
|
|
16
|
+
"identity": {
|
|
17
|
+
"type": "byDefault",
|
|
18
|
+
"name": "accounts_id_seq",
|
|
19
|
+
"schema": "public",
|
|
20
|
+
"increment": "1",
|
|
21
|
+
"startWith": "1",
|
|
22
|
+
"minValue": "1",
|
|
23
|
+
"maxValue": "2147483647",
|
|
24
|
+
"cache": "1",
|
|
25
|
+
"cycle": false
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"network": {
|
|
29
|
+
"name": "network",
|
|
30
|
+
"type": "text",
|
|
31
|
+
"primaryKey": false,
|
|
32
|
+
"notNull": true
|
|
33
|
+
},
|
|
34
|
+
"brand": {
|
|
35
|
+
"name": "brand",
|
|
36
|
+
"type": "text",
|
|
37
|
+
"primaryKey": false,
|
|
38
|
+
"notNull": true
|
|
39
|
+
},
|
|
40
|
+
"label": {
|
|
41
|
+
"name": "label",
|
|
42
|
+
"type": "text",
|
|
43
|
+
"primaryKey": false,
|
|
44
|
+
"notNull": true
|
|
45
|
+
},
|
|
46
|
+
"settings": {
|
|
47
|
+
"name": "settings",
|
|
48
|
+
"type": "text",
|
|
49
|
+
"primaryKey": false,
|
|
50
|
+
"notNull": true,
|
|
51
|
+
"default": "'{}'"
|
|
52
|
+
},
|
|
53
|
+
"is_primary": {
|
|
54
|
+
"name": "is_primary",
|
|
55
|
+
"type": "integer",
|
|
56
|
+
"primaryKey": false,
|
|
57
|
+
"notNull": true,
|
|
58
|
+
"default": 0
|
|
59
|
+
},
|
|
60
|
+
"status": {
|
|
61
|
+
"name": "status",
|
|
62
|
+
"type": "text",
|
|
63
|
+
"primaryKey": false,
|
|
64
|
+
"notNull": true,
|
|
65
|
+
"default": "'unchecked'"
|
|
66
|
+
},
|
|
67
|
+
"identity": {
|
|
68
|
+
"name": "identity",
|
|
69
|
+
"type": "text",
|
|
70
|
+
"primaryKey": false,
|
|
71
|
+
"notNull": false
|
|
72
|
+
},
|
|
73
|
+
"problem": {
|
|
74
|
+
"name": "problem",
|
|
75
|
+
"type": "text",
|
|
76
|
+
"primaryKey": false,
|
|
77
|
+
"notNull": false
|
|
78
|
+
},
|
|
79
|
+
"checked_at": {
|
|
80
|
+
"name": "checked_at",
|
|
81
|
+
"type": "text",
|
|
82
|
+
"primaryKey": false,
|
|
83
|
+
"notNull": false
|
|
84
|
+
},
|
|
85
|
+
"created_at": {
|
|
86
|
+
"name": "created_at",
|
|
87
|
+
"type": "text",
|
|
88
|
+
"primaryKey": false,
|
|
89
|
+
"notNull": true,
|
|
90
|
+
"default": "to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"indexes": {},
|
|
94
|
+
"foreignKeys": {},
|
|
95
|
+
"compositePrimaryKeys": {},
|
|
96
|
+
"uniqueConstraints": {
|
|
97
|
+
"accounts_network_brand_label_unique": {
|
|
98
|
+
"name": "accounts_network_brand_label_unique",
|
|
99
|
+
"nullsNotDistinct": false,
|
|
100
|
+
"columns": [
|
|
101
|
+
"network",
|
|
102
|
+
"brand",
|
|
103
|
+
"label"
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"policies": {},
|
|
108
|
+
"checkConstraints": {},
|
|
109
|
+
"isRLSEnabled": false
|
|
110
|
+
},
|
|
111
|
+
"public.cursors": {
|
|
112
|
+
"name": "cursors",
|
|
113
|
+
"schema": "",
|
|
114
|
+
"columns": {
|
|
115
|
+
"key": {
|
|
116
|
+
"name": "key",
|
|
117
|
+
"type": "text",
|
|
118
|
+
"primaryKey": true,
|
|
119
|
+
"notNull": true
|
|
120
|
+
},
|
|
121
|
+
"value": {
|
|
122
|
+
"name": "value",
|
|
123
|
+
"type": "text",
|
|
124
|
+
"primaryKey": false,
|
|
125
|
+
"notNull": true
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
"indexes": {},
|
|
129
|
+
"foreignKeys": {},
|
|
130
|
+
"compositePrimaryKeys": {},
|
|
131
|
+
"uniqueConstraints": {},
|
|
132
|
+
"policies": {},
|
|
133
|
+
"checkConstraints": {},
|
|
134
|
+
"isRLSEnabled": false
|
|
135
|
+
},
|
|
136
|
+
"public.launches": {
|
|
137
|
+
"name": "launches",
|
|
138
|
+
"schema": "",
|
|
139
|
+
"columns": {
|
|
140
|
+
"id": {
|
|
141
|
+
"name": "id",
|
|
142
|
+
"type": "integer",
|
|
143
|
+
"primaryKey": true,
|
|
144
|
+
"notNull": true,
|
|
145
|
+
"identity": {
|
|
146
|
+
"type": "byDefault",
|
|
147
|
+
"name": "launches_id_seq",
|
|
148
|
+
"schema": "public",
|
|
149
|
+
"increment": "1",
|
|
150
|
+
"startWith": "1",
|
|
151
|
+
"minValue": "1",
|
|
152
|
+
"maxValue": "2147483647",
|
|
153
|
+
"cache": "1",
|
|
154
|
+
"cycle": false
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"repo": {
|
|
158
|
+
"name": "repo",
|
|
159
|
+
"type": "text",
|
|
160
|
+
"primaryKey": false,
|
|
161
|
+
"notNull": true
|
|
162
|
+
},
|
|
163
|
+
"ref": {
|
|
164
|
+
"name": "ref",
|
|
165
|
+
"type": "text",
|
|
166
|
+
"primaryKey": false,
|
|
167
|
+
"notNull": true
|
|
168
|
+
},
|
|
169
|
+
"trigger": {
|
|
170
|
+
"name": "trigger",
|
|
171
|
+
"type": "text",
|
|
172
|
+
"primaryKey": false,
|
|
173
|
+
"notNull": true
|
|
174
|
+
},
|
|
175
|
+
"kind": {
|
|
176
|
+
"name": "kind",
|
|
177
|
+
"type": "text",
|
|
178
|
+
"primaryKey": false,
|
|
179
|
+
"notNull": true
|
|
180
|
+
},
|
|
181
|
+
"brand": {
|
|
182
|
+
"name": "brand",
|
|
183
|
+
"type": "text",
|
|
184
|
+
"primaryKey": false,
|
|
185
|
+
"notNull": true
|
|
186
|
+
},
|
|
187
|
+
"status": {
|
|
188
|
+
"name": "status",
|
|
189
|
+
"type": "text",
|
|
190
|
+
"primaryKey": false,
|
|
191
|
+
"notNull": true
|
|
192
|
+
},
|
|
193
|
+
"detail": {
|
|
194
|
+
"name": "detail",
|
|
195
|
+
"type": "text",
|
|
196
|
+
"primaryKey": false,
|
|
197
|
+
"notNull": false
|
|
198
|
+
},
|
|
199
|
+
"created_at": {
|
|
200
|
+
"name": "created_at",
|
|
201
|
+
"type": "text",
|
|
202
|
+
"primaryKey": false,
|
|
203
|
+
"notNull": true,
|
|
204
|
+
"default": "to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')"
|
|
205
|
+
},
|
|
206
|
+
"updated_at": {
|
|
207
|
+
"name": "updated_at",
|
|
208
|
+
"type": "text",
|
|
209
|
+
"primaryKey": false,
|
|
210
|
+
"notNull": true,
|
|
211
|
+
"default": "to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')"
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
"indexes": {},
|
|
215
|
+
"foreignKeys": {},
|
|
216
|
+
"compositePrimaryKeys": {},
|
|
217
|
+
"uniqueConstraints": {
|
|
218
|
+
"launches_repo_ref_unique": {
|
|
219
|
+
"name": "launches_repo_ref_unique",
|
|
220
|
+
"nullsNotDistinct": false,
|
|
221
|
+
"columns": [
|
|
222
|
+
"repo",
|
|
223
|
+
"ref"
|
|
224
|
+
]
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
"policies": {},
|
|
228
|
+
"checkConstraints": {},
|
|
229
|
+
"isRLSEnabled": false
|
|
230
|
+
},
|
|
231
|
+
"public.metrics": {
|
|
232
|
+
"name": "metrics",
|
|
233
|
+
"schema": "",
|
|
234
|
+
"columns": {
|
|
235
|
+
"launch_id": {
|
|
236
|
+
"name": "launch_id",
|
|
237
|
+
"type": "integer",
|
|
238
|
+
"primaryKey": false,
|
|
239
|
+
"notNull": true
|
|
240
|
+
},
|
|
241
|
+
"source": {
|
|
242
|
+
"name": "source",
|
|
243
|
+
"type": "text",
|
|
244
|
+
"primaryKey": false,
|
|
245
|
+
"notNull": true
|
|
246
|
+
},
|
|
247
|
+
"name": {
|
|
248
|
+
"name": "name",
|
|
249
|
+
"type": "text",
|
|
250
|
+
"primaryKey": false,
|
|
251
|
+
"notNull": true
|
|
252
|
+
},
|
|
253
|
+
"value": {
|
|
254
|
+
"name": "value",
|
|
255
|
+
"type": "double precision",
|
|
256
|
+
"primaryKey": false,
|
|
257
|
+
"notNull": true
|
|
258
|
+
},
|
|
259
|
+
"taken_at": {
|
|
260
|
+
"name": "taken_at",
|
|
261
|
+
"type": "text",
|
|
262
|
+
"primaryKey": false,
|
|
263
|
+
"notNull": true
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
"indexes": {
|
|
267
|
+
"metrics_by_launch": {
|
|
268
|
+
"name": "metrics_by_launch",
|
|
269
|
+
"columns": [
|
|
270
|
+
{
|
|
271
|
+
"expression": "launch_id",
|
|
272
|
+
"isExpression": false,
|
|
273
|
+
"asc": true,
|
|
274
|
+
"nulls": "last"
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"expression": "source",
|
|
278
|
+
"isExpression": false,
|
|
279
|
+
"asc": true,
|
|
280
|
+
"nulls": "last"
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
"expression": "name",
|
|
284
|
+
"isExpression": false,
|
|
285
|
+
"asc": true,
|
|
286
|
+
"nulls": "last"
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"expression": "taken_at",
|
|
290
|
+
"isExpression": false,
|
|
291
|
+
"asc": true,
|
|
292
|
+
"nulls": "last"
|
|
293
|
+
}
|
|
294
|
+
],
|
|
295
|
+
"isUnique": false,
|
|
296
|
+
"concurrently": false,
|
|
297
|
+
"method": "btree",
|
|
298
|
+
"with": {}
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
"foreignKeys": {
|
|
302
|
+
"metrics_launch_id_launches_id_fk": {
|
|
303
|
+
"name": "metrics_launch_id_launches_id_fk",
|
|
304
|
+
"tableFrom": "metrics",
|
|
305
|
+
"tableTo": "launches",
|
|
306
|
+
"columnsFrom": [
|
|
307
|
+
"launch_id"
|
|
308
|
+
],
|
|
309
|
+
"columnsTo": [
|
|
310
|
+
"id"
|
|
311
|
+
],
|
|
312
|
+
"onDelete": "no action",
|
|
313
|
+
"onUpdate": "no action"
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
"compositePrimaryKeys": {},
|
|
317
|
+
"uniqueConstraints": {},
|
|
318
|
+
"policies": {},
|
|
319
|
+
"checkConstraints": {},
|
|
320
|
+
"isRLSEnabled": false
|
|
321
|
+
},
|
|
322
|
+
"public.posts": {
|
|
323
|
+
"name": "posts",
|
|
324
|
+
"schema": "",
|
|
325
|
+
"columns": {
|
|
326
|
+
"launch_id": {
|
|
327
|
+
"name": "launch_id",
|
|
328
|
+
"type": "integer",
|
|
329
|
+
"primaryKey": false,
|
|
330
|
+
"notNull": true
|
|
331
|
+
},
|
|
332
|
+
"channel": {
|
|
333
|
+
"name": "channel",
|
|
334
|
+
"type": "text",
|
|
335
|
+
"primaryKey": false,
|
|
336
|
+
"notNull": true
|
|
337
|
+
},
|
|
338
|
+
"url": {
|
|
339
|
+
"name": "url",
|
|
340
|
+
"type": "text",
|
|
341
|
+
"primaryKey": false,
|
|
342
|
+
"notNull": false
|
|
343
|
+
},
|
|
344
|
+
"external_id": {
|
|
345
|
+
"name": "external_id",
|
|
346
|
+
"type": "text",
|
|
347
|
+
"primaryKey": false,
|
|
348
|
+
"notNull": false
|
|
349
|
+
},
|
|
350
|
+
"published_at": {
|
|
351
|
+
"name": "published_at",
|
|
352
|
+
"type": "text",
|
|
353
|
+
"primaryKey": false,
|
|
354
|
+
"notNull": true,
|
|
355
|
+
"default": "to_char(statement_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')"
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
"indexes": {},
|
|
359
|
+
"foreignKeys": {
|
|
360
|
+
"posts_launch_id_launches_id_fk": {
|
|
361
|
+
"name": "posts_launch_id_launches_id_fk",
|
|
362
|
+
"tableFrom": "posts",
|
|
363
|
+
"tableTo": "launches",
|
|
364
|
+
"columnsFrom": [
|
|
365
|
+
"launch_id"
|
|
366
|
+
],
|
|
367
|
+
"columnsTo": [
|
|
368
|
+
"id"
|
|
369
|
+
],
|
|
370
|
+
"onDelete": "no action",
|
|
371
|
+
"onUpdate": "no action"
|
|
372
|
+
}
|
|
373
|
+
},
|
|
374
|
+
"compositePrimaryKeys": {
|
|
375
|
+
"posts_launch_id_channel_pk": {
|
|
376
|
+
"name": "posts_launch_id_channel_pk",
|
|
377
|
+
"columns": [
|
|
378
|
+
"launch_id",
|
|
379
|
+
"channel"
|
|
380
|
+
]
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
"uniqueConstraints": {},
|
|
384
|
+
"policies": {},
|
|
385
|
+
"checkConstraints": {},
|
|
386
|
+
"isRLSEnabled": false
|
|
387
|
+
}
|
|
388
|
+
},
|
|
389
|
+
"enums": {},
|
|
390
|
+
"schemas": {},
|
|
391
|
+
"sequences": {},
|
|
392
|
+
"roles": {},
|
|
393
|
+
"policies": {},
|
|
394
|
+
"views": {},
|
|
395
|
+
"_meta": {
|
|
396
|
+
"columns": {},
|
|
397
|
+
"schemas": {},
|
|
398
|
+
"tables": {}
|
|
399
|
+
}
|
|
400
|
+
}
|