fix: Forward to incorrect collection url on first signin (#2565)

closes #2560
This commit is contained in:
Tom Moor 2021-09-13 21:35:52 -07:00 committed by GitHub
parent fb335887cb
commit 6c605cf720
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 58 additions and 8 deletions

View File

@ -7,6 +7,7 @@ import { Op, DataTypes, sequelize } from "../sequelize";
import slugify from "../utils/slugify";
import CollectionUser from "./CollectionUser";
import Document from "./Document";
import User from "./User";
const Collection = sequelize.define(
"collection",
@ -236,6 +237,25 @@ Collection.findByPk = async function (id, options = {}) {
}
};
/**
* Find the first collection that the specified user has access to.
*
* @param user User object
* @returns collection First collection in the sidebar order
*/
Collection.findFirstCollectionForUser = async (user: User) => {
const id = await user.collectionIds();
return Collection.findOne({
where: { id },
order: [
// using LC_COLLATE:"C" because we need byte order to drive the sorting
sequelize.literal('"collection"."index" collate "C"'),
["updatedAt", "DESC"],
],
});
};
// get all the membership relationshps a user could have with the collection
Collection.membershipUserIds = async (collectionId: string) => {
const collection = await Collection.scope("withAllMemberships").findByPk(

View File

@ -43,10 +43,7 @@ router.get("/redirect", auth(), async (ctx) => {
const [team, collection, view] = await Promise.all([
Team.findByPk(user.teamId),
Collection.findOne({
where: { teamId: user.teamId },
order: [["index", "ASC"]],
}),
Collection.findFirstCollectionForUser(user),
View.findOne({
where: { userId: user.id },
}),

View File

@ -0,0 +1,36 @@
// @flow
import TestServer from "fetch-test-server";
import webService from "../../services/web";
import { buildUser, buildCollection } from "../../test/factories";
import { flushdb } from "../../test/support";
const app = webService();
const server = new TestServer(app.callback());
beforeEach(() => flushdb());
afterAll(() => server.close());
describe("auth/redirect", () => {
it("should redirect to home", async () => {
const user = await buildUser();
const res = await server.get(
`/auth/redirect?token=${user.getTransferToken()}`,
{ redirect: "manual" }
);
expect(res.status).toEqual(302);
expect(res.headers.get("location").endsWith("/home")).toBeTruthy();
});
it("should redirect to first collection", async () => {
const collection = await buildCollection();
const user = await buildUser({ teamId: collection.teamId });
const res = await server.get(
`/auth/redirect?token=${user.getTransferToken()}`,
{ redirect: "manual" }
);
expect(res.status).toEqual(302);
expect(res.headers.get("location").endsWith(collection.url)).toBeTruthy();
});
});

View File

@ -101,10 +101,7 @@ export async function signIn(
});
const [collection, view] = await Promise.all([
Collection.findOne({
where: { teamId: user.teamId },
order: [["index", "ASC"]],
}),
Collection.findFirstCollectionForUser(user),
View.findOne({
where: { userId: user.id },
}),