Files
2025-11-11 03:08:36 -03:00

137 lines
3.5 KiB
TypeScript

import { type NextRequest, NextResponse } from "next/server";
import { requireAdminUser } from "@/lib/auth/middleware";
import {
assignUserToSubscriptionTier,
getDefaultSubscriptionTier,
getSubscriptionTierById,
getSubscriptionTierBySlug,
} from "@/lib/prisma/queries/subscription-tiers";
import { getUserById } from "@/lib/prisma/queries/users";
import { secureLogger } from "@/lib/secure-logger";
import { assignSubscriptionTierSchema } from "@/lib/validation-schemas";
export async function POST(request: NextRequest) {
const auth = await requireAdminUser(request);
if (auth instanceof NextResponse) {
return auth;
}
try {
const body = await request.json();
const parsed = assignSubscriptionTierSchema.parse(body);
const user = await getUserById(parsed.userId);
if (!user) {
return NextResponse.json(
{
success: false,
error: "Usuário não encontrado.",
},
{ status: 404 },
);
}
let targetTierId: number | null = null;
let targetTier: {
subscription_tier_id: number;
name: string;
slug: string;
level: number;
} | null = null;
if (parsed.tierId !== undefined) {
if (parsed.tierId === null) {
const defaultTier = await getDefaultSubscriptionTier();
if (!defaultTier) {
return NextResponse.json(
{
success: false,
error: "Plano padrão não encontrado.",
},
{ status: 500 },
);
}
targetTier = defaultTier;
} else {
const tierById = await getSubscriptionTierById(parsed.tierId, false);
if (!tierById) {
return NextResponse.json(
{
success: false,
error: "Plano informado não existe.",
},
{ status: 404 },
);
}
targetTier = tierById;
}
} else if (parsed.tierSlug) {
const tierBySlug = await getSubscriptionTierBySlug(
parsed.tierSlug,
false,
);
if (!tierBySlug) {
return NextResponse.json(
{
success: false,
error: "Plano informado não existe.",
},
{ status: 404 },
);
}
targetTier = tierBySlug;
}
if (!targetTier) {
return NextResponse.json(
{
success: false,
error: "Plano de assinatura não identificado.",
},
{ status: 400 },
);
}
targetTierId = targetTier.subscription_tier_id;
await assignUserToSubscriptionTier(parsed.userId, targetTierId);
return NextResponse.json(
{
success: true,
userId: parsed.userId,
tier: {
id: targetTier.subscription_tier_id,
name: targetTier.name,
slug: targetTier.slug,
level: targetTier.level,
},
},
{ status: 200 },
);
} catch (error) {
if (error instanceof Error && "issues" in error) {
return NextResponse.json(
{
success: false,
error: "Dados inválidos",
details: (error as any).issues,
},
{ status: 400 },
);
}
secureLogger.error("❌ Erro ao atribuir subscription tier", {
error: error instanceof Error ? error.message : "Erro desconhecido",
});
return NextResponse.json(
{
success: false,
error: "Erro ao atribuir plano de assinatura ao usuário",
},
{ status: 500 },
);
}
}