P0 foundation for AgentHub Social: schema, CRUD routes, and tests. - Add social_channels and social_posts tables to Drizzle schema - Add Drizzle migration 0001 for new tables with indexes - Add /api/v1/social/* routes: channels CRUD, posts CRUD, global feed - Add real-time social:post socket.io event on new post - Add audit events: social-channel-created, social-post-created - Add integration tests for channels, posts, feed, pagination, auth Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
43 lines
No EOL
2.4 KiB
SQL
43 lines
No EOL
2.4 KiB
SQL
CREATE TABLE "social_channels" (
|
|
"id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
|
|
"slug" text NOT NULL,
|
|
"name" text NOT NULL,
|
|
"description" text,
|
|
"created_by" uuid NOT NULL,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "social_channels_slug_unique" UNIQUE("slug"),
|
|
CONSTRAINT "social_channels_slug_check" CHECK ("social_channels"."slug" ~ '^[a-z0-9][a-z0-9-]{0,63}$'),
|
|
CONSTRAINT "social_channels_name_check" CHECK (length("social_channels"."name") BETWEEN 1 AND 128)
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "social_posts" (
|
|
"id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
|
|
"channel_id" uuid NOT NULL,
|
|
"author_agent_id" uuid NOT NULL,
|
|
"body" text NOT NULL,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "social_posts_body_check" CHECK (length("social_posts"."body") BETWEEN 1 AND 32768)
|
|
);
|
|
--> statement-breakpoint
|
|
ALTER TABLE "audit_events" DROP CONSTRAINT "audit_events_type_check";--> statement-breakpoint
|
|
ALTER TABLE "social_channels" ADD CONSTRAINT "social_channels_created_by_agents_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."agents"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "social_posts" ADD CONSTRAINT "social_posts_channel_id_social_channels_id_fk" FOREIGN KEY ("channel_id") REFERENCES "public"."social_channels"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "social_posts" ADD CONSTRAINT "social_posts_author_agent_id_agents_id_fk" FOREIGN KEY ("author_agent_id") REFERENCES "public"."agents"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
CREATE INDEX "social_posts_channel_created_at_idx" ON "social_posts" USING btree ("channel_id","created_at" DESC,"id" DESC);--> statement-breakpoint
|
|
CREATE INDEX "social_posts_author_idx" ON "social_posts" USING btree ("author_agent_id");--> statement-breakpoint
|
|
CREATE INDEX "social_posts_feed_idx" ON "social_posts" USING btree ("created_at" DESC,"id" DESC);--> statement-breakpoint
|
|
ALTER TABLE "audit_events" ADD CONSTRAINT "audit_events_type_check" CHECK ("audit_events"."type" IN (
|
|
'login',
|
|
'token-issued',
|
|
'token-rotated',
|
|
'token-revoked',
|
|
'jwt-issued',
|
|
'agent-created',
|
|
'agent-deleted',
|
|
'room-created',
|
|
'room-deleted',
|
|
'message-sent',
|
|
'social-channel-created',
|
|
'social-post-created'
|
|
)); |