mirror of
https://github.com/fosrl/pangolin.git
synced 2025-05-13 05:40:38 +01:00
Add bruno
This commit is contained in:
parent
81017139c5
commit
797f72e1d0
10 changed files with 139 additions and 5 deletions
11
bruno/Auth/login.bru
Normal file
11
bruno/Auth/login.bru
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
meta {
|
||||||
|
name: login
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url:
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
11
bruno/Orgs/listOrgs.bru
Normal file
11
bruno/Orgs/listOrgs.bru
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
meta {
|
||||||
|
name: listOrgs
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url:
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
11
bruno/Resources/listResourcesByOrg.bru
Normal file
11
bruno/Resources/listResourcesByOrg.bru
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
meta {
|
||||||
|
name: listResourcesByOrg
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url:
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
16
bruno/Resources/listResourcesBySite.bru
Normal file
16
bruno/Resources/listResourcesBySite.bru
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
meta {
|
||||||
|
name: listResourcesBySite
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: http://localhost:3000/api/v1/site/1/resources?limit=10&offset=0
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
params:query {
|
||||||
|
limit: 10
|
||||||
|
offset: 0
|
||||||
|
}
|
11
bruno/Sites/listSites.bru
Normal file
11
bruno/Sites/listSites.bru
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
meta {
|
||||||
|
name: listSites
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url:
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
16
bruno/Targets/listTargets.bru
Normal file
16
bruno/Targets/listTargets.bru
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
meta {
|
||||||
|
name: listTargets
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: http://localhost:3000/api/v1/resource/web.main.localhost/targets?limit=10&offset=0
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
params:query {
|
||||||
|
limit: 10
|
||||||
|
offset: 0
|
||||||
|
}
|
9
bruno/bruno.json
Normal file
9
bruno/bruno.json
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"version": "1",
|
||||||
|
"name": "Pangolin",
|
||||||
|
"type": "collection",
|
||||||
|
"ignore": [
|
||||||
|
"node_modules",
|
||||||
|
".git"
|
||||||
|
]
|
||||||
|
}
|
40
server/auth/limits.ts
Normal file
40
server/auth/limits.ts
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
import { db } from '@server/db';
|
||||||
|
import { limitsTable } from '@server/db/schema';
|
||||||
|
import { and, eq } from 'drizzle-orm';
|
||||||
|
import createHttpError from 'http-errors';
|
||||||
|
import HttpCode from '@server/types/HttpCode';
|
||||||
|
|
||||||
|
interface CheckLimitOptions {
|
||||||
|
orgId: number;
|
||||||
|
limitName: string;
|
||||||
|
currentValue: number;
|
||||||
|
increment?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function checkOrgLimit({ orgId, limitName, currentValue, increment = 0 }: CheckLimitOptions): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
const limit = await db.select()
|
||||||
|
.from(limitsTable)
|
||||||
|
.where(
|
||||||
|
and(
|
||||||
|
eq(limitsTable.orgId, orgId),
|
||||||
|
eq(limitsTable.name, limitName)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.limit(1);
|
||||||
|
|
||||||
|
if (limit.length === 0) {
|
||||||
|
throw createHttpError(HttpCode.NOT_FOUND, `Limit "${limitName}" not found for organization`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const limitValue = limit[0].value;
|
||||||
|
|
||||||
|
// Check if the current value plus the increment is within the limit
|
||||||
|
return (currentValue + increment) <= limitValue;
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof Error) {
|
||||||
|
throw createHttpError(HttpCode.INTERNAL_SERVER_ERROR, `Error checking limit: ${error.message}`);
|
||||||
|
}
|
||||||
|
throw createHttpError(HttpCode.INTERNAL_SERVER_ERROR, 'Unknown error occurred while checking limit');
|
||||||
|
}
|
||||||
|
}
|
|
@ -202,6 +202,14 @@ export const userResources = sqliteTable("userResources", {
|
||||||
.references(() => resources.resourceId, { onDelete: "cascade" }),
|
.references(() => resources.resourceId, { onDelete: "cascade" }),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const limitsTable = sqliteTable("limits", {
|
||||||
|
limitId: integer("limitId").primaryKey({ autoIncrement: true }),
|
||||||
|
orgId: integer("orgId").references(() => orgs.orgId, { onDelete: "cascade" }),
|
||||||
|
name: text("name").notNull(),
|
||||||
|
value: integer("value").notNull(),
|
||||||
|
description: text("description"),
|
||||||
|
});
|
||||||
|
|
||||||
// Define the model types for type inference
|
// Define the model types for type inference
|
||||||
export type Org = InferSelectModel<typeof orgs>;
|
export type Org = InferSelectModel<typeof orgs>;
|
||||||
export type User = InferSelectModel<typeof users>;
|
export type User = InferSelectModel<typeof users>;
|
||||||
|
@ -224,3 +232,4 @@ export type RoleSite = InferSelectModel<typeof roleSites>;
|
||||||
export type UserSite = InferSelectModel<typeof userSites>;
|
export type UserSite = InferSelectModel<typeof userSites>;
|
||||||
export type RoleResource = InferSelectModel<typeof roleResources>;
|
export type RoleResource = InferSelectModel<typeof roleResources>;
|
||||||
export type UserResource = InferSelectModel<typeof userResources>;
|
export type UserResource = InferSelectModel<typeof userResources>;
|
||||||
|
export type Limit = InferSelectModel<typeof limitsTable>;
|
|
@ -73,8 +73,7 @@ export async function listTargets(req: Request, res: Response, next: NextFunctio
|
||||||
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: {
|
||||||
targets: targetsList,
|
targets: targetsList,
|
||||||
pagination: {
|
pagination: {
|
||||||
|
@ -88,8 +87,9 @@ export async function listTargets(req: Request, res: Response, next: NextFunctio
|
||||||
message: "Targets retrieved successfully",
|
message: "Targets retrieved successfully",
|
||||||
status: HttpCode.OK,
|
status: HttpCode.OK,
|
||||||
})
|
})
|
||||||
);
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
next(error);
|
console.log(error);
|
||||||
|
|
||||||
|
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "sadfdf"));
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue