Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

project exists middleware #254

Merged
merged 14 commits into from
Sep 6, 2023
1 change: 1 addition & 0 deletions integration.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ module.exports = {
verbose: true,
setupFilesAfterEnv: ["<rootDir>/src/tests/integration/helper/setup.ts"],
reporters: ["default"],
testTimeout: 20000,
}
2 changes: 1 addition & 1 deletion src/server/middleware/authentication-middleware.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ describe("AuthenticationMiddleware", () => {
})

describe("Query token", () => {
it("should return unathorized when invalid query token provided", async () => {
it("should return unauthorized when invalid query token provided", async () => {
await authenticationMiddleware({
headers: {},
query: { token: "123" },
Expand Down
35 changes: 35 additions & 0 deletions src/server/middleware/project-exists-middleware.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { IGetUserAuthInfoRequest } from "./request.model"
import { Response, NextFunction } from "express"
import { projectExistsMiddleware } from "./project-exists-middleware"
import { db } from "../../db/db"
import Boom = require("boom")

jest.mock("../../db/db")

describe("projectExistsMiddleware", () => {
const nextFunction: NextFunction = jest.fn()

beforeEach(() => {
jest.resetAllMocks()
})
it("should return 404 when no project found", async () => {
const request: any = { params: { projectName: "does not exist" } }
db.oneOrNone = jest.fn().mockReturnValueOnce(null)

await projectExistsMiddleware(request as unknown as IGetUserAuthInfoRequest,
{} as unknown as Response, nextFunction)
expect(nextFunction).toHaveBeenCalledTimes(1)
expect(nextFunction).toHaveBeenCalledWith(Boom.notFound("Project not found"))
})

it("should proceed when project found", async () => {
const request: any = { params: { projectName: "my-project" } }
db.oneOrNone = jest.fn().mockReturnValueOnce("projectId")

await projectExistsMiddleware(request as unknown as IGetUserAuthInfoRequest,
{} as unknown as Response, nextFunction)
expect(nextFunction).toHaveBeenCalledTimes(1)
expect(nextFunction).toHaveBeenCalledWith()
})

})
15 changes: 15 additions & 0 deletions src/server/middleware/project-exists-middleware.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { IGetUserAuthInfoRequest } from "./request.model"
import { NextFunction, Response } from "express"
import { db } from "../../db/db"
import * as boom from "boom"
import { findProjectId } from "../queries/projects"

export const projectExistsMiddleware = async (req: IGetUserAuthInfoRequest, res: Response, next: NextFunction) => {

const { projectName } = req.params
const project = await db.oneOrNone(findProjectId(projectName))
if (!project) {
return next(boom.notFound("Project not found"))
}
next()
}
2 changes: 1 addition & 1 deletion src/server/queries/projects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export const createNewProject = projectName => {
export const findProjectId = projectName => {
return {
name: "find-project-id",
text: "SELECT id FROM jtl.projects WHERE project_name = $1 AND",
text: "SELECT id FROM jtl.projects WHERE project_name = $1",
values: [projectName],
}
}
Expand Down
15 changes: 15 additions & 0 deletions src/server/routes/item.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import { AllowedRoles, authorizationMiddleware } from "../middleware/authorization-middleware"
import { authenticationMiddleware } from "../middleware/authentication-middleware"
import { getRequestStatsExportController } from "../controllers/item/get-request-stats-export-controller"
import { projectExistsMiddleware } from "../middleware/project-exists-middleware"

Check warning on line 36 in src/server/routes/item.ts

View check run for this annotation

Codecov / codecov/patch

src/server/routes/item.ts#L36

Added line #L36 was not covered by tests

export class ItemsRoutes {

Expand All @@ -44,12 +45,14 @@
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(scenarioParamsSchema),
queryParamsValidator(querySchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => getItemsController(req, res)))

.post(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(newItemParamSchema),
projectExistsMiddleware,
createItemController)

app.route("/api/projects/:projectName/scenarios/:scenarioName/items/start-async")
Expand All @@ -58,6 +61,7 @@
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
bodySchemaValidator(newAsyncItemStartBodySchema),
paramsSchemaValidator(newItemParamSchema),
projectExistsMiddleware,
createItemAsyncController)

app.route("/api/projects/:projectName/scenarios/:scenarioName/items/:itemId")
Expand All @@ -66,26 +70,30 @@
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => getItemController(req, res)))

.put(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
bodySchemaValidator(updateItemBodySchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response, next: NextFunction) => updateItemController(req, res, next)))

.delete(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => deleteItemController(req, res)))

app.route("/api/projects/:projectName/scenarios/:scenarioName/items/:itemId/request-stats-export")
.get(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => getRequestStatsExportController(req, res)))


Expand All @@ -95,26 +103,30 @@
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
bodySchemaValidator(stopItemAsyncBodySchema),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => stopItemAsyncController(req, res)))

app.route("/api/projects/:projectName/scenarios/:scenarioName/items/:itemId/share-tokens")
.get(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => getItemLinksController(req, res)))

.post(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => createItemLinkController(req, res)))

app.route("/api/projects/:projectName/scenarios/:scenarioName/items/:itemId/share-tokens/:tokenId")
.delete(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(shareTokenSchema),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => deleteItemShareTokenController(req, res)))

