Format files and fix http response

This commit is contained in:
Owen Schwartz 2024-10-06 18:05:20 -04:00
parent 797f72e1d0
commit 8213036729
No known key found for this signature in database
GPG key ID: 8271FDFFD9E0CCBD
49 changed files with 2428 additions and 2404 deletions

View file

@ -1,3 +1,6 @@
{ {
"extends": ["next/core-web-vitals", "next/typescript"] "extends": [
"next/core-web-vitals",
"next/typescript"
]
} }

View file

@ -5,39 +5,33 @@ import { and, eq } from 'drizzle-orm';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
export const ActionsEnum = { export enum ActionsEnum {
createOrg = "createOrg",
createOrg: 1, deleteOrg = "deleteOrg",
deleteOrg: 2, getOrg = "getOrg",
getOrg: 3, listOrgs = "listOrgs",
listOrgs: 4, updateOrg = "updateOrg",
updateOrg: 5, createSite = "createSite",
deleteSite = "deleteSite",
createSite: 6, getSite = "getSite",
deleteSite: 7, listSites = "listSites",
getSite: 8, updateSite = "updateSite",
listSites: 9, createResource = "createResource",
updateSite: 10, deleteResource = "deleteResource",
getResource = "getResource",
createResource: 11, listResources = "listResources",
deleteResource: 12, updateResource = "updateResource",
getResource: 13, createTarget = "createTarget",
listResources: 14, deleteTarget = "deleteTarget",
updateResource: 15, getTarget = "getTarget",
listTargets = "listTargets",
createTarget: 16, updateTarget = "updateTarget",
deleteTarget: 17, getUser = "getUser",
getTarget: 18, deleteUser = "deleteUser",
listTargets: 19, listUsers = "listUsers"
updateTarget: 20,
getUser: 21,
deleteUser: 22,
listUsers: 23
} }
export async function checkUserActionPermission(actionId: number, req: Request): Promise<boolean> { export async function checkUserActionPermission(actionId: string, req: Request): Promise<boolean> {
const userId = req.user?.id; const userId = req.user?.id;
if (!userId) { if (!userId) {

View file

@ -130,7 +130,7 @@ export const passwordResetTokens = sqliteTable("passwordResetTokens", {
}); });
export const actions = sqliteTable("actions", { export const actions = sqliteTable("actions", {
actionId: integer("actionId").primaryKey({ autoIncrement: true }), actionId: text("actionId").primaryKey(),
name: text("name").notNull(), name: text("name").notNull(),
description: text("description"), description: text("description"),
}); });
@ -146,7 +146,7 @@ export const roleActions = sqliteTable("roleActions", {
roleId: integer("roleId") roleId: integer("roleId")
.notNull() .notNull()
.references(() => roles.roleId, { onDelete: "cascade" }), .references(() => roles.roleId, { onDelete: "cascade" }),
actionId: integer("actionId") actionId: text("actionId")
.notNull() .notNull()
.references(() => actions.actionId, { onDelete: "cascade" }), .references(() => actions.actionId, { onDelete: "cascade" }),
orgId: integer("orgId") orgId: integer("orgId")
@ -158,7 +158,7 @@ export const userActions = sqliteTable("userActions", {
userId: text("userId") userId: text("userId")
.notNull() .notNull()
.references(() => users.id, { onDelete: "cascade" }), .references(() => users.id, { onDelete: "cascade" }),
actionId: integer("actionId") actionId: text("actionId")
.notNull() .notNull()
.references(() => actions.actionId, { onDelete: "cascade" }), .references(() => actions.actionId, { onDelete: "cascade" }),
orgId: integer("orgId") orgId: integer("orgId")

View file

@ -15,12 +15,12 @@ export async function getUserOrgs(req: Request, res: Response, next: NextFunctio
try { try {
const userOrganizations = await db.select({ const userOrganizations = await db.select({
orgId: userOrgs.orgId, orgId: userOrgs.orgId,
role: userOrgs.role, roleId: userOrgs.roleId,
}) })
.from(userOrgs) .from(userOrgs)
.where(eq(userOrgs.userId, userId)); .where(eq(userOrgs.userId, userId));
req.userOrgs = userOrganizations.map(org => org.orgId); req.userOrgIds = userOrganizations.map(org => org.orgId);
// req.userOrgRoleIds = userOrganizations.reduce((acc, org) => { // req.userOrgRoleIds = userOrganizations.reduce((acc, org) => {
// acc[org.orgId] = org.role; // acc[org.orgId] = org.role;
// return acc; // return acc;

View file

@ -3,6 +3,8 @@ import { DrizzleError, eq } from 'drizzle-orm';
import { sites, resources, targets, exitNodes } from '@server/db/schema'; import { sites, resources, targets, exitNodes } from '@server/db/schema';
import db from '@server/db'; import db from '@server/db';
import logger from '@server/logger'; import logger from '@server/logger';
import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors';
export const getConfig = async (req: Request, res: Response, next: NextFunction): Promise<void> => { export const getConfig = async (req: Request, res: Response, next: NextFunction): Promise<void> => {
try { try {
@ -55,11 +57,7 @@ export const getConfig = async (req: Request, res: Response, next: NextFunction)
res.json(config); res.json(config);
} catch (error) { } catch (error) {
logger.error('Error querying database:', error); logger.error('Error querying database:', error);
if (error instanceof DrizzleError) { return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
res.status(500).json({ error: 'Database query error', message: error.message });
} else {
next(error);
}
} }
}; };

View file

@ -3,6 +3,9 @@ import { DrizzleError, eq } from 'drizzle-orm';
import { sites, resources, targets, exitNodes } from '@server/db/schema'; import { sites, resources, targets, exitNodes } from '@server/db/schema';
import db from '@server/db'; import db from '@server/db';
import logger from '@server/logger'; import logger from '@server/logger';
import createHttpError from 'http-errors';
import HttpCode from '@server/types/HttpCode';
import response from "@server/utils/response";
interface PeerBandwidth { interface PeerBandwidth {
publicKey: string; publicKey: string;
@ -10,7 +13,7 @@ interface PeerBandwidth {
bytesOut: number; bytesOut: number;
} }
export const receiveBandwidth = async (req: Request, res: Response, next: NextFunction): Promise<void> => { export const receiveBandwidth = async (req: Request, res: Response, next: NextFunction): Promise<any> => {
try { try {
const bandwidthData: PeerBandwidth[] = req.body; const bandwidthData: PeerBandwidth[] = req.body;
@ -43,10 +46,16 @@ export const receiveBandwidth = async (req: Request, res: Response, next: NextFu
} }
res.status(200).json({ message: 'Bandwidth data updated successfully' }); return response(res, {
data: {},
success: true,
error: false,
message: "Organization retrieved successfully",
status: HttpCode.OK,
});
} catch (error) { } catch (error) {
logger.error('Error updating bandwidth data:', error); logger.error('Error updating bandwidth data:', error);
res.status(500).json({ error: 'Internal server error' }); return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
}; };

View file

@ -6,6 +6,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const createOrgSchema = z.object({ const createOrgSchema = z.object({
name: z.string().min(1).max(255), name: z.string().min(1).max(255),
@ -49,16 +50,15 @@ export async function createOrg(req: Request, res: Response, next: NextFunction)
domain, domain,
}).returning(); }).returning();
return res.status(HttpCode.CREATED).send( return response(res, {
response(res, {
data: newOrg[0], data: newOrg[0],
success: true, success: true,
error: false, error: false,
message: "Organization created successfully", message: "Organization created successfully",
status: HttpCode.CREATED, status: HttpCode.CREATED,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const deleteOrgSchema = z.object({ const deleteOrgSchema = z.object({
orgId: z.string().transform(Number).pipe(z.number().int().positive()) orgId: z.string().transform(Number).pipe(z.number().int().positive())
@ -45,16 +46,15 @@ export async function deleteOrg(req: Request, res: Response, next: NextFunction)
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: null, data: null,
success: true, success: true,
error: false, error: false,
message: "Organization deleted successfully", message: "Organization deleted successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const getOrgSchema = z.object({ const getOrgSchema = z.object({
orgId: z.string().transform(Number).pipe(z.number().int().positive()) orgId: z.string().transform(Number).pipe(z.number().int().positive())
@ -46,16 +47,15 @@ export async function getOrg(req: Request, res: Response, next: NextFunction): P
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: org[0], data: org[0],
success: true, success: true,
error: false, error: false,
message: "Organization retrieved successfully", message: "Organization retrieved successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { sql, inArray } from 'drizzle-orm'; import { sql, inArray } from 'drizzle-orm';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const listOrgsSchema = z.object({ const listOrgsSchema = z.object({
limit: z.string().optional().transform(Number).pipe(z.number().int().positive().default(10)), limit: z.string().optional().transform(Number).pipe(z.number().int().positive().default(10)),
@ -72,8 +73,7 @@ export async function listOrgs(req: Request, res: Response, next: NextFunction):
// userRole: req.userOrgRoleIds[org.orgId], // userRole: req.userOrgRoleIds[org.orgId],
// })); // }));
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: { data: {
organizations, organizations,
pagination: { pagination: {
@ -86,9 +86,9 @@ export async function listOrgs(req: Request, res: Response, next: NextFunction):
error: false, error: false,
message: "Organizations retrieved successfully", message: "Organizations retrieved successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const updateOrgParamsSchema = z.object({ const updateOrgParamsSchema = z.object({
orgId: z.string().transform(Number).pipe(z.number().int().positive()) orgId: z.string().transform(Number).pipe(z.number().int().positive())
@ -65,16 +66,15 @@ export async function updateOrg(req: Request, res: Response, next: NextFunction)
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: updatedOrg[0], data: updatedOrg[0],
success: true, success: true,
error: false, error: false,
message: "Organization updated successfully", message: "Organization updated successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -6,6 +6,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const createResourceParamsSchema = z.object({ const createResourceParamsSchema = z.object({
siteId: z.number().int().positive(), siteId: z.number().int().positive(),
@ -64,16 +65,15 @@ export async function createResource(req: Request, res: Response, next: NextFunc
subdomain, subdomain,
}).returning(); }).returning();
return res.status(HttpCode.CREATED).send(
response(res, { response(res, {
data: newResource[0], data: newResource[0],
success: true, success: true,
error: false, error: false,
message: "Resource created successfully", message: "Resource created successfully",
status: HttpCode.CREATED, status: HttpCode.CREATED,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
// Define Zod schema for request parameters validation // Define Zod schema for request parameters validation
const deleteResourceSchema = z.object({ const deleteResourceSchema = z.object({
@ -48,16 +49,15 @@ export async function deleteResource(req: Request, res: Response, next: NextFunc
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: null, data: null,
success: true, success: true,
error: false, error: false,
message: "Resource deleted successfully", message: "Resource deleted successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
// Define Zod schema for request parameters validation // Define Zod schema for request parameters validation
const getResourceSchema = z.object({ const getResourceSchema = z.object({
@ -49,16 +50,15 @@ export async function getResource(req: Request, res: Response, next: NextFunctio
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: resource[0], data: resource[0],
success: true, success: true,
error: false, error: false,
message: "Resource retrieved successfully", message: "Resource retrieved successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { sql, eq, and, or, inArray } from 'drizzle-orm'; import { sql, eq, and, or, inArray } from 'drizzle-orm';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const listResourcesParamsSchema = z.object({ const listResourcesParamsSchema = z.object({
siteId: z.coerce.number().int().positive().optional(), siteId: z.coerce.number().int().positive().optional(),
@ -92,8 +93,7 @@ export async function listResources(req: RequestWithOrgAndRole, res: Response, n
const totalCountResult = await countQuery; const totalCountResult = await countQuery;
const totalCount = totalCountResult[0].count; const totalCount = totalCountResult[0].count;
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: { data: {
resources: resourcesList, resources: resourcesList,
pagination: { pagination: {
@ -106,9 +106,9 @@ export async function listResources(req: RequestWithOrgAndRole, res: Response, n
error: false, error: false,
message: "Resources retrieved successfully", message: "Resources retrieved successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
// Define Zod schema for request parameters validation // Define Zod schema for request parameters validation
const updateResourceParamsSchema = z.object({ const updateResourceParamsSchema = z.object({
@ -69,16 +70,15 @@ export async function updateResource(req: Request, res: Response, next: NextFunc
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: updatedResource[0], data: updatedResource[0],
success: true, success: true,
error: false, error: false,
message: "Resource updated successfully", message: "Resource updated successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import fetch from 'node-fetch'; import fetch from 'node-fetch';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const API_BASE_URL = "http://localhost:3000"; const API_BASE_URL = "http://localhost:3000";
@ -65,17 +66,16 @@ export async function createSite(req: Request, res: Response, next: NextFunction
subnet, subnet,
}).returning(); }).returning();
return res.status(HttpCode.CREATED).send( return response(res, {
response(res, {
data: newSite[0], data: newSite[0],
success: true, success: true,
error: false, error: false,
message: "Site created successfully", message: "Site created successfully",
status: HttpCode.CREATED, status: HttpCode.CREATED,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }
@ -95,10 +95,9 @@ async function addPeer(peer: string) {
} }
const data: any = await response.json(); const data: any = await response.json();
console.log('Peer added successfully:', data.status); logger.info('Peer added successfully:', data.status);
return data; return data;
} catch (error: any) { } catch (error: any) {
console.error('Error adding peer:', error.message);
throw error; throw error;
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const API_BASE_URL = "http://localhost:3000"; const API_BASE_URL = "http://localhost:3000";
@ -51,17 +52,16 @@ export async function deleteSite(req: Request, res: Response, next: NextFunction
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: null, data: null,
success: true, success: true,
error: false, error: false,
message: "Site deleted successfully", message: "Site deleted successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
// Define Zod schema for request parameters validation // Define Zod schema for request parameters validation
const getSiteSchema = z.object({ const getSiteSchema = z.object({
@ -49,16 +50,15 @@ export async function getSite(req: Request, res: Response, next: NextFunction):
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: site[0], data: site[0],
success: true, success: true,
error: false, error: false,
message: "Site retrieved successfully", message: "Site retrieved successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { sql, eq, and, or, inArray } from 'drizzle-orm'; import { sql, eq, and, or, inArray } from 'drizzle-orm';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const listSitesParamsSchema = z.object({ const listSitesParamsSchema = z.object({
orgId: z.string().optional().transform(Number).pipe(z.number().int().positive()), orgId: z.string().optional().transform(Number).pipe(z.number().int().positive()),
@ -85,8 +86,7 @@ export async function listSites(req: Request, res: Response, next: NextFunction)
const totalCountResult = await countQuery; const totalCountResult = await countQuery;
const totalCount = totalCountResult[0].count; const totalCount = totalCountResult[0].count;
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: { data: {
sites: sitesList, sites: sitesList,
pagination: { pagination: {
@ -99,9 +99,9 @@ export async function listSites(req: Request, res: Response, next: NextFunction)
error: false, error: false,
message: "Sites retrieved successfully", message: "Sites retrieved successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
// Define Zod schema for request parameters validation // Define Zod schema for request parameters validation
const updateSiteParamsSchema = z.object({ const updateSiteParamsSchema = z.object({
@ -74,16 +75,15 @@ export async function updateSite(req: Request, res: Response, next: NextFunction
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: updatedSite[0], data: updatedSite[0],
success: true, success: true,
error: false, error: false,
message: "Site updated successfully", message: "Site updated successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -6,6 +6,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const createTargetParamsSchema = z.object({ const createTargetParamsSchema = z.object({
resourceId: z.string().uuid(), resourceId: z.string().uuid(),
@ -56,16 +57,15 @@ export async function createTarget(req: Request, res: Response, next: NextFuncti
...targetData ...targetData
}).returning(); }).returning();
return res.status(HttpCode.CREATED).send( return response(res, {
response(res, {
data: newTarget[0], data: newTarget[0],
success: true, success: true,
error: false, error: false,
message: "Target created successfully", message: "Target created successfully",
status: HttpCode.CREATED, status: HttpCode.CREATED,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const deleteTargetSchema = z.object({ const deleteTargetSchema = z.object({
targetId: z.string().transform(Number).pipe(z.number().int().positive()) targetId: z.string().transform(Number).pipe(z.number().int().positive())
@ -45,16 +46,15 @@ export async function deleteTarget(req: Request, res: Response, next: NextFuncti
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: null, data: null,
success: true, success: true,
error: false, error: false,
message: "Target deleted successfully", message: "Target deleted successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const getTargetSchema = z.object({ const getTargetSchema = z.object({
targetId: z.string().transform(Number).pipe(z.number().int().positive()) targetId: z.string().transform(Number).pipe(z.number().int().positive())
@ -46,16 +47,15 @@ export async function getTarget(req: Request, res: Response, next: NextFunction)
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: target[0], data: target[0],
success: true, success: true,
error: false, error: false,
message: "Target retrieved successfully", message: "Target retrieved successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { sql, eq } from 'drizzle-orm'; import { sql, eq } from 'drizzle-orm';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const listTargetsParamsSchema = z.object({ const listTargetsParamsSchema = z.object({
resourceId: z.string().optional() resourceId: z.string().optional()
@ -86,10 +87,9 @@ export async function listTargets(req: Request, res: Response, next: NextFunctio
error: false, error: false,
message: "Targets retrieved successfully", message: "Targets retrieved successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
} catch (error) { } catch (error) {
console.log(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "sadfdf"));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const updateTargetParamsSchema = z.object({ const updateTargetParamsSchema = z.object({
targetId: z.string().transform(Number).pipe(z.number().int().positive()) targetId: z.string().transform(Number).pipe(z.number().int().positive())
@ -67,16 +68,15 @@ export async function updateTarget(req: Request, res: Response, next: NextFuncti
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: updatedTarget[0], data: updatedTarget[0],
success: true, success: true,
error: false, error: false,
message: "Target updated successfully", message: "Target updated successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const deleteUserSchema = z.object({ const deleteUserSchema = z.object({
userId: z.string().uuid() userId: z.string().uuid()
@ -45,16 +46,15 @@ export async function deleteUser(req: Request, res: Response, next: NextFunction
); );
} }
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: null, data: null,
success: true, success: true,
error: false, error: false,
message: "User deleted successfully", message: "User deleted successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import response from "@server/utils/response";
import HttpCode from '@server/types/HttpCode'; import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const getUserSchema = z.object({ const getUserSchema = z.object({
userId: z.string().uuid() userId: z.string().uuid()
@ -49,16 +50,15 @@ export async function getUser(req: Request, res: Response, next: NextFunction):
// Remove passwordHash from the response // Remove passwordHash from the response
const { passwordHash: _, ...userWithoutPassword } = user[0]; const { passwordHash: _, ...userWithoutPassword } = user[0];
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: userWithoutPassword, data: userWithoutPassword,
success: true, success: true,
error: false, error: false,
message: "User retrieved successfully", message: "User retrieved successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -7,6 +7,7 @@ import HttpCode from '@server/types/HttpCode';
import createHttpError from 'http-errors'; import createHttpError from 'http-errors';
import { sql } from 'drizzle-orm'; import { sql } from 'drizzle-orm';
import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger';
const listUsersSchema = z.object({ const listUsersSchema = z.object({
limit: z.string().optional().transform(Number).pipe(z.number().int().positive().default(10)), limit: z.string().optional().transform(Number).pipe(z.number().int().positive().default(10)),
@ -46,8 +47,7 @@ export async function listUsers(req: Request, res: Response, next: NextFunction)
// Remove passwordHash from each user object // Remove passwordHash from each user object
const usersWithoutPassword = usersList.map(({ passwordHash, ...userWithoutPassword }) => userWithoutPassword); const usersWithoutPassword = usersList.map(({ passwordHash, ...userWithoutPassword }) => userWithoutPassword);
return res.status(HttpCode.OK).send( return response(res, {
response(res, {
data: { data: {
users: usersWithoutPassword, users: usersWithoutPassword,
pagination: { pagination: {
@ -60,9 +60,9 @@ export async function listUsers(req: Request, res: Response, next: NextFunction)
error: false, error: false,
message: "Users retrieved successfully", message: "Users retrieved successfully",
status: HttpCode.OK, status: HttpCode.OK,
}) });
);
} catch (error) { } catch (error) {
next(error); logger.error(error);
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
} }
} }

View file

@ -1,6 +1,7 @@
@tailwind base; @tailwind base;
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
@layer base { @layer base {
:root { :root {
--background: 37 100% 100%; --background: 37 100% 100%;
@ -24,6 +25,7 @@
--ring: 37 8% 51%; --ring: 37 8% 51%;
--radius: 0rem; --radius: 0rem;
} }
.dark { .dark {
--background: 37 50% 10%; --background: 37 50% 10%;
--foreground: 37 5% 100%; --foreground: 37 5% 100%;
@ -47,10 +49,12 @@
--radius: 0rem; --radius: 0rem;
} }
} }
@layer base { @layer base {
* { * {
@apply border-border; @apply border-border;
} }
body { body {
@apply bg-background text-foreground; @apply bg-background text-foreground;
} }

View file

@ -1,6 +1,10 @@
{ {
"compilerOptions": { "compilerOptions": {
"lib": ["dom", "dom.iterable", "esnext"], "lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true, "allowJs": true,
"skipLibCheck": true, "skipLibCheck": true,
"strict": true, "strict": true,
@ -14,9 +18,15 @@
"incremental": true, "incremental": true,
"baseUrl": "src", "baseUrl": "src",
"paths": { "paths": {
"@server/*": ["../server/*"], "@server/*": [
"@app/*": ["*"], "../server/*"
"@/*": ["./*"] ],
"@app/*": [
"*"
],
"@/*": [
"./*"
]
}, },
"plugins": [ "plugins": [
{ {
@ -24,6 +34,13 @@
} }
] ]
}, },
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "include": [
"exclude": ["node_modules"] "next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
],
"exclude": [
"node_modules"
]
} }