refactor(user): 重构用户相关代码

- 优化了用户路由、控制器、仓库和服务的代码结构
- 改进了代码的可读性和可维护性
-移除了冗余的导入和导出语句
- 统一了异步函数的定义方式- 简化了错误处理逻辑
This commit is contained in:
LingandRX 2025-01-05 18:44:46 +08:00
parent 039317d229
commit fbbcf675d1
7 changed files with 81 additions and 129 deletions

View File

@ -66,5 +66,3 @@ export const HTTP_STATUS = {
/** @type {number} 网关超时 */ /** @type {number} 网关超时 */
GATEWAY_TIMEOUT: 504 GATEWAY_TIMEOUT: 504
} }
export default { HTTP_STATUS }

View File

@ -1,10 +1,7 @@
import mongoose from 'mongoose' import mongoose from 'mongoose'
import logger from 'morgan' import logger from 'morgan'
import { config } from 'dotenv' import('dotenv').config()
config()
// 使用环境变量存储敏感信息 // 使用环境变量存储敏感信息
const account = process.env.MONGO_ACCOUNT const account = process.env.MONGO_ACCOUNT
@ -16,7 +13,7 @@ let isConnected = false
export async function connectMongoDB() { export async function connectMongoDB() {
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
logger(account, password, host, port) logger({ account, password, host, port })
} }
// 如果已经连接,不再重复连接 // 如果已经连接,不再重复连接

View File

@ -15,7 +15,6 @@ const UserController = {
return FetchResult.formatResult(res, HTTP_STATUS.INTERNAL_SERVER_ERROR, 'Internal server error') return FetchResult.formatResult(res, HTTP_STATUS.INTERNAL_SERVER_ERROR, 'Internal server error')
} }
}, },
async findUserList(req, res) { async findUserList(req, res) {
try { try {
const { page, size, sort } = req.query const { page, size, sort } = req.query
@ -28,7 +27,6 @@ const UserController = {
return FetchResult.formatResult(res, HTTP_STATUS.INTERNAL_SERVER_ERROR, 'Internal server error') return FetchResult.formatResult(res, HTTP_STATUS.INTERNAL_SERVER_ERROR, 'Internal server error')
} }
}, },
createUser: [ createUser: [
body('account').isLength({ min: 3 }).withMessage('Account must be at least 3 characters long'), body('account').isLength({ min: 3 }).withMessage('Account must be at least 3 characters long'),
body('account').isEmpty().withMessage('Account is required'), body('account').isEmpty().withMessage('Account is required'),
@ -63,7 +61,6 @@ const UserController = {
} }
} }
], ],
login: [ login: [
body('account').notEmpty().withMessage('Account is required'), body('account').notEmpty().withMessage('Account is required'),
body('password').notEmpty().withMessage('Password is required'), body('password').notEmpty().withMessage('Password is required'),
@ -99,7 +96,6 @@ const UserController = {
} }
} }
], ],
logout: [ logout: [
async (req, res) => { async (req, res) => {
try { try {
@ -111,7 +107,6 @@ const UserController = {
} }
} }
], ],
async getUserExists(req, res) { async getUserExists(req, res) {
try { try {
const { account } = req.query const { account } = req.query
@ -126,7 +121,7 @@ const UserController = {
logger('Error checking user existence: ', err) logger('Error checking user existence: ', err)
return FetchResult.formatResult(res, HTTP_STATUS.INTERNAL_SERVER_ERROR, 'Internal server error') return FetchResult.formatResult(res, HTTP_STATUS.INTERNAL_SERVER_ERROR, 'Internal server error')
} }
} },
} }
export default UserController export default UserController

View File

@ -7,7 +7,7 @@ export class SearchQuery {
} }
} }
class SearchResult { export class SearchResult {
constructor({ list = [], num = 0, size = 0, total = 0 } = {}) { constructor({ list = [], num = 0, size = 0, total = 0 } = {}) {
if (typeof num !== 'number') { if (typeof num !== 'number') {
throw new Error('Invalid num parameter') throw new Error('Invalid num parameter')
@ -25,5 +25,3 @@ class SearchResult {
this.total = total this.total = total
} }
} }
export default { SearchQuery, SearchResult }

View File

@ -2,123 +2,92 @@ import User from '../models/userModel.js'
import { SearchResult } from '../models/search.js' import { SearchResult } from '../models/search.js'
const userRepository = { const userRepository = {
startTransaction, async startTransaction() {
commitTransaction, const session = await User.startSession()
rollbackTransaction, session.startTransaction()
selectAllUser, return session
selectUserList, },
selectUserById, async commitTransaction(session) {
selectUserByAccount, return session.commitTransaction()
selectUserByEmail, },
selectUserByUsername, async rollbackTransaction(session) {
selectUserByPhone, return session.abortTransaction()
selectUserByAccountExist, },
createUser, async selectAllUser() {
updateUserById, return User.find()
updateUserByLoginDate, },
deleteUserById, async selectUserList(search = {}) {
deleteAllUser try {
} const { size = 20, page = 1, sort, filters } = search
export async function startTransaction() { const skip = (page - 1) * size
const session = await User.startSession() const searchResult = new SearchResult()
session.startTransaction() searchResult.num = page
return session searchResult.size = size
}
export async function commitTransaction(session) { // 检查 filters确保只有在 filters 存在时才应用
return session.commitTransaction() const matchFilters = filters ? { ...filters } : {}
}
export async function rollbackTransaction(session) { const sortObj = sort && typeof sort === 'object' ? sort : { _id: 1 }
return session.abortTransaction()
}
export async function selectAllUser() { const result = await User.aggregate([
return User.find() // 应用过滤条件确保filters存在时才传入
} { $match: matchFilters },
{
export async function selectUserList(search = {}) { $facet: {
try { metadata: [{ $count: 'total' }, { $addFields: { total: '$total' } }],
const { size = 20, page = 1, sort, filters } = search data: [{ $sort: sortObj }, { $skip: skip }, { $limit: size }]
}
const skip = (page - 1) * size
const searchResult = new SearchResult()
searchResult.num = page
searchResult.size = size
// 检查 filters确保只有在 filters 存在时才应用
const matchFilters = filters ? { ...filters } : {}
const sortObj = sort && typeof sort === 'object' ? sort : { _id: 1 } // 默认按 _id 升序排序
const result = await User.aggregate([
// 应用过滤条件确保filters存在时才传入
{ $match: matchFilters },
{
$facet: {
metadata: [{ $count: 'total' }, { $addFields: { total: '$total' } }],
data: [{ $sort: sortObj }, { $skip: skip }, { $limit: size }]
} }
} ])
])
// 解构 result 并进行必要的空值检查 // 解构 result 并进行必要的空值检查
const { metadata = [], data = [] } = result[0] || {} const { metadata = [], data = [] } = result[0] || {}
// 提取 metadata 中的 total若不存在则为 0 // 提取 metadata 中的 total若不存在则为 0
searchResult.total = metadata.length > 0 ? metadata[0].total : 0 searchResult.total = metadata.length > 0 ? metadata[0].total : 0
searchResult.list = data searchResult.list = data
return searchResult return searchResult
} catch (error) { } catch (error) {
console.log(error) console.log(error)
throw error throw error
}
},
async selectUserById(id) {
return User.findById(id)
},
async selectUserByAccount(account) {
return User.findOne({ account: account })
},
async selectUserByEmail(email) {
return User.findOne({ email: email })
},
async selectUserByUsername(username) {
return User.findOne({ username: username })
},
async selectUserByPhone(phone) {
return User.findOne({ phone: phone })
},
async selectUserByAccountExist(account) {
const exist = await User.exists({ account: account })
return exist !== null
},
async createUser(user) {
return User.create(user)
},
async updateUserById(id, user) {
return User.findByIdAndUpdate(id, user)
},
async updateUserByLoginDate(id, loginDate) {
return User.findByIdAndUpdate(id, { lastLoginDate: loginDate })
},
async deleteUserById(id) {
return User.findByIdAndDelete(id)
},
async deleteAllUser() {
return User.deleteMany()
} }
} }
export async function selectUserById(id) {
return User.findById(id)
}
export async function selectUserByAccount(account) {
return User.findOne({ account: account })
}
export async function selectUserByEmail(email) {
return User.findOne({ email: email })
}
export async function selectUserByUsername(username) {
return User.findOne({ username: username })
}
export async function selectUserByPhone(phone) {
return User.findOne({ phone: phone })
}
export async function selectUserByAccountExist(account) {
const exist = await User.exists({ account: account })
return exist !== null
}
export async function createUser(user) {
return User.create(user)
}
export async function updateUserById(id, user) {
return User.findByIdAndUpdate(id, user)
}
export async function updateUserByLoginDate(id, loginDate) {
return User.findByIdAndUpdate(id, { lastLoginDate: loginDate })
}
export async function deleteUserById(id) {
return User.findByIdAndDelete(id)
}
export async function deleteAllUser() {
return User.deleteMany()
}
export default userRepository export default userRepository

View File

@ -1,4 +1,3 @@
// routes/userRoutes.js
import express from 'express' import express from 'express'
import userController from '../controllers/userController.js' import userController from '../controllers/userController.js'

View File

@ -25,10 +25,6 @@ const userService = {
throw new Error(messages.user.passwordIncorrect) throw new Error(messages.user.passwordIncorrect)
} }
// 更新用户的最后登录时间
user.lastLoginDate = new Date()
await userRepository.updateUserByLoginDate(user.id, user.lastLoginDate)
return user return user
}, },