feat: 删除多余模块
This commit is contained in:
@@ -1,104 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const Estate = require('./estate.model');
|
||||
const filter = estate => {
|
||||
// 用于返回前过滤敏感数据
|
||||
};
|
||||
let getGlobalState = (() => {
|
||||
let GlobalState = [];
|
||||
let lastUpdateAt = Date.now();
|
||||
let freq = 1000 * 60 * 5; // 5min更新一次
|
||||
let timezones = Array.from({length:24});
|
||||
const refresh = async () => {
|
||||
const jobs= timezones.map(async (v, i) => Estate.find({ startTime: i, status: 1 }).countDocuments());
|
||||
const data = await Promise.all(jobs).catch(err => {
|
||||
mylog.error('地产全局状态获取失败:', err);
|
||||
return null;
|
||||
});
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
if (data) GlobalState = data;
|
||||
lastUpdateAt = Date.now();
|
||||
};
|
||||
refresh();
|
||||
return async () => {
|
||||
if (GlobalState.length === 0 || Date.now() - lastUpdateAt >= freq) {
|
||||
await refresh();
|
||||
}
|
||||
return GlobalState;
|
||||
};
|
||||
})();
|
||||
|
||||
module.exports = {
|
||||
getEstateList: async function (req, res) {
|
||||
const { pageSize, pageIndex, timezone } = req.query;
|
||||
if (pageSize && pageIndex && timezone) {
|
||||
const list = await Estate.find({
|
||||
timezone,
|
||||
}, {
|
||||
skip: +pageSize * (+pageIndex - 1),
|
||||
limit: +pageSize
|
||||
}).exec();
|
||||
if (list && Array.isArray(list)) {
|
||||
res.json({
|
||||
code: 0,
|
||||
msg: '',
|
||||
data: list
|
||||
});
|
||||
}
|
||||
} else {
|
||||
res.json({
|
||||
code: 1,
|
||||
msg: 'Param required'
|
||||
});
|
||||
}
|
||||
},
|
||||
getEstateDetail: async function (req, res) {
|
||||
const { id } = req.query;
|
||||
if (id) {
|
||||
const estate = await Estate.findById(id).exec();
|
||||
if (estate) {
|
||||
res.json({
|
||||
code: 0,
|
||||
msg: '',
|
||||
data: estate
|
||||
});
|
||||
}
|
||||
}
|
||||
res.json({
|
||||
code: 1,
|
||||
msg: 'Cannot find estate, invalid id',
|
||||
data: null
|
||||
});
|
||||
},
|
||||
publishEstate: function (req, res) {
|
||||
const { data = {}} = req.body;
|
||||
const invalidEstate = !data || !data.name || (!data.basePrice && !data.price) || !data.startTime || !data.profit || data.profit > 1;
|
||||
if (!data.basePrice && data.price) data.basePrice = data.price;
|
||||
if (!data.price && data.basePrice) data.price = data.basePrice;
|
||||
if (invalidEstate) {
|
||||
return res.json({
|
||||
code: 1,
|
||||
msg: 'Invalid parameter'
|
||||
});
|
||||
}
|
||||
const estate = new Estate(data);
|
||||
return estate.save().then(newEstate => {
|
||||
res.json({
|
||||
code: 0,
|
||||
msg: 'success',
|
||||
data: newEstate
|
||||
});
|
||||
}).catch(err => {
|
||||
res.json({
|
||||
code: 1,
|
||||
msg: JSON.stringify(err)
|
||||
});
|
||||
});
|
||||
},
|
||||
getState: async function (req, res) {
|
||||
return res.json({
|
||||
code: 0,
|
||||
data: await getGlobalState()
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -1,102 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const mongoose = require('mongoose');
|
||||
const EstateSchema = new mongoose.Schema({
|
||||
name: {
|
||||
// 地皮名
|
||||
type: String,
|
||||
required: true,
|
||||
unique: true
|
||||
},
|
||||
type: {
|
||||
// 为edition 2保留,分为系统生成的地皮和玩家自建的地皮
|
||||
type: String,
|
||||
default: 'v1'
|
||||
},
|
||||
basePrice: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
price: {
|
||||
// 地皮的市场标价
|
||||
type: Number,
|
||||
required: true
|
||||
},
|
||||
profit: {
|
||||
// 收益率
|
||||
type: Number,
|
||||
required: true
|
||||
},
|
||||
startTime: {
|
||||
// 开始抢购时间
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
period: {
|
||||
// 换手周期,目前默认为24(hour)
|
||||
type: Number,
|
||||
default: 24,
|
||||
},
|
||||
status: {
|
||||
// 当前状态 不可买:可买 -> 0 : 1
|
||||
type: Number,
|
||||
default: 1
|
||||
},
|
||||
desc: {
|
||||
// 地皮描述
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
image: {
|
||||
// 图片链接
|
||||
type: String
|
||||
},
|
||||
currentOwner: {
|
||||
type: String
|
||||
},
|
||||
lastTurnAt: {
|
||||
type: String
|
||||
},
|
||||
turnTimes: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
option: {
|
||||
type: {}
|
||||
}
|
||||
}, {
|
||||
timestamps: {
|
||||
createdAt: 'createdAt',
|
||||
updatedAt: 'updatedAt'
|
||||
}
|
||||
});
|
||||
|
||||
const EstateModel = mongoose.model('Estate', EstateSchema);
|
||||
|
||||
EstateModel.prototype.purchase = async function (userId, option = {}) {
|
||||
return EstateModel.findByIdAndUpdate(this.id, {
|
||||
status: 0,
|
||||
currentOwner: userId,
|
||||
lastTurnAt: new Date().toISOString(),
|
||||
$inc: { turnTimes: 1 }
|
||||
}, option).exec().catch(err => {
|
||||
mylog.error(err);
|
||||
return null;
|
||||
});
|
||||
};
|
||||
|
||||
EstateModel.prototype.sell = async function (option = {}) {
|
||||
const price = +this.price * (1 + +this.profit);
|
||||
return EstateModel.findByIdAndUpdate(this.id, {
|
||||
$set: {
|
||||
status: 1,
|
||||
currentOwner: '',
|
||||
price,
|
||||
}
|
||||
}, option).exec().catch(err => {
|
||||
mylog.error(err);
|
||||
return null;
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = EstateModel;
|
||||
@@ -1,31 +0,0 @@
|
||||
const indexRoute = '/estate';
|
||||
const controller = require('./estate.controller');
|
||||
|
||||
const services = [
|
||||
{
|
||||
url: '/list',
|
||||
method: 'GET',
|
||||
controller: controller.getEstateList
|
||||
},
|
||||
{
|
||||
url: '/detail',
|
||||
method: 'GET',
|
||||
controller: controller.getEstateDetail
|
||||
},
|
||||
{
|
||||
url: '/publish',
|
||||
method: 'POST',
|
||||
controller: controller.publishEstate
|
||||
},
|
||||
{
|
||||
url: '/state',
|
||||
method: 'GET',
|
||||
controller: controller.getState
|
||||
},
|
||||
];
|
||||
|
||||
module.exports = services.map(service => {
|
||||
// 可以在此处对要导出的服务map进行统一处理
|
||||
service.url = indexRoute + service.url;
|
||||
return service;
|
||||
});
|
||||
@@ -1,60 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const EstateOrder = require('./estateOrder.model');
|
||||
const { purchase } = require('./estateOrder.handler');
|
||||
|
||||
module.exports = {
|
||||
purchase: async function (req, res) {
|
||||
const actorId = res.locals.user.userId;
|
||||
const { estate } = req.body;
|
||||
const exec = await purchase(actorId, estate);
|
||||
if (exec.code === 0 && exec.res) {
|
||||
return res.json({
|
||||
code: 0,
|
||||
msg: 'success',
|
||||
data: exec.res
|
||||
});
|
||||
}
|
||||
return res.json({
|
||||
code: exec.code,
|
||||
msg: exec.msg
|
||||
});
|
||||
},
|
||||
getUserEstateList (req, res) {
|
||||
const { userId } = res.locals.user;
|
||||
const { pageSize, pageIndex, type } = req.query;
|
||||
// 只返回detail内容
|
||||
EstateOrder.find({ type, userId }, 'detail').skip((+pageIndex - 1) * +pageSize).limit(+pageSize)
|
||||
.then(list => {
|
||||
res.json({
|
||||
code: 0,
|
||||
msg: '',
|
||||
data: list
|
||||
});
|
||||
})
|
||||
.catch(err => {
|
||||
res.json({
|
||||
code: 1,
|
||||
msg: err
|
||||
});
|
||||
});
|
||||
},
|
||||
getUserEstateDetail (req, res) {
|
||||
const { userId } = res.locals.user;
|
||||
const option = req.query;
|
||||
EstateOrder.find({ userId, ...option }, 'detail')
|
||||
.then(list => {
|
||||
res.json({
|
||||
code: 0,
|
||||
msg: '',
|
||||
data: list
|
||||
});
|
||||
})
|
||||
.catch(err => {
|
||||
res.json({
|
||||
code: 1,
|
||||
msg: err
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -1,73 +0,0 @@
|
||||
'use strict';
|
||||
const mongoose = require('mongoose');
|
||||
const User = require('../user/user.model');
|
||||
const Estate = require('../estate/estate.model');
|
||||
const EstateOrder = require('./estateOrder.model');
|
||||
const { createAction } = require('../action/action.handler');
|
||||
|
||||
module.exports = {
|
||||
purchase: async function (actorId, estateId) {
|
||||
/*
|
||||
* 1. 生成对应的action
|
||||
* 2. 将目标estate打上用户印记
|
||||
* 3. 在estateOrder内记录用户买入情况
|
||||
* 4. 对用户扣款
|
||||
*/
|
||||
try {
|
||||
const [actor, estate] = await Promise.all([
|
||||
User.findById(actorId).exec(),
|
||||
Estate.findById(estateId).exec()
|
||||
]);
|
||||
if (!actor) return { res: null, code: 1, msg: 'unknow user' };
|
||||
if (!estate || estate.status !== 1) return { res: null, code: 1, msg: 'estate unavailable' };
|
||||
const action = createAction(2, { actor: actorId, estate, amount: estate.price, remain: actor.asset });
|
||||
const order = new EstateOrder({ userId: actorId, estateId, type: '0', status: 'holding', amount: estate.price , detail: { ...estate } });
|
||||
if (!Number.isFinite(+estate.price)) throw new Error('非法的地产价格!');
|
||||
let [ estateSession, orderSession, actorSession ] = await Promise.all([
|
||||
mongoose.startSession(),
|
||||
mongoose.startSession(),
|
||||
mongoose.startSession()
|
||||
]);
|
||||
await Promise.all([
|
||||
estateSession.startTransaction(),
|
||||
orderSession.startTransaction(),
|
||||
actorSession.startTransaction()
|
||||
]);
|
||||
const estateOpts = { session: estateSession, returnOriginal: false };
|
||||
const orderOpts = { session: orderSession, returnOriginal: false };
|
||||
const actorOpts = { session: actorSession, returnOriginal: false };
|
||||
try {
|
||||
await Promise.all([
|
||||
estate.purchase(actorId, estateOpts),
|
||||
order.save(orderOpts),
|
||||
actor.decrease('log', +estate.price, actorOpts),
|
||||
action.save()
|
||||
]);
|
||||
await Promise.all([
|
||||
estateSession.commitTransaction(),
|
||||
orderSession.commitTransaction(),
|
||||
actorSession.commitTransaction()
|
||||
]);
|
||||
return { res : action.toJSON(), code: 0 };
|
||||
} catch (error) {
|
||||
// mylog.error(error);
|
||||
await Promise.all([
|
||||
action.remove(),
|
||||
estateSession.abortTransaction(),
|
||||
orderSession.abortTransaction(),
|
||||
actorSession.abortTransaction()
|
||||
]);
|
||||
return { res: null, code: 3, msg: 'Insufficient funds' };
|
||||
} finally {
|
||||
await Promise.all([
|
||||
estateSession.endSession(),
|
||||
orderSession.endSession(),
|
||||
actorSession.endSession()
|
||||
]);
|
||||
}
|
||||
} catch (error) {
|
||||
mylog.error(error);
|
||||
return { res: null, code: 500, msg: JSON.stringify(error) };
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -1,58 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const mongoose = require('mongoose');
|
||||
const EstateOrderSchema = new mongoose.Schema({
|
||||
userId: {
|
||||
// 订单所属用户的objId
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
estateId: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
type: {
|
||||
// 订单类型
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
amount: {
|
||||
type: Number,
|
||||
required: true
|
||||
},
|
||||
status: {
|
||||
// 订单状态
|
||||
/**
|
||||
* holding: 持有
|
||||
* sold: 卖出
|
||||
*/
|
||||
type: String,
|
||||
},
|
||||
detail: {
|
||||
// 订单详情/快照
|
||||
type: {},
|
||||
required: true
|
||||
},
|
||||
option: {
|
||||
type: {}
|
||||
}
|
||||
}, {
|
||||
timestamps: {
|
||||
createdAt: 'createdAt',
|
||||
updatedAt: 'updatedAt'
|
||||
}
|
||||
});
|
||||
|
||||
const EstateOrderModel = mongoose.model('estateOrder', EstateOrderSchema);
|
||||
|
||||
EstateOrderModel.prototype.finish = async function (option) {
|
||||
return this.updateOne({
|
||||
$set: {
|
||||
status: 'sold'
|
||||
}
|
||||
}, option).exec().catch(err => {
|
||||
throw new Error('订单完成状态转换失败', JSON.stringify(err));
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = EstateOrderModel;
|
||||
@@ -1,25 +0,0 @@
|
||||
const indexRoute = '/estateorder';
|
||||
const controller = require('./estateOrder.controller');
|
||||
const services = [
|
||||
{
|
||||
url: '/list',
|
||||
method: 'GET',
|
||||
controller: controller.getUserEstateList
|
||||
},
|
||||
{
|
||||
url: '/detail',
|
||||
method: 'GET',
|
||||
controller: controller.getUserEstateDetail
|
||||
},
|
||||
{
|
||||
url: '/purchase',
|
||||
method: 'POST',
|
||||
controller: controller.purchase
|
||||
},
|
||||
];
|
||||
|
||||
module.exports = services.map(service => {
|
||||
// 可以在此处对要导出的服务map进行统一处理
|
||||
service.url = indexRoute + service.url;
|
||||
return service;
|
||||
});
|
||||
@@ -1,5 +0,0 @@
|
||||
const { inject } = require('../../common/Provider');
|
||||
|
||||
module.exports = {
|
||||
|
||||
};
|
||||
@@ -1,22 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const mongoose = require('mongoose');
|
||||
const MarketSchema = new mongoose.Schema({
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
unique: true
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
price: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
});
|
||||
|
||||
const marketSchema = mongoose.model('Market', MarketSchema);
|
||||
|
||||
module.exports = marketSchema;
|
||||
@@ -1,11 +0,0 @@
|
||||
const indexRoute = '/market';
|
||||
const controller = require('./market.controller');
|
||||
const services = [
|
||||
|
||||
];
|
||||
|
||||
module.exports = services.map(service => {
|
||||
// 可以在此处对要导出的服务map进行统一处理
|
||||
service.url = indexRoute + service.url;
|
||||
return service;
|
||||
});
|
||||
Reference in New Issue
Block a user