learn-request-queue/src/cronjobs/processSubscriptions.ts

53 lines
2.0 KiB
TypeScript

import * as twitch from "../twitch";
import { log, LogLevel } from "../logging"
import db from "../db";
export async function processSubscriptions(streamer: twitch.StreamerUserIdTokenPair) {
var dbconn = await db.connect();
try {
await dbconn.query('BEGIN');
await dbconn.query("DELETE FROM subscriptions");
var response = await twitch.streamerApiRequest(streamer,
`/subscriptions?broadcaster_id=${streamer.userid}&first=100`);
//log(LogLevel.DEBUG,"Subscriptions API response:")
//log(LogLevel.DEBUG,JSON.stringify(response,null,2));
while (true) {
var insertSubscriptionQuery = "INSERT INTO subscriptions (userid) VALUES ";
var subscriptionRow = 0; // Used for $1, $2, etc. in parameterized query
var subscriptionsArray: number[] = [];
if (Object.keys(response.data).length > 0) {
for (var subscription of response.data) {
subscriptionRow++;
insertSubscriptionQuery += `($${subscriptionRow}), `;
subscriptionsArray.push(subscription.user_id as number);
}
insertSubscriptionQuery = insertSubscriptionQuery.slice(0,-2); // Cut last `, ` off of the end
var subscriptionQueryConfig = {
text: insertSubscriptionQuery,
values: subscriptionsArray
};
log(LogLevel.DEBUG,"subscriptionQueryConfig object:")
log(LogLevel.DEBUG,JSON.stringify(subscriptionQueryConfig,null,2))
await dbconn.query(subscriptionQueryConfig);
}
if (response.pagination.cursor) {
//var oldFirstUserid = response.data[0].user_id;
response = await twitch.streamerApiRequest(streamer,
`/subscriptions?broadcaster_id=${streamer.userid}&after=${response.pagination.cursor}&first=100`);
//log(LogLevel.DEBUG,"Subscription API response:");
//log(LogLevel.DEBUG,JSON.stringify(response,null,2));
} else {
break;
}
}
await dbconn.query("CALL update_scores()");
await dbconn.query('COMMIT');
} catch (e) {
log(LogLevel.ERROR,"cronjobs.processSubscriptions: Exception thrown; rolling back");
await dbconn.query('ROLLBACK');
throw(e);
} finally {
await dbconn.release();
}
}