mirror of https://github.com/iptv-org/iptv
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.0 KiB
TypeScript
79 lines
2.0 KiB
TypeScript
import { Collection, Dictionary } from '@freearhey/core'
|
|
import { Country, Region, Subdivision } from '.'
|
|
import type { CityData, CitySerializedData } from '../types/city'
|
|
|
|
export class City {
|
|
code: string
|
|
name: string
|
|
countryCode: string
|
|
country?: Country
|
|
subdivisionCode?: string
|
|
subdivision?: Subdivision
|
|
wikidataId: string
|
|
regions?: Collection
|
|
|
|
constructor(data?: CityData) {
|
|
if (!data) return
|
|
|
|
this.code = data.code
|
|
this.name = data.name
|
|
this.countryCode = data.country
|
|
this.subdivisionCode = data.subdivision || undefined
|
|
this.wikidataId = data.wikidata_id
|
|
}
|
|
|
|
withCountry(countriesKeyByCode: Dictionary): this {
|
|
this.country = countriesKeyByCode.get(this.countryCode)
|
|
|
|
return this
|
|
}
|
|
|
|
withSubdivision(subdivisionsKeyByCode: Dictionary): this {
|
|
if (!this.subdivisionCode) return this
|
|
|
|
this.subdivision = subdivisionsKeyByCode.get(this.subdivisionCode)
|
|
|
|
return this
|
|
}
|
|
|
|
withRegions(regions: Collection): this {
|
|
this.regions = regions.filter((region: Region) =>
|
|
region.countryCodes.includes(this.countryCode)
|
|
)
|
|
|
|
return this
|
|
}
|
|
|
|
getRegions(): Collection {
|
|
if (!this.regions) return new Collection()
|
|
|
|
return this.regions
|
|
}
|
|
|
|
serialize(): CitySerializedData {
|
|
return {
|
|
code: this.code,
|
|
name: this.name,
|
|
countryCode: this.countryCode,
|
|
country: this.country ? this.country.serialize() : undefined,
|
|
subdivisionCode: this.subdivisionCode || null,
|
|
subdivision: this.subdivision ? this.subdivision.serialize() : undefined,
|
|
wikidataId: this.wikidataId
|
|
}
|
|
}
|
|
|
|
deserialize(data: CitySerializedData): this {
|
|
this.code = data.code
|
|
this.name = data.name
|
|
this.countryCode = data.countryCode
|
|
this.country = data.country ? new Country().deserialize(data.country) : undefined
|
|
this.subdivisionCode = data.subdivisionCode || undefined
|
|
this.subdivision = data.subdivision
|
|
? new Subdivision().deserialize(data.subdivision)
|
|
: undefined
|
|
this.wikidataId = data.wikidataId
|
|
|
|
return this
|
|
}
|
|
}
|