fiddy/apps/web/app/api/invite-links/[token]/route.ts

42 lines
2.1 KiB
TypeScript

import { NextResponse } from "next/server";
import { getSessionUser, requireSessionUser } from "@/lib/server/session";
import { apiError, toErrorResponse } from "@/lib/server/errors";
import { getRequestMeta } from "@/lib/server/request";
import { acceptInviteLink, getInviteLinkSummaryByToken, getInviteViewerStatus } from "@/lib/server/group-invites";
export async function GET(_: Request, context: { params: Promise<{ token: string }> }) {
const { requestId } = await getRequestMeta();
try {
const { token } = await context.params;
const normalized = String(token || "").trim();
if (!normalized) apiError("INVITE_NOT_FOUND");
const link = await getInviteLinkSummaryByToken(normalized);
if (!link) apiError("INVITE_NOT_FOUND", { tokenLast4: normalized.slice(-4) });
const user = await getSessionUser();
if (user) {
const viewerStatus = await getInviteViewerStatus({ userId: user.id, groupId: link.groupId });
if (viewerStatus)
return NextResponse.json({ requestId, request_id: requestId, link: { ...link, viewerStatus } });
}
return NextResponse.json({ requestId, request_id: requestId, link });
} catch (e) {
const { status, body } = toErrorResponse(e, "GET /api/invite-links/[token]", requestId);
return NextResponse.json(body, { status });
}
}
export async function POST(_: Request, context: { params: Promise<{ token: string }> }) {
const { requestId, ip, userAgent } = await getRequestMeta();
try {
const user = await requireSessionUser();
const { token } = await context.params;
const normalized = String(token || "").trim();
if (!normalized) apiError("INVITE_NOT_FOUND");
const result = await acceptInviteLink({ userId: user.id, token: normalized, requestId, ip, userAgent });
return NextResponse.json({ requestId, request_id: requestId, result });
} catch (e) {
const { status, body } = toErrorResponse(e, "POST /api/invite-links/[token]", requestId);
return NextResponse.json(body, { status });
}
}