Skip to content

Commit ebc35fe

Browse files
authored
fix error on search result with two identical titles (#324)
* fix error on search result with two identical titles * remove slugs
1 parent cde1ad4 commit ebc35fe

2 files changed

Lines changed: 46 additions & 34 deletions

File tree

server/__tests__/repository/mediaItem/mediaItem.test.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,6 @@ describe('mediaItemRepository', () => {
277277
source: 'user',
278278
mediaType: 'tv',
279279
title: 'Item 1',
280-
slug: 'item-1',
281280
poster: 'poster',
282281
backdrop: 'backdrop',
283282
},
@@ -287,15 +286,13 @@ describe('mediaItemRepository', () => {
287286
source: 'user',
288287
mediaType: 'tv',
289288
title: 'Item 4',
290-
slug: 'item-5',
291289
},
292290
{
293291
id: 77773,
294292
tmdbId: 9875321,
295293
source: 'user',
296294
mediaType: 'tv',
297295
title: 'Item 2',
298-
slug: 'item-2',
299296
},
300297
];
301298

@@ -305,14 +302,12 @@ describe('mediaItemRepository', () => {
305302
source: 'user',
306303
mediaType: 'tv',
307304
title: 'Item 1',
308-
slug: 'item-1',
309305
},
310306
{
311307
tmdbId: 9875321,
312308
source: 'user',
313309
mediaType: 'tv',
314310
title: 'Item 2',
315-
slug: 'item-2',
316311
},
317312
{
318313
imdbId: 'tt1234567',
@@ -321,21 +316,30 @@ describe('mediaItemRepository', () => {
321316
poster: 'poster',
322317
backdrop: 'backdrop',
323318
title: 'Item 3',
324-
slug: 'item-3',
325319
},
326320
{
327321
imdbId: 'tt876123',
328322
tmdbId: 77812332,
329323
source: 'user',
330324
mediaType: 'tv',
331325
title: 'new Title 4',
332-
slug: 'new-title-4',
333326
overview: 'new overview',
334327
},
328+
{
329+
tmdbId: 998,
330+
source: 'tmdb',
331+
mediaType: 'tv',
332+
title: 'title123',
333+
},
334+
{
335+
tmdbId: 999,
336+
source: 'tmdb',
337+
mediaType: 'tv',
338+
title: 'title123',
339+
},
335340
];
336341

337342
await mediaItemRepository.createMany(existingItems);
338-
339343
const res = await mediaItemRepository.mergeSearchResultWithExistingItems(
340344
searchResult,
341345
'tv'
@@ -376,7 +380,7 @@ describe('mediaItemRepository', () => {
376380
expect(insertedPoster).toBeDefined();
377381
expect(insertedBackdrop).toBeDefined();
378382

379-
expect(res.mergeWithSearchResult()).toMatchObject([
383+
const expected = [
380384
{
381385
...searchResult[0],
382386
id: 77771,
@@ -394,7 +398,12 @@ describe('mediaItemRepository', () => {
394398
...searchResult[3],
395399
id: 77772,
396400
},
397-
]);
401+
searchResult[4],
402+
searchResult[5],
403+
];
404+
405+
expect(res.mergeWithSearchResult()).toMatchObject(expected);
406+
expect(res.mergeWithSearchResult()).toMatchObject(expected);
398407

399408
expect(res.existingItems).toMatchObject([
400409
{

server/src/repository/mediaItem.ts

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -849,29 +849,28 @@ class MediaItemRepository extends repository<MediaItemBase>({
849849

850850
newItems.forEach((item) => (item.lastTimeUpdated = new Date().getTime()));
851851

852-
const newItemsId = await Database.knex
853-
.batchInsert(
854-
this.tableName,
855-
newItems.map(
856-
(item): Record<string, unknown> => ({
857-
...this.serialize(this.stripValue(item)),
858-
slug: Database.knex.raw(
859-
`(CASE
860-
WHEN (
861-
${Database.knex('mediaItem')
862-
.count()
863-
.where('slug', mediaItemSlug(item))
864-
.toQuery()}) = 0
865-
THEN '${mediaItemSlug(item)}'
866-
ELSE '${mediaItemSlug(item)}-${randomSlugId()}'
867-
END)`
868-
),
869-
})
870-
),
871-
30
872-
)
873-
.transacting(trx)
874-
.returning('id');
852+
const newItemsId: { id: number }[] = [];
853+
854+
for (const newItem of newItems) {
855+
const [res] = await trx<MediaItemBase>(this.tableName)
856+
.insert({
857+
...this.serialize(this.stripValue(newItem)),
858+
slug: Database.knex.raw(
859+
`(CASE
860+
WHEN (
861+
${Database.knex('mediaItem')
862+
.count()
863+
.where('slug', mediaItemSlug(newItem))
864+
.toQuery()}) = 0
865+
THEN '${mediaItemSlug(newItem)}'
866+
ELSE '${mediaItemSlug(newItem)}-${randomSlugId()}'
867+
END)`
868+
),
869+
})
870+
.returning<{ id: number }[]>('id');
871+
872+
newItemsId.push(res);
873+
}
875874

876875
const newItemsWithId = _.merge(
877876
newItems,
@@ -931,7 +930,11 @@ class MediaItemRepository extends repository<MediaItemBase>({
931930
searchResultId: number;
932931
})[]
933932
) =>
934-
_(_.concat(newItemsWithId, existingItems || existingSearchResults))
933+
_(
934+
_.cloneDeep(
935+
_.concat(newItemsWithId, existingItems || existingSearchResults)
936+
)
937+
)
935938
.sortBy('searchResultId')
936939
.forEach((item) => delete item.searchResultId)
937940
.valueOf(),

0 commit comments

Comments
 (0)