Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
3063e0e
chore(dev): add environment profile selection
BastiDood May 7, 2026
e62e69e
feat(model): support channel threads
BastiDood May 7, 2026
239c781
feat(db): add channel threads to data model
BastiDood May 7, 2026
912deda
refactor(api): prefer `DiscordError.throwNew` as loggable primitive
BastiDood May 7, 2026
f30ee7c
feat(api): support public thread creation
BastiDood May 7, 2026
0ea46cf
chore(dev): remove `--tsconfig` from `svelte-check` lint
BastiDood May 7, 2026
1bedeb0
feat(api): add public threads support
BastiDood May 14, 2026
0d9ea02
feat(api): add validated download of attachments
BastiDood May 14, 2026
948c694
test(api): add initial unit tests
BastiDood May 14, 2026
cf7db77
chore(meta): update slash command registration
BastiDood May 14, 2026
2856067
chore(db): generate migration script
BastiDood May 14, 2026
3fd5aa0
fix(api): ensure ephemeral attachments can be downloaded
BastiDood May 15, 2026
339feea
refactor(dev): use more native Nushell helpers for command registration
BastiDood May 15, 2026
e8ac660
fix(api): make attachment logic consistent with approvals
BastiDood May 15, 2026
a1f7d47
feat(api): allow replying as threads anonymously
BastiDood May 15, 2026
ff66aa5
fix(api): parse empty strings as null in modal state
BastiDood May 15, 2026
ab056fe
docs: update guide + reference on new threads support
BastiDood May 15, 2026
a415408
fix(api): anticipate thread creation errors
BastiDood May 15, 2026
0bd07f4
refactor(api): reorder moderator log fields
BastiDood May 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,7 @@ jobs:
run: pnpm sync
- name: Run All Lints in Parallel
run: pnpm lint
- name: Run Unit Tests
run: pnpm test
- name: Build Website
run: pnpm build
15 changes: 15 additions & 0 deletions discord.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,28 @@
"integration_types": [0],
"contexts": [0]
},
{
"type": 1,
"name": "thread",
"description": "Create an anonymous confession thread.",
"default_member_permissions": 309237645312,
"integration_types": [0],
"contexts": [0]
},
{
"type": 3,
"name": "Reply Anonymously",
"default_member_permissions": 2048,
"integration_types": [0],
"contexts": [0]
},
{
"type": 3,
"name": "Reply as Anonymous Thread",
"default_member_permissions": 309237647360,
"integration_types": [0],
"contexts": [0]
},
{
"type": 1,
"name": "setup",
Expand Down
23 changes: 23 additions & 0 deletions drizzle/0013_anonymous-thread-support.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
CREATE TYPE "app"."pending_channel_thread_kind" AS ENUM('new-thread');--> statement-breakpoint
CREATE TABLE "app"."approved_channel_thread" (
"thread_id" bigint PRIMARY KEY NOT NULL,
"pending_channel_thread_id" bigint NOT NULL,
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
CONSTRAINT "approved_channel_thread_pending_channel_thread_id_unique" UNIQUE("pending_channel_thread_id")
);
--> statement-breakpoint
CREATE TABLE "app"."pending_channel_thread" (
"id" bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "app"."pending_channel_thread_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 CACHE 1),
"channel_id" bigint NOT NULL,
"kind" "app"."pending_channel_thread_kind" NOT NULL,
"title" text NOT NULL,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
ALTER TABLE "app"."confession" ADD COLUMN "pending_channel_thread_id" bigint;--> statement-breakpoint
ALTER TABLE "app"."approved_channel_thread" ADD CONSTRAINT "approved_channel_thread_pending_channel_thread_id_pending_channel_thread_id_fk" FOREIGN KEY ("pending_channel_thread_id") REFERENCES "app"."pending_channel_thread"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "app"."pending_channel_thread" ADD CONSTRAINT "pending_channel_thread_channel_id_channel_id_fk" FOREIGN KEY ("channel_id") REFERENCES "app"."channel"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
CREATE INDEX "pending_channel_thread_channel_id_idx" ON "app"."pending_channel_thread" USING btree ("channel_id");--> statement-breakpoint
ALTER TABLE "app"."confession" ADD CONSTRAINT "confession_pending_channel_thread_id_pending_channel_thread_id_fk" FOREIGN KEY ("pending_channel_thread_id") REFERENCES "app"."pending_channel_thread"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
CREATE INDEX "confession_channel_id_idx" ON "app"."confession" USING btree ("channel_id");--> statement-breakpoint
CREATE INDEX "confession_pending_channel_thread_id_idx" ON "app"."confession" USING btree ("pending_channel_thread_id") WHERE "app"."confession"."pending_channel_thread_id" is not null;
Loading