feat: Allow Document to be fetched without Slug (#3453)
* Allow Document to be fetched without Slug Fixes #3423 This PR refactors the `Document.findByPk` method to not require the `slug` portion of the urlID. Before this function accepted two different 'formats' for the ID. - The `uuid` ID of the Document - The full `urlID` which looked something like `some-document-1234567890` However the `some-document` slug portion of this identifier wasn't actually used when looking for a document. We now allow searching by JUST the postfix of the `urlID`, in the above example that is `1234567890`. We do this via a new Regex pattern to match on that just looks for the right looking id alone, without the prefix. This codepath looks the same as when we find it by the full `urlID` besides the different regex that we match on. The issue #3423 mentions that this should apply to all the API endpoints. I believe that this `findByPk` method is all that should be needed for that change. But if this is incorrect, OR you would like more test coverage on the API endpoints as a more 'end to end test' please let me know! * Change original regex to make the slug optional This has the, I believe to be good, side-effect of making the same logic apply to `Collection` as well. Since `Collection` was always doing the same stripping of the slug before the lookup I believe it should be just as safe to do there. We don't have to touch the code in Collections but we add a test of this behavior there as well. * No reason to rename this now that we aren't doing two matches
This commit is contained in:
@@ -372,6 +372,13 @@ describe("#findByPk", () => {
|
||||
expect(response!.id).toBe(collection.id);
|
||||
});
|
||||
|
||||
test("should return collection when urlId is present, but missing slug", async () => {
|
||||
const collection = await buildCollection();
|
||||
const id = collection.urlId;
|
||||
const response = await Collection.findByPk(id);
|
||||
expect(response!.id).toBe(collection.id);
|
||||
});
|
||||
|
||||
test("should return undefined when incorrect uuid type", async () => {
|
||||
const collection = await buildCollection();
|
||||
const response = await Collection.findByPk(collection.id + "-incorrect");
|
||||
|
||||
@@ -532,6 +532,13 @@ describe("#findByPk", () => {
|
||||
const response = await Document.findByPk(id);
|
||||
expect(response?.id).toBe(document.id);
|
||||
});
|
||||
|
||||
test("should return document when urlId is given without the slug prefix", async () => {
|
||||
const { document } = await seed();
|
||||
const id = document.urlId;
|
||||
const response = await Document.findByPk(id);
|
||||
expect(response?.id).toBe(document.id);
|
||||
});
|
||||
});
|
||||
|
||||
describe("tasks", () => {
|
||||
|
||||
@@ -51,4 +51,4 @@ export function signin(service = "slack"): string {
|
||||
return `${process.env.URL}/auth/${service}`;
|
||||
}
|
||||
|
||||
export const SLUG_URL_REGEX = /^[0-9a-zA-Z-_~]*-([a-zA-Z0-9]{10,15})$/;
|
||||
export const SLUG_URL_REGEX = /^(?:[0-9a-zA-Z-_~]*-)?([a-zA-Z0-9]{10,15})$/;
|
||||
|
||||
Reference in New Issue
Block a user