85 lines
2.2 KiB
TypeScript
85 lines
2.2 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import bcrypt from "bcryptjs";
|
|
import { getDatabase } from "../../../../lib/database/index";
|
|
import log from "@/lib/logger";
|
|
import { userSchema } from "@/lib/validation/schemas";
|
|
import {
|
|
validateRequestBody,
|
|
validationErrorResponse,
|
|
} from "@/lib/validation/helpers";
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
// Validate request body
|
|
const validation = await validateRequestBody(request, userSchema);
|
|
|
|
if (!validation.success) {
|
|
log.warn("Registration validation failed", { errors: validation.errors });
|
|
return validationErrorResponse(validation.errors);
|
|
}
|
|
|
|
const { email, password, firstName, lastName, phone } = validation.data;
|
|
|
|
const db = await getDatabase();
|
|
const existingUser = await db.getUserByEmail(email);
|
|
|
|
if (existingUser) {
|
|
return NextResponse.json(
|
|
{ error: "User already exists" },
|
|
{ status: 409 },
|
|
);
|
|
}
|
|
|
|
const hashedPassword = await bcrypt.hash(password, 10);
|
|
|
|
const newUser = await db.createUser({
|
|
email,
|
|
firstName,
|
|
lastName,
|
|
password: hashedPassword,
|
|
phone,
|
|
role: "client",
|
|
});
|
|
|
|
const newClient = await db.createClient({
|
|
userId: newUser.id,
|
|
membershipType: "basic",
|
|
membershipStatus: "active",
|
|
joinDate: new Date(),
|
|
});
|
|
|
|
const { password: _, ...userWithoutPassword } = newUser;
|
|
|
|
return NextResponse.json(
|
|
{
|
|
message: "User registered successfully",
|
|
user: { ...userWithoutPassword, client: newClient },
|
|
},
|
|
{ status: 201 },
|
|
);
|
|
} catch (error) {
|
|
log.error("User registration failed", error);
|
|
return NextResponse.json(
|
|
{ error: "Internal server error" },
|
|
{ status: 500 },
|
|
);
|
|
}
|
|
}
|
|
|
|
export async function GET() {
|
|
try {
|
|
const db = await getDatabase();
|
|
const allUsers = await db.getAllUsers();
|
|
const usersWithoutPassword = allUsers.map(
|
|
({ password: _, ...user }) => user,
|
|
);
|
|
return NextResponse.json({ users: usersWithoutPassword });
|
|
} catch (error) {
|
|
log.error("Failed to get users", error);
|
|
return NextResponse.json(
|
|
{ error: "Internal server error" },
|
|
{ status: 500 },
|
|
);
|
|
}
|
|
}
|