feat: member portal Sprint 2 — digest history page and restore Digest/DigestConfig schema models
- Restore Digest + DigestConfig models to schema.prisma (wiped by prior git reset) - Add Tenant.digestConfig / Tenant.digests relations - GET /my/digest API endpoint (last 20 digests, truncated summary) - BFF route /api/my/digest - /my/digest page: digest cards with date, message count, summary preview - Add Digest nav item to MemberShell sidebar Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -29,6 +29,11 @@ export class MyController {
|
||||
return this.service.getDashboard(member.sub, member.tenantId);
|
||||
}
|
||||
|
||||
@Get('digest')
|
||||
digests(@CurrentMember() member: MemberJwtPayload) {
|
||||
return this.service.getDigests(member.tenantId);
|
||||
}
|
||||
|
||||
@Get('profile')
|
||||
profile(@CurrentMember() member: MemberJwtPayload) {
|
||||
return this.service.getProfile(member.sub, member.tenantId);
|
||||
|
||||
@@ -26,6 +26,22 @@ export class MyService {
|
||||
};
|
||||
}
|
||||
|
||||
async getDigests(tenantId: string) {
|
||||
const digests = await this.prisma.digest.findMany({
|
||||
where: { tenantId },
|
||||
orderBy: { digestDate: 'desc' },
|
||||
take: 20,
|
||||
select: { id: true, digestDate: true, content: true, messageIds: true, sentAt: true },
|
||||
});
|
||||
return digests.map((d) => ({
|
||||
id: d.id,
|
||||
digestDate: d.digestDate.toISOString(),
|
||||
summary: d.content.slice(0, 300),
|
||||
messageCount: (d.messageIds as string[]).length,
|
||||
sentAt: d.sentAt.toISOString(),
|
||||
}));
|
||||
}
|
||||
|
||||
async getDashboard(userId: string, tenantId: string) {
|
||||
const user = await this.prisma.towerUser.findFirst({ where: { id: userId, tenantId } });
|
||||
if (!user) throw new NotFoundException('User not found');
|
||||
|
||||
Reference in New Issue
Block a user