增加交易记录相关接口
This commit is contained in:
parent
bf0e6c865a
commit
9e8d14ba84
47
src/controllers/record.controller.ts
Normal file
47
src/controllers/record.controller.ts
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import BaseController from 'common/base.controller'
|
||||||
|
import { ZError } from 'common/ZError'
|
||||||
|
import { router } from 'decorators/router'
|
||||||
|
import { TranRecord } from 'modules/TranRecord'
|
||||||
|
|
||||||
|
class RecordController extends BaseController {
|
||||||
|
@router('post /trans/record')
|
||||||
|
async save(req) {
|
||||||
|
let { _id } = req.params
|
||||||
|
let user = req.user
|
||||||
|
let record
|
||||||
|
if (!_id) {
|
||||||
|
record = new TranRecord(req.params)
|
||||||
|
record.account = user.id
|
||||||
|
} else {
|
||||||
|
record = await TranRecord.findById(_id)
|
||||||
|
record.account = user.id
|
||||||
|
}
|
||||||
|
await record.save()
|
||||||
|
return record.toJson()
|
||||||
|
}
|
||||||
|
|
||||||
|
@router('post /trans/records')
|
||||||
|
async list(req) {
|
||||||
|
const user = req.user
|
||||||
|
let defaultParams: any = { account: user.id }
|
||||||
|
let { params } = req
|
||||||
|
Object.assign(params, defaultParams)
|
||||||
|
const records = await TranRecord.pageQuery(params)
|
||||||
|
return records
|
||||||
|
}
|
||||||
|
|
||||||
|
@router('delete /trans/record')
|
||||||
|
async delete(req) {
|
||||||
|
let { ids } = req.params
|
||||||
|
const user = req.user
|
||||||
|
if (!ids) {
|
||||||
|
throw new ZError(11, 'params mismatch')
|
||||||
|
}
|
||||||
|
const params: any = {
|
||||||
|
_id: { $in: ids },
|
||||||
|
account: user.id,
|
||||||
|
}
|
||||||
|
let result = await TranRecord.deleteRecords(params)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
@ -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'
|
||||||
@ -56,6 +56,15 @@ export abstract class BaseModule extends FindOrCreate {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static deleteRecords<T extends BaseModule>(this: ReturnModelType<AnyParamConstructor<T>>, params) {
|
||||||
|
return this.updateMany(params, {
|
||||||
|
$set: {
|
||||||
|
deleted: true,
|
||||||
|
deleteTime: new Date(),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 自定义分页查询
|
* 自定义分页查询
|
||||||
* @param data
|
* @param data
|
||||||
@ -64,16 +73,16 @@ export abstract class BaseModule extends FindOrCreate {
|
|||||||
public static async pageQuery<T extends BaseModule>(
|
public static async pageQuery<T extends BaseModule>(
|
||||||
this: ReturnModelType<AnyParamConstructor<T>>,
|
this: ReturnModelType<AnyParamConstructor<T>>,
|
||||||
data: any,
|
data: any,
|
||||||
json: boolean = false,
|
options?: any,
|
||||||
) {
|
) {
|
||||||
let { start, limit, page } = data
|
let { start, limit, page } = data
|
||||||
limit = +limit || 10
|
limit = +limit || 20
|
||||||
start = +start || (+page - 1) * limit || 0
|
start = +start || (+page - 1) * limit || 0
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
let { opt, sort } = this.parseQueryParam(data)
|
let { opt, sort } = this.parseQueryParam(data, options)
|
||||||
let records = await this.find(opt).sort(sort).skip(start).limit(limit)
|
let records = await this.find(opt).sort(sort).skip(start).limit(limit)
|
||||||
let total = await this.countDocuments(opt)
|
let total = await this.countDocuments(opt)
|
||||||
if (json) {
|
if (options?.json) {
|
||||||
records.map((o: T) => o.toJson())
|
records.map((o: T) => o.toJson())
|
||||||
}
|
}
|
||||||
return { records, total, start, limit }
|
return { records, total, start, limit }
|
||||||
@ -102,14 +111,18 @@ export abstract class BaseModule extends FindOrCreate {
|
|||||||
* @return {{opt: any, sort: {_id: number}}}
|
* @return {{opt: any, sort: {_id: number}}}
|
||||||
*/
|
*/
|
||||||
public static parseQueryParam(params: {}, options?: any) {
|
public static parseQueryParam(params: {}, options?: any) {
|
||||||
const opt: any = { deleted: false }
|
const opt: any = { deleted: { $ne: true } }
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
let obj = this.schema.paths
|
let obj = this.schema.paths
|
||||||
for (let key in params) {
|
for (let key in params) {
|
||||||
if (key !== 'sort' && obj.hasOwnProperty(key)) {
|
if (key !== 'sort' && obj.hasOwnProperty(key)) {
|
||||||
switch (obj[key].instance) {
|
switch (obj[key].instance) {
|
||||||
case 'String':
|
case 'String':
|
||||||
opt[key] = { $regex: params[key], $options: 'i' }
|
if (typeof params[key] === 'object') {
|
||||||
|
opt[key] = params[key]
|
||||||
|
} else {
|
||||||
|
opt[key] = { $regex: params[key], $options: 'i' }
|
||||||
|
}
|
||||||
break
|
break
|
||||||
case 'Number':
|
case 'Number':
|
||||||
opt[key] = params[key]
|
opt[key] = params[key]
|
||||||
@ -133,6 +146,8 @@ export abstract class BaseModule extends FindOrCreate {
|
|||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
} else if (key === '$or' || key == '$and') {
|
||||||
|
opt[key] = params[key]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (params.hasOwnProperty('key') && params['key']) {
|
if (params.hasOwnProperty('key') && params['key']) {
|
||||||
@ -192,7 +207,7 @@ export abstract class BaseModule extends FindOrCreate {
|
|||||||
if (options?.opt) {
|
if (options?.opt) {
|
||||||
Object.assign(opt, options.opt)
|
Object.assign(opt, options.opt)
|
||||||
}
|
}
|
||||||
let sort = { _id: 1 }
|
let sort = { _id: -1 }
|
||||||
if (params.hasOwnProperty('sort')) {
|
if (params.hasOwnProperty('sort')) {
|
||||||
sort = params['sort']
|
sort = params['sort']
|
||||||
}
|
}
|
||||||
|
50
src/modules/TranRecord.ts
Normal file
50
src/modules/TranRecord.ts
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import { getModelForClass, index, modelOptions, mongoose, prop, Severity } from '@typegoose/typegoose'
|
||||||
|
import { dbconn } from 'decorators/dbconn'
|
||||||
|
import { BaseModule } from './Base'
|
||||||
|
|
||||||
|
@dbconn()
|
||||||
|
@index({ transactionHash: 1 }, { unique: true })
|
||||||
|
@index({ contract: 1, account: 1, tokenId: 1 })
|
||||||
|
@modelOptions({
|
||||||
|
schemaOptions: { collection: 'transaction_record', timestamps: true },
|
||||||
|
})
|
||||||
|
class TranRecordClass extends BaseModule {
|
||||||
|
@prop({ required: true })
|
||||||
|
public transactionHash!: string
|
||||||
|
@prop({ required: true })
|
||||||
|
public contract!: string
|
||||||
|
@prop({ required: true })
|
||||||
|
public account!: string
|
||||||
|
@prop()
|
||||||
|
public blockNumber: number
|
||||||
|
@prop()
|
||||||
|
public blockHash: string
|
||||||
|
@prop()
|
||||||
|
public from: string
|
||||||
|
@prop()
|
||||||
|
public to: string
|
||||||
|
// 对于ERC20, 该值永远为'0'
|
||||||
|
@prop({ default: '0' })
|
||||||
|
public tokenId: string
|
||||||
|
// 对于ERC721, 该值永远为'1'
|
||||||
|
@prop({ default: '1' })
|
||||||
|
public amount: string
|
||||||
|
|
||||||
|
@prop({ default: 0 })
|
||||||
|
public status: number
|
||||||
|
|
||||||
|
public toJson() {
|
||||||
|
return {
|
||||||
|
transactionHash: this.transactionHash,
|
||||||
|
contract: this.contract,
|
||||||
|
blockNumber: this.blockNumber,
|
||||||
|
blockHash: this.blockHash,
|
||||||
|
from: this.from,
|
||||||
|
to: this.to,
|
||||||
|
amount: this.amount,
|
||||||
|
tokenId: this.tokenId,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TranRecord = getModelForClass(TranRecordClass, { existingConnection: TranRecordClass.db })
|
Loading…
x
Reference in New Issue
Block a user