Add populate announcement job

This commit is contained in:
garrettmills 2020-08-12 21:49:02 -05:00
parent 1458e4126b
commit 9a35bd60e1
No known key found for this signature in database
GPG Key ID: 6ACD58D6ADACFC6E
3 changed files with 101 additions and 0 deletions

View File

@ -64,6 +64,7 @@ class ReflectController extends Controller {
}) })
await announcement.save() await announcement.save()
await announcement.log_populate()
return res.api(await announcement.to_api()) return res.api(await announcement.to_api())
} }

View File

@ -0,0 +1,29 @@
const { Job } = require('flitter-jobs')
class PopulateAnnouncementJob extends Job {
static get services() {
return [...super.services, 'models', 'output']
}
async execute(job) {
const { data } = job
const { announcement_id } = data
try {
const Announcement = this.models.get('system:Announcement')
const announcement = await Announcement.findById(announcement_id)
if ( !announcement ) {
this.output.error(`Unable to find announcement with ID: ${announcement_id}`)
throw new Error('Unable to find announcement with that ID.')
}
await announcement.populate()
this.output.success('Populated announcements.')
} catch (e) {
this.output.error(e)
}
}
}
module.exports = exports = PopulateAnnouncementJob

View File

@ -1,6 +1,10 @@
const { Model } = require('flitter-orm') const { Model } = require('flitter-orm')
class AnnouncementModel extends Model { class AnnouncementModel extends Model {
static get services() {
return [...super.services, 'models', 'jobs', 'configs']
}
static get schema() { static get schema() {
return { return {
title: String, title: String,
@ -21,6 +25,73 @@ class AnnouncementModel extends Model {
type: this.type, type: this.type,
} }
} }
async groups() {
const Group = this.models.get('auth:Group')
return await Group.find({ _id: { $in: this.group_ids.map(x => this.constructor.to_object_id(x)) } })
}
async users() {
const User = this.models.get('auth:User')
return await User.find({ _id: { $in: this.user_ids.map(x => this.constructor.to_object_id(x)) } })
}
async all_users() {
const users = await this.users()
const groups = await this.groups()
const all_users = users
const all_user_ids = users.map(x => x.id)
for ( const group of groups ) {
const group_users = await group.users()
for ( const user of group_users ) {
if ( !all_user_ids.includes(user.id) ) {
all_user_ids.push(user.id)
all_users.push(user)
}
}
}
return all_users
}
async log_populate() {
await this.jobs.queue('notifications').add('PopulateAnnouncement', {
announcement_id: this.id,
})
}
async populate() {
if ( this.type === 'email' ) {
await this.populate_emails()
} else if ( this.type === 'banner' ) {
await this.populate_banners()
}
}
async populate_emails() {
const users = await this.all_users()
for ( const user of users ) {
await this.jobs.queue('mailer').add('EMail', {
to: user.email,
subject: 'Announcement | ' + this.configs.get('app.name'),
email_params: {
header_text: this.title,
body_paragraphs: [
this.message,
],
},
})
}
}
async populate_banners() {
const users = await this.all_users()
const Message = this.models.get('Message')
for ( const user of users ) {
await Message.create(user, `${this.title} - ${this.message}`)
}
}
} }
module.exports = exports = AnnouncementModel module.exports = exports = AnnouncementModel