-import { NSFWQuery, SearchTargetType } from '@shared/models'
+import { BooleanBothQuery, BooleanQuery, SearchTargetType, VideosSearchQuery } from '@shared/models'
export class AdvancedSearch {
startDate: string // ISO 8601
originallyPublishedStartDate: string // ISO 8601
originallyPublishedEndDate: string // ISO 8601
- nsfw: NSFWQuery
+ nsfw: BooleanBothQuery
categoryOneOf: string
languageOneOf: string
- tagsOneOf: string
- tagsAllOf: string
+ tagsOneOf: string[]
+ tagsAllOf: string[]
durationMin: number // seconds
durationMax: number // seconds
+ isLive: BooleanQuery
+
sort: string
searchTarget: SearchTargetType
endDate?: string
originallyPublishedStartDate?: string
originallyPublishedEndDate?: string
- nsfw?: NSFWQuery
+ nsfw?: BooleanBothQuery
categoryOneOf?: string
licenceOneOf?: string
languageOneOf?: string
- tagsOneOf?: string
- tagsAllOf?: string
+
+ tagsOneOf?: any
+ tagsAllOf?: any
+
+ isLive?: BooleanQuery
+
durationMin?: string
durationMax?: string
sort?: string
this.originallyPublishedEndDate = options.originallyPublishedEndDate || undefined
this.nsfw = options.nsfw || undefined
+ this.isLive = options.isLive || 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.tagsOneOf = this.intoArray(options.tagsOneOf)
+ this.tagsAllOf = this.intoArray(options.tagsAllOf)
this.durationMin = parseInt(options.durationMin, 10)
this.durationMax = parseInt(options.durationMax, 10)
}
containsValues () {
- const exceptions = new Set([ 'sort', 'searchTarget' ])
-
const obj = this.toUrlObject()
for (const k of Object.keys(obj)) {
if (this.silentFilters.has(k)) continue
- if (obj[k] !== undefined && obj[k] !== '') return true
+ if (this.isValidValue(obj[k])) return true
}
return false
this.tagsAllOf = undefined
this.durationMin = undefined
this.durationMax = undefined
+ this.isLive = undefined
this.sort = '-match'
}
tagsAllOf: this.tagsAllOf,
durationMin: this.durationMin,
durationMax: this.durationMax,
+ isLive: this.isLive,
sort: this.sort,
searchTarget: this.searchTarget
}
}
- toAPIObject () {
+ toAPIObject (): VideosSearchQuery {
+ let isLive: boolean
+ if (this.isLive) isLive = this.isLive === 'true'
+
return {
startDate: this.startDate,
endDate: this.endDate,
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),
+ tagsOneOf: this.tagsOneOf,
+ tagsAllOf: this.tagsAllOf,
durationMin: this.durationMin,
durationMax: this.durationMax,
+ isLive,
sort: this.sort,
searchTarget: this.searchTarget
}
for (const k of Object.keys(obj)) {
if (this.silentFilters.has(k)) continue
- if (obj[k] !== undefined && obj[k] !== '') acc++
+ if (this.isValidValue(obj[k])) acc++
}
return acc
}
+ private isValidValue (val: any) {
+ if (val === undefined) return false
+ if (val === '') return false
+ if (Array.isArray(val) && val.length === 0) return false
+
+ return true
+ }
+
private intoArray (value: any) {
if (!value) return undefined
if (Array.isArray(value)) return value