fix(api): 🐛 Fix duplicated mentions, general refactorings

This commit is contained in:
Jesse Wierzbinski 2024-12-09 15:30:18 +01:00
parent 84a0a07ea6
commit e293bd280d
No known key found for this signature in database
5 changed files with 29 additions and 29 deletions

View file

@ -143,7 +143,7 @@ describe(meta.route, () => {
const objects = (await response.json()) as ApiNotification[]; const objects = (await response.json()) as ApiNotification[];
expect(objects.length).toBe(2); expect(objects.length).toBe(3);
// There should be no element with a status with id of timeline[0].id // There should be no element with a status with id of timeline[0].id
expect(objects).not.toContainEqual( expect(objects).not.toContainEqual(
expect.objectContaining({ expect.objectContaining({

View file

@ -153,25 +153,25 @@ export default apiRoute((app) =>
// Filters in `Filters` table have keyword in `FilterKeywords` table (use LIKE) // Filters in `Filters` table have keyword in `FilterKeywords` table (use LIKE)
// Filters table has a userId and a context which is an array // Filters table has a userId and a context which is an array
sql`NOT EXISTS ( sql`NOT EXISTS (
SELECT 1 SELECT 1
FROM "Filters" FROM "Filters"
WHERE "Filters"."userId" = ${user.id} WHERE "Filters"."userId" = ${user.id}
AND "Filters"."filter_action" = 'hide' AND "Filters"."filter_action" = 'hide'
AND EXISTS ( AND EXISTS (
SELECT 1 SELECT 1
FROM "FilterKeywords", "Notifications" as "n_inner", "Notes" FROM "FilterKeywords", "Notifications" as "n_inner", "Notes"
WHERE "FilterKeywords"."filterId" = "Filters"."id" WHERE "FilterKeywords"."filterId" = "Filters"."id"
AND "n_inner"."noteId" = "Notes"."id" AND "n_inner"."noteId" = "Notes"."id"
AND "Notes"."content" LIKE AND "Notes"."content" LIKE
'%' || "FilterKeywords"."keyword" || '%' '%' || "FilterKeywords"."keyword" || '%'
AND "n_inner"."id" = "Notifications"."id" AND "n_inner"."id" = "Notifications"."id"
) )
AND "Filters"."context" @> ARRAY['notifications'] AND "Filters"."context" @> ARRAY['notifications']
)`, )`,
), ),
limit, limit,
context.req.url, context.req.url,
user?.id, user.id,
); );
return context.json( return context.json(

View file

@ -310,6 +310,9 @@ describe(meta.route, () => {
const object = (await response.json()) as ApiStatus; const object = (await response.json()) as ApiStatus;
expect(object.content).toBe(
`<p>Hello, <a class="u-url mention" rel="nofollow noopener noreferrer" target="_blank" href="${users[1].getUri()}">@${users[1].data.username}</a>!</p>`,
);
expect(object.mentions).toBeArrayOfSize(1); expect(object.mentions).toBeArrayOfSize(1);
expect(object.mentions[0]).toMatchObject({ expect(object.mentions[0]).toMatchObject({
id: users[1].id, id: users[1].id,

View file

@ -298,20 +298,17 @@ export const replaceTextMentions = (text: string, mentions: User[]): string => {
); );
} }
return finalText return finalText.replace(
.replace( createRegExp(
createRegExp( exactly(
exactly(`@${username}`) exactly(`@${username}`)
.notBefore(anyOf(letter, digit, charIn("@"))) .notBefore(anyOf(letter, digit, charIn("@")))
.notAfter(anyOf(letter, digit, charIn("@"))), .notAfter(anyOf(letter, digit, charIn("@"))),
[global], ).or(exactly(`@${username}@${baseHost}`)),
), [global],
linkTemplate(`@${username}@${baseHost}`), ),
) linkTemplate(`@${username}@${baseHost}`),
.replaceAll( );
`@${username}@${baseHost}`,
linkTemplate(`@${username}@${baseHost}`),
);
}, text); }, text);
}; };

View file

@ -43,7 +43,6 @@ mock.module("@versia/kit/db", () => ({
}, },
Notification: { Notification: {
fromSql: jest.fn(), fromSql: jest.fn(),
insert: jest.fn(),
}, },
})); }));
@ -242,6 +241,7 @@ describe("InboxProcessor", () => {
id: "followee-id", id: "followee-id",
data: { isLocked: false }, data: { isLocked: false },
sendFollowAccept: jest.fn(), sendFollowAccept: jest.fn(),
notify: jest.fn(),
}; };
const mockRelationship = { const mockRelationship = {
data: { following: false }, data: { following: false },