Files
zerobyte/app/server/modules/desktop/bootstrap.ts
Nico c0148aba89 feat(desktop): prepare folder picker for desktop (#993)
* feat(desktop): prepare folder picker for desktop

* fix: test failure
2026-06-17 14:34:39 +02:00

73 lines
2.3 KiB
TypeScript

import { eq } from "drizzle-orm";
import { UnauthorizedError } from "http-errors-enhanced";
import type { DateFormatPreference, TimeFormatPreference } from "~/lib/datetime";
import { config } from "~/server/core/config";
import { db } from "~/server/db/db";
import { usersTable } from "~/server/db/schema";
import { verifyUserPassword } from "~/server/modules/auth/helpers";
import { ensureDefaultOrg } from "~/server/lib/auth/helpers/create-default-org";
import { auth } from "~/server/lib/auth";
import { cryptoUtils } from "~/server/utils/crypto";
import { DESKTOP_USER_EMAIL, DESKTOP_USERNAME } from "./constants";
type DesktopDateTimePreferences = {
dateFormat: DateFormatPreference;
timeFormat: TimeFormatPreference;
};
export const ensureDesktopIdentity = async ({ dateFormat, timeFormat }: DesktopDateTimePreferences) => {
if (config.runtime !== "desktop") {
return;
}
let user = await db.query.usersTable.findFirst({ where: { email: DESKTOP_USER_EMAIL } });
const password = await cryptoUtils.deriveSecret("zerobyte:desktop-user-password");
if (!user) {
const authContext = await auth.$context;
const passwordHash = await authContext.password.hash(password);
await authContext.internalAdapter.createUser({
email: DESKTOP_USER_EMAIL,
name: "Zerobyte",
username: DESKTOP_USERNAME,
hasDownloadedResticPassword: false,
dateFormat,
timeFormat,
emailVerified: false,
});
user = await db.query.usersTable.findFirst({ where: { email: DESKTOP_USER_EMAIL } });
if (!user) {
throw new Error("Failed to bootstrap desktop user");
}
await authContext.internalAdapter.linkAccount({
userId: user.id,
providerId: "credential",
accountId: user.id,
password: passwordHash,
});
} else if (!(await verifyUserPassword({ userId: user.id, password }))) {
throw new UnauthorizedError("Reserved desktop user is not trusted");
}
if (!user) {
throw new Error("Failed to bootstrap desktop user");
}
await ensureDefaultOrg(user.id);
await db
.update(usersTable)
.set({ role: "admin", emailVerified: true, updatedAt: new Date() })
.where(eq(usersTable.id, user.id));
const desktopUser = await db.query.usersTable.findFirst({ where: { id: user.id } });
if (!desktopUser) {
throw new Error("Failed to load desktop user");
}
return desktopUser;
};