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