69 lines
2.2 KiB
TypeScript
69 lines
2.2 KiB
TypeScript
import { submitDomainForReview } from "../../../db/domains";
|
|
import { getProfile } from "../../../db/profile";
|
|
import { getPlanLimits } from "../../../utils/plan-features";
|
|
import { usePrisma } from "../../../utils/prisma";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const user = await requireUser(event);
|
|
const id = getRouterParam(event, "id");
|
|
if (!id) throw createError({ statusCode: 400, message: "ID fehlt" });
|
|
|
|
// Only Pro/Legend can submit
|
|
const profile = await getProfile(user.id);
|
|
const plan = profile?.plan ?? "free";
|
|
const limits = getPlanLimits(plan);
|
|
if (!limits.domainRefill) {
|
|
throw createError({
|
|
statusCode: 403,
|
|
message: "Nur Pro-User können Domains einreichen",
|
|
});
|
|
}
|
|
|
|
const db = usePrisma();
|
|
// Verify ownership + status
|
|
const existing = await db.userCustomDomain.findFirst({
|
|
where: { id, userId: user.id },
|
|
select: { id: true, domain: true, status: true },
|
|
});
|
|
if (!existing)
|
|
throw createError({ statusCode: 404, message: "Domain nicht gefunden" });
|
|
if (existing.status !== "active" && existing.status !== "rejected") {
|
|
throw createError({
|
|
statusCode: 409,
|
|
message: "Domain wurde bereits eingereicht oder genehmigt",
|
|
});
|
|
}
|
|
|
|
// Tier-Routing:
|
|
// - Pro: Community-Post mit Voting-Flow erstellen
|
|
// - Legend: KEIN Post — Domain landet direkt in der Admin-Queue zur manuellen Prüfung
|
|
let postId: string | null = null;
|
|
if (plan === "pro") {
|
|
const postContent = `🛡️ Domain-Vorschlag: **${existing.domain}**\n\nIch schlage vor, diese Domain zur globalen ReBreak-Sperrliste hinzuzufügen. Stimme ab: Sollte **${existing.domain}** global gesperrt werden?`;
|
|
const post = await db.communityPost.create({
|
|
data: {
|
|
userId: user.id,
|
|
category: "domain_vote",
|
|
content: postContent,
|
|
},
|
|
select: { id: true },
|
|
});
|
|
postId = post.id;
|
|
}
|
|
|
|
const { submission } = await submitDomainForReview(
|
|
user.id,
|
|
id,
|
|
plan as "free" | "pro" | "legend",
|
|
postId ?? undefined,
|
|
);
|
|
|
|
return {
|
|
ok: true,
|
|
postId,
|
|
submissionId: submission.id,
|
|
domain: existing.domain,
|
|
route: plan === "legend" ? "admin_direct" : "community_vote",
|
|
};
|
|
});
|