Untitled
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