* first pass * test * test * priority * Reduce boilerplate further * Update server/utils/PluginManager.ts Co-authored-by: Apoorv Mishra <apoorvmishra101092@gmail.com> * fix: matchesNode error in destroyed editor transaction * fix: Individual imported files do not display source correctly in 'Insights' * chore: Add sleep before Slack notification * docs * fix: Error logged about missing plugin.json * Remove email template glob --------- Co-authored-by: Apoorv Mishra <apoorvmishra101092@gmail.com>
78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
import passport from "@outlinewiki/koa-passport";
|
|
import { addMonths } from "date-fns";
|
|
import Koa from "koa";
|
|
import bodyParser from "koa-body";
|
|
import Router from "koa-router";
|
|
import { AuthenticationError } from "@server/errors";
|
|
import auth from "@server/middlewares/authentication";
|
|
import coalesceBody from "@server/middlewares/coaleseBody";
|
|
import { Collection, Team, View } from "@server/models";
|
|
import AuthenticationHelper from "@server/models/helpers/AuthenticationHelper";
|
|
import { AppState, AppContext, APIContext } from "@server/types";
|
|
|
|
const app = new Koa<AppState, AppContext>();
|
|
const router = new Router();
|
|
|
|
router.use(passport.initialize());
|
|
|
|
// dynamically load available authentication provider routes
|
|
AuthenticationHelper.providers.forEach((provider) => {
|
|
router.use("/", provider.value.routes());
|
|
});
|
|
|
|
router.get("/redirect", auth(), async (ctx: APIContext) => {
|
|
const { user } = ctx.state.auth;
|
|
const jwtToken = user.getJwtToken();
|
|
|
|
if (jwtToken === ctx.params.token) {
|
|
throw AuthenticationError("Cannot extend token");
|
|
}
|
|
|
|
// ensure that the lastActiveAt on user is updated to prevent replay requests
|
|
await user.updateActiveAt(ctx, true);
|
|
|
|
ctx.cookies.set("accessToken", jwtToken, {
|
|
sameSite: "lax",
|
|
expires: addMonths(new Date(), 3),
|
|
});
|
|
const [team, collection, view] = await Promise.all([
|
|
Team.findByPk(user.teamId),
|
|
Collection.findFirstCollectionForUser(user),
|
|
View.findOne({
|
|
where: {
|
|
userId: user.id,
|
|
},
|
|
}),
|
|
]);
|
|
|
|
const defaultCollectionId = team?.defaultCollectionId;
|
|
|
|
if (defaultCollectionId) {
|
|
const collection = await Collection.findOne({
|
|
where: {
|
|
id: defaultCollectionId,
|
|
teamId: team.id,
|
|
},
|
|
});
|
|
|
|
if (collection) {
|
|
ctx.redirect(`${team.url}${collection.url}`);
|
|
return;
|
|
}
|
|
}
|
|
|
|
const hasViewedDocuments = !!view;
|
|
|
|
ctx.redirect(
|
|
!hasViewedDocuments && collection
|
|
? `${team?.url}${collection.url}`
|
|
: `${team?.url}/home`
|
|
);
|
|
});
|
|
|
|
app.use(bodyParser());
|
|
app.use(coalesceBody());
|
|
app.use(router.routes());
|
|
|
|
export default app;
|