Simple endpoint to link .dev email to existing profile
cgen-5fc5d67d75f143d99c6f5e59c7f006f0
This commit is contained in:
parent
fd4c655f5a
commit
f4a5768906
1 changed files with 96 additions and 0 deletions
96
api/user/link-dev-email.ts
Normal file
96
api/user/link-dev-email.ts
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
import { getAdminClient } from "../_supabase";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Link a .dev email to an existing profile (no merging, just email linking)
|
||||||
|
* Used when .dev account exists but was never onboarded
|
||||||
|
*/
|
||||||
|
export default async (req: Request) => {
|
||||||
|
if (req.method !== "POST") {
|
||||||
|
return new Response(JSON.stringify({ error: "Method not allowed" }), {
|
||||||
|
status: 405,
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Check authorization
|
||||||
|
const authHeader = req.headers.get("authorization");
|
||||||
|
const adminToken = authHeader?.replace("Bearer ", "");
|
||||||
|
|
||||||
|
if (adminToken !== "mrpiglr-admin-token") {
|
||||||
|
return new Response(JSON.stringify({ error: "Unauthorized" }), {
|
||||||
|
status: 401,
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const supabase = getAdminClient();
|
||||||
|
const devEmail = "mrpiglr@aethex.dev";
|
||||||
|
const mainEmail = "mrpiglr@gmail.com";
|
||||||
|
|
||||||
|
// Get the main user
|
||||||
|
const { data: mainUser, error: mainError } = await supabase
|
||||||
|
.from("user_profiles")
|
||||||
|
.select("user_id")
|
||||||
|
.eq("email", mainEmail)
|
||||||
|
.single();
|
||||||
|
|
||||||
|
if (mainError || !mainUser) {
|
||||||
|
return new Response(
|
||||||
|
JSON.stringify({ error: `User ${mainEmail} not found` }),
|
||||||
|
{ status: 404, headers: { "Content-Type": "application/json" } }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if .dev email is already linked
|
||||||
|
const { data: existing } = await supabase
|
||||||
|
.from("user_email_links")
|
||||||
|
.select("*")
|
||||||
|
.eq("email", devEmail)
|
||||||
|
.single();
|
||||||
|
|
||||||
|
if (existing) {
|
||||||
|
return new Response(
|
||||||
|
JSON.stringify({
|
||||||
|
success: true,
|
||||||
|
message: `.dev email already linked`,
|
||||||
|
email: devEmail,
|
||||||
|
user_id: mainUser.user_id,
|
||||||
|
}),
|
||||||
|
{ status: 200, headers: { "Content-Type": "application/json" } }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Link .dev email to main user
|
||||||
|
const { error: linkError } = await supabase.from("user_email_links").insert({
|
||||||
|
user_id: mainUser.user_id,
|
||||||
|
email: devEmail,
|
||||||
|
is_primary: false,
|
||||||
|
verified_at: new Date().toISOString(),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (linkError) {
|
||||||
|
throw linkError;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Response(
|
||||||
|
JSON.stringify({
|
||||||
|
success: true,
|
||||||
|
message: `Successfully linked ${devEmail} to ${mainEmail}`,
|
||||||
|
devEmail,
|
||||||
|
mainEmail,
|
||||||
|
userId: mainUser.user_id,
|
||||||
|
}),
|
||||||
|
{ status: 200, headers: { "Content-Type": "application/json" } }
|
||||||
|
);
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error("[Link Dev Email Error]", error);
|
||||||
|
return new Response(
|
||||||
|
JSON.stringify({
|
||||||
|
error: "Failed to link email",
|
||||||
|
details: error.message,
|
||||||
|
}),
|
||||||
|
{ status: 500, headers: { "Content-Type": "application/json" } }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
Loading…
Reference in a new issue