增加邮件相关后台接口
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 { generateQrFile } from '../../services/File'
|
||||||
import { isObjectId } from '../../utils/string.util'
|
import { isObjectId } from '../../utils/string.util'
|
||||||
import { ShopGameExt } from '../../models/shop/ShopGameExt'
|
import { ShopGameExt } from '../../models/shop/ShopGameExt'
|
||||||
|
import { GameUser } from '../../models/user/GameUser'
|
||||||
|
|
||||||
class ShopController extends BaseController {
|
class ShopController extends BaseController {
|
||||||
@permission(['shop:read', 'shopman:read'])
|
@permission(['shop:read', 'shopman:read'])
|
||||||
@ -219,4 +220,12 @@ class ShopController extends BaseController {
|
|||||||
await shop.save()
|
await shop.save()
|
||||||
return {}
|
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) {
|
async list(req: any) {
|
||||||
const { accountId, sid } = req.params
|
const { accountId, sid } = req.params
|
||||||
await UserMail.updateExpire(accountId)
|
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()
|
let mailSet: Set<string> = new Set()
|
||||||
for (let mail of mails) {
|
for (let mail of mails) {
|
||||||
mailSet.add(mail.oid)
|
mailSet.add(mail.oid)
|
||||||
@ -23,6 +23,7 @@ class MailController extends BaseController {
|
|||||||
mails.push(mail)
|
mails.push(mail)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mails = mails.filter(o => o.deleted === false)
|
||||||
return mails.map(o => o.toJson())
|
return mails.map(o => o.toJson())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,6 +407,13 @@ interface Date {
|
|||||||
* @returns {string} 格式化后的时间
|
* @returns {string} 格式化后的时间
|
||||||
*/
|
*/
|
||||||
format(mask: string, local?: boolean): string
|
format(mask: string, local?: boolean): string
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 增加n天
|
||||||
|
* @param {number} days
|
||||||
|
* @return {Date}
|
||||||
|
*/
|
||||||
|
addDays(days: number): Date
|
||||||
}
|
}
|
||||||
|
|
||||||
Object.defineProperties(Date.prototype, {
|
Object.defineProperties(Date.prototype, {
|
||||||
@ -475,6 +482,14 @@ Object.defineProperties(Date.prototype, {
|
|||||||
},
|
},
|
||||||
writable: true,
|
writable: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
addDays: {
|
||||||
|
value: function (days: number) {
|
||||||
|
this.setDate(this.getDate() + days)
|
||||||
|
return this
|
||||||
|
},
|
||||||
|
writable: true,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
/****************************************扩展Array****************************************/
|
/****************************************扩展Array****************************************/
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { FindOrCreate } from '@typegoose/typegoose/lib/defaultClasses'
|
import { FindOrCreate } from '@typegoose/typegoose/lib/defaultClasses'
|
||||||
import { checkJson } from '../decorators/nojson'
|
import { checkJson, noJson } from '../decorators/nojson'
|
||||||
import { plugin, ReturnModelType } from '@typegoose/typegoose'
|
import { plugin, prop, ReturnModelType } from '@typegoose/typegoose'
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import findOrCreate from 'mongoose-findorcreate'
|
import findOrCreate from 'mongoose-findorcreate'
|
||||||
@ -8,6 +8,7 @@ import { Connection } from 'mongoose'
|
|||||||
import { ObjectId } from 'bson'
|
import { ObjectId } from 'bson'
|
||||||
import { isTrue } from '../utils/string.util'
|
import { isTrue } from '../utils/string.util'
|
||||||
import { AnyParamConstructor } from '@typegoose/typegoose/lib/types'
|
import { AnyParamConstructor } from '@typegoose/typegoose/lib/types'
|
||||||
|
import { SysMail } from './content/SysMail'
|
||||||
|
|
||||||
const jsonExcludeKeys = ['updatedAt', '__v']
|
const jsonExcludeKeys = ['updatedAt', '__v']
|
||||||
const saveExcludeKeys = ['createdAt', 'updatedAt', '__v', '_id']
|
const saveExcludeKeys = ['createdAt', 'updatedAt', '__v', '_id']
|
||||||
@ -29,8 +30,54 @@ export abstract class BaseModule extends FindOrCreate {
|
|||||||
* @param condition
|
* @param condition
|
||||||
* @param data
|
* @param data
|
||||||
*/
|
*/
|
||||||
public static async insertOrUpdate<T>(this: ReturnModelType<AnyParamConstructor<T>>, condition: any, data: any) {
|
public static insertOrUpdate<T extends BaseModule>(
|
||||||
return this.findOneAndUpdate(condition, data, { upsert: true, new: true })
|
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() {
|
public toJson() {
|
||||||
@ -89,7 +136,7 @@ export abstract class BaseModule extends FindOrCreate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (params.hasOwnProperty('key')) {
|
if (params.hasOwnProperty('key') && params['key']) {
|
||||||
let orArr = []
|
let orArr = []
|
||||||
if (options?.matchKey) {
|
if (options?.matchKey) {
|
||||||
if (Array.isArray(options?.matchKey)) {
|
if (Array.isArray(options?.matchKey)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user