app.route("/api/projects/:projectName/scenarios/:scenarioName/processing-items")
Expand All @@ -123,6 +135,7 @@
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(scenarioParamsSchema),
queryParamsValidator(environmentQuerySchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => getProcessingItemsController(req, res)))

app.route("/api/projects/:projectName/scenarios/:scenarioName/items/:itemId/custom-chart-settings")
Expand All @@ -131,12 +144,14 @@
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
bodySchemaValidator(upsertUserItemChartSettings),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => upsertItemChartSettingsController(req, res))
)
.get(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => getItemChartSettingsController(req, res)))
}
}
4 changes: 4 additions & 0 deletions src/server/routes/label.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import { getLabelErrorsController } from "../controllers/label/get-label-errors-controller"
import { AllowedRoles, authorizationMiddleware } from "../middleware/authorization-middleware"
import { authenticationMiddleware } from "../middleware/authentication-middleware"
import { projectExistsMiddleware } from "../middleware/project-exists-middleware"

Check warning on line 11 in src/server/routes/label.ts

View check run for this annotation

Codecov / codecov/patch

src/server/routes/label.ts#L11

Added line #L11 was not covered by tests

export class LabelRoutes {

Expand All @@ -19,6 +20,7 @@
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(labelParamSchema),
queryParamsValidator(labelQuerySchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => getLabelTrendController(req, res)))

app.route("/api/projects/:projectName/scenarios/:scenarioName/items/:itemId/label/:label/virtual-users")
Expand All @@ -27,6 +29,7 @@
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(labelParamSchema),
queryParamsValidator(labelQuerySchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response, next: NextFunction) =>
getLabelVirtualUsersController(req, res, next)))

Expand All @@ -35,6 +38,7 @@
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(labelParamSchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => getLabelErrorsController(req, res)))
}
}
7 changes: 4 additions & 3 deletions src/server/routes/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import { AllowedRoles, authorizationMiddleware } from "../middleware/authorization-middleware"
import { authenticationMiddleware } from "../middleware/authentication-middleware"
import { IGetUserAuthInfoRequest } from "../middleware/request.model"
import { projectExistsMiddleware } from "../middleware/project-exists-middleware"

Check warning on line 16 in src/server/routes/project.ts

View check run for this annotation

Codecov / codecov/patch

src/server/routes/project.ts#L16

Added line #L16 was not covered by tests

export class ProjectRoutes {
routes(app: express.Application): void {
Expand Down Expand Up @@ -47,12 +48,14 @@
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(projectNameParam),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => deleteProjectController(req, res)))

.get(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(projectNameParam),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => getProjectController(req, res)))


Expand All @@ -61,11 +64,9 @@
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(projectNameParam),
bodySchemaValidator(updateProjectSchema),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => updateProjectController(req, res)))


app.route("/api/projects/:projectName/allowed-users")
.get()
}

}
12 changes: 12 additions & 0 deletions src/server/routes/scenario.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import { IGetUserAuthInfoRequest } from "../middleware/request.model"
import { postScenarioTrendsSettings } from "../controllers/scenario/trends/update-scenario-trends-settings-controller"
import { getScenarioEnvironmentController } from "../controllers/scenario/get-scenario-environment-controller"
import { projectExistsMiddleware } from "../middleware/project-exists-middleware"

Check warning on line 31 in src/server/routes/scenario.ts

View check run for this annotation

Codecov / codecov/patch

src/server/routes/scenario.ts#L31

Added line #L31 was not covered by tests

export class ScenarioRoutes {

Expand All @@ -38,13 +39,15 @@
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(projectNameParam),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => getScenariosController(req, res)))

.post(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(projectNameParam),
bodySchemaValidator(scenarioSchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response, next: NextFunction) =>
createScenarioController(req, res, next)))

Expand All @@ -53,6 +56,7 @@
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => getScenarioController(req, res))
)

Expand All @@ -61,26 +65,30 @@
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
bodySchemaValidator(updateScenarioSchema),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => updateScenarioController(req, res)))

.delete(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => deleteScenarioController(req, res)))

app.route("/api/projects/:projectName/scenarios/:scenarioName/notifications")
.get(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => getScenarioNotificationsController(req, res)))

.post(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
bodySchemaValidator(scenarioNotificationBodySchema),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => createScenarioNotificationController(req, res)))


Expand All @@ -89,6 +97,7 @@
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramSchemaNotification),
projectExistsMiddleware,
wrapAsync((req: Request, res: Response) => deleteScenarioNotificationController(req, res)))

app.route("/api/projects/:projectName/scenarios/:scenarioName/trends")
Expand All @@ -97,6 +106,7 @@
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
queryParamsValidator(environmentQuerySchema),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => getScenarioTrendsController(req, res)))

app.route("/api/projects/:projectName/scenarios/:scenarioName/trends/settings")
Expand All @@ -105,13 +115,15 @@
authorizationMiddleware([AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
bodySchemaValidator(scenarioTrendsSettings),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => postScenarioTrendsSettings(req, res)))

app.route("/api/projects/:projectName/scenarios/:scenarioName/environment")
.get(
authenticationMiddleware,
authorizationMiddleware([AllowedRoles.Readonly, AllowedRoles.Operator, AllowedRoles.Admin]),
paramsSchemaValidator(paramsSchema),
projectExistsMiddleware,
wrapAsync((req: IGetUserAuthInfoRequest, res: Response) => getScenarioEnvironmentController(req, res)))
}
}
Loading
Loading