Untitled

 avatar
unknown
typescript
a month ago
2.2 kB
2
Indexable
Purchase.loaderByCard = new RedisDataLoader<
            {
                panStart: number;
                panEnd: number;
            },
            Purchase[],
            string
        >(
            'loaderByCard',
            async (keys) => {
                const result = await Purchase.sequelize.query<
                    InferAttributes<Purchase> & {
                        pan_start: number;
                        pan_end: number;
                    }
                >(
                    `SELECT /*loaderByCard*/ ${modelSqlColumns(Purchase, 'p')}, pan_start, pan_end
                     FROM purchase_partial_card pc
                              JOIN payment_attempt pa on pc.payment_attempt_id = pa.id
                              LEFT JOIN payment.rebill r on r.id = pa.model_id AND pa.model = 'rebill'
                              LEFT JOIN purchased_item pi on pi.id = r.purchased_item_id
                              LEFT JOIN payment.purchase p
                                        on (p.id = pa.model_id AND pa.model = 'purchase') OR (p.id = pi.purchase_id)
                     WHERE (pc.pan_start, pc.pan_end) IN ${inMysqlPairs(
                         keys.map((k) => [k.panStart, k.panEnd]),
                         Purchase.sequelize
                     )};`,
                    {
                        type: QueryTypes.SELECT,
                    }
                );
                return keys.map((key) => {
                    const data = result?.filter((p) => p.pan_start === key.panStart && p.pan_end === key.panEnd);
                    return data ? data.map((pData) => Purchase.build(pData, { isNewRecord: false, raw: true })) : undefined;
                });
            },
            {
                redis: {
                    client: container.getNtSymbol('redis'),
                    ttl: DURATION.DAY,
                    deserialize: (key, json) => (JSON.parse(json) as InferAttributes<Purchase>[]).map((r) => hydrateModel(Purchase, r)),
                    serialize: (data) => JSON.stringify(data),
                },
                cacheKeyFn: (key) => `${key.panStart}-${key.panEnd}`,
            }
        );
Leave a Comment