52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
import { validateSdkRequest } from '@/server/auth';
|
|
import { db } from '@/server/db';
|
|
import { createError, handleError } from '@/server/exceptions';
|
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
import randomAnimalName from 'random-animal-name';
|
|
|
|
import type { CreateProfileResponse, ProfilePayload } from '@mixan/types';
|
|
|
|
interface Request extends NextApiRequest {
|
|
body: ProfilePayload;
|
|
}
|
|
|
|
export default async function handler(req: Request, res: NextApiResponse) {
|
|
if (req.method == 'OPTIONS') {
|
|
await validateSdkRequest(req, res);
|
|
return res.status(200).json({});
|
|
}
|
|
|
|
if (req.method !== 'POST') {
|
|
return handleError(res, createError(405, 'Method not allowed'));
|
|
}
|
|
|
|
try {
|
|
// Check client id & secret
|
|
const projectId = await validateSdkRequest(req, res);
|
|
|
|
// Providing an `ID` is deprecated, should be removed in the future
|
|
const profileId = 'id' in req.body ? req.body.id : undefined;
|
|
const { properties } = req.body ?? {};
|
|
|
|
const profile = await db.profile.create({
|
|
data: {
|
|
id: profileId,
|
|
external_id: null,
|
|
email: null,
|
|
first_name: randomAnimalName(),
|
|
last_name: null,
|
|
avatar: null,
|
|
properties: {
|
|
...(properties ?? {}),
|
|
},
|
|
project_id: projectId,
|
|
},
|
|
});
|
|
|
|
const response: CreateProfileResponse = { id: profile.id };
|
|
res.status(200).json(response);
|
|
} catch (error) {
|
|
handleError(res, error);
|
|
}
|
|
}
|