From 2922e048de95738b3319054ce0778f873a34a0ee Mon Sep 17 00:00:00 2001 From: Julien Le Bras Date: Wed, 28 Mar 2018 23:38:52 +0200 Subject: Add publishedAt field for video model. * New field added in the `video` table + migration script * `publishedAt` updated to NOW when privacy changes from private to public/unlisted (default = NOW) * Models updated to handle the new attribute * Client interface updated to use `publishedAt` instead of `createdAt` except in My Account > My Videos view --- .../shared/video/video-miniature.component.html | 2 +- client/src/app/shared/video/video.model.ts | 2 ++ .../videos/+video-watch/video-watch.component.html | 2 +- server/controllers/api/videos/index.ts | 9 +++++- server/initializers/constants.ts | 2 +- .../migrations/0200-video-published-at.ts | 32 ++++++++++++++++++++++ server/models/video/video.ts | 8 +++++- shared/models/videos/video.model.ts | 1 + 8 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 server/initializers/migrations/0200-video-published-at.ts diff --git a/client/src/app/shared/video/video-miniature.component.html b/client/src/app/shared/video/video-miniature.component.html index 7ac017235..f28e9b8d9 100644 --- a/client/src/app/shared/video/video-miniature.component.html +++ b/client/src/app/shared/video/video-miniature.component.html @@ -11,7 +11,7 @@ - {{ video.createdAt | myFromNow }} - {{ video.views | myNumberFormatter }} views + {{ video.publishedAt | myFromNow }} - {{ video.views | myNumberFormatter }} views {{ video.by }} diff --git a/client/src/app/shared/video/video.model.ts b/client/src/app/shared/video/video.model.ts index 7b68933a1..0c02cbcb9 100644 --- a/client/src/app/shared/video/video.model.ts +++ b/client/src/app/shared/video/video.model.ts @@ -9,6 +9,7 @@ export class Video implements VideoServerModel { by: string createdAt: Date updatedAt: Date + publishedAt: Date category: VideoConstant licence: VideoConstant language: VideoConstant @@ -56,6 +57,7 @@ export class Video implements VideoServerModel { const absoluteAPIUrl = getAbsoluteAPIUrl() this.createdAt = new Date(hash.createdAt.toString()) + this.publishedAt = new Date(hash.publishedAt.toString()) this.category = hash.category this.licence = hash.licence this.language = hash.language diff --git a/client/src/app/videos/+video-watch/video-watch.component.html b/client/src/app/videos/+video-watch/video-watch.component.html index 6c7fc08e1..ec5bd30dc 100644 --- a/client/src/app/videos/+video-watch/video-watch.component.html +++ b/client/src/app/videos/+video-watch/video-watch.component.html @@ -14,7 +14,7 @@
{{ video.name }}
- {{ video.createdAt | myFromNow }} - {{ video.views | myNumberFormatter }} views + {{ video.publishedAt | myFromNow }} - {{ video.views | myNumberFormatter }} views
diff --git a/server/controllers/api/videos/index.ts b/server/controllers/api/videos/index.ts index 552e5edac..244099015 100644 --- a/server/controllers/api/videos/index.ts +++ b/server/controllers/api/videos/index.ts @@ -307,10 +307,17 @@ async function updateVideo (req: express.Request, res: express.Response) { if (videoInfoToUpdate.licence !== undefined) videoInstance.set('licence', videoInfoToUpdate.licence) if (videoInfoToUpdate.language !== undefined) videoInstance.set('language', videoInfoToUpdate.language) if (videoInfoToUpdate.nsfw !== undefined) videoInstance.set('nsfw', videoInfoToUpdate.nsfw) - if (videoInfoToUpdate.privacy !== undefined) videoInstance.set('privacy', parseInt(videoInfoToUpdate.privacy.toString(), 10)) if (videoInfoToUpdate.support !== undefined) videoInstance.set('support', videoInfoToUpdate.support) if (videoInfoToUpdate.description !== undefined) videoInstance.set('description', videoInfoToUpdate.description) if (videoInfoToUpdate.commentsEnabled !== undefined) videoInstance.set('commentsEnabled', videoInfoToUpdate.commentsEnabled) + if (videoInfoToUpdate.privacy !== undefined) { + const newPrivacy = parseInt(videoInfoToUpdate.privacy.toString(), 10) + videoInstance.set('privacy', newPrivacy) + + if (wasPrivateVideo === true && newPrivacy !== VideoPrivacy.PRIVATE) { + videoInstance.set('publishedAt', new Date()) + } + } const videoInstanceUpdated = await videoInstance.save(sequelizeOptions) diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 5152095b3..2622b2c71 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -12,7 +12,7 @@ let config: IConfig = require('config') // --------------------------------------------------------------------------- -const LAST_MIGRATION_VERSION = 195 +const LAST_MIGRATION_VERSION = 200 // --------------------------------------------------------------------------- diff --git a/server/initializers/migrations/0200-video-published-at.ts b/server/initializers/migrations/0200-video-published-at.ts new file mode 100644 index 000000000..edaf4a145 --- /dev/null +++ b/server/initializers/migrations/0200-video-published-at.ts @@ -0,0 +1,32 @@ +import * as Sequelize from 'sequelize' + +async function up (utils: { + transaction: Sequelize.Transaction, + queryInterface: Sequelize.QueryInterface, + sequelize: Sequelize.Sequelize +}): Promise { + + { + const data = { + type: Sequelize.DATE, + allowNull: false, + defaultValue: Sequelize.NOW + } + await utils.queryInterface.addColumn('video', 'publishedAt', data) + } + + { + const query = 'UPDATE video SET "publishedAt" = video."createdAt"' + await utils.sequelize.query(query) + } + +} + +function down (options) { + throw new Error('Not implemented.') +} + +export { + up, + down +} diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 7c56c65a6..2a1226f6d 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -376,6 +376,11 @@ export class VideoModel extends Model { @UpdatedAt updatedAt: Date + @AllowNull(false) + @Default(Sequelize.NOW) + @Column + publishedAt: Date + @ForeignKey(() => VideoChannelModel) @Column channelId: number @@ -968,6 +973,7 @@ export class VideoModel extends Model { embedPath: this.getEmbedPath(), createdAt: this.createdAt, updatedAt: this.updatedAt, + publishedAt: this.publishedAt, account: { name: formattedAccount.name, displayName: formattedAccount.displayName, @@ -1122,7 +1128,7 @@ export class VideoModel extends Model { views: this.views, sensitive: this.nsfw, commentsEnabled: this.commentsEnabled, - published: this.createdAt.toISOString(), + published: this.publishedAt.toISOString(), updated: this.updatedAt.toISOString(), mediaType: 'text/markdown', content: this.getTruncatedDescription(), diff --git a/shared/models/videos/video.model.ts b/shared/models/videos/video.model.ts index ebd2813ca..1b5f1a09c 100644 --- a/shared/models/videos/video.model.ts +++ b/shared/models/videos/video.model.ts @@ -22,6 +22,7 @@ export interface Video { uuid: string createdAt: Date | string updatedAt: Date | string + publishedAt: Date | string category: VideoConstant licence: VideoConstant language: VideoConstant -- cgit v1.2.3