refactor(config): ♻️ Redo config structure from scratch, simplify validation code, improve checks, add support for loading sensitive data from paths

This commit is contained in:
Jesse Wierzbinski 2025-02-15 02:47:29 +01:00
parent d4afd84019
commit 54fd81f076
No known key found for this signature in database
118 changed files with 3892 additions and 5291 deletions

View file

@ -1,6 +1,6 @@
import { apiRoute } from "@/api";
import { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager";
import { config } from "~/config.ts";
const route = createRoute({
method: "get",

View file

@ -1,8 +1,8 @@
import { apiRoute } from "@/api";
import { createRoute, z } from "@hono/zod-openapi";
import { Note, User } from "@versia/kit/db";
import { config } from "~/config.ts";
import manifest from "~/package.json";
import { config } from "~/packages/config-manager";
const route = createRoute({
method: "get",
@ -65,7 +65,7 @@ export default apiRoute((app) =>
},
localPosts: noteCount,
},
openRegistrations: config.signups.registration,
openRegistrations: config.registration.allow,
metadata: {
nodeName: config.instance.name,
nodeDescription: config.instance.description,

View file

@ -1,6 +1,6 @@
import { apiRoute } from "@/api";
import { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager";
import { config } from "~/config.ts";
const route = createRoute({
method: "get",

View file

@ -1,6 +1,6 @@
import { apiRoute } from "@/api";
import { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager";
import { config } from "~/config.ts";
const route = createRoute({
method: "get",

View file

@ -5,8 +5,8 @@ import { InstanceMetadata as InstanceMetadataSchema } from "@versia/federation/s
import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
import { asc } from "drizzle-orm";
import { config } from "~/config.ts";
import pkg from "~/package.json";
import { config } from "~/packages/config-manager";
const route = createRoute({
method: "get",
@ -29,6 +29,10 @@ export default apiRoute((app) =>
// Get date of first user creation
const firstUser = await User.fromSql(undefined, asc(Users.createdAt));
const publicKey = Buffer.from(
await crypto.subtle.exportKey("spki", config.instance.keys.public),
).toString("base64");
return context.json(
{
type: "InstanceMetadata" as const,
@ -43,18 +47,18 @@ export default apiRoute((app) =>
name: config.instance.name,
description: config.instance.description,
public_key: {
key: config.instance.keys.public,
key: publicKey,
algorithm: "ed25519" as const,
},
software: {
name: "Versia Server",
version: pkg.version,
},
banner: config.instance.banner
? urlToContentFormat(config.instance.banner)
banner: config.instance.branding.banner
? urlToContentFormat(config.instance.branding.banner)
: undefined,
logo: config.instance.logo
? urlToContentFormat(config.instance.logo)
logo: config.instance.branding.logo
? urlToContentFormat(config.instance.branding.logo)
: undefined,
shared_inbox: new URL(
"/inbox",

View file

@ -12,7 +12,7 @@ import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
import { and, eq, isNull } from "drizzle-orm";
import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager";
import { config } from "~/config.ts";
import { ErrorSchema } from "~/types/api";
const schemas = {
@ -90,7 +90,7 @@ export default apiRoute((app) =>
let activityPubUrl = "";
if (config.federation.bridge.enabled) {
if (config.federation.bridge) {
const manager = await User.getFederationRequester();
try {
@ -98,7 +98,7 @@ export default apiRoute((app) =>
user.data.username,
config.http.base_url.host,
"application/activity+json",
config.federation.bridge.url?.toString(),
config.federation.bridge.url.origin,
);
} catch (e) {
const error = e as ResponseError;
@ -136,7 +136,7 @@ export default apiRoute((app) =>
type:
user.avatar?.getPreferredMimeType() ??
"image/svg+xml",
href: user.getAvatarUrl(config),
href: user.getAvatarUrl(),
},
].filter(Boolean) as {
rel: string;