52 lines
2.4 KiB
TypeScript
52 lines
2.4 KiB
TypeScript
"use server";
|
|
import { redirect } from "next/navigation";
|
|
import { revalidatePath } from "next/cache";
|
|
import { userByEmail, getSettings, renameAnalysis, deleteAnalysis, db } from "@/lib/db";
|
|
import { signUpNewUser, verifyPassword, startSession, endSession, requireUser, emailOk, hashPassword } from "@/lib/auth";
|
|
import { saveSettingsForm } from "@/lib/settings";
|
|
|
|
export async function signUp(_: unknown, fd: FormData) {
|
|
const r = signUpNewUser(String(fd.get("email") ?? ""), String(fd.get("password") ?? ""));
|
|
if (!r.ok) return r;
|
|
await startSession(r.id);
|
|
redirect("/setup");
|
|
}
|
|
export async function signIn(_: unknown, fd: FormData) {
|
|
const e = String(fd.get("email") ?? "").trim().toLowerCase();
|
|
const u = emailOk(e) ? userByEmail(e) : null;
|
|
if (!u || !verifyPassword(String(fd.get("password") ?? ""), u.pass))
|
|
return { ok: false, error: "Email or password is wrong." };
|
|
await startSession(u.id);
|
|
redirect(getSettings(u.id)?.onboarded === 1 ? "/app" : "/setup");
|
|
}
|
|
export async function signOut() { await endSession(); redirect("/login"); }
|
|
|
|
export async function rename(_: unknown, fd: FormData) {
|
|
const u = await requireUser();
|
|
const id = String(fd.get("id") ?? "");
|
|
const title = String(fd.get("title") ?? "").trim().slice(0, 120);
|
|
if (id && title) renameAnalysis(id, u.id, title);
|
|
revalidatePath("/app");
|
|
}
|
|
export async function remove(_: unknown, fd: FormData) {
|
|
const u = await requireUser();
|
|
deleteAnalysis(String(fd.get("id") ?? ""), u.id);
|
|
revalidatePath("/app");
|
|
}
|
|
|
|
export async function saveSettingsAction(_: unknown, fd: FormData) {
|
|
const u = await requireUser();
|
|
const email = String(fd.get("email") ?? "").trim().toLowerCase();
|
|
const password = String(fd.get("password") ?? "");
|
|
if (email && !emailOk(email)) return { ok: false, error: "Enter a valid email address." };
|
|
if (password && password.length < 10) return { ok: false, error: "Use at least 10 characters." };
|
|
saveSettingsForm(u.id, fd);
|
|
// The wizard sends `after`: a configured user must land on the readiness screen, and the setup page
|
|
// forwards configured users away from steps 1-2, so "Saved." would never be seen there.
|
|
if (String(fd.get("after") ?? "").startsWith("/setup")) redirect("/setup?step=3");
|
|
if (password) db.prepare("UPDATE users SET pass = ? WHERE id = ?").run(hashPassword(password), u.id);
|
|
if (email) db.prepare("UPDATE users SET email = ? WHERE id = ?").run(email, u.id);
|
|
revalidatePath("/settings");
|
|
return { ok: true };
|
|
}
|