增加邮件相关后台接口

This commit is contained in:
zhl 2021-06-09 19:22:27 +08:00
parent cd26c1270f
commit 5dc346a3c3
5 changed files with 124 additions and 6 deletions

View File

@ -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)
}
}

View File

@ -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())
}
}

View File

@ -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<string> = 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())
}

View File

@ -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****************************************/

View File

@ -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<T>(this: ReturnModelType<AnyParamConstructor<T>>, condition: any, data: any) {
return this.findOneAndUpdate(condition, data, { upsert: true, new: true })
public static insertOrUpdate<T extends BaseModule>(
this: ReturnModelType<AnyParamConstructor<T>>,
condition: any,
data: any,
) {
return this.findOneAndUpdate(condition, data, { upsert: true, new: true, setDefaultsOnInsert: true })
}
/**
*
* @param {string[]} ids
*/
public static deleteVirtual<T extends BaseModule>(this: ReturnModelType<AnyParamConstructor<T>>, 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<T extends BaseModule>(
this: ReturnModelType<AnyParamConstructor<T>>,
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)) {