mirror of
https://framagit.org/les/gancio.git
synced 2025-02-01 00:52:01 +01:00
86 lines
2.7 KiB
JavaScript
86 lines
2.7 KiB
JavaScript
const Place = require('../models/place')
|
|
const Event = require('../models/event')
|
|
const eventController = require('./event')
|
|
const exportController = require('./export')
|
|
|
|
const log = require('../../log')
|
|
const { Op, where, col, fn, cast } = require('sequelize')
|
|
const NOMINATIM_URL = 'https://nominatim.openstreetmap.org/search?limit=3&format=geocodejson&accept-language=it&q='
|
|
|
|
module.exports = {
|
|
|
|
async getEvents (req, res) {
|
|
const placeName = req.params.placeName
|
|
const place = await Place.findOne({ where: { name: placeName }})
|
|
if (!place) {
|
|
log.warn(`Place ${placeName} not found`)
|
|
return res.sendStatus(404)
|
|
}
|
|
|
|
const format = req.params.format || 'json'
|
|
log.debug(`Events for place: ${placeName}`)
|
|
const events = await eventController._select({ places: String(place.id), show_recurrent: true })
|
|
|
|
switch (format) {
|
|
case 'rss':
|
|
return exportController.feed(req, res, events,
|
|
`${res.locals.settings.title} - Place @${place.name}`,
|
|
`${res.locals.settings.baseurl}/feed/rss/place/${place.name}`)
|
|
case 'ics':
|
|
return exportController.ics(req, res, events)
|
|
default:
|
|
return res.json({ events, place })
|
|
}
|
|
|
|
},
|
|
|
|
|
|
async updatePlace (req, res) {
|
|
const place = await Place.findByPk(req.body.id)
|
|
await place.update(req.body)
|
|
res.json(place)
|
|
},
|
|
|
|
async getAll (_req, res) {
|
|
const places = await Place.findAll({
|
|
order: [[cast(fn('COUNT', col('events.placeId')),'INTEGER'), 'DESC']],
|
|
include: [{ model: Event, where: { is_visible: true }, required: true, attributes: [] }],
|
|
group: ['place.id'],
|
|
raw: true
|
|
})
|
|
return res.json(places)
|
|
},
|
|
|
|
async search (req, res) {
|
|
const search = req.query.search.toLocaleLowerCase()
|
|
const places = await Place.findAll({
|
|
order: [[cast(fn('COUNT', col('events.placeId')),'INTEGER'), 'DESC']],
|
|
where: {
|
|
[Op.or]: [
|
|
{ name: where(fn('LOWER', col('name')), 'LIKE', '%' + search + '%' )},
|
|
{ address: where(fn('LOWER', col('address')), 'LIKE', '%' + search + '%')},
|
|
]
|
|
},
|
|
attributes: ['name', 'address', 'details', 'id'],
|
|
include: [{ model: Event, where: { is_visible: true }, required: true, attributes: [] }],
|
|
group: ['place.id'],
|
|
raw: true,
|
|
limit: 10,
|
|
subQuery: false
|
|
})
|
|
|
|
// TOFIX: don't know why limit does not work
|
|
return res.json(places.slice(0, 10))
|
|
},
|
|
|
|
// async _nominatim (req, res) {
|
|
// const details = req.params.place_details
|
|
// const ret = await axios.get(`${NOMINATIM_URL}${details}`, { headers: { 'User-Agent': 'gancio 0.20' } })
|
|
// debug(`${NOMINATIM_URL}${details}`)
|
|
// debug(ret.status)
|
|
// debug(ret.statusText)
|
|
// debug(ret.data)
|
|
// return ret
|
|
// },
|
|
|
|
}
|