From 8202aa17c377242d932b8dde21b446dba3b02fba Mon Sep 17 00:00:00 2001 From: chaosBreaking Date: Sat, 31 Aug 2019 15:01:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/estate/estate.controller.js | 104 ------------------ src/modules/estate/estate.model.js | 102 ----------------- src/modules/estate/estate.service.js | 31 ------ .../estateOrder/estateOrder.controller.js | 60 ---------- .../estateOrder/estateOrder.handler.js | 73 ------------ src/modules/estateOrder/estateOrder.model.js | 58 ---------- .../estateOrder/estateOrder.service.js | 25 ----- src/modules/market/market.controller.js | 5 - src/modules/market/market.model.js | 22 ---- src/modules/market/market.service.js | 11 -- 10 files changed, 491 deletions(-) delete mode 100644 src/modules/estate/estate.controller.js delete mode 100644 src/modules/estate/estate.model.js delete mode 100644 src/modules/estate/estate.service.js delete mode 100644 src/modules/estateOrder/estateOrder.controller.js delete mode 100644 src/modules/estateOrder/estateOrder.handler.js delete mode 100644 src/modules/estateOrder/estateOrder.model.js delete mode 100644 src/modules/estateOrder/estateOrder.service.js delete mode 100644 src/modules/market/market.controller.js delete mode 100644 src/modules/market/market.model.js delete mode 100644 src/modules/market/market.service.js diff --git a/src/modules/estate/estate.controller.js b/src/modules/estate/estate.controller.js deleted file mode 100644 index 7964870..0000000 --- a/src/modules/estate/estate.controller.js +++ /dev/null @@ -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() - }); - } -}; \ No newline at end of file diff --git a/src/modules/estate/estate.model.js b/src/modules/estate/estate.model.js deleted file mode 100644 index 3f852c8..0000000 --- a/src/modules/estate/estate.model.js +++ /dev/null @@ -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; \ No newline at end of file diff --git a/src/modules/estate/estate.service.js b/src/modules/estate/estate.service.js deleted file mode 100644 index 4067444..0000000 --- a/src/modules/estate/estate.service.js +++ /dev/null @@ -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; -}); \ No newline at end of file diff --git a/src/modules/estateOrder/estateOrder.controller.js b/src/modules/estateOrder/estateOrder.controller.js deleted file mode 100644 index bc1d06d..0000000 --- a/src/modules/estateOrder/estateOrder.controller.js +++ /dev/null @@ -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 - }); - }); - } -}; \ No newline at end of file diff --git a/src/modules/estateOrder/estateOrder.handler.js b/src/modules/estateOrder/estateOrder.handler.js deleted file mode 100644 index 5a0588e..0000000 --- a/src/modules/estateOrder/estateOrder.handler.js +++ /dev/null @@ -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) }; - } - } -}; diff --git a/src/modules/estateOrder/estateOrder.model.js b/src/modules/estateOrder/estateOrder.model.js deleted file mode 100644 index b6df880..0000000 --- a/src/modules/estateOrder/estateOrder.model.js +++ /dev/null @@ -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; \ No newline at end of file diff --git a/src/modules/estateOrder/estateOrder.service.js b/src/modules/estateOrder/estateOrder.service.js deleted file mode 100644 index 92527f7..0000000 --- a/src/modules/estateOrder/estateOrder.service.js +++ /dev/null @@ -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; -}); \ No newline at end of file diff --git a/src/modules/market/market.controller.js b/src/modules/market/market.controller.js deleted file mode 100644 index 59eaaff..0000000 --- a/src/modules/market/market.controller.js +++ /dev/null @@ -1,5 +0,0 @@ -const { inject } = require('../../common/Provider'); - -module.exports = { - -}; \ No newline at end of file diff --git a/src/modules/market/market.model.js b/src/modules/market/market.model.js deleted file mode 100644 index 663acb7..0000000 --- a/src/modules/market/market.model.js +++ /dev/null @@ -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; \ No newline at end of file diff --git a/src/modules/market/market.service.js b/src/modules/market/market.service.js deleted file mode 100644 index 94a223e..0000000 --- a/src/modules/market/market.service.js +++ /dev/null @@ -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; -}); \ No newline at end of file