mirror of
https://github.com/kjanat/livedash-node.git
synced 2026-01-16 19:32:08 +01:00
- Implemented API session retrieval in `lib/api-auth.ts` to manage user sessions. - Created authentication options in `lib/auth-options.ts` using NextAuth.js with credentials provider. - Added migration scripts to create necessary tables for authentication in `migrations/0002_create_auth_tables.sql` and `prisma/migrations/20250601033219_add_nextauth_tables/migration.sql`. - Configured ESLint with Next.js and TypeScript support in `eslint.config.mjs`. - Updated Next.js configuration in `next.config.ts` for Cloudflare compatibility. - Defined Cloudflare Worker configuration in `open-next.config.ts` and `wrangler.jsonc`. - Enhanced type definitions for authentication in `types/auth.d.ts`. - Created a Cloudflare Worker entry point in `src/index.ts.backup` to handle API requests and responses.
79 lines
2.9 KiB
TypeScript
79 lines
2.9 KiB
TypeScript
// API endpoint: return metrics for current company
|
|
import { NextApiRequest, NextApiResponse } from "next";
|
|
import { getApiSession } from "../../../lib/api-auth";
|
|
import { prisma } from "../../../lib/prisma";
|
|
import { sessionMetrics } from "../../../lib/metrics";
|
|
import { ChatSession } from "../../../lib/types"; // Import ChatSession
|
|
|
|
interface SessionUser {
|
|
email: string;
|
|
name?: string;
|
|
}
|
|
|
|
interface SessionData {
|
|
user: SessionUser;
|
|
}
|
|
|
|
export default async function handler(
|
|
req: NextApiRequest,
|
|
res: NextApiResponse
|
|
) {
|
|
const session = await getApiSession(req, res);
|
|
if (!session?.user) return res.status(401).json({ error: "Not logged in" });
|
|
|
|
const user = await prisma.user.findUnique({
|
|
where: { email: session.user.email },
|
|
include: { company: true },
|
|
});
|
|
|
|
if (!user) return res.status(401).json({ error: "No user" });
|
|
|
|
const prismaSessions = await prisma.session.findMany({
|
|
where: { companyId: user.companyId },
|
|
});
|
|
|
|
// Convert Prisma sessions to ChatSession[] type for sessionMetrics
|
|
const chatSessions: ChatSession[] = prismaSessions.map((ps) => ({
|
|
id: ps.id, // Map Prisma's id to ChatSession.id
|
|
sessionId: ps.id, // Map Prisma's id to ChatSession.sessionId
|
|
companyId: ps.companyId,
|
|
startTime: new Date(ps.startTime), // Ensure startTime is a Date object
|
|
endTime: ps.endTime ? new Date(ps.endTime) : null, // Ensure endTime is a Date object or null
|
|
transcriptContent: ps.transcriptContent || "", // Ensure transcriptContent is a string
|
|
createdAt: new Date(ps.createdAt), // Map Prisma's createdAt
|
|
updatedAt: new Date(ps.createdAt), // Use createdAt for updatedAt as Session model doesn't have updatedAt
|
|
category: ps.category || undefined,
|
|
language: ps.language || undefined,
|
|
country: ps.country || undefined,
|
|
ipAddress: ps.ipAddress || undefined,
|
|
sentiment: ps.sentiment === null ? undefined : ps.sentiment,
|
|
messagesSent: ps.messagesSent === null ? undefined : ps.messagesSent, // Handle null messagesSent
|
|
avgResponseTime:
|
|
ps.avgResponseTime === null ? undefined : ps.avgResponseTime,
|
|
tokens: ps.tokens === null ? undefined : ps.tokens,
|
|
tokensEur: ps.tokensEur === null ? undefined : ps.tokensEur,
|
|
escalated: ps.escalated || false,
|
|
forwardedHr: ps.forwardedHr || false,
|
|
initialMsg: ps.initialMsg || undefined,
|
|
fullTranscriptUrl: ps.fullTranscriptUrl || undefined,
|
|
// userId is missing in Prisma Session model, assuming it's not strictly needed for metrics or can be null
|
|
userId: undefined, // Or some other default/mapping if available
|
|
}));
|
|
|
|
// Pass company config to metrics
|
|
const companyConfigForMetrics = {
|
|
sentimentAlert:
|
|
user.company.sentimentAlert === null
|
|
? undefined
|
|
: user.company.sentimentAlert,
|
|
};
|
|
|
|
const metrics = sessionMetrics(chatSessions, companyConfigForMetrics);
|
|
|
|
res.json({
|
|
metrics,
|
|
csvUrl: user.company.csvUrl,
|
|
company: user.company,
|
|
});
|
|
}
|