fix: store and populate memberKey for share invite link

This commit is contained in:
Power BI Dev
2026-08-17 18:37:03 +07:00
parent 2a9cf59e55
commit 8e958ea0ed
11 changed files with 91 additions and 55 deletions
+1
View File
@@ -21,6 +21,7 @@ model Board {
title String @default("Agile Kanban Board")
adminKeyHash String
memberKeyHash String
memberKey String? @default("")
autoMoveStale Boolean @default(false) // Auto move stale cards to Backlog
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
+1
View File
@@ -14,6 +14,7 @@ model Board {
title String @default("Agile Kanban Board")
adminKeyHash String
memberKeyHash String
memberKey String? @default("")
autoMoveStale Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
+30 -14
View File
@@ -13,11 +13,12 @@ export class BoardService {
const adminKeyHash = hashKey(adminKey);
const memberKeyHash = hashKey(memberKey);
const board = await prisma.board.create({
const board = await (prisma.board as any).create({
data: {
title: title.trim() || 'Agile Kanban Board',
adminKeyHash,
memberKeyHash,
memberKey,
autoMoveStale: false,
columns: {
create: [
@@ -90,22 +91,20 @@ export class BoardService {
boardId: col.boardId,
title: col.title,
order: col.order,
maxWipLimit: col.maxWipLimit || 0,
autoStaleHours: col.autoStaleHours || 0,
createdAt: col.createdAt.toISOString(),
updatedAt: col.updatedAt.toISOString(),
maxWipLimit: col.maxWipLimit,
autoStaleHours: col.autoStaleHours,
tickets: col.tickets.map((t) => {
let parsedTags: string[] = [];
let parsedSubtasks: Subtask[] = [];
let tags: string[] = [];
let subtasks: Subtask[] = [];
try {
parsedTags = JSON.parse(t.tags || '[]');
tags = JSON.parse(t.tags || '[]');
} catch {
parsedTags = [];
tags = [];
}
try {
parsedSubtasks = JSON.parse(t.subtasks || '[]');
subtasks = JSON.parse(t.subtasks || '[]');
} catch {
parsedSubtasks = [];
subtasks = [];
}
return {
@@ -115,8 +114,8 @@ export class BoardService {
description: t.description,
order: t.order,
priority: t.priority as Priority,
tags: parsedTags,
subtasks: parsedSubtasks,
tags,
subtasks,
dueDate: t.dueDate || null,
isBlocked: t.isBlocked || false,
blockedReason: t.blockedReason || null,
@@ -128,10 +127,26 @@ export class BoardService {
}),
}));
let memberKeyVal = (board as any).memberKey || '';
if (!memberKeyVal && role === 'admin') {
const newMemberKey = generateSecureKey(32);
const newMemberKeyHash = hashKey(newMemberKey);
await (prisma.board as any).update({
where: { id: boardId },
data: {
memberKey: newMemberKey,
memberKeyHash: newMemberKeyHash,
},
});
memberKeyVal = newMemberKey;
}
return {
id: board.id,
title: board.title,
role,
memberKey: memberKeyVal,
memberUrlFragment: memberKeyVal ? `/b/${board.id}#member=${memberKeyVal}` : '',
autoMoveStale: board.autoMoveStale || false,
columns,
createdAt: board.createdAt.toISOString(),
@@ -146,10 +161,11 @@ export class BoardService {
const newMemberKey = generateSecureKey(32);
const newMemberKeyHash = hashKey(newMemberKey);
await prisma.board.update({
await (prisma.board as any).update({
where: { id: boardId },
data: {
memberKeyHash: newMemberKeyHash,
memberKey: newMemberKey,
},
});
+2
View File
@@ -35,6 +35,8 @@ export interface BoardPayload {
id: string;
title: string;
role: Role;
memberKey?: string;
memberUrlFragment?: string;
autoMoveStale: boolean;
columns: ColumnPayload[];
createdAt: string;