Untitled
unknown
typescript
a year ago
2.2 kB
6
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}`,
}
);Editor is loading...
Leave a Comment