Files
Wyview/app/api/tiktok/stats/route.ts
2026-03-27 00:58:38 +01:00

96 lines
3.3 KiB
TypeScript

import { NextResponse } from "next/server";
import { auth } from "@/lib/auth";
import { fetchUserStats, refreshAccessToken } from "@/lib/tiktok";
import { prisma } from "@/lib/prisma";
export async function GET() {
const session = await auth();
if (!session?.user) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const userId = (session.user as { id?: string }).id;
if (!userId) {
return NextResponse.json({ error: "Session error" }, { status: 401 });
}
if (process.env.NODE_ENV === "development") {
const user = await prisma.user.findUnique({ where: { id: userId } });
return NextResponse.json({
followers: 124,
likes: 856,
videoCount: 1,
views: 3432,
profileViews: 287,
displayName: "CrowMate studio",
avatarUrl: "",
plan: (user as any)?.plan ?? "free",
});
}
const tokenRecord = await prisma.tikTokToken.findUnique({ where: { userId } });
if (!tokenRecord) {
return NextResponse.json({ error: "Not connected" }, { status: 404 });
}
let { accessToken, refreshToken, openId, expiresAt } = tokenRecord;
if (expiresAt.getTime() - Date.now() < 60_000) {
try {
const refreshed = await refreshAccessToken(refreshToken);
await prisma.tikTokToken.update({
where: { userId },
data: {
accessToken: refreshed.access_token,
refreshToken: refreshed.refresh_token,
expiresAt: new Date(Date.now() + refreshed.expires_in * 1000),
},
});
accessToken = refreshed.access_token;
} catch (err) {
console.error("[TikTok stats refresh error]", err);
return NextResponse.json({ error: "Token refresh failed" }, { status: 401 });
}
}
try {
const stats = await fetchUserStats(accessToken, openId);
try {
let account = await prisma.trackedAccount.findFirst({
where: { userId, platform: "tiktok" },
});
if (!account) {
account = await prisma.trackedAccount.create({
data: {
userId,
platform: "tiktok",
username: stats.displayName ?? openId,
accountId: openId,
},
});
}
await prisma.snapshot.create({
data: {
accountId: account.id,
followers: stats.followers ?? 0,
likes: stats.likes ?? 0,
videoCount: stats.videoCount ?? 0,
views: stats.views ?? 0,
},
});
} catch (snapshotErr) {
console.error("[TikTok snapshot save error]", snapshotErr);
}
const user = await prisma.user.findUnique({ where: { id: userId } });
return NextResponse.json({ ...stats, plan: (user as any)?.plan ?? "free" });
} catch (err) {
console.error("[TikTok stats fetch error]", err);
return NextResponse.json({ error: "Failed to fetch stats" }, { status: 500 });
}
}