You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.1 KiB
TypeScript
86 lines
2.1 KiB
TypeScript
4 years ago
|
import { ObjectID } from 'mongodb';
|
||
4 years ago
|
import * as user from './user';
|
||
4 years ago
|
import { Mdoc } from '../interface';
|
||
4 years ago
|
import * as db from '../service/db';
|
||
4 years ago
|
import * as bus from '../service/bus';
|
||
5 years ago
|
|
||
|
const coll = db.collection('message');
|
||
|
|
||
4 years ago
|
export const FLAG_UNREAD = 1;
|
||
4 years ago
|
export const FLAG_ALERT = 2;
|
||
4 years ago
|
|
||
4 years ago
|
export async function send(
|
||
|
from: number, to: number,
|
||
|
content: string, flag: number = FLAG_UNREAD,
|
||
|
): Promise<Mdoc> {
|
||
4 years ago
|
const res = await coll.insertOne({
|
||
4 years ago
|
from, to, content, flag,
|
||
5 years ago
|
});
|
||
4 years ago
|
const mdoc = {
|
||
4 years ago
|
from, to, content, _id: res.insertedId, flag,
|
||
4 years ago
|
};
|
||
4 years ago
|
if (from !== to) {
|
||
|
// ENHANCE domainId?
|
||
|
const udoc = await user.getById('system', to);
|
||
|
bus.publish(`user_message-${to}`, { mdoc, udoc });
|
||
|
}
|
||
|
return mdoc;
|
||
5 years ago
|
}
|
||
|
|
||
4 years ago
|
export async function get(_id: ObjectID): Promise<Mdoc | null> {
|
||
4 years ago
|
return await coll.findOne({ _id });
|
||
5 years ago
|
}
|
||
|
|
||
4 years ago
|
export async function getByUser(uid: number): Promise<Mdoc[]> {
|
||
|
return await coll.find({ $or: [{ from: uid }, { to: uid }] }).sort('_id', 1).toArray();
|
||
4 years ago
|
}
|
||
|
|
||
4 years ago
|
export async function getMany(query: any, sort: any, page: number, limit: number): Promise<Mdoc[]> {
|
||
|
return await coll.find(query).sort(sort)
|
||
5 years ago
|
.skip((page - 1) * limit).limit(limit)
|
||
|
.toArray();
|
||
|
}
|
||
|
|
||
4 years ago
|
export async function setFlag(messageId: ObjectID, flag: number): Promise<Mdoc | null> {
|
||
4 years ago
|
const result = await coll.findOneAndUpdate(
|
||
|
{ _id: messageId },
|
||
|
{ $bit: { flag: { xor: flag } } },
|
||
|
{ returnOriginal: false },
|
||
|
);
|
||
|
return result.value;
|
||
|
}
|
||
|
|
||
4 years ago
|
export async function del(_id: ObjectID) {
|
||
|
return await coll.deleteOne({ _id });
|
||
5 years ago
|
}
|
||
|
|
||
4 years ago
|
export function count(query: any) {
|
||
5 years ago
|
return coll.find(query).count();
|
||
|
}
|
||
|
|
||
4 years ago
|
export function getMulti(uid: number) {
|
||
5 years ago
|
return coll.find({ $or: [{ from: uid }, { to: uid }] });
|
||
|
}
|
||
|
|
||
4 years ago
|
function ensureIndexes() {
|
||
5 years ago
|
return Promise.all([
|
||
|
coll.createIndex({ to: 1, _id: -1 }),
|
||
|
coll.createIndex({ from: 1, _id: -1 }),
|
||
|
]);
|
||
|
}
|
||
|
|
||
4 years ago
|
global.Hydro.postInit.push(ensureIndexes);
|
||
4 years ago
|
global.Hydro.model.message = {
|
||
4 years ago
|
FLAG_UNREAD,
|
||
4 years ago
|
FLAG_ALERT,
|
||
4 years ago
|
|
||
5 years ago
|
count,
|
||
|
get,
|
||
4 years ago
|
getByUser,
|
||
5 years ago
|
del,
|
||
4 years ago
|
setFlag,
|
||
5 years ago
|
getMany,
|
||
|
getMulti,
|
||
5 years ago
|
send,
|
||
5 years ago
|
};
|