create: API for register

This commit is contained in:
abiyasa05 2024-08-08 14:28:24 +07:00
parent 7b33d3d940
commit d2ecdfab11
4 changed files with 97 additions and 1 deletions

View File

@ -32,6 +32,9 @@ const permissionsData = [
{
code: "roles.delete",
},
{
code: "register.create",
},
] as const;
export type SpecificPermissionCode = (typeof permissionsData)[number]["code"];

View File

@ -17,10 +17,18 @@ const roleData: RoleData[] = [
name: "Super Admin",
permissions: permissionsData.map((permission) => permission.code),
},
{
code: "user",
description:
"Has full access to the system and can manage all features and settings",
isActive: true,
name: "User",
permissions: ["register.create"],
},
];
// Manually specify the union of role codes
export type RoleCode = "super-admin" | "*";
export type RoleCode = "super-admin" | "user" | "*";
const exportedRoleData = roleData;

View File

@ -3,6 +3,7 @@ import { configDotenv } from "dotenv";
import { Hono } from "hono";
import authRoutes from "./routes/auth/route";
import usersRoute from "./routes/users/route";
import respondentsRoute from "./routes/register/route";
import { verifyAccessToken } from "./utils/authUtils";
import permissionRoutes from "./routes/permissions/route";
import { cors } from "hono/cors";
@ -78,6 +79,7 @@ const routes = app
.route("/dashboard", dashboardRoutes)
.route("/roles", rolesRoute)
.route("/dev", devRoutes)
.route("/register", respondentsRoute)
.onError((err, c) => {
if (err instanceof DashboardError) {
return c.json(

View File

@ -0,0 +1,83 @@
import { Hono } from "hono";
import { HTTPException } from "hono/http-exception";
import db from "../../drizzle";
import { respondents } from "../../drizzle/schema/respondents";
import { users } from "../../drizzle/schema/users";
import { hashPassword } from "../../utils/passwordUtils";
import requestValidator from "../../utils/requestValidator";
import authInfo from "../../middlewares/authInfo";
import checkPermission from "../../middlewares/checkPermission";
import { and, eq, isNull, ilike, or, sql } from "drizzle-orm";
import { z } from "zod";
import HonoEnv from "../../types/HonoEnv";
const registerFormSchema = z.object({
name: z.string().min(1).max(255),
username: z.string().min(1).max(255),
email: z.string().email().optional(),
password: z.string().min(6),
companyName: z.string().min(1).max(255),
position: z.string().min(1).max(255),
workExperience: z.string().min(1).max(255),
address: z.string().min(1),
phoneNumber: z.string().min(1).max(13),
});
const respondentsRoute = new Hono<HonoEnv>()
.use(authInfo)
//create user and respondent
.post(
"/",
checkPermission("register.create"),
requestValidator("json", registerFormSchema),
async (c) => {
const formData = c.req.valid("json");
// Hash the password
const hashedPassword = await hashPassword(formData.password);
// Start a transaction
try {
const result = await db.transaction(async (trx) => {
// Create user
const [newUser] = await trx
.insert(users)
.values({
name: formData.name,
username: formData.username,
email: formData.email,
password: hashedPassword,
})
.returning();
// Create respondent
await trx
.insert(respondents)
.values({
companyName: formData.companyName,
position: formData.position,
workExperience: formData.workExperience,
address: formData.address,
phoneNumber: formData.phoneNumber,
userId: newUser.id,
});
return newUser;
});
return c.json(
{
message: "User and respondent created successfully",
},
201
);
} catch (error) {
console.error("Error creating user and respondent:", error);
throw new HTTPException(500, {
message: "Error creating user and respondent",
});
}
}
);
export default respondentsRoute;