]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - client/src/app/shared/shared-search/advanced-search.model.ts
Live streaming implementation first step
[github/Chocobozzz/PeerTube.git] / client / src / app / shared / shared-search / advanced-search.model.ts
CommitLineData
67ed6552 1import { NSFWQuery, SearchTargetType } from '@shared/models'
0b18f4aa
C
2
3export class AdvancedSearch {
4 startDate: string // ISO 8601
5 endDate: string // ISO 8601
6
31d065cc
AM
7 originallyPublishedStartDate: string // ISO 8601
8 originallyPublishedEndDate: string // ISO 8601
9
0b18f4aa
C
10 nsfw: NSFWQuery
11
12 categoryOneOf: string
13
14 licenceOneOf: string
15
16 languageOneOf: string
17
9abd170d
C
18 tagsOneOf: string[]
19 tagsAllOf: string[]
0b18f4aa
C
20
21 durationMin: number // seconds
22 durationMax: number // seconds
23
cddf4503
C
24 sort: string
25
5fb2e288
C
26 searchTarget: SearchTargetType
27
28 // Filters we don't want to count, because they are mandatory
29 private silentFilters = new Set([ 'sort', 'searchTarget' ])
30
0b18f4aa
C
31 constructor (options?: {
32 startDate?: string
33 endDate?: string
31d065cc
AM
34 originallyPublishedStartDate?: string
35 originallyPublishedEndDate?: string
0b18f4aa
C
36 nsfw?: NSFWQuery
37 categoryOneOf?: string
38 licenceOneOf?: string
39 languageOneOf?: string
9abd170d
C
40
41 tagsOneOf?: any
42 tagsAllOf?: any
43
0b18f4aa
C
44 durationMin?: string
45 durationMax?: string
cddf4503 46 sort?: string
5fb2e288 47 searchTarget?: SearchTargetType
0b18f4aa
C
48 }) {
49 if (!options) return
50
7afea880
C
51 this.startDate = options.startDate || undefined
52 this.endDate = options.endDate || undefined
31d065cc
AM
53 this.originallyPublishedStartDate = options.originallyPublishedStartDate || undefined
54 this.originallyPublishedEndDate = options.originallyPublishedEndDate || undefined
55
7afea880
C
56 this.nsfw = options.nsfw || undefined
57 this.categoryOneOf = options.categoryOneOf || undefined
58 this.licenceOneOf = options.licenceOneOf || undefined
59 this.languageOneOf = options.languageOneOf || undefined
9abd170d
C
60 this.tagsOneOf = this.intoArray(options.tagsOneOf)
61 this.tagsAllOf = this.intoArray(options.tagsAllOf)
0b18f4aa
C
62 this.durationMin = parseInt(options.durationMin, 10)
63 this.durationMax = parseInt(options.durationMax, 10)
64
5fb2e288
C
65 this.searchTarget = options.searchTarget || undefined
66
0b18f4aa
C
67 if (isNaN(this.durationMin)) this.durationMin = undefined
68 if (isNaN(this.durationMax)) this.durationMax = undefined
cddf4503
C
69
70 this.sort = options.sort || '-match'
0b18f4aa
C
71 }
72
73 containsValues () {
c199c427 74 const obj = this.toUrlObject()
0b18f4aa 75 for (const k of Object.keys(obj)) {
5fb2e288 76 if (this.silentFilters.has(k)) continue
cddf4503 77
9abd170d 78 if (this.isValidValue(obj[k])) return true
0b18f4aa
C
79 }
80
81 return false
82 }
83
84 reset () {
85 this.startDate = undefined
86 this.endDate = undefined
31d065cc
AM
87 this.originallyPublishedStartDate = undefined
88 this.originallyPublishedEndDate = undefined
0b18f4aa
C
89 this.nsfw = undefined
90 this.categoryOneOf = undefined
91 this.licenceOneOf = undefined
92 this.languageOneOf = undefined
93 this.tagsOneOf = undefined
94 this.tagsAllOf = undefined
95 this.durationMin = undefined
96 this.durationMax = undefined
cddf4503
C
97
98 this.sort = '-match'
0b18f4aa
C
99 }
100
101 toUrlObject () {
102 return {
103 startDate: this.startDate,
104 endDate: this.endDate,
31d065cc
AM
105 originallyPublishedStartDate: this.originallyPublishedStartDate,
106 originallyPublishedEndDate: this.originallyPublishedEndDate,
0b18f4aa
C
107 nsfw: this.nsfw,
108 categoryOneOf: this.categoryOneOf,
109 licenceOneOf: this.licenceOneOf,
110 languageOneOf: this.languageOneOf,
111 tagsOneOf: this.tagsOneOf,
112 tagsAllOf: this.tagsAllOf,
113 durationMin: this.durationMin,
cddf4503 114 durationMax: this.durationMax,
5fb2e288
C
115 sort: this.sort,
116 searchTarget: this.searchTarget
0b18f4aa
C
117 }
118 }
119
120 toAPIObject () {
121 return {
122 startDate: this.startDate,
123 endDate: this.endDate,
31d065cc
AM
124 originallyPublishedStartDate: this.originallyPublishedStartDate,
125 originallyPublishedEndDate: this.originallyPublishedEndDate,
0b18f4aa 126 nsfw: this.nsfw,
4278710d
C
127 categoryOneOf: this.intoArray(this.categoryOneOf),
128 licenceOneOf: this.intoArray(this.licenceOneOf),
129 languageOneOf: this.intoArray(this.languageOneOf),
9abd170d
C
130 tagsOneOf: this.tagsOneOf,
131 tagsAllOf: this.tagsAllOf,
0b18f4aa 132 durationMin: this.durationMin,
cddf4503 133 durationMax: this.durationMax,
5fb2e288
C
134 sort: this.sort,
135 searchTarget: this.searchTarget
0b18f4aa
C
136 }
137 }
4278710d 138
c5d04b4f
RK
139 size () {
140 let acc = 0
141
c199c427 142 const obj = this.toUrlObject()
c5d04b4f 143 for (const k of Object.keys(obj)) {
5fb2e288 144 if (this.silentFilters.has(k)) continue
c5d04b4f 145
9abd170d 146 if (this.isValidValue(obj[k])) acc++
c5d04b4f
RK
147 }
148
149 return acc
150 }
151
9abd170d
C
152 private isValidValue (val: any) {
153 if (val === undefined) return false
154 if (val === '') return false
155 if (Array.isArray(val) && val.length === 0) return false
156
157 return true
158 }
159
4278710d
C
160 private intoArray (value: any) {
161 if (!value) return undefined
baeb429d 162 if (Array.isArray(value)) return value
4278710d
C
163
164 if (typeof value === 'string') return value.split(',')
165
166 return [ value ]
167 }
0b18f4aa 168}