You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CoreID/app/models/system/Announcement.model.js

108 lines
3.0 KiB

const { Model } = require('flitter-orm')
class AnnouncementModel extends Model {
static get services() {
return [...super.services, 'models', 'jobs', 'configs']
}
static get schema() {
return {
title: String,
message: String,
user_ids: [String],
group_ids: [String],
type: String, // login | email | banner
}
}
async to_api() {
return {
id: this.id,
title: this.title,
message: this.message,
user_ids: this.user_ids,
group_ids: this.group_ids,
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()
} else if ( this.type === 'login' ) {
await this.populate_logins()
}
}
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}`)
}
}
async populate_logins() {
const users = await this.all_users()
const LoginMessage = this.models.get('LoginMessage')
for ( const user of users ) {
await LoginMessage.create(user, this.title, this.message)
}
}
}
module.exports = exports = AnnouncementModel