Strapi API: настроить службу пользовательских запросов для поиска ближайшего местоположения в диапазоне? - PullRequest
0 голосов
/ 29 мая 2018

Отправляя широту и долготу текущего местоположения, я хотел бы найти ближайший аэропорт в моей коллекции.

Я использовал geodist для нахождения расстояния между двумя координатами широты / долготы.

Вопрос: Можно ли сделать запрос после получения всей коллекции аэропорта, чтобы проверить, доступно ли текущее местоположение на определенном расстоянии?

Например, Когда минимальное текущее расстояние до элемента коллекций находится в пределах 100 км, я хотел бы показать этот элемент как результат.

This My Query ...

return Airport
    .find(_.pick(params, _.keys(Airport.schema.paths)))
    .populate(_.keys(_.groupBy(_.reject(
        strapi.models.airport.associations, {autoPopulate: false}), 'alias')).join(' '));

Это мой маршрут ...

{
    "method": "GET",
    "path": "/airport/:latitude/:longitude/",
    "handler": "Airport.findOne",
    "config": {
        "policies": []
     }
},

Это мой контроллер ...

findOne: async (ctx) => {
    return strapi.services.airport.fetch(ctx.params);
},

1 Ответ

0 голосов
/ 10 апреля 2019

Может быть, вы решили, но если кто-то может помочь, мой подход был:

  /**
   * Promise to fetch all near shops.
   *
   * @return {Promise}
   */

  fetchAllNear: async (params) => {
    const convertedParams = strapi.utils.models.convertParams('shops', params)

    let data = {}
    let populatedShopsActive = {}

    data = await new Promise((resolve, reject) => {
      Shops.aggregate([
        {
          '$geoNear': {
            'near': { type: 'Point', coordinates: [ parseFloat(params._lon), parseFloat(params._lat) ] },
            'limit': 100,
            'maxDistance': parseFloat(params._distance),
            'distanceField': 'distance',
            'distanceMultiplier': 0.001,
            'spherical': true
          }
        }
      ]).exec(async (err, shops) => {
        await Shops.populate(shops, {
          path: _.keys(_.groupBy(_.reject(strapi.models.shops.associations, {autoPopulate: false}), 'alias')).join(' '),
          populate: {
            path: 'shop image',
            populate: {
              path: 'image'
            }
          }
        }, async (err, populatedShops) => {
          if (err) {
            reject(err)
          } else {
            if (params._todayOffers === 'true') {
              populatedShopsActive = await _.forEach(populatedShops, async (shop) => {
                await _.remove(shop.offers, (offer) => {
                  return !(_moment(offer.end_date).isSame(new Date(), 'day'))
                })
              })
            } else {
              populatedShopsActive = await _.forEach(populatedShops, async (shop) => {
                await _.remove(shop.offers, (offer) => {
                  return !(_moment(new Date()).isBetween(offer.start_date, offer.end_date, null, '[]'))
                })
              })
            }

            resolve(populatedShopsActive)
          }
        })
      })
    })

    return data
  },
...