Add ability to sort by originallyPublishedAt
authorChocobozzz <me@florianbigard.com>
Mon, 20 Apr 2020 12:05:52 +0000 (14:05 +0200)
committerChocobozzz <me@florianbigard.com>
Mon, 20 Apr 2020 12:05:52 +0000 (14:05 +0200)
server/initializers/constants.ts
server/models/video/video-query-builder.ts
server/tests/api/videos/single-server.ts

index e801e282a144d2cb0579acac53510df72326b044..bc6c58b0653fdcf2236328413a547e186c84412f 100644 (file)
@@ -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' ],
index 8f0a814dece605d923ea44fd6efd7c7f309e9cfb..455f9f30ff032c158404535196db985de1e0e36d 100644 (file)
@@ -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 {
index 596fff9965fb045a969392d33bd5b707e4422f00..0ae405950b54025e949eed4c412fa8b0f101106c 100644 (file)
@@ -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<any>[] = []
     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 ])
   })