fix: Forward to incorrect collection url on first signin (#2565)
closes #2560
This commit is contained in:
@ -7,6 +7,7 @@ import { Op, DataTypes, sequelize } from "../sequelize";
|
|||||||
import slugify from "../utils/slugify";
|
import slugify from "../utils/slugify";
|
||||||
import CollectionUser from "./CollectionUser";
|
import CollectionUser from "./CollectionUser";
|
||||||
import Document from "./Document";
|
import Document from "./Document";
|
||||||
|
import User from "./User";
|
||||||
|
|
||||||
const Collection = sequelize.define(
|
const Collection = sequelize.define(
|
||||||
"collection",
|
"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
|
// get all the membership relationshps a user could have with the collection
|
||||||
Collection.membershipUserIds = async (collectionId: string) => {
|
Collection.membershipUserIds = async (collectionId: string) => {
|
||||||
const collection = await Collection.scope("withAllMemberships").findByPk(
|
const collection = await Collection.scope("withAllMemberships").findByPk(
|
||||||
|
@ -43,10 +43,7 @@ router.get("/redirect", auth(), async (ctx) => {
|
|||||||
|
|
||||||
const [team, collection, view] = await Promise.all([
|
const [team, collection, view] = await Promise.all([
|
||||||
Team.findByPk(user.teamId),
|
Team.findByPk(user.teamId),
|
||||||
Collection.findOne({
|
Collection.findFirstCollectionForUser(user),
|
||||||
where: { teamId: user.teamId },
|
|
||||||
order: [["index", "ASC"]],
|
|
||||||
}),
|
|
||||||
View.findOne({
|
View.findOne({
|
||||||
where: { userId: user.id },
|
where: { userId: user.id },
|
||||||
}),
|
}),
|
||||||
|
36
server/routes/auth/index.test.js
Normal file
36
server/routes/auth/index.test.js
Normal 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();
|
||||||
|
});
|
||||||
|
});
|
@ -101,10 +101,7 @@ export async function signIn(
|
|||||||
});
|
});
|
||||||
|
|
||||||
const [collection, view] = await Promise.all([
|
const [collection, view] = await Promise.all([
|
||||||
Collection.findOne({
|
Collection.findFirstCollectionForUser(user),
|
||||||
where: { teamId: user.teamId },
|
|
||||||
order: [["index", "ASC"]],
|
|
||||||
}),
|
|
||||||
View.findOne({
|
View.findOne({
|
||||||
where: { userId: user.id },
|
where: { userId: user.id },
|
||||||
}),
|
}),
|
||||||
|
Reference in New Issue
Block a user