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:
Alejandro Gutiérrez
2026-04-04 21:19:32 +01:00
commit d3163a5bff
1384 changed files with 314925 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
"use server";
import { cookies } from "next/headers";
import { config } from "@turbostarter/i18n";
import type { Locale } from "@turbostarter/i18n";
export const setLocaleCookie = async (locale: Locale) => {
const cookieStore = await cookies();
cookieStore.set(config.cookie, locale);
};

View File

@@ -0,0 +1,35 @@
"use client";
import { usePathname, useRouter } from "next/navigation";
import { useCallback } from "react";
import { getPathname } from "@turbostarter/i18n";
import { LocaleCustomizer } from "@turbostarter/ui-web/i18n";
import { appConfig } from "~/config/app";
import { setLocaleCookie } from "./actions";
import type { Locale } from "@turbostarter/i18n";
export const I18nControls = () => {
const router = useRouter();
const path = usePathname();
const onChange = useCallback(
async (locale: Locale) => {
await setLocaleCookie(locale);
router.push(
getPathname({
locale,
path,
defaultLocale: appConfig.locale,
}),
);
router.refresh();
},
[path, router],
);
return <LocaleCustomizer onChange={onChange} />;
};