♻️ 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,
} from "@/components/settings-group";
import { Trans } from "@/components/trans";
import { updateInstanceSettings } from "@/features/instance-settings/mutations";
import {
type InstanceSettings,
instanceSettingsSchema,
@ -31,7 +32,6 @@ import {
import { useToast } from "@rallly/ui/hooks/use-toast";
import { Switch } from "@rallly/ui/switch";
import { useForm } from "react-hook-form";
import { updateInstanceSettings } from "./actions";
export function InstanceSettingsForm({
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";
import { prisma } from "@rallly/database";
import { cache } from "react";
import { unstable_cache } from "next/cache";
import { instanceSettingsTag } from "./constants";
export const getInstanceSettings = cache(async () => {
const instanceSettings = await prisma.instanceSettings.findUnique({
where: {
id: 1,
},
select: {
disableUserRegistration: true,
},
});
export const getInstanceSettings = unstable_cache(
async () => {
const instanceSettings = await prisma.instanceSettings.findUnique({
where: {
id: 1,
},
select: {
disableUserRegistration: true,
},
});
return {
disableUserRegistration: instanceSettings?.disableUserRegistration ?? false,
};
});
return {
disableUserRegistration:
instanceSettings?.disableUserRegistration ?? false,
};
},
[],
{
tags: [instanceSettingsTag],
},
);