Try to fix subscriptions inconsistencies
[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     // Use the same file than the preview for the thumbnail
90     if (this.previewfile) {
91       this.thumbnailfile = this.previewfile
92     }
93   }
94
95   toFormPatch () {
96     const json = {
97       category: this.category,
98       licence: this.licence,
99       language: this.language,
100       description: this.description,
101       support: this.support,
102       name: this.name,
103       tags: this.tags,
104       nsfw: this.nsfw,
105       commentsEnabled: this.commentsEnabled,
106       downloadEnabled: this.downloadEnabled,
107       waitTranscoding: this.waitTranscoding,
108       channelId: this.channelId,
109       privacy: this.privacy,
110       originallyPublishedAt: this.originallyPublishedAt
111     }
112
113     // Special case if we scheduled an update
114     if (this.scheduleUpdate) {
115       Object.assign(json, {
116         privacy: VideoEdit.SPECIAL_SCHEDULED_PRIVACY,
117         schedulePublicationAt: new Date(this.scheduleUpdate.updateAt.toString())
118       })
119     }
120
121     return json
122   }
123 }