catarse/catarse.js

View on GitHub
legacy/src/vms/cities-search-vm.ts

Summary

Maintainability
A
0 mins
Test Coverage
import _ from 'underscore'
import { catarse } from '../api'
import models from '../models'
import { City } from '../@types/city'
import { State } from '../@types/state'
import { CityState } from '../@types/city-state'

type ExtendedWindow = {
    replaceDiacritics(inputText : string): string;
}

const { replaceDiacritics } = window as any as ExtendedWindow;

export async function searchCitiesGroupedByState(inputText: string) : Promise<CityState[]> {

    const cities = await searchCities(inputText);
    const cityGroup : { [key:string] : City[] } = {};

    for (let city of cities) {
        cityGroup[city.state_name] = [city].concat(cityGroup[city.state_name] || []);
    }

    return cityGroupToList(cityGroup);
}

export async function searchCities(inputText : string) : Promise<City[]> {
    
    const filters = catarse.filtersVM({
        search_index: 'ilike'
    }).order({ name: 'asc' });

    filters.search_index(replaceDiacritics(inputText));

    return await models.city.getPage(filters.parameters());
}

export async function getCityById(city_id : number) : Promise<City> {
    const filters = catarse.filtersVM({
        id: 'eq'
    }).id(city_id)

    return _.first(await models.city.getPage(filters.parameters()));
}

export function cityGroupToList(citiesByStateOnKey: {[key:string] : City[]}) : CityState[] {
    
    const cityList : CityState[] = [];

    for (const stateName of Object.keys(citiesByStateOnKey)) {
        const cities = citiesByStateOnKey[stateName];
        const firstCity = cities[0];
        const cityState : CityState = {
            state: {
                acronym: firstCity.acronym, 
                state_name: stateName
            }
        };

        cityList.push(cityState);

        for (const city of cities) {
            const cityState : CityState = {
                state: {
                    acronym: firstCity.acronym, 
                    state_name: stateName
                },
                city,
            };
            cityList.push(cityState);
        }
    }

    return cityList;
}