diff --git a/src/admin/controllers/mail.controller.ts b/src/admin/controllers/mail.controller.ts new file mode 100644 index 0000000..e4af0b0 --- /dev/null +++ b/src/admin/controllers/mail.controller.ts @@ -0,0 +1,46 @@ +import BaseController from '../../common/base.controller' +import { permission, router } from '../../decorators/router' +import { SysMail } from '../../models/content/SysMail' +import { ZError } from '../../common/ZError' +import { ObjectId } from 'bson' + +export default class MailController extends BaseController { + @permission('shopmail:read') + @router('post /api/mails') + async list(req, res) { + return SysMail.pageQuery(req.params, true) + } + + @permission('shopmail:read') + @router('get /api/mail/:id') + async detail(req, res) { + let { id } = req.params + const record = await SysMail.findById(id) + if (!record) { + throw new ZError(11, 'record not found') + } + return record.toJson() + } + + @permission('shopmail:edit') + @router('post /api/mail/save') + async save(req: any) { + const data = req.params + if (!data._id) { + data.createdBy = req.user.id + data._id = new ObjectId() + } + let record = await SysMail.insertOrUpdate({ _id: data._id }, data) + return record.toJson() + } + + @permission('shopmail:delete') + @router('post /api/mail/delete') + async delete(req: any) { + let { ids } = req.params + if (!ids) { + throw new ZError(11, 'params mismatch') + } + return SysMail.deleteVirtual(ids) + } +} diff --git a/src/admin/controllers/shop.controller.ts b/src/admin/controllers/shop.controller.ts index f05892d..fac1ac8 100644 --- a/src/admin/controllers/shop.controller.ts +++ b/src/admin/controllers/shop.controller.ts @@ -6,6 +6,7 @@ import { Game } from '../../models/content/Game' import { generateQrFile } from '../../services/File' import { isObjectId } from '../../utils/string.util' import { ShopGameExt } from '../../models/shop/ShopGameExt' +import { GameUser } from '../../models/user/GameUser' class ShopController extends BaseController { @permission(['shop:read', 'shopman:read']) @@ -219,4 +220,12 @@ class ShopController extends BaseController { await shop.save() return {} } + + @permission(['shop:edit', 'shopmail:edit']) + @router('post /api/shop/game_users') + async userList(req: any) { + const { shop } = req.params + let users = await GameUser.find({ shops: shop }) + return users.map(o => o.toJson()) + } } diff --git a/src/api/controllers/mail.controller.ts b/src/api/controllers/mail.controller.ts index 03f3e50..7575879 100644 --- a/src/api/controllers/mail.controller.ts +++ b/src/api/controllers/mail.controller.ts @@ -11,7 +11,7 @@ class MailController extends BaseController { async list(req: any) { const { accountId, sid } = req.params await UserMail.updateExpire(accountId) - let mails = await UserMail.find({ accountId, deleted: false }).sort({ status: 1, _id: -1 }) + let mails = await UserMail.find({ accountId }).sort({ status: 1, _id: -1 }) let mailSet: Set = new Set() for (let mail of mails) { mailSet.add(mail.oid) @@ -23,6 +23,7 @@ class MailController extends BaseController { mails.push(mail) } } + mails = mails.filter(o => o.deleted === false) return mails.map(o => o.toJson()) } diff --git a/src/common/Extend.ts b/src/common/Extend.ts index c4a53ec..dfe36b5 100644 --- a/src/common/Extend.ts +++ b/src/common/Extend.ts @@ -407,6 +407,13 @@ interface Date { * @returns {string} 格式化后的时间 */ format(mask: string, local?: boolean): string + + /** + * 增加n天 + * @param {number} days + * @return {Date} + */ + addDays(days: number): Date } Object.defineProperties(Date.prototype, { @@ -475,6 +482,14 @@ Object.defineProperties(Date.prototype, { }, writable: true, }, + + addDays: { + value: function (days: number) { + this.setDate(this.getDate() + days) + return this + }, + writable: true, + }, }) /****************************************扩展Array****************************************/ diff --git a/src/models/Base.ts b/src/models/Base.ts index 84fefdd..bb2ac6c 100644 --- a/src/models/Base.ts +++ b/src/models/Base.ts @@ -1,6 +1,6 @@ import { FindOrCreate } from '@typegoose/typegoose/lib/defaultClasses' -import { checkJson } from '../decorators/nojson' -import { plugin, ReturnModelType } from '@typegoose/typegoose' +import { checkJson, noJson } from '../decorators/nojson' +import { plugin, prop, ReturnModelType } from '@typegoose/typegoose' // @ts-ignore import findOrCreate from 'mongoose-findorcreate' @@ -8,6 +8,7 @@ import { Connection } from 'mongoose' import { ObjectId } from 'bson' import { isTrue } from '../utils/string.util' import { AnyParamConstructor } from '@typegoose/typegoose/lib/types' +import { SysMail } from './content/SysMail' const jsonExcludeKeys = ['updatedAt', '__v'] const saveExcludeKeys = ['createdAt', 'updatedAt', '__v', '_id'] @@ -29,8 +30,54 @@ export abstract class BaseModule extends FindOrCreate { * @param condition * @param data */ - public static async insertOrUpdate(this: ReturnModelType>, condition: any, data: any) { - return this.findOneAndUpdate(condition, data, { upsert: true, new: true }) + public static insertOrUpdate( + this: ReturnModelType>, + condition: any, + data: any, + ) { + return this.findOneAndUpdate(condition, data, { upsert: true, new: true, setDefaultsOnInsert: true }) + } + + /** + * 虚拟删除 + * @param {string[]} ids + */ + public static deleteVirtual(this: ReturnModelType>, ids: string[]) { + return this.updateMany( + // @ts-ignore + { + _id: { $in: ids }, + }, + { + $set: { + deleted: true, + deleteTime: new Date(), + }, + }, + ) + } + + /** + * 自定义分页查询 + * @param data + * @param {boolean} json + */ + public static async pageQuery( + this: ReturnModelType>, + data: any, + json: boolean = false, + ) { + let { start, limit, page } = data + limit = +limit || 10 + start = +start || (+page - 1) * limit || 0 + // @ts-ignore + let { opt, sort } = this.parseQueryParam(data) + let records = await this.find(opt).sort(sort).skip(start).limit(limit) + let total = await this.countDocuments(opt) + if (json) { + records.map((o: T) => o.toJson()) + } + return { records, total, start, limit } } public toJson() { @@ -89,7 +136,7 @@ export abstract class BaseModule extends FindOrCreate { } } } - if (params.hasOwnProperty('key')) { + if (params.hasOwnProperty('key') && params['key']) { let orArr = [] if (options?.matchKey) { if (Array.isArray(options?.matchKey)) {