create: API for register
This commit is contained in:
parent
7b33d3d940
commit
d2ecdfab11
|
|
@ -32,6 +32,9 @@ const permissionsData = [
|
||||||
{
|
{
|
||||||
code: "roles.delete",
|
code: "roles.delete",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
code: "register.create",
|
||||||
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export type SpecificPermissionCode = (typeof permissionsData)[number]["code"];
|
export type SpecificPermissionCode = (typeof permissionsData)[number]["code"];
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,18 @@ const roleData: RoleData[] = [
|
||||||
name: "Super Admin",
|
name: "Super Admin",
|
||||||
permissions: permissionsData.map((permission) => permission.code),
|
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
|
// Manually specify the union of role codes
|
||||||
export type RoleCode = "super-admin" | "*";
|
export type RoleCode = "super-admin" | "user" | "*";
|
||||||
|
|
||||||
const exportedRoleData = roleData;
|
const exportedRoleData = roleData;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import { configDotenv } from "dotenv";
|
||||||
import { Hono } from "hono";
|
import { Hono } from "hono";
|
||||||
import authRoutes from "./routes/auth/route";
|
import authRoutes from "./routes/auth/route";
|
||||||
import usersRoute from "./routes/users/route";
|
import usersRoute from "./routes/users/route";
|
||||||
|
import respondentsRoute from "./routes/register/route";
|
||||||
import { verifyAccessToken } from "./utils/authUtils";
|
import { verifyAccessToken } from "./utils/authUtils";
|
||||||
import permissionRoutes from "./routes/permissions/route";
|
import permissionRoutes from "./routes/permissions/route";
|
||||||
import { cors } from "hono/cors";
|
import { cors } from "hono/cors";
|
||||||
|
|
@ -78,6 +79,7 @@ const routes = app
|
||||||
.route("/dashboard", dashboardRoutes)
|
.route("/dashboard", dashboardRoutes)
|
||||||
.route("/roles", rolesRoute)
|
.route("/roles", rolesRoute)
|
||||||
.route("/dev", devRoutes)
|
.route("/dev", devRoutes)
|
||||||
|
.route("/register", respondentsRoute)
|
||||||
.onError((err, c) => {
|
.onError((err, c) => {
|
||||||
if (err instanceof DashboardError) {
|
if (err instanceof DashboardError) {
|
||||||
return c.json(
|
return c.json(
|
||||||
|
|
|
||||||
83
apps/backend/src/routes/register/route.ts
Normal file
83
apps/backend/src/routes/register/route.ts
Normal 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;
|
||||||
Loading…
Reference in New Issue
Block a user