♻️ Refactor instance settings to use cache (#1785)

This commit is contained in:
Luke Vella 2025-06-23 10:29:18 +01:00 committed by GitHub
parent 6bacbd5833
commit 7ab25c68de
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 68 additions and 35 deletions

View file

@ -1,20 +0,0 @@
"use server";
import { requireAdmin } from "@/auth/queries";
import type { InstanceSettings } from "@/features/instance-settings/schema";
import { prisma } from "@rallly/database";
export async function updateInstanceSettings({
disableUserRegistration,
}: InstanceSettings) {
await requireAdmin();
await prisma.instanceSettings.update({
where: {
id: 1,
},
data: {
disableUserRegistration,
},
});
}

View file

@ -8,6 +8,7 @@ import {
SettingsGroupTitle, SettingsGroupTitle,
} from "@/components/settings-group"; } from "@/components/settings-group";
import { Trans } from "@/components/trans"; import { Trans } from "@/components/trans";
import { updateInstanceSettings } from "@/features/instance-settings/mutations";
import { import {
type InstanceSettings, type InstanceSettings,
instanceSettingsSchema, instanceSettingsSchema,
@ -31,7 +32,6 @@ import {
import { useToast } from "@rallly/ui/hooks/use-toast"; import { useToast } from "@rallly/ui/hooks/use-toast";
import { Switch } from "@rallly/ui/switch"; import { Switch } from "@rallly/ui/switch";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { updateInstanceSettings } from "./actions";
export function InstanceSettingsForm({ export function InstanceSettingsForm({
defaultValue, defaultValue,

View file

@ -0,0 +1,25 @@
"use client";
import React from "react";
import type { InstanceSettings } from "./schema";
const InstanceSettingsContext = React.createContext<InstanceSettings>({
disableUserRegistration: false,
});
export function InstanceSettingsProvider({
value,
children,
}: {
value: InstanceSettings;
children: React.ReactNode;
}) {
return (
<InstanceSettingsContext.Provider value={value}>
{children}
</InstanceSettingsContext.Provider>
);
}
export const useInstanceSettings = () =>
React.useContext(InstanceSettingsContext);

View file

@ -0,0 +1 @@
export const instanceSettingsTag = "instance-settings";

View file

@ -0,0 +1,19 @@
"use server";
import { requireAdmin } from "@/auth/queries";
import { type InstanceSettings, prisma } from "@rallly/database";
import { revalidateTag } from "next/cache";
import { instanceSettingsTag } from "./constants";
export async function updateInstanceSettings(data: Partial<InstanceSettings>) {
await requireAdmin();
await prisma.instanceSettings.update({
where: {
id: 1,
},
data,
});
revalidateTag(instanceSettingsTag);
}

View file

@ -1,18 +1,26 @@
"server-only"; "server-only";
import { prisma } from "@rallly/database"; import { prisma } from "@rallly/database";
import { cache } from "react"; import { unstable_cache } from "next/cache";
import { instanceSettingsTag } from "./constants";
export const getInstanceSettings = cache(async () => { export const getInstanceSettings = unstable_cache(
const instanceSettings = await prisma.instanceSettings.findUnique({ async () => {
where: { const instanceSettings = await prisma.instanceSettings.findUnique({
id: 1, where: {
}, id: 1,
select: { },
disableUserRegistration: true, select: {
}, disableUserRegistration: true,
}); },
});
return { return {
disableUserRegistration: instanceSettings?.disableUserRegistration ?? false, disableUserRegistration:
}; instanceSettings?.disableUserRegistration ?? false,
}); };
},
[],
{
tags: [instanceSettingsTag],
},
);