feat: invite members

This commit is contained in:
Henry
2024-10-17 21:37:51 +01:00
parent 9291ad183d
commit 936e554e93
22 changed files with 1588 additions and 48 deletions

View File

@@ -0,0 +1,22 @@
DO $$ BEGIN
CREATE TYPE "member_status" AS ENUM('invited', 'active', 'removed');
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
--> statement-breakpoint
ALTER TABLE "_card_workspace_members" DROP CONSTRAINT "_card_workspace_members_cardId_card_id_fk";
--> statement-breakpoint
ALTER TABLE "_card_labels" DROP CONSTRAINT "_card_labels_cardId_card_id_fk";
--> statement-breakpoint
ALTER TABLE "workspace_members" ADD COLUMN "status" "member_status" DEFAULT 'invited' NOT NULL;--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "_card_workspace_members" ADD CONSTRAINT "_card_workspace_members_cardId_card_id_fk" FOREIGN KEY ("cardId") REFERENCES "card"("id") ON DELETE no action ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "_card_labels" ADD CONSTRAINT "_card_labels_cardId_card_id_fk" FOREIGN KEY ("cardId") REFERENCES "card"("id") ON DELETE no action ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN null;
END $$;

File diff suppressed because it is too large Load Diff

View File

@@ -22,6 +22,13 @@
"when": 1724967733894,
"tag": "0002_clever_robin_chapel",
"breakpoints": true
},
{
"idx": 3,
"version": "5",
"when": 1728246215706,
"tag": "0003_naive_secret_warriors",
"breakpoints": true
}
]
}
}

View File

@@ -0,0 +1,30 @@
import { generateUID } from "~/utils/generateUID";
import { type Database } from "~/types/database.types";
import { type SupabaseClient } from "@supabase/supabase-js";
export const create = async (
db: SupabaseClient<Database>,
memberInput: {
userId: string;
workspaceId: number;
createdBy: string;
role: "admin" | "member" | "guest";
status: "invited" | "active" | "removed";
},
) => {
const { data } = await db
.from("workspace_members")
.insert({
publicId: generateUID(),
userId: memberInput.userId,
workspaceId: memberInput.workspaceId,
createdBy: memberInput.createdBy,
role: memberInput.role,
status: memberInput.status,
})
.select(`id, publicId`)
.limit(1)
.single();
return data;
};

View File

@@ -11,3 +11,31 @@ export const getById = async (db: SupabaseClient<Database>, userId: string) => {
return data;
};
export const getByEmail = async (
db: SupabaseClient<Database>,
email: string,
) => {
const { data } = await db
.from("user")
.select(`id, name, email`)
.eq("email", email)
.limit(1)
.single();
return data;
};
export const create = async (
db: SupabaseClient<Database>,
user: { id: string; email: string },
) => {
const { data } = await db
.from("user")
.insert({ id: user.id, email: user.email })
.select()
.limit(1)
.single();
return data;
};

View File

@@ -75,6 +75,7 @@ export const getByPublicIdWithMembers = async (
.from("workspace")
.select(
`
id,
publicId,
members: workspace_members (
publicId,
@@ -89,6 +90,7 @@ export const getByPublicIdWithMembers = async (
)
.eq("publicId", workspacePublicId)
.is("deletedAt", null)
.is("members.deletedAt", null)
.limit(1)
.single();
@@ -99,7 +101,7 @@ export const getAllByUserId = async (
db: SupabaseClient<Database>,
userId: string,
) => {
const { data } = await db
const { data, error } = await db
.from("workspace_members")
.select(
`
@@ -113,6 +115,8 @@ export const getAllByUserId = async (
.eq("userId", userId)
.is("deletedAt", null);
console.log({ error });
return data;
};

View File

@@ -19,6 +19,11 @@ export const importStatusEnum = pgEnum("status", [
"failed",
]);
export const memberRoleEnum = pgEnum("role", ["admin", "member", "guest"]);
export const memberStatusEnum = pgEnum("member_status", [
"invited",
"active",
"removed",
]);
export const boards = pgTable("board", {
id: bigserial("id", { mode: "number" }).primaryKey(),
@@ -294,6 +299,7 @@ export const workspaceMembers = pgTable("workspace_members", {
updatedAt: timestamp("updatedAt"),
deletedAt: timestamp("deletedAt"),
role: memberRoleEnum("role").notNull(),
status: memberStatusEnum("status").default("invited").notNull(),
});
export const usersToWorkspacesRelations = relations(