1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
import { NSFWQuery } from '../../../../shared/models/search'
export class AdvancedSearch {
startDate: string // ISO 8601
endDate: string // ISO 8601
nsfw: NSFWQuery
categoryOneOf: string
licenceOneOf: string
languageOneOf: string
tagsOneOf: string
tagsAllOf: string
durationMin: number // seconds
durationMax: number // seconds
sort: string
constructor (options?: {
startDate?: string
endDate?: string
nsfw?: NSFWQuery
categoryOneOf?: string
licenceOneOf?: string
languageOneOf?: string
tagsOneOf?: string
tagsAllOf?: string
durationMin?: string
durationMax?: string
sort?: string
}) {
if (!options) return
this.startDate = options.startDate || undefined
this.endDate = options.endDate || undefined
this.nsfw = options.nsfw || undefined
this.categoryOneOf = options.categoryOneOf || undefined
this.licenceOneOf = options.licenceOneOf || undefined
this.languageOneOf = options.languageOneOf || undefined
this.tagsOneOf = options.tagsOneOf || undefined
this.tagsAllOf = options.tagsAllOf || undefined
this.durationMin = parseInt(options.durationMin, 10)
this.durationMax = parseInt(options.durationMax, 10)
if (isNaN(this.durationMin)) this.durationMin = undefined
if (isNaN(this.durationMax)) this.durationMax = undefined
this.sort = options.sort || '-match'
}
containsValues () {
const obj = this.toUrlObject()
for (const k of Object.keys(obj)) {
if (k === 'sort') continue // Exception
if (obj[k] !== undefined) return true
}
return false
}
reset () {
this.startDate = undefined
this.endDate = undefined
this.nsfw = undefined
this.categoryOneOf = undefined
this.licenceOneOf = undefined
this.languageOneOf = undefined
this.tagsOneOf = undefined
this.tagsAllOf = undefined
this.durationMin = undefined
this.durationMax = undefined
this.sort = '-match'
}
toUrlObject () {
return {
startDate: this.startDate,
endDate: this.endDate,
nsfw: this.nsfw,
categoryOneOf: this.categoryOneOf,
licenceOneOf: this.licenceOneOf,
languageOneOf: this.languageOneOf,
tagsOneOf: this.tagsOneOf,
tagsAllOf: this.tagsAllOf,
durationMin: this.durationMin,
durationMax: this.durationMax,
sort: this.sort
}
}
toAPIObject () {
return {
startDate: this.startDate,
endDate: this.endDate,
nsfw: this.nsfw,
categoryOneOf: this.intoArray(this.categoryOneOf),
licenceOneOf: this.intoArray(this.licenceOneOf),
languageOneOf: this.intoArray(this.languageOneOf),
tagsOneOf: this.intoArray(this.tagsOneOf),
tagsAllOf: this.intoArray(this.tagsAllOf),
durationMin: this.durationMin,
durationMax: this.durationMax,
sort: this.sort
}
}
size () {
let acc = 0
const obj = this.toUrlObject()
for (const k of Object.keys(obj)) {
if (k === 'sort') continue // Exception
if (obj[k] !== undefined) acc++
}
return acc
}
private intoArray (value: any) {
if (!value) return undefined
if (typeof value === 'string') return value.split(',')
return [ value ]
}
}
|