- Replace Bun with pnpm 9 + Turborepo + tsx; apps/api renamed to apps/backend - Split backend into http/, modules/, lib/ layers mirroring tai-specguard - Add use-case + Result pattern, Problem Details RFC 7807, basePath /api/v1 - Mount Better Auth at /api/v1/auth, keep session-auth whitelist - Split Prisma schema into prisma/models/*, generate into generated/ - Rework packages/shared into lib/ + schemas/ with pagination DTOs - Implement health, groups, students, payments, waitlist modules - Add vitest suite with prisma mocks (21 tests), biome lint - Point web client to /api/v1/auth and /api/v1/groups/from-organization
118 lines
4.2 KiB
SQL
118 lines
4.2 KiB
SQL
/*
|
|
Warnings:
|
|
|
|
- You are about to drop the column `groupId` on the `members` table. All the data in the column will be lost.
|
|
- You are about to drop the column `joinedAt` on the `members` table. All the data in the column will be lost.
|
|
- The `role` column on the `members` table would be dropped and recreated. This will lead to data loss if there is data in the column.
|
|
- A unique constraint covering the columns `[organizationId,userId]` on the table `members` will be added. If there are existing duplicate values, this will fail.
|
|
- Added the required column `organizationId` to the `members` table without a default value. This is not possible if the table is not empty.
|
|
|
|
*/
|
|
-- DropForeignKey
|
|
ALTER TABLE "members" DROP CONSTRAINT "members_groupId_fkey";
|
|
|
|
-- DropIndex
|
|
DROP INDEX "members_groupId_userId_key";
|
|
|
|
-- AlterTable
|
|
ALTER TABLE "members" DROP COLUMN "groupId",
|
|
DROP COLUMN "joinedAt",
|
|
ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
ADD COLUMN "organizationId" TEXT NOT NULL,
|
|
DROP COLUMN "role",
|
|
ADD COLUMN "role" TEXT NOT NULL DEFAULT 'member';
|
|
|
|
-- AlterTable
|
|
ALTER TABLE "sessions" ADD COLUMN "activeOrganizationId" TEXT;
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "organizations" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"slug" TEXT NOT NULL,
|
|
"logo" TEXT,
|
|
"metadata" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "organizations_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "invitations" (
|
|
"id" TEXT NOT NULL,
|
|
"organizationId" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"role" TEXT NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'pending',
|
|
"inviterId" TEXT NOT NULL,
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "invitations_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "passkeys" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT,
|
|
"publicKey" TEXT NOT NULL,
|
|
"credentialID" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"counter" INTEGER NOT NULL,
|
|
"deviceType" TEXT NOT NULL,
|
|
"backedUp" BOOLEAN NOT NULL,
|
|
"transports" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"aaguid" TEXT,
|
|
|
|
CONSTRAINT "passkeys_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "group_members" (
|
|
"id" TEXT NOT NULL,
|
|
"groupId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"role" "Role" NOT NULL DEFAULT 'MEMBER',
|
|
"joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "group_members_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "organizations_slug_key" ON "organizations"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "invitations_organizationId_idx" ON "invitations"("organizationId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "passkeys_credentialID_key" ON "passkeys"("credentialID");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "passkeys_userId_idx" ON "passkeys"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "group_members_groupId_userId_key" ON "group_members"("groupId", "userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "members_organizationId_userId_key" ON "members"("organizationId", "userId");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "members" ADD CONSTRAINT "members_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "invitations" ADD CONSTRAINT "invitations_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "invitations" ADD CONSTRAINT "invitations_inviterId_fkey" FOREIGN KEY ("inviterId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "passkeys" ADD CONSTRAINT "passkeys_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "group_members" ADD CONSTRAINT "group_members_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "groups"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "group_members" ADD CONSTRAINT "group_members_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|