73 lines
1.7 KiB
TypeScript
73 lines
1.7 KiB
TypeScript
import { randomUUID } from 'crypto';
|
|
import { z } from 'zod';
|
|
|
|
import { hashPassword, stripTrailingSlash } from '@openpanel/common';
|
|
import type { Prisma } from '@openpanel/db';
|
|
import { db } from '@openpanel/db';
|
|
|
|
import { createTRPCRouter, protectedProcedure } from '../trpc';
|
|
|
|
export const clientRouter = createTRPCRouter({
|
|
update: protectedProcedure
|
|
.input(
|
|
z.object({
|
|
id: z.string(),
|
|
name: z.string(),
|
|
cors: z.string().nullable(),
|
|
})
|
|
)
|
|
.mutation(({ input }) => {
|
|
return db.client.update({
|
|
where: {
|
|
id: input.id,
|
|
},
|
|
data: {
|
|
name: input.name,
|
|
cors: input.cors ?? null,
|
|
},
|
|
});
|
|
}),
|
|
create: protectedProcedure
|
|
.input(
|
|
z.object({
|
|
name: z.string(),
|
|
projectId: z.string(),
|
|
organizationSlug: z.string(),
|
|
cors: z.string().nullable(),
|
|
type: z.enum(['read', 'write', 'root']).optional(),
|
|
})
|
|
)
|
|
.mutation(async ({ input }) => {
|
|
const secret = randomUUID();
|
|
const data: Prisma.ClientCreateArgs['data'] = {
|
|
organizationSlug: input.organizationSlug,
|
|
projectId: input.projectId,
|
|
name: input.name,
|
|
type: input.type ?? 'write',
|
|
cors: input.cors ? stripTrailingSlash(input.cors) : null,
|
|
secret: await hashPassword(secret),
|
|
};
|
|
|
|
const client = await db.client.create({ data });
|
|
|
|
return {
|
|
...client,
|
|
secret,
|
|
};
|
|
}),
|
|
remove: protectedProcedure
|
|
.input(
|
|
z.object({
|
|
id: z.string(),
|
|
})
|
|
)
|
|
.mutation(async ({ input }) => {
|
|
await db.client.delete({
|
|
where: {
|
|
id: input.id,
|
|
},
|
|
});
|
|
return true;
|
|
}),
|
|
});
|