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