Add populate announcement job
This commit is contained in:
parent
1458e4126b
commit
9a35bd60e1
@ -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())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
29
app/jobs/PopulateAnnouncement.job.js
Normal file
29
app/jobs/PopulateAnnouncement.job.js
Normal 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
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user