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} */ 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