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.
123 lines
3.1 KiB
123 lines
3.1 KiB
// announcement.js
|
|
// Copyright (C) 2022 DTP Technologies, LLC
|
|
// License: Apache-2.0
|
|
|
|
'use strict';
|
|
|
|
const mongoose = require('mongoose');
|
|
const Announcement = mongoose.model('Announcement');
|
|
|
|
const { SiteService } = require('../../lib/site-lib');
|
|
|
|
class AnnouncementService extends SiteService {
|
|
|
|
constructor (dtp) {
|
|
super(dtp, module.exports);
|
|
}
|
|
|
|
async create (announcementDefinition) {
|
|
const NOW = new Date();
|
|
const { coreNode: coreNodeService } = this.dtp.services;
|
|
|
|
const announcement = new Announcement();
|
|
announcement.created = NOW;
|
|
announcement.title = {
|
|
icon: {
|
|
class: announcementDefinition.titleIconClass,
|
|
color: announcementDefinition.titleIconColor,
|
|
},
|
|
content: announcementDefinition.titleContent,
|
|
};
|
|
announcement.content = announcementDefinition.content.trim();
|
|
|
|
await announcement.save();
|
|
|
|
/*
|
|
* Broadcast the Announcement to your DTP Constellation.
|
|
*/
|
|
const announcementHref = coreNodeService.getLocalUrl(`/announcement/${announcement._id}`);
|
|
await coreNodeService.sendKaleidoscopeEvent({
|
|
action: 'announcement',
|
|
label: announcement.title.content,
|
|
content: announcement.content,
|
|
href: announcementHref,
|
|
});
|
|
|
|
return announcement.toObject();
|
|
}
|
|
|
|
async update (announcement, announcementDefinition) {
|
|
await Announcement.updateOne(
|
|
{ _id: announcement._id },
|
|
{
|
|
$set: {
|
|
title: {
|
|
icon: {
|
|
class: announcementDefinition.titleIconClass,
|
|
color: announcementDefinition.titleIconColor,
|
|
},
|
|
content: announcementDefinition.titleContent,
|
|
},
|
|
content: announcementDefinition.content.trim(),
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
async getLatest (user) {
|
|
const { user: userService } = this.dtp.services;
|
|
let announcements = [ ];
|
|
|
|
if (user) {
|
|
const search = { };
|
|
if (user.lastAnnouncement) {
|
|
search.created = { $gt: user.lastAnnouncement };
|
|
}
|
|
announcements = await Announcement
|
|
.find(search)
|
|
.sort({ created: -1 })
|
|
.limit(1)
|
|
.lean();
|
|
if (announcements && (announcements.length > 0)) {
|
|
await userService.setLastAnnouncement(user, announcements[0]);
|
|
}
|
|
} else {
|
|
announcements = await Announcement
|
|
.find()
|
|
.sort({ created: -1 })
|
|
.limit(1)
|
|
.lean();
|
|
}
|
|
|
|
return announcements;
|
|
}
|
|
|
|
async getById (announcementId) {
|
|
const announcement = await Announcement.findById(announcementId);
|
|
return announcement;
|
|
}
|
|
|
|
async getAnnouncements (pagination) {
|
|
const announcements = await Announcement
|
|
.find()
|
|
.sort({ created: -1 })
|
|
.skip(pagination.skip)
|
|
.limit(pagination.cpp)
|
|
.lean();
|
|
return announcements;
|
|
}
|
|
|
|
async remove (announcement) {
|
|
const { comment: commentService } = this.dtp.services;
|
|
await commentService.deleteForResource(announcement);
|
|
|
|
await Announcement.deleteOne({ _id: announcement._id });
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
logId: 'announcement',
|
|
index: 'announcement',
|
|
className: 'AnnouncementService',
|
|
create: (dtp) => { return new AnnouncementService(dtp); },
|
|
};
|