- 更新导入路径,使用 .js 后缀 -修正用户模型中的密码加密和验证逻辑 - 优化用户路由和控制器 - 重构用户服务和仓库,使用原生 mongoose 方法- 更新错误处理和日志记录
125 lines
3.0 KiB
JavaScript
125 lines
3.0 KiB
JavaScript
import User from '../models/userModel.js'
|
||
import { SearchResult } from '../models/search.js'
|
||
|
||
const userRepository = {
|
||
startTransaction,
|
||
commitTransaction,
|
||
rollbackTransaction,
|
||
selectAllUser,
|
||
selectUserList,
|
||
selectUserById,
|
||
selectUserByAccount,
|
||
selectUserByEmail,
|
||
selectUserByUsername,
|
||
selectUserByPhone,
|
||
selectUserByAccountExist,
|
||
createUser,
|
||
updateUserById,
|
||
updateUserByLoginDate,
|
||
deleteUserById,
|
||
deleteAllUser
|
||
}
|
||
|
||
export async function startTransaction() {
|
||
const session = await User.startSession()
|
||
session.startTransaction()
|
||
return session
|
||
}
|
||
|
||
export async function commitTransaction(session) {
|
||
return session.commitTransaction()
|
||
}
|
||
|
||
export async function rollbackTransaction(session) {
|
||
return session.abortTransaction()
|
||
}
|
||
|
||
export async function selectAllUser() {
|
||
return User.find()
|
||
}
|
||
|
||
export async function 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 } // 默认按 _id 升序排序
|
||
|
||
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 (error) {
|
||
console.log(error)
|
||
throw error
|
||
}
|
||
}
|
||
|
||
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
|