core: blog (draft)

This commit is contained in:
undefined committed 2021-12-18 23:03:09 +08:00
1 parent d40f56e676
commit e935558702
17 files changed
+440 -18

No files matched your search

+92
View File
@@ -0,0 +1,92 @@
import { omit } from 'lodash';
import { FilterQuery, ObjectID } from 'mongodb';
import { BlogDoc } from '../interface';
import * as bus from '../service/bus';
import { NumberKeys } from '../typeutils';
import * as document from './document';
export async function add(
owner: number, title: string, content: string,
ip: string | null = null,
): Promise<ObjectID> {
const payload: Partial<BlogDoc> = {
content,
owner,
title,
ip,
nReply: 0,
updateAt: new Date(),
views: 0,
};
await bus.serial('blog/before-add', payload);
const res = await document.add(
'system', payload.content!, payload.owner!, document.TYPE_BLOG,
null, null, null, omit(payload, ['domainId', 'content', 'owner']),
);
payload.docId = res;
await bus.emit('blog/add', payload);
return payload.docId;
}
export async function get(did: ObjectID): Promise<BlogDoc> {
return await document.get('system', document.TYPE_BLOG, did);
}
export function edit(did: ObjectID, title: string, content: string): Promise<BlogDoc> {
const payload = { title, content };
return document.set('system', document.TYPE_BLOG, did, payload);
}
export function inc(did: ObjectID, key: NumberKeys<BlogDoc>, value: number): Promise<BlogDoc | null> {
return document.inc('system', document.TYPE_BLOG, did, key, value);
}
export function del(did: ObjectID): Promise<never> {
return Promise.all([
document.deleteOne('system', document.TYPE_BLOG, did),
document.deleteMultiStatus('system', document.TYPE_BLOG, { docId: did }),
]) as any;
}
export function count(query: FilterQuery<BlogDoc>) {
return document.count('system', document.TYPE_BLOG, query);
}
export function getMulti(query: FilterQuery<BlogDoc> = {}) {
return document.getMulti('system', document.TYPE_BLOG, query)
.sort({ _id: -1 });
}
export async function addReply(did: ObjectID, owner: number, content: string, ip: string): Promise<ObjectID> {
const [[, drid]] = await Promise.all([
document.push('system', document.TYPE_BLOG, did, 'reply', content, owner, { ip }),
document.incAndSet('system', document.TYPE_BLOG, did, 'nReply', 1, { updateAt: new Date() }),
]);
return drid;
}
export function setStar(did: ObjectID, uid: number, star: boolean) {
return document.setStatus('system', document.TYPE_BLOG, did, uid, { star });
}
export function getStatus(did: ObjectID, uid: number) {
return document.getStatus('system', document.TYPE_BLOG, did, uid);
}
export function setStatus(did: ObjectID, uid: number, $set) {
return document.setStatus('system', document.TYPE_BLOG, did, uid, $set);
}
global.Hydro.model.blog = {
add,
get,
inc,
edit,
del,
count,
getMulti,
addReply,
setStar,
getStatus,
setStatus,
};
+1 -1
View File
@@ -264,8 +264,8 @@ export async function getVnode(domainId: string, type: number, id: string, uid?:
return { ...tdoc, type, id: _id };
}
return {
...await getNode(domainId, id),
title: id,
...await getNode(domainId, id),
type,
id,
};
+14 -9
View File
@@ -4,7 +4,9 @@ import {
Cursor, FilterQuery, ObjectID, OnlyFieldsOfType, UpdateQuery,
} from 'mongodb';
import {
Content, DiscussionDoc, DiscussionReplyDoc, ProblemDoc, ProblemStatusDoc, Tdoc, TrainingDoc,
BlogDoc, Content, DiscussionDoc,
DiscussionReplyDoc, ProblemDoc, ProblemStatusDoc,
Tdoc, TrainingDoc,
} from '../interface';
import * as bus from '../service/bus';
import db from '../service/db';
@@ -25,16 +27,18 @@ export const TYPE_DISCUSSION_REPLY: 22 = 22;
export const TYPE_CONTEST: 30 = 30;
export const TYPE_TRAINING: 40 = 40;
export const TYPE_HOMEWORK: 60 = 60;
export const TYPE_BLOG: 70 = 70;
export interface DocType {
[TYPE_PROBLEM]: ProblemDoc,
[TYPE_PROBLEM_SOLUTION]: any,
[TYPE_PROBLEM_LIST]: any,
[TYPE_DISCUSSION_NODE]: any,
[TYPE_DISCUSSION]: DiscussionDoc,
[TYPE_DISCUSSION_REPLY]: DiscussionReplyDoc,
[TYPE_CONTEST]: Tdoc,
[TYPE_TRAINING]: TrainingDoc,
[TYPE_PROBLEM]: ProblemDoc;
[TYPE_PROBLEM_SOLUTION]: any;
[TYPE_PROBLEM_LIST]: any;
[TYPE_DISCUSSION_NODE]: any;
[TYPE_DISCUSSION]: DiscussionDoc;
[TYPE_DISCUSSION_REPLY]: DiscussionReplyDoc;
[TYPE_CONTEST]: Tdoc;
[TYPE_TRAINING]: TrainingDoc;
[TYPE_BLOG]: BlogDoc;
}
export interface DocStatusType {
@@ -479,4 +483,5 @@ global.Hydro.model.document = {
TYPE_PROBLEM_LIST,
TYPE_PROBLEM_SOLUTION,
TYPE_TRAINING,
TYPE_BLOG,
};
+1 -1
View File
@@ -30,7 +30,7 @@ class RecordModel {
const pending = await task.count({ uid });
const timeRecent = await RecordModel.coll
.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'hour')) }, uid }).project({ time: 1 }).toArray();
return base - ((pending * 100 + 1) * (sum(timeRecent.map((i) => i.time || 0)) / 10000));
return base - ((pending * 1000 + 1) * (sum(timeRecent.map((i) => i.time || 0)) / 10000));
}
static async get(_id: ObjectID): Promise<RecordDoc | null>