import { startSession, find, aggregate, findById, findOne, exists, create, findByIdAndUpdate, findByIdAndDelete, deleteMany } from '../models/userModel' import { SearchResult } from '../models/search' export async function startTransaction() { const session = await 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 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 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 findById(id) } export async function selectUserByAccount(account) { return findOne({ account: account }) } export async function selectUserByEmail(email) { return findOne({ email: email }) } export async function selectUserByUsername(username) { return findOne({ username: username }) } export async function selectUserByPhone(phone) { return findOne({ phone: phone }) } export async function selectUserByAccountExist(account) { const exist = await exists({ account: account }) return exist !== null } export async function createUser(user) { return create(user) } export async function updateUserById(id, user) { return findByIdAndUpdate(id, user) } export async function updateUserByLoginDate(id, loginDate) { return findByIdAndUpdate(id, { last_login_date: loginDate }) } export async function deleteUserById(id) { return findByIdAndDelete(id) } export async function deleteAllUser() { return deleteMany() }