feat: register user instance

This commit is contained in:
Ephraim Atta-Duncan
2024-06-03 19:38:52 +00:00
parent 0dfc41f423
commit bafaf3b95e
11 changed files with 87 additions and 21 deletions

View File

@ -1,12 +1,13 @@
import { getSiteSettings } from '@documenso/lib/server-only/site-settings/get-site-settings';
import { SITE_SETTINGS_BANNER_ID } from '@documenso/lib/server-only/site-settings/schemas/banner';
import {
SITE_SETTINGS_BANNER_ID,
ZSiteSettingsBannerSchema,
} from '@documenso/lib/server-only/site-settings/schemas/banner';
import { SettingsHeader } from '~/components/(dashboard)/settings/layout/header';
import { BannerForm } from './banner-form';
// import { BannerForm } from './banner-form';
export default async function AdminBannerPage() {
const banner = await getSiteSettings().then((settings) =>
settings.find((setting) => setting.id === SITE_SETTINGS_BANNER_ID),
@ -17,7 +18,7 @@ export default async function AdminBannerPage() {
<SettingsHeader title="Site Settings" subtitle="Manage your site settings here" />
<div className="mt-8">
<BannerForm banner={banner} />
<BannerForm banner={ZSiteSettingsBannerSchema.parse(banner)} />
</div>
</div>
);

View File

@ -1,6 +1,6 @@
import { useEffect, useState } from 'react';
import { WebhookTriggerEvents } from '@prisma/client/';
import { WebhookTriggerEvents } from '@prisma/client';
import { Check, ChevronsUpDown } from 'lucide-react';
import { toFriendlyWebhookEventName } from '@documenso/lib/universal/webhook/to-friendly-webhook-event-name';

View File

@ -1,9 +1,7 @@
import { sendInstanceInfo } from '@documenso/lib/server-only/telemetry/send-instance-info';
import { registerInstance } from '@documenso/lib/server-only/telemetry/register-instance';
export async function register() {
await sendInstanceInfo({
uniqueId: '1',
timestamp: new Date(),
version: '1.2.3',
});
}
export const register = async () => {
if (process.env.NEXT_RUNTIME === 'nodejs') {
await registerInstance();
}
};

View File

@ -1,9 +1,12 @@
import { z } from 'zod';
import { ZSiteSettingsBannerSchema } from './schemas/banner';
import { ZSiteSettingsTelemetrySchema } from './schemas/telemetry';
// TODO: Use `z.union([...])` once we have more than one setting
export const ZSiteSettingSchema = ZSiteSettingsBannerSchema;
export const ZSiteSettingSchema = z.union([
ZSiteSettingsBannerSchema,
ZSiteSettingsTelemetrySchema,
]);
export type TSiteSettingSchema = z.infer<typeof ZSiteSettingSchema>;

View File

@ -0,0 +1,20 @@
import { nanoid } from 'nanoid';
import { z } from 'zod';
import { ZSiteSettingsBaseSchema } from './_base';
export const SITE_SETTINGS_TELEMETRY_ID = 'site.instance-id';
export const ZSiteSettingsTelemetrySchema = ZSiteSettingsBaseSchema.extend({
id: z.literal(SITE_SETTINGS_TELEMETRY_ID),
data: z
.object({
instanceId: z.string(),
})
.optional()
.default({
instanceId: nanoid(),
}),
});
export type TSiteSettingsTelemetrySchema = z.infer<typeof ZSiteSettingsTelemetrySchema>;

View File

@ -3,7 +3,7 @@ import { prisma } from '@documenso/prisma';
import type { TSiteSettingSchema } from './schema';
export type UpsertSiteSettingOptions = TSiteSettingSchema & {
userId: number;
userId: number | null;
};
export const upsertSiteSetting = async ({

View File

@ -0,0 +1,42 @@
import { nanoid } from 'nanoid';
import { getSiteSettings } from '../site-settings/get-site-settings';
import {
SITE_SETTINGS_TELEMETRY_ID,
ZSiteSettingsTelemetrySchema,
} from '../site-settings/schemas/telemetry';
import { upsertSiteSetting } from '../site-settings/upsert-site-setting';
import { sendInstance } from './send-instance';
export const registerInstance = async () => {
const instanceResponse = await getSiteSettings().then((settings) =>
settings.find((setting) => setting.id === SITE_SETTINGS_TELEMETRY_ID),
);
const instance = ZSiteSettingsTelemetrySchema.parse(instanceResponse);
if (!instance) {
const upsert = await upsertSiteSetting({
data: {
instanceId: nanoid(),
},
enabled: true,
id: SITE_SETTINGS_TELEMETRY_ID,
userId: null,
});
const instance = ZSiteSettingsTelemetrySchema.parse(upsert);
return await sendInstance({
uniqueId: instance.data?.instanceId,
timestamp: new Date(),
version: '1.2.3',
});
}
return await sendInstance({
uniqueId: instance.data.instanceId,
timestamp: new Date(),
version: '1.2.3',
});
};

View File

@ -1,10 +1,10 @@
export type SendInstanceInfo = {
export type SendInstance = {
uniqueId: string;
timestamp: Date;
version: string;
};
export const sendInstanceInfo = async ({ uniqueId, timestamp, version }: SendInstanceInfo) => {
export const sendInstance = async ({ uniqueId, timestamp, version }: SendInstance) => {
const isProduction = process.env.NODE_ENV === 'production';
const isTelemetryDisabled = process.env.DISABLE_TELEMETRY === 'true';

View File

@ -1,7 +1,7 @@
import { Role } from '@prisma/client';
import z from 'zod';
import { ZSiteSettingSchema } from '@documenso/lib/server-only/site-settings/schema';
import { ZSiteSettingsBannerSchema } from '@documenso/lib/server-only/site-settings/schemas/banner';
export const ZAdminFindDocumentsQuerySchema = z.object({
term: z.string().optional(),
@ -30,7 +30,7 @@ export type TAdminUpdateRecipientMutationSchema = z.infer<
typeof ZAdminUpdateRecipientMutationSchema
>;
export const ZAdminUpdateSiteSettingMutationSchema = ZSiteSettingSchema;
export const ZAdminUpdateSiteSettingMutationSchema = ZSiteSettingsBannerSchema;
export type TAdminUpdateSiteSettingMutationSchema = z.infer<
typeof ZAdminUpdateSiteSettingMutationSchema

View File

@ -70,6 +70,7 @@ declare namespace NodeJS {
VERCEL?: string;
VERCEL_ENV?: 'production' | 'development' | 'preview';
VERCEL_URL?: string;
NEXT_RUNTIME?: 'nodejs' | 'edge';
DEPLOYMENT_TARGET?: 'webapp' | 'marketing';
FONT_CAVEAT_URI: string;

View File

@ -111,6 +111,7 @@
"E2E_TEST_AUTHENTICATE_USERNAME",
"E2E_TEST_AUTHENTICATE_USER_EMAIL",
"E2E_TEST_AUTHENTICATE_USER_PASSWORD",
"DISABLE_TELEMETRY"
"DISABLE_TELEMETRY",
"NEXT_RUNTIME"
]
}