parent
143fccf179
commit
1458e4126b
@ -0,0 +1,98 @@
|
||||
import CRUDBase from '../CRUDBase.js'
|
||||
|
||||
class AnnouncementResource extends CRUDBase {
|
||||
endpoint = '/api/v1/system/announcements'
|
||||
required_fields = ['user_ids', 'group_ids', 'title', 'message', 'type']
|
||||
permission_base = 'v1:system:announcements'
|
||||
|
||||
item = 'System Announcement'
|
||||
plural = 'System Announcements'
|
||||
|
||||
listing_definition = {
|
||||
display: `
|
||||
System announcements are administrative messages that you want all or some of your users to see. These messages can be delivered via e-mail, as a message after login, or as a system banner announcement.
|
||||
`,
|
||||
columns: [
|
||||
{
|
||||
name: 'Title',
|
||||
field: 'title',
|
||||
},
|
||||
{
|
||||
name: 'Message',
|
||||
field: 'message',
|
||||
renderer: (message) => String(message).slice(0, 150),
|
||||
},
|
||||
],
|
||||
actions: [
|
||||
{
|
||||
type: 'resource',
|
||||
position: 'main',
|
||||
action: 'insert',
|
||||
text: 'Create New',
|
||||
color: 'success',
|
||||
},
|
||||
{
|
||||
type: 'resource',
|
||||
position: 'row',
|
||||
action: 'delete',
|
||||
icon: 'fa fa-times',
|
||||
color: 'danger',
|
||||
confirm: true,
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
form_definition = {
|
||||
fields: [
|
||||
{
|
||||
name: 'Title',
|
||||
field: 'title',
|
||||
type: 'text',
|
||||
},
|
||||
{
|
||||
name: 'Message',
|
||||
field: 'message',
|
||||
type: 'textarea',
|
||||
},
|
||||
{
|
||||
name: 'Users',
|
||||
field: 'user_ids',
|
||||
type: 'select.dynamic.multiple',
|
||||
options: {
|
||||
resource: 'auth/User',
|
||||
display: (user) => `${user.last_name}, ${user.first_name} (${user.uid})`,
|
||||
value: 'id',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'Groups',
|
||||
field: 'group_ids',
|
||||
type: 'select.dynamic.multiple',
|
||||
options: {
|
||||
resource: 'auth/Group',
|
||||
display: (group) => `${group.name}`,
|
||||
value: 'id',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'Type',
|
||||
field: 'type',
|
||||
type: 'select',
|
||||
options: [
|
||||
{ display: 'Login Intercept', value: 'login' },
|
||||
{ display: 'E-Mail', value: 'email' },
|
||||
{ display: 'System Banner', value: 'banner' },
|
||||
],
|
||||
},
|
||||
],
|
||||
handlers: {
|
||||
insert: {
|
||||
action: 'redirect',
|
||||
next: '/dash/c/listing/system/Announcement',
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const system_announcement = new AnnouncementResource()
|
||||
export { system_announcement }
|
@ -0,0 +1,84 @@
|
||||
const { Controller } = require('libflitter')
|
||||
|
||||
class ReflectController extends Controller {
|
||||
static get services() {
|
||||
return [...super.services, 'routers', 'models', 'activity']
|
||||
}
|
||||
|
||||
async get_announcements(req, res, next) {
|
||||
const Announcement = this.models.get('system:Announcement')
|
||||
const announcements = await Announcement.find()
|
||||
|
||||
const data = []
|
||||
for ( const announcement of announcements ) {
|
||||
data.push(await announcement.to_api())
|
||||
}
|
||||
|
||||
return res.api(data)
|
||||
}
|
||||
|
||||
async get_announcement(req, res, next) {
|
||||
const Announcement = this.models.get('system:Announcement')
|
||||
const announcement = await Announcement.findById(req.params.id)
|
||||
|
||||
if ( !announcement )
|
||||
return res.status(404)
|
||||
.message(req.T('api.announcement_not_found'))
|
||||
.api()
|
||||
|
||||
return res.api(await announcement.to_api())
|
||||
}
|
||||
|
||||
async create_announcement(req, res, next) {
|
||||
const Announcement = this.models.get('system:Announcement')
|
||||
|
||||
const required_fields = ['title', 'message', 'user_ids', 'group_ids', 'type']
|
||||
for ( const field of required_fields ) {
|
||||
if ( !req.body[field] )
|
||||
return res.status(400)
|
||||
.message(`${req.T('api.missing_field')} ${field}`)
|
||||
.api()
|
||||
}
|
||||
|
||||
if ( !Array.isArray(req.body.user_ids) )
|
||||
return res.status(400)
|
||||
.message(`${req.T('api.improper_field')} user_ids`)
|
||||
.api()
|
||||
|
||||
if ( !Array.isArray(req.body.group_ids) )
|
||||
return res.status(400)
|
||||
.message(`${req.T('api.improper_field')} group_ids`)
|
||||
.api()
|
||||
|
||||
if ( !['email', 'login', 'banner'].includes(req.body.type) )
|
||||
return res.status(400)
|
||||
.message(`${req.T('api.improper_field')} type`)
|
||||
.api()
|
||||
|
||||
const announcement = new Announcement({
|
||||
title: req.body.title,
|
||||
message: req.body.message,
|
||||
user_ids: req.body.user_ids,
|
||||
group_ids: req.body.group_ids,
|
||||
type: req.body.type,
|
||||
})
|
||||
|
||||
await announcement.save()
|
||||
return res.api(await announcement.to_api())
|
||||
}
|
||||
|
||||
async delete_announcement(req, res, next) {
|
||||
const Announcement = this.models.get('system:Announcement')
|
||||
const announcement = await Announcement.findById(req.params.id)
|
||||
|
||||
if ( !announcement )
|
||||
return res.status(404)
|
||||
.message(req.T('api.announcement_not_found'))
|
||||
.api()
|
||||
|
||||
await announcement.delete()
|
||||
return res.api()
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = exports = ReflectController
|
@ -0,0 +1,26 @@
|
||||
const { Model } = require('flitter-orm')
|
||||
|
||||
class AnnouncementModel extends Model {
|
||||
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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = exports = AnnouncementModel
|
@ -0,0 +1,34 @@
|
||||
const system_routes = {
|
||||
prefix: '/api/v1/system',
|
||||
|
||||
middleware: [
|
||||
'auth:APIRoute'
|
||||
],
|
||||
|
||||
get: {
|
||||
'/announcements': [
|
||||
['middleware::api:Permission', { check: 'v1:system:announcements:list' }],
|
||||
'controller::api:v1:System.get_announcements',
|
||||
],
|
||||
'/announcements/:id': [
|
||||
['middleware::api:Permission', { check: 'v1:system:announcements:get' }],
|
||||
'controller::api:v1:System.get_announcement',
|
||||
],
|
||||
},
|
||||
|
||||
post: {
|
||||
'/announcements': [
|
||||
['middleware::api:Permission', { check: 'v1:system:announcements:create'}],
|
||||
'controller::api:v1:System.create_announcement',
|
||||
],
|
||||
},
|
||||
|
||||
delete: {
|
||||
'/announcements/:id': [
|
||||
['middleware::api:Permission', { check: 'v1:system:announcements:delete' }],
|
||||
'controller::api:v1:System.delete_announcement',
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
module.exports = exports = system_routes
|
Loading…
Reference in new issue