expressServer/repositories/userRepository.js
LingandRX 21e4c3ea8a refactor(user): 重构用户模块代码
- 移除了不必要的 getAllUsers 控制器方法
-重命名 findUserList 为 getUserList,更符合方法的实际功能- 引入 UserDTO 类,用于用户数据传输和验证
- 优化了错误处理和日志记录
- 简化了代码结构,提高了可读性和可维护性
2025-01-05 19:41:03 +08:00

101 lines
2.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import User from '../models/userModel.js'
import { SearchResult } from '../models/search.js'
import logger from 'morgan'
const userRepository = {
async startTransaction() {
const session = await User.startSession()
session.startTransaction()
return session
},
async commitTransaction(session) {
return session.commitTransaction()
},
async rollbackTransaction(session) {
return session.abortTransaction()
},
async selectAllUser() {
return User.find()
},
async selectUserList(search = {}) {
try {
const { size = 20, page = 1, sort, filters } = search
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 }
const result = await User.aggregate([
// 应用过滤条件确保filters存在时才传入
{ $match: matchFilters },
{
$facet: {
metadata: [{ $count: 'total' }, { $addFields: { total: '$total' } }],
data: [{ $sort: sortObj }, { $skip: skip }, { $limit: size }]
}
}
])
// 解构 result 并进行必要的空值检查
const { metadata = [], data = [] } = result[0] || {}
// 提取 metadata 中的 total若不存在则为 0
searchResult.total = metadata.length > 0 ? metadata[0].total : 0
searchResult.list = data
return searchResult
} catch (err) {
logger(err)
throw err
}
},
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 })
},
/**
* 检查用户是否存在
* @param account
* @returns {Promise<boolean>}
*/
async selectUserByAccountExists(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 default userRepository