feat: add board favourites with animations (#318)

* feat: add board favorites with animations

* feat: add board favorites functionality with admin-only access

* refactor: make board favorites user-specific via junction table

* fix: assertUserInWorkspace

* Update pnpm lockfile to match package.json

* chore: clean up migrations

---------

Co-authored-by: Henry <henry_ball@hotmail.co.uk>
This commit is contained in:
Eliott Herbert-Byrnes
2026-02-01 22:29:51 +00:00
committed by GitHub
parent ec37f5480a
commit ef5bf87fdf
16 changed files with 6729 additions and 47 deletions

View File

@@ -2,9 +2,11 @@ import { relations, sql } from "drizzle-orm";
import {
bigint,
bigserial,
boolean,
index,
pgEnum,
pgTable,
primaryKey,
text,
timestamp,
uniqueIndex,
@@ -67,6 +69,7 @@ export const boards = pgTable(
).enableRLS();
export const boardsRelations = relations(boards, ({ one, many }) => ({
userFavorites: many(userBoardFavorites),
createdBy: one(users, {
fields: [boards.createdBy],
references: [users.id],
@@ -91,3 +94,21 @@ export const boardsRelations = relations(boards, ({ one, many }) => ({
relationName: "boardWorkspace",
}),
}));
export const userBoardFavorites = pgTable(
"user_board_favorites",
{
userId: uuid("userId")
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
boardId: bigint("boardId", { mode: "number" })
.notNull()
.references(() => boards.id, { onDelete: "cascade" }),
createdAt: timestamp("createdAt").defaultNow().notNull(),
},
(table) => ({
pk: primaryKey({ columns: [table.userId, table.boardId] }),
userIdx: index("user_board_favorite_user_idx").on(table.userId),
boardIdx: index("user_board_favorite_board_idx").on(table.boardId),
}),
);

View File

@@ -8,7 +8,7 @@ import {
} from "drizzle-orm/pg-core";
import { apikey } from "./auth";
import { boards } from "./boards";
import { boards, userBoardFavorites } from "./boards";
import { cards } from "./cards";
import { imports } from "./imports";
import { lists } from "./lists";
@@ -84,3 +84,14 @@ export const usersToWorkspacesRelations = relations(
}),
}),
);
export const userBoardFavoritesRelations = relations(userBoardFavorites, ({ one }) => ({
user: one(users, {
fields: [userBoardFavorites.userId],
references: [users.id],
}),
board: one(boards, {
fields: [userBoardFavorites.boardId],
references: [boards.id],
}),
}));