增加邮件相关后台接口
This commit is contained in:
parent
cd26c1270f
commit
5dc346a3c3
46
src/admin/controllers/mail.controller.ts
Normal file
46
src/admin/controllers/mail.controller.ts
Normal 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)
|
||||
}
|
||||
}
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
@ -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())
|
||||
}
|
||||
|
||||
|
@ -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****************************************/
|
||||
|
@ -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)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user