Split types and typings
[oweals/peertube.git] / server / types / models / video / video-playlist.ts
1 import { VideoPlaylistModel } from '../../../models/video/video-playlist'
2 import { PickWith } from '../../utils'
3 import { MAccount, MAccountDefault, MAccountSummary, MAccountSummaryFormattable } from '../account'
4 import { MThumbnail } from './thumbnail'
5 import { MChannelDefault, MChannelSummary, MChannelSummaryFormattable, MChannelUrl } from './video-channels'
6 import { MVideoPlaylistElementLight } from '@server/types/models/video/video-playlist-element'
7
8 type Use<K extends keyof VideoPlaylistModel, M> = PickWith<VideoPlaylistModel, K, M>
9
10 // ############################################################################
11
12 export type MVideoPlaylist = Omit<VideoPlaylistModel, 'OwnerAccount' | 'VideoChannel' | 'VideoPlaylistElements' | 'Thumbnail'>
13
14 // ############################################################################
15
16 export type MVideoPlaylistId = Pick<MVideoPlaylist, 'id'>
17 export type MVideoPlaylistPrivacy = Pick<MVideoPlaylist, 'privacy'>
18 export type MVideoPlaylistUUID = Pick<MVideoPlaylist, 'uuid'>
19 export type MVideoPlaylistVideosLength = MVideoPlaylist & { videosLength?: number }
20
21 // ############################################################################
22
23 // With elements
24
25 export type MVideoPlaylistWithElements =
26   MVideoPlaylist &
27   Use<'VideoPlaylistElements', MVideoPlaylistElementLight[]>
28
29 export type MVideoPlaylistIdWithElements =
30   MVideoPlaylistId &
31   Use<'VideoPlaylistElements', MVideoPlaylistElementLight[]>
32
33 // ############################################################################
34
35 // With account
36
37 export type MVideoPlaylistOwner =
38   MVideoPlaylist &
39   Use<'OwnerAccount', MAccount>
40
41 export type MVideoPlaylistOwnerDefault =
42   MVideoPlaylist &
43   Use<'OwnerAccount', MAccountDefault>
44
45 // ############################################################################
46
47 // With thumbnail
48
49 export type MVideoPlaylistThumbnail =
50   MVideoPlaylist &
51   Use<'Thumbnail', MThumbnail>
52
53 export type MVideoPlaylistAccountThumbnail =
54   MVideoPlaylist &
55   Use<'OwnerAccount', MAccountDefault> &
56   Use<'Thumbnail', MThumbnail>
57
58 // ############################################################################
59
60 // With channel
61
62 export type MVideoPlaylistAccountChannelDefault =
63   MVideoPlaylist &
64   Use<'OwnerAccount', MAccountDefault> &
65   Use<'VideoChannel', MChannelDefault>
66
67 // ############################################################################
68
69 // With all associations
70
71 export type MVideoPlaylistFull =
72   MVideoPlaylist &
73   Use<'OwnerAccount', MAccountDefault> &
74   Use<'VideoChannel', MChannelDefault> &
75   Use<'Thumbnail', MThumbnail>
76
77 // ############################################################################
78
79 // For API
80
81 export type MVideoPlaylistAccountChannelSummary =
82   MVideoPlaylist &
83   Use<'OwnerAccount', MAccountSummary> &
84   Use<'VideoChannel', MChannelSummary>
85
86 export type MVideoPlaylistFullSummary =
87   MVideoPlaylist &
88   Use<'Thumbnail', MThumbnail> &
89   Use<'OwnerAccount', MAccountSummary> &
90   Use<'VideoChannel', MChannelSummary>
91
92 // ############################################################################
93
94 // Format for API or AP object
95
96 export type MVideoPlaylistFormattable =
97   MVideoPlaylistVideosLength &
98   Use<'OwnerAccount', MAccountSummaryFormattable> &
99   Use<'VideoChannel', MChannelSummaryFormattable>
100
101 export type MVideoPlaylistAP =
102   MVideoPlaylist &
103   Use<'Thumbnail', MThumbnail> &
104   Use<'VideoChannel', MChannelUrl>