Move original publication date in advanced settings
[oweals/peertube.git] / client / src / app / shared / video / video-edit.model.ts
1 import { VideoPrivacy } from '../../../../../shared/models/videos/video-privacy.enum'
2 import { VideoUpdate } from '../../../../../shared/models/videos'
3 import { VideoScheduleUpdate } from '../../../../../shared/models/videos/video-schedule-update.model'
4 import { Video } from '../../../../../shared/models/videos/video.model'
5
6 export class VideoEdit implements VideoUpdate {
7   static readonly SPECIAL_SCHEDULED_PRIVACY = -1
8
9   category: number
10   licence: number
11   language: string
12   description: string
13   name: string
14   tags: string[]
15   nsfw: boolean
16   commentsEnabled: boolean
17   downloadEnabled: boolean
18   waitTranscoding: boolean
19   channelId: number
20   privacy: VideoPrivacy
21   support: string
22   thumbnailfile?: any
23   previewfile?: any
24   thumbnailUrl: string
25   previewUrl: string
26   uuid?: string
27   id?: number
28   scheduleUpdate?: VideoScheduleUpdate
29   originallyPublishedAt?: Date | string
30
31   constructor (
32     video?: Video & {
33       tags: string[],
34       commentsEnabled: boolean,
35       downloadEnabled: boolean,
36       support: string,
37       thumbnailUrl: string,
38       previewUrl: string
39     }) {
40     if (video) {
41       this.id = video.id
42       this.uuid = video.uuid
43       this.category = video.category.id
44       this.licence = video.licence.id
45       this.language = video.language.id
46       this.description = video.description
47       this.name = video.name
48       this.tags = video.tags
49       this.nsfw = video.nsfw
50       this.commentsEnabled = video.commentsEnabled
51       this.downloadEnabled = video.downloadEnabled
52       this.waitTranscoding = video.waitTranscoding
53       this.channelId = video.channel.id
54       this.privacy = video.privacy.id
55       this.support = video.support
56       this.thumbnailUrl = video.thumbnailUrl
57       this.previewUrl = video.previewUrl
58
59       this.scheduleUpdate = video.scheduledUpdate
60       this.originallyPublishedAt = video.originallyPublishedAt ? new Date(video.originallyPublishedAt) : null
61     }
62   }
63
64   patch (values: { [ id: string ]: string }) {
65     Object.keys(values).forEach((key) => {
66       this[ key ] = values[ key ]
67     })
68
69     // If schedule publication, the video is private and will be changed to public privacy
70     if (parseInt(values['privacy'], 10) === VideoEdit.SPECIAL_SCHEDULED_PRIVACY) {
71       const updateAt = new Date(values['schedulePublicationAt'])
72       updateAt.setSeconds(0)
73
74       this.privacy = VideoPrivacy.PRIVATE
75       this.scheduleUpdate = {
76         updateAt: updateAt.toISOString(),
77         privacy: VideoPrivacy.PUBLIC
78       }
79     } else {
80       this.scheduleUpdate = null
81     }
82
83     // Convert originallyPublishedAt to string so that function objectToFormData() works correctly
84     if (this.originallyPublishedAt) {
85       const originallyPublishedAt = new Date(values['originallyPublishedAt'])
86       this.originallyPublishedAt = originallyPublishedAt.toISOString()
87     }
88   }
89
90   toFormPatch () {
91     const json = {
92       category: this.category,
93       licence: this.licence,
94       language: this.language,
95       description: this.description,
96       support: this.support,
97       name: this.name,
98       tags: this.tags,
99       nsfw: this.nsfw,
100       commentsEnabled: this.commentsEnabled,
101       downloadEnabled: this.downloadEnabled,
102       waitTranscoding: this.waitTranscoding,
103       channelId: this.channelId,
104       privacy: this.privacy,
105       originallyPublishedAt: this.originallyPublishedAt
106     }
107
108     // Special case if we scheduled an update
109     if (this.scheduleUpdate) {
110       Object.assign(json, {
111         privacy: VideoEdit.SPECIAL_SCHEDULED_PRIVACY,
112         schedulePublicationAt: new Date(this.scheduleUpdate.updateAt.toString())
113       })
114     }
115
116     return json
117   }
118 }