import { eq, desc, asc, and, like, or, count } from 'drizzle-orm'; import { app, db, schema } from '../../../app.ts'; export class MarkServices { static getList = async (opts: { /** 查询用户的 */ uid?: string; query?: { page?: number; pageSize?: number; search?: string; markType?: string; sort?: string; }; /** * 查询类型 * simple: 简单查询 默认 */ queryType?: string; }) => { const { uid, query = {} } = opts; const { page = 1, pageSize = 999, search, sort = 'DESC' } = query; const conditions = []; if (uid) { conditions.push(eq(schema.microMark.uid, uid)); } if (search) { conditions.push( or( like(schema.microMark.title, `%${search}%`), like(schema.microMark.summary, `%${search}%`) ) ); } if (opts.query?.markType) { conditions.push(eq(schema.microMark.markType, opts.query.markType)); } const whereClause = conditions.length > 0 ? and(...conditions) : undefined; const queryType = opts.queryType || 'simple'; let selectFields: any = {}; if (queryType === 'simple') { // Exclude data, config, cover, description selectFields = { id: schema.microMark.id, title: schema.microMark.title, tags: schema.microMark.tags, uname: schema.microMark.uname, uid: schema.microMark.uid, createdAt: schema.microMark.createdAt, updatedAt: schema.microMark.updatedAt, thumbnail: schema.microMark.thumbnail, link: schema.microMark.link, summary: schema.microMark.summary, markType: schema.microMark.markType, puid: schema.microMark.puid, deletedAt: schema.microMark.deletedAt, version: schema.microMark.version, fileList: schema.microMark.fileList, key: schema.microMark.key, }; } const orderByField = sort === 'ASC' ? asc(schema.microMark.updatedAt) : desc(schema.microMark.updatedAt); const [rows, totalResult] = await Promise.all([ queryType === 'simple' ? db.select(selectFields).from(schema.microMark).where(whereClause).orderBy(orderByField).limit(pageSize).offset((page - 1) * pageSize) : db.select().from(schema.microMark).where(whereClause).orderBy(orderByField).limit(pageSize).offset((page - 1) * pageSize), db.select({ count: count() }).from(schema.microMark).where(whereClause) ]); return { pagination: { current: page, pageSize, total: totalResult[0]?.count || 0, }, list: rows, }; }; }