diff --git a/package.json b/package.json index 900aebc0..3e8a7b2d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gancio", - "version": "0.9.4", + "version": "0.9.5", "description": "A shared agenda for local communities", "author": "lesion", "scripts": { diff --git a/server/api/controller/event.js b/server/api/controller/event.js index 3d97654d..a528597f 100644 --- a/server/api/controller/event.js +++ b/server/api/controller/event.js @@ -180,8 +180,6 @@ const eventController = { [Op.and]: [ Sequelize.literal(`start_datetime >= ${start}`), Sequelize.literal(`start_datetime <= ${end}`) - // { start_datetime: { [Op.gte]: start } }, - // { start_datetime: { [Op.lte]: end } } ] }, order: [ diff --git a/server/cli.js b/server/cli.js index 37a748b2..c98252f5 100755 --- a/server/cli.js +++ b/server/cli.js @@ -66,6 +66,7 @@ async function setupQuestionnaire() { name: 'db.storage', message: 'sqlite db path', default: '/var/gancio/db.sqlite', + filter: p => path.resolve(p), when: answers => answers.db.dialect === 'sqlite', validate: db_path => db_path.length>0 && fs.existsSync(path.dirname(db_path)) }) @@ -102,7 +103,8 @@ async function setupQuestionnaire() { name: 'upload_path', message: 'Where gancio has to store media?', default: '/var/gancio/', - validate: (p) => { + filter: p => path.resolve(p), + validate: p => { const exists = fs.existsSync(p) if (!exists) consola.warn(`"${p}" does not exists, please create it`) return exists diff --git a/server/notifier.js b/server/notifier.js index e4da7e1e..60f56a79 100644 --- a/server/notifier.js +++ b/server/notifier.js @@ -1,60 +1,82 @@ const mail = require('./api/mail') const bot = require('./api/controller/bot') const settingsController = require('./api/controller/settings') -const config = require('./config.js') +const eventController = require() +const config = require('config') -const { Event, Notification, EventNotification, - User, Place, Tag } = require('./api/models') -let settings +const { event: Event, notification: Notification, eventNotification: EventNotification, + user: User, place: Place, tag: Tag } = require('./api/models') -async function sendNotification(notification, event, eventNotification) { - const promises = [] - switch (notification.type) { - // case 'mail': - // return mail.send(notification.email, 'event', { event, config, notification }) - case 'admin_email': - // const admins = await User.findAll({ where: { is_admin: true } }) - // const admin_emails = admins.map(admin => admin.email) - return mail.send(admin_emails, 'event', { event, to_confirm: true, notification }) - case 'mastodon': - // instance publish - if (settings.mastodon_auth.instance && settings.mastodon_auth.access_token) { - const b = bot.post(settings.mastodon_auth, event).then(b => { - event.activitypub_id = b.data.id - // event.activitypub_ids.push(b.data.id) - return event.save() - }) - promises.push(b) - } - } - return Promise.all(promises) -} - -async function notify() { - settings = await settingsController.settings() - // get all event notification in queue - const eventNotifications = await EventNotification.findAll({ where: { status: 'new' } }) - const promises = eventNotifications.map(async e => { - const event = await Event.findByPk(e.eventId, { include: [User, Place, Tag] }) - if (!event.place) return - const notification = await Notification.findByPk(e.notificationId) - try { - await sendNotification(notification, event, e) - e.status = 'sent' - return e.save() - } catch (err) { - console.error(err) - e.status = 'error' - return e.save() +const notifier = { + async sendNotification(notification, event, eventNotification) { + const promises = [] + switch (notification.type) { + case 'mail': + return mail.send(notification.email, 'event', { event, config, notification }) + case 'admin_email': + const admins = await User.findAll({ where: { is_admin: true } }) + const admin_emails = admins.map(admin => admin.email) + return mail.send(admin_emails, 'event', { event, to_confirm: true, notification }) + case 'mastodon': + // instance publish + if (settings.mastodon_auth.instance && settings.mastodon_auth.access_token) { + const b = bot.post(settings.mastodon_auth, event).then(b => { + event.activitypub_id = b.data.id + event.activitypub_ids.push(b.data.id) + return event.save() + }) + promises.push(b) + } } - }) + return Promise.all(promises) + }, + async notifyEvent(event) { + // insert notifications + const notifications = await eventController.getNotifications(event) + await event.setNotifications(notifications) - return Promise.all(promises) + const promises = notifications.map(async e => { + const notification = await Notification.findByPk(e.notificationId) + try { + await sendNotification(notification, event, e) + e.status = 'sent' + } catch (err) { + console.error(err) + e.status = 'error' + // e.error = err + } + return e.save() + }) + + return Promise.all(promises) + }, + async notify() { + // get all event notification in queue + const eventNotifications = await EventNotification.findAll({ where: { status: 'new' } }) + const promises = eventNotifications.map(async e => { + const event = await Event.findByPk(e.eventId, { include: [User, Place, Tag] }) + if (!event.place) return + const notification = await Notification.findByPk(e.notificationId) + try { + await sendNotification(notification, event, e) + e.status = 'sent' + return e.save() + } catch (err) { + console.error(err) + e.status = 'error' + // e.error = err + return e.save() + } + }) + return Promise.all(promises) + } } -let interval -function startLoop(seconds) { - interval = setInterval(notify, seconds * 1000) -} +// let interval +// function startLoop(seconds) { +// interval = setInterval(notify, seconds * 1000) +// } -startLoop(26000) +// startLoop(26000) + +module.exports = notifier \ No newline at end of file