1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
CREATE TABLE IF NOT EXISTS "apps" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"slug" text NOT NULL UNIQUE,
"name" text NOT NULL,
"description" text NOT NULL DEFAULT '',
"icon_url" text,
"homepage_url" text,
"webhook_url" text,
"webhook_secret" text,
"creator_id" uuid NOT NULL,
"permissions" text NOT NULL DEFAULT '[]',
"default_events" text NOT NULL DEFAULT '[]',
"is_public" boolean NOT NULL DEFAULT true,
"created_at" timestamp DEFAULT now() NOT NULL,
"updated_at" timestamp DEFAULT now() NOT NULL,
CONSTRAINT "apps_creator_fk" FOREIGN KEY ("creator_id") REFERENCES "users"("id") ON DELETE cascade
);
CREATE INDEX IF NOT EXISTS "apps_public_slug" ON "apps" ("is_public", "slug");
CREATE TABLE IF NOT EXISTS "app_installations" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"app_id" uuid NOT NULL,
"installed_by" uuid NOT NULL,
"target_type" text NOT NULL,
"target_id" uuid NOT NULL,
"granted_permissions" text NOT NULL DEFAULT '[]',
"suspended_at" timestamp,
"created_at" timestamp DEFAULT now() NOT NULL,
"uninstalled_at" timestamp,
CONSTRAINT "app_installations_app_fk" FOREIGN KEY ("app_id") REFERENCES "apps"("id") ON DELETE cascade,
CONSTRAINT "app_installations_user_fk" FOREIGN KEY ("installed_by") REFERENCES "users"("id") ON DELETE cascade
);
CREATE INDEX IF NOT EXISTS "app_installations_app" ON "app_installations" ("app_id");
CREATE INDEX IF NOT EXISTS "app_installations_target" ON "app_installations" ("target_type", "target_id");
CREATE UNIQUE INDEX IF NOT EXISTS "app_installations_unique" ON "app_installations" ("app_id", "target_type", "target_id") WHERE "uninstalled_at" IS NULL;
CREATE TABLE IF NOT EXISTS "app_bots" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"app_id" uuid NOT NULL UNIQUE,
"username" text NOT NULL UNIQUE,
"display_name" text NOT NULL,
"avatar_url" text,
"created_at" timestamp DEFAULT now() NOT NULL,
CONSTRAINT "app_bots_app_fk" FOREIGN KEY ("app_id") REFERENCES "apps"("id") ON DELETE cascade
);
CREATE TABLE IF NOT EXISTS "app_install_tokens" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"installation_id" uuid NOT NULL,
"token_hash" text NOT NULL UNIQUE,
"expires_at" timestamp NOT NULL,
"created_at" timestamp DEFAULT now() NOT NULL,
"revoked_at" timestamp,
CONSTRAINT "app_install_tokens_inst_fk" FOREIGN KEY ("installation_id") REFERENCES "app_installations"("id") ON DELETE cascade
);
CREATE INDEX IF NOT EXISTS "app_install_tokens_hash" ON "app_install_tokens" ("token_hash");
CREATE TABLE IF NOT EXISTS "app_events" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"app_id" uuid NOT NULL,
"installation_id" uuid,
"kind" text NOT NULL,
"payload" text,
"response_status" integer,
"created_at" timestamp DEFAULT now() NOT NULL,
CONSTRAINT "app_events_app_fk" FOREIGN KEY ("app_id") REFERENCES "apps"("id") ON DELETE cascade
);
CREATE INDEX IF NOT EXISTS "app_events_app_time" ON "app_events" ("app_id", "created_at");
|