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 --- 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 +++++- 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 server/initializers/migrations/0200-video-published-at.ts (limited to 'server') 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(), -- cgit v1.2.3