RSS Git Download  Clone
Raw Blame History 1kB 46 lines
export default async (options) => {
    const {socket, payload} = options

    try {
        const redis = socket.p3xrs.ioredis
        const { index, query, offset, limit } = payload

        if (!index || !query) {
            socket.emit(options.responseEvent, {
                status: 'error',
                error: 'Index and query are required',
            })
            return
        }

        const args = [index, query, 'LIMIT', offset || 0, limit || 20]
        const result = await redis.call('FT.SEARCH', ...args)

        // Parse FT.SEARCH result: [totalCount, key1, [field, value, ...], key2, [...], ...]
        const total = result[0]
        const docs = []
        for (let i = 1; i < result.length; i += 2) {
            const key = result[i]
            const fields = result[i + 1]
            const doc = { _key: key }
            if (Array.isArray(fields)) {
                for (let j = 0; j < fields.length; j += 2) {
                    doc[fields[j]] = fields[j + 1]
                }
            }
            docs.push(doc)
        }

        socket.emit(options.responseEvent, {
            status: 'ok',
            data: { total, docs },
        })
    } catch (e) {
        console.error(e)
        socket.emit(options.responseEvent, {
            status: 'error',
            error: e.message,
        })
    }
}