Add user POST + validation

This commit is contained in:
Kevin Puig
2025-09-27 13:04:35 -04:00
parent c39ab15694
commit 3d79c9cf4f
6 changed files with 81 additions and 2 deletions

View File

@@ -1,4 +1,5 @@
import { getAllUsersFrom, getUserInformation } from "../services/userService";
import { getAllUsersFrom, getUserInformation, createUser } from "../services/userService";
import { CreateUserInput } from "../validators/userValidator";
export async function fetchUserData(id: string) {
return await getUserInformation(id);
@@ -7,3 +8,7 @@ export async function fetchUserData(id: string) {
export async function fetchAllUsers(instanceId: string) {
return await getAllUsersFrom(instanceId);
}
export async function createNewUser(data: CreateUserInput) {
return await createUser(data);
}

View File

@@ -1,5 +1,7 @@
import { Hono } from "hono";
import { fetchAllUsers, fetchUserData } from "../controller/userController";
import { fetchAllUsers, fetchUserData, createNewUser } from "../controller/userController";
import { createUserSchema } from "../validators/userValidator";
import { zValidator } from "@hono/zod-validator";
const actions = new Hono();
actions.get("user/:id", async (c) => {
@@ -26,4 +28,18 @@ actions.get("user", async (c) => {
}
});
actions.post(
"user",
zValidator('json', createUserSchema),
async (c) => {
try {
const data = await c.req.json();
const newUser = await createNewUser(data);
return c.json(newUser, 201);
} catch (error) {
return c.json({ error: "Error creating user" }, 500);
}
}
);
export default actions;

View File

@@ -5,9 +5,24 @@ import {
Role,
UserAuth,
} from "@prisma/client";
import { CreateUserInput } from '../validators/userValidator';
const prisma = new PrismaClient();
export async function createUser(data: CreateUserInput) {
return await prisma.user.create({
data: {
username: data.username,
nickname: data.nickname,
bio: data.bio,
picture: data.picture,
banner: data.banner,
status: data.status,
admin: data.admin,
},
});
}
export async function getUserInformation(userId: string): Promise<{
id: string;
userName: string;

View File

@@ -0,0 +1,13 @@
import { z } from 'zod'
export const createUserSchema = z.object({
username: z.string().min(3).max(30),
nickname: z.string().min(1).max(30).optional(),
bio: z.string().max(500).optional(),
picture: z.url().optional(),
banner: z.url().optional(),
status: z.enum(['online', 'offline', 'dnd', 'idle', 'invis']).default('online'),
admin: z.boolean().default(false),
})
export type CreateUserInput = z.infer<typeof createUserSchema>