fix: store and populate memberKey for share invite link
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -35,6 +35,8 @@ export interface BoardPayload {
|
||||
id: string;
|
||||
title: string;
|
||||
role: Role;
|
||||
memberKey?: string;
|
||||
memberUrlFragment?: string;
|
||||
autoMoveStale: boolean;
|
||||
columns: ColumnPayload[];
|
||||
createdAt: string;
|
||||
|
||||
Reference in New Issue
Block a user