feat(user): add bookmarkedTemplates column to user table and update related API methods

- Introduced a new column `bookmarkedTemplates` to the user table to store user-specific template bookmarks.
- Updated API methods to manage bookmarked templates, replacing the deprecated user_template_bookmarks table.
- Adjusted queries to retrieve and toggle bookmarks directly from the user record.
This commit is contained in:
Mauricio Siu
2026-04-03 21:50:12 -06:00
parent d8e15a60f0
commit 2eb460ba63
6 changed files with 8311 additions and 53 deletions

View File

@@ -0,0 +1 @@
ALTER TABLE "user" ADD COLUMN "bookmarkedTemplates" text[] DEFAULT ARRAY[]::text[];

File diff suppressed because it is too large Load Diff

View File

@@ -1114,6 +1114,13 @@
"when": 1775270343231,
"tag": "0158_amused_synch",
"breakpoints": true
},
{
"idx": 159,
"version": "7",
"when": 1775274158009,
"tag": "0159_polite_puppet_master",
"breakpoints": true
}
]
}

View File

@@ -22,7 +22,7 @@ import {
apiUpdateUser,
invitation,
member,
userTemplateBookmarks,
user,
} from "@dokploy/server/db/schema";
import {
hasPermission,
@@ -642,12 +642,12 @@ export const userRouter = createTRPCRouter({
}),
getBookmarkedTemplates: protectedProcedure.query(async ({ ctx }) => {
const bookmarked = await db.query.userTemplateBookmarks.findMany({
where: eq(userTemplateBookmarks.userId, ctx.user.id),
orderBy: [asc(userTemplateBookmarks.createdAt)],
const result = await db.query.user.findFirst({
where: eq(user.id, ctx.user.id),
columns: { bookmarkedTemplates: true },
});
return bookmarked.map((b) => b.templateId);
return result?.bookmarkedTemplates ?? [];
}),
toggleTemplateBookmark: protectedProcedure
@@ -657,24 +657,23 @@ export const userRouter = createTRPCRouter({
}),
)
.mutation(async ({ input, ctx }) => {
const existing = await db.query.userTemplateBookmarks.findFirst({
where: and(
eq(userTemplateBookmarks.userId, ctx.user.id),
eq(userTemplateBookmarks.templateId, input.templateId),
),
const result = await db.query.user.findFirst({
where: eq(user.id, ctx.user.id),
columns: { bookmarkedTemplates: true },
});
if (existing) {
await db
.delete(userTemplateBookmarks)
.where(eq(userTemplateBookmarks.id, existing.id));
return { isBookmarked: false };
}
const current = result?.bookmarkedTemplates ?? [];
const isBookmarked = current.includes(input.templateId);
await db.insert(userTemplateBookmarks).values({
userId: ctx.user.id,
templateId: input.templateId,
});
return { isBookmarked: true };
const updated = isBookmarked
? current.filter((id) => id !== input.templateId)
: [...current, input.templateId];
await db
.update(user)
.set({ bookmarkedTemplates: updated })
.where(eq(user.id, ctx.user.id));
return { isBookmarked: !isBookmarked };
}),
});