mirror of
https://github.com/documenso/documenso.git
synced 2025-11-17 10:11:35 +10:00
feat: register user instance
This commit is contained in:
@ -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>;
|
||||
|
||||
|
||||
20
packages/lib/server-only/site-settings/schemas/telemetry.ts
Normal file
20
packages/lib/server-only/site-settings/schemas/telemetry.ts
Normal 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>;
|
||||
@ -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 ({
|
||||
|
||||
42
packages/lib/server-only/telemetry/register-instance.ts
Normal file
42
packages/lib/server-only/telemetry/register-instance.ts
Normal 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',
|
||||
});
|
||||
};
|
||||
@ -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';
|
||||
|
||||
@ -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
|
||||
|
||||
1
packages/tsconfig/process-env.d.ts
vendored
1
packages/tsconfig/process-env.d.ts
vendored
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user