This commit is contained in:
2022-08-27 08:14:10 -05:00
parent f65ae56f74
commit 696ca6a393
9 changed files with 101 additions and 77 deletions

View File

@@ -1,27 +0,0 @@
import auth0 from "./auth0";
function withErrorHandling(handler) {
return async (req, res) => {
try {
await handler(req, res);
} catch (error) {
console.error(error);
res.status(error.status || 500).end(error.message);
}
};
}
function withSession(handler) {
return async (req, res) => {
const session = await auth0.getSession(req, res);
if (!session || !session.user) {
res.status(401).end();
return;
}
await handler(req, res, session);
}
}
export { withErrorHandling, withSession };

42
web/lib/jsonapi.js Normal file
View File

@@ -0,0 +1,42 @@
import auth0 from "./auth0";
async function jsonApi(handler) {
var unauthenticationHandler = async (req, res) => {
try {
await handler(req, res);
} catch (error) {
handleError(res, error);
}
res.end();
};
return unauthenticationHandler;
}
function authenticatedJsonApi(handler) {
var authenticatedHandler = async (req, res) => {
try {
const session = await auth0.getSession(req, res);
if (!session || !session.user) {
res.status(401);
} else {
await handler(req, res, session);
}
} catch (error) {
handleError(res, error);
}
res.end();
};
return authenticatedHandler;
}
function handleError(res, error) {
console.error(error);
res.status(error.status || 500).end(error.message);
}
export { jsonApi, authenticatedJsonApi };

View File

@@ -1,6 +1,23 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
async headers() {
return [
{
source: "/api/:path*",
headers: [
{
key: "Content-Type",
value: "application/vnd.api+json"
},
{
key: "x-testing",
value: "true"
}
]
}
]
}
}
module.exports = nextConfig

View File

@@ -1,28 +1,26 @@
import db from "../../../../lib/db";
import { withErrorHandling, withSession } from "../../../../lib/apiHelpers";
import { authenticatedJsonApi } from "../../../../lib/jsonapi";
import models from "../../../../lib/models";
const handler = withErrorHandling(
withSession(async (req, res, session) => {
const { method } = req;
const { user } = session;
const handler = authenticatedJsonApi(async (req, res, session) => {
const { method } = req;
const { user } = session;
switch (method) {
case "GET":
await getEntity(req, res, user);
break;
default:
res.setHeader("Allow", ["GET"]);
res.status(405).end(`Method ${method} Not Allowed`);
}
})
);
switch (method) {
case "GET":
await getEntity(req, res, user);
break;
default:
res.setHeader("Allow", ["GET"]);
res.status(405).send(`Method ${method} Not Allowed`);
}
});
const getEntity = async (req, res, user) => {
const { entityName, entityId } = req.query;
if (!models[entityName]) {
res.status(404).end();
res.status(404);
return;
}
@@ -30,7 +28,7 @@ const getEntity = async (req, res, user) => {
if (!model.validateId(entityId)) {
console.warn(model.validateId.errors);
res.status(404).end();
res.status(404);
return;
}
@@ -48,7 +46,7 @@ const getEntity = async (req, res, user) => {
if (entities.Items.length == 1) {
res.status(200).json(entities.Items[0]);
} else {
res.status(404).end();
res.status(404);
}
};

View File

@@ -1,31 +1,29 @@
import db from "../../../../lib/db";
import { withErrorHandling, withSession } from "../../../../lib/apiHelpers";
import { authenticatedJsonApi } from "../../../../lib/jsonapi";
import models from "../../../../lib/models";
const handler = withErrorHandling(
withSession(async (req, res, session) => {
const { method } = req;
const { user } = session;
const handler = authenticatedJsonApi(async (req, res, session) => {
const { method } = req;
const { user } = session;
switch (method) {
case "GET":
await getEntities(req, res, user);
break;
case "POST":
await createEntity(req, res, user);
break;
default:
res.setHeader("Allow", ["GET", "POST"]);
res.status(405).end(`Method ${method} Not Allowed`);
}
})
);
switch (method) {
case "GET":
await getEntities(req, res, user);
break;
case "POST":
await createEntity(req, res, user);
break;
default:
res.setHeader("Allow", ["GET", "POST"]);
res.status(405).json(`Method ${method} Not Allowed`);
}
});
const getEntities = async (req, res, user) => {
const { entityName } = req.query;
if (!models[entityName]) {
res.status(404).end();
res.status(404);
return;
}
@@ -46,7 +44,7 @@ const createEntity = async (req, res, user) => {
const { entityName } = req.query;
if (!models[entityName]) {
res.status(404).end();
res.status(404);
return;
}

View File

@@ -1,8 +1,7 @@
import auth0 from "../../../lib/auth0";
import { withErrorHandling } from "../../../lib/apiHelpers";
const callback = withErrorHandling(async (req, res) => {
const callback = async (req, res) => {
await auth0.handleCallback(req, res);
});
};
export default callback;

View File

@@ -1,7 +1,6 @@
import db from "../../../lib/db";
import { withErrorHandling } from "../../../lib/apiHelpers";
const handler = withErrorHandling(async (req, res) => {
const handler = async (req, res) => {
const { method } = req;
switch (method) {
@@ -11,7 +10,7 @@ const handler = withErrorHandling(async (req, res) => {
res.setHeader("Allow", ["GET"]);
res.status(405).end(`Method ${method} Not Allowed`);
}
});
};
const get = async (req, res) => {
const params = {

View File

@@ -1,8 +1,7 @@
import auth0 from "../../../lib/auth0";
import { withErrorHandling } from "../../../lib/apiHelpers";
const login = withErrorHandling(async (req, res) => {
const login = async (req, res) => {
await auth0.handleLogin(req, res);
});
};
export default login;

View File

@@ -1,8 +1,7 @@
import auth0 from "../../../lib/auth0";
import { withErrorHandling } from "../../../lib/apiHelpers";
const me = withErrorHandling(async (req, res) => {
const me = async (req, res) => {
await auth0.handleProfile(req, res);
});
};
export default me;