feat(db): mesh data model — meshes, members, invites, audit log
- pgSchema "mesh" with 4 tables isolating the peer mesh domain - Enums: visibility, transport, tier, role - audit_log is metadata-only (E2E encryption enforced at broker/client) - Cascade on mesh delete, soft-delete via archivedAt/revokedAt Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
24
apps/web/src/app/[locale]/auth/password/forgot/page.tsx
Normal file
24
apps/web/src/app/[locale]/auth/password/forgot/page.tsx
Normal file
@@ -0,0 +1,24 @@
|
||||
import { getTranslation } from "@turbostarter/i18n/server";
|
||||
|
||||
import { getMetadata } from "~/lib/metadata";
|
||||
import { ForgotPasswordForm } from "~/modules/auth/form/password/forgot";
|
||||
import { AuthHeader } from "~/modules/auth/layout/header";
|
||||
|
||||
export const generateMetadata = getMetadata({
|
||||
title: "auth:account.password.forgot.title",
|
||||
});
|
||||
|
||||
const ForgotPassword = async () => {
|
||||
const { t } = await getTranslation({ ns: "auth" });
|
||||
return (
|
||||
<>
|
||||
<AuthHeader
|
||||
title={t("account.password.forgot.header.title")}
|
||||
description={t("account.password.forgot.header.description")}
|
||||
/>
|
||||
<ForgotPasswordForm />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default ForgotPassword;
|
||||
32
apps/web/src/app/[locale]/auth/password/update/page.tsx
Normal file
32
apps/web/src/app/[locale]/auth/password/update/page.tsx
Normal file
@@ -0,0 +1,32 @@
|
||||
import { getTranslation } from "@turbostarter/i18n/server";
|
||||
|
||||
import { getMetadata } from "~/lib/metadata";
|
||||
import { UpdatePasswordForm } from "~/modules/auth/form/password/update";
|
||||
import { AuthHeader } from "~/modules/auth/layout/header";
|
||||
|
||||
export const generateMetadata = getMetadata({
|
||||
title: "auth:account.password.update.title",
|
||||
});
|
||||
|
||||
interface UpdatePasswordPageProps {
|
||||
readonly searchParams: Promise<{
|
||||
readonly token?: string;
|
||||
}>;
|
||||
}
|
||||
|
||||
const UpdatePassword = async ({ searchParams }: UpdatePasswordPageProps) => {
|
||||
const token = (await searchParams).token;
|
||||
const { t } = await getTranslation({ ns: "auth" });
|
||||
|
||||
return (
|
||||
<>
|
||||
<AuthHeader
|
||||
title={t("account.password.update.header.title")}
|
||||
description={t("account.password.update.header.description")}
|
||||
/>
|
||||
<UpdatePasswordForm token={token} />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default UpdatePassword;
|
||||
Reference in New Issue
Block a user