Mobile-first Web-App fuer persoenliches Health-, Ernaehrungs-, Aktivitaets- und Einkaufs-Tracking im Home-Lab-Betrieb. Stack: pnpm Monorepo - Next.js 16 + React 19 + Tailwind (apps/admin) - Hono + tRPC + Better Auth mit 2FA und Passkeys (packages/api) - PostgreSQL + Drizzle ORM (packages/db) - Docker fuer Postgres und pgAdmin. Module: - Auth mit Login, 2FA (TOTP + Backup-Codes), Passkeys und Admin-Recovery - Tagesansicht mit Essen, Trinken, Gewicht, Aktivitaeten und Coach-Hinweisen - Lebensmittelkatalog mit Naehrwerten, Portionen, OCR/Barcode/Open Food Facts - Rezepte mit Live-Naehrwertberechnung und Community-Vorschlaegen - Essensplanung und Wochenbudget mit Sportbonus - Einkaufslisten mit Maerkten und Laufweg-Sortierung - Hellfireclub mit Aktivitaetspunkten und gemeinsamer Aktivitaetsplanung - Wearables-Vorbereitung (Fitbit / Google Fit / Health Connect) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
22 lines
No EOL
1.4 KiB
SQL
22 lines
No EOL
1.4 KiB
SQL
CREATE TYPE "public"."tenant_invite_status" AS ENUM('pending', 'accepted', 'revoked', 'expired');--> statement-breakpoint
|
|
CREATE TABLE "tenant_invitations" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"tenantId" text NOT NULL,
|
|
"email" text NOT NULL,
|
|
"emailNormalized" text NOT NULL,
|
|
"role" "tenant_member_role" DEFAULT 'member' NOT NULL,
|
|
"status" "tenant_invite_status" DEFAULT 'pending' NOT NULL,
|
|
"tokenHash" text NOT NULL,
|
|
"invitedByUserId" text NOT NULL,
|
|
"acceptedByUserId" text,
|
|
"expiresAt" timestamp NOT NULL,
|
|
"acceptedAt" timestamp,
|
|
"revokedAt" timestamp,
|
|
"createdAt" timestamp DEFAULT now() NOT NULL,
|
|
"updatedAt" timestamp DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
ALTER TABLE "tenant_invitations" ADD CONSTRAINT "tenant_invitations_tenantId_tenants_id_fk" FOREIGN KEY ("tenantId") REFERENCES "public"."tenants"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "tenant_invitations" ADD CONSTRAINT "tenant_invitations_invitedByUserId_user_id_fk" FOREIGN KEY ("invitedByUserId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "tenant_invitations" ADD CONSTRAINT "tenant_invitations_acceptedByUserId_user_id_fk" FOREIGN KEY ("acceptedByUserId") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "tenant_invitations_token_hash_unique" ON "tenant_invitations" USING btree ("tokenHash"); |