From 2fd59d7d89d1c389446ee67838c821e2622fc8ca Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 20 Apr 2020 14:05:52 +0200 Subject: [PATCH] Add ability to sort by originallyPublishedAt --- server/initializers/constants.ts | 4 +- server/models/video/video-query-builder.ts | 6 +++ server/tests/api/videos/single-server.ts | 49 ++++++++++++++++++---- 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index e801e282a..bc6c58b06 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -59,9 +59,9 @@ const SORTABLE_COLUMNS = { FOLLOWERS: [ 'createdAt', 'state', 'score' ], FOLLOWING: [ 'createdAt', 'redundancyAllowed', 'state' ], - VIDEOS: [ 'name', 'duration', 'createdAt', 'publishedAt', 'views', 'likes', 'trending' ], + VIDEOS: [ 'name', 'duration', 'createdAt', 'publishedAt', 'originallyPublishedAt', 'views', 'likes', 'trending' ], - VIDEOS_SEARCH: [ 'name', 'duration', 'createdAt', 'publishedAt', 'views', 'likes', 'match' ], + VIDEOS_SEARCH: [ 'name', 'duration', 'createdAt', 'publishedAt', 'originallyPublishedAt', 'views', 'likes', 'match' ], VIDEO_CHANNELS_SEARCH: [ 'match', 'displayName', 'createdAt' ], ACCOUNTS_BLOCKLIST: [ 'createdAt' ], diff --git a/server/models/video/video-query-builder.ts b/server/models/video/video-query-builder.ts index 8f0a814de..455f9f30f 100644 --- a/server/models/video/video-query-builder.ts +++ b/server/models/video/video-query-builder.ts @@ -321,6 +321,10 @@ function buildListQuery (model: typeof Model, options: BuildVideosQueryOptions) if (options.isCount !== true) { if (exists(options.sort)) { + if (options.sort === '-originallyPublishedAt' || options.sort === 'originallyPublishedAt') { + attributes.push('COALESCE("video"."originallyPublishedAt", "video"."publishedAt") AS "publishedAtForOrder"') + } + order = buildOrder(model, options.sort) suffix += `${order} ` } @@ -365,6 +369,8 @@ function buildOrder (model: typeof Model, value: string) { if (field.toLowerCase() === 'match') { // Search firstSort = '"similarity"' + } else if (field === 'originallyPublishedAt') { + firstSort = '"publishedAtForOrder"' } else if (field.includes('.')) { firstSort = field } else { diff --git a/server/tests/api/videos/single-server.ts b/server/tests/api/videos/single-server.ts index 596fff996..0ae405950 100644 --- a/server/tests/api/videos/single-server.ts +++ b/server/tests/api/videos/single-server.ts @@ -34,6 +34,7 @@ const expect = chai.expect describe('Test a single server', function () { let server: ServerInfo = null let videoId = -1 + let videoId2 = -1 let videoUUID = '' let videosListBase: any[] = null @@ -237,12 +238,11 @@ describe('Test a single server', function () { it('Should upload 6 videos', async function () { this.timeout(25000) - const videos = [ + const videos = new Set([ 'video_short.mp4', 'video_short.ogv', 'video_short.webm', 'video_short1.webm', 'video_short2.webm', 'video_short3.webm' - ] + ]) - const tasks: Promise[] = [] for (const video of videos) { const videoAttributes = { name: video + ' name', @@ -255,11 +255,8 @@ describe('Test a single server', function () { fixture: video } - const p = uploadVideo(server.url, server.accessToken, videoAttributes) - tasks.push(p) + await uploadVideo(server.url, server.accessToken, videoAttributes) } - - await Promise.all(tasks) }) it('Should have the correct durations', async function () { @@ -345,6 +342,7 @@ describe('Test a single server', function () { expect(videos[5].name).to.equal('video_short1.webm name') videoId = videos[3].uuid + videoId2 = videos[5].uuid }) it('Should list and sort by trending in descending order', async function () { @@ -433,6 +431,43 @@ describe('Test a single server', function () { expect(video.dislikes).to.equal(1) }) + it('Should sort by originallyPublishedAt', async function () { + { + + { + const now = new Date() + const attributes = { originallyPublishedAt: now.toISOString() } + await updateVideo(server.url, server.accessToken, videoId, attributes) + + const res = await getVideosListSort(server.url, '-originallyPublishedAt') + const names = res.body.data.map(v => v.name) + + expect(names[0]).to.equal('my super video updated') + expect(names[1]).to.equal('video_short2.webm name') + expect(names[2]).to.equal('video_short1.webm name') + expect(names[3]).to.equal('video_short.webm name') + expect(names[4]).to.equal('video_short.ogv name') + expect(names[5]).to.equal('video_short.mp4 name') + } + + { + const now = new Date() + const attributes = { originallyPublishedAt: now.toISOString() } + await updateVideo(server.url, server.accessToken, videoId2, attributes) + + const res = await getVideosListSort(server.url, '-originallyPublishedAt') + const names = res.body.data.map(v => v.name) + + expect(names[0]).to.equal('video_short1.webm name') + expect(names[1]).to.equal('my super video updated') + expect(names[2]).to.equal('video_short2.webm name') + expect(names[3]).to.equal('video_short.webm name') + expect(names[4]).to.equal('video_short.ogv name') + expect(names[5]).to.equal('video_short.mp4 name') + } + } + }) + after(async function () { await cleanupTests([ server ]) })