feat: add the tiktok integration
This commit is contained in:
58
app/api/tiktok/stats/route.ts
Normal file
58
app/api/tiktok/stats/route.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
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 });
|
||||
}
|
||||
|
||||
const tokenRecord = await prisma.tikTokToken.findUnique({ where: { userId } });
|
||||
|
||||
if (!tokenRecord) {
|
||||
return NextResponse.json({ error: "Not connected" }, { status: 404 });
|
||||
}
|
||||
|
||||
let { accessToken, refreshToken, openId, expiresAt } = tokenRecord;
|
||||
|
||||
// Refresh si expiré (avec 60s de marge)
|
||||
if (expiresAt.getTime() - Date.now() < 60_000) {
|
||||
try {
|
||||
const refreshed = await refreshAccessToken(refreshToken);
|
||||
const newExpiresAt = new Date(Date.now() + refreshed.expires_in * 1000);
|
||||
|
||||
await prisma.tikTokToken.update({
|
||||
where: { userId },
|
||||
data: {
|
||||
accessToken: refreshed.access_token,
|
||||
refreshToken: refreshed.refresh_token,
|
||||
expiresAt: newExpiresAt,
|
||||
},
|
||||
});
|
||||
|
||||
accessToken = refreshed.access_token;
|
||||
refreshToken = refreshed.refresh_token;
|
||||
expiresAt = newExpiresAt;
|
||||
} 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);
|
||||
return NextResponse.json(stats);
|
||||
} catch (err) {
|
||||
console.error("[TikTok stats fetch error]", err);
|
||||
return NextResponse.json({ error: "Failed to fetch stats" }, { status: 500 });
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user