singularise listing fetching

This commit is contained in:
ntr committed 2022-09-05 21:21:34 +10:00
1 parent f2294def05
commit bbc3fe6b48
4 files changed
+33 -29

No files matched your search

+1 -1
View File
@@ -28,7 +28,7 @@ async function start() {
events, events,
} = createServices(log); } = createServices(log);
// events.emit(Events.StartupSync); events.emit(Events.StartupSync);
// events.emit(Events.ListingsUpdated); // events.emit(Events.ListingsUpdated);
api.listen(); api.listen();
+3 -3
View File
@@ -72,13 +72,13 @@ model Offer {
comparison Decimal @db.Money comparison Decimal @db.Money
listingId Int listingId Int
listing Listing @relation(fields: [listingId], references: [id]) listing Listing @relation(fields: [listingId], references: [id], onDelete: Restrict)
userId String @db.Uuid userId String @db.Uuid
user User @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade)
wantId String @db.Uuid wantId String @db.Uuid
want Want @relation(fields: [wantId], references: [id], onDelete: Cascade, onUpdate: Cascade) want Want @relation(fields: [wantId], references: [id], onDelete: Cascade)
// only one offer per want for a user // only one offer per want for a user
// @@unique([userId, wantId]) // @@unique([userId, wantId])
+2 -2
View File
@@ -113,7 +113,7 @@ export default function createApi(log: Log, pg: Pg, discogs, offers, events) {
const user = await pg.userFindId(ctx.state.user.id); const user = await pg.userFindId(ctx.state.user.id);
const release = await discogs.release(releaseId); const release = await discogs.release(releaseId);
const want = await pg.wantCreate(release, user); const want = await pg.wantCreate(release, user);
events.emit(Events.WantsAdded, [want]); events.emit(Events.WantAdded, want);
ctx.response.body = [want]; ctx.response.body = [want];
}); });
@@ -122,7 +122,7 @@ export default function createApi(log: Log, pg: Pg, discogs, offers, events) {
const { username } = ctx.request.body; const { username } = ctx.request.body;
const user = await pg.userFindId(ctx.state.user.id); const user = await pg.userFindId(ctx.state.user.id);
const wants = await discogs.wantListSync(username, user); const wants = await discogs.wantListSync(username, user);
events.emit(Events.WantsAdded, wants); wants.forEach(w => events.emit(Events.WantAdded, w));
ctx.response.body = wants; ctx.response.body = wants;
}); });
+27 -23
View File
@@ -9,7 +9,7 @@ import { wantDetails } from './utils';
import routerAuth from './routers/router.auth'; import routerAuth from './routers/router.auth';
export enum Events { export enum Events {
WantsAdded = 'WantsAdded', WantAdded = 'WantAdded',
StartupSync = 'StartupSync', StartupSync = 'StartupSync',
ListingsUpdated = 'ListingsUpdated', ListingsUpdated = 'ListingsUpdated',
} }
@@ -17,37 +17,41 @@ export enum Events {
export default function createEvents(log: Log, pg: Pg, discogs, offers) { export default function createEvents(log: Log, pg: Pg, discogs, offers) {
const events = new EventEmitter({ captureRejections: true }); const events = new EventEmitter({ captureRejections: true });
events.on('error', function eventError(e) { async function populateListings(want: Want) {
log.error('event error', e);
});
events.on(Events.WantsAdded, async function wantsAdded(wants: Want[]) {
log.info({ event: Events.WantsAdded, wants: wants.length });
for (const want of wants) {
const listings = await discogs.listings(want);
log.info({ count: listings.length, ...wantDetails(want) }, 'listings added')
}
log.info('finished fetching listings', { wants: wants.length });
});
events.on(Events.StartupSync, async function wantsAdded() {
const wants = await pg.wantsToSync();
log.info({ event: Events.StartupSync, wants: wants.length });
for (const want of wants) {
try { try {
const listings = await discogs.listings(want); const listings = await discogs.listings(want);
log.info({ count: listings.length, ...wantDetails(want) }, 'listings added') return listings;
} catch (e) { } catch (e) {
if (e.message === 'rate limited') { if (e.message === 'rate limited') {
log.warn('rate limited, trying again in 60s'); log.warn('rate limited, trying again in 60s');
await setTimeout(60 * 1000); await setTimeout(60 * 1000);
const listings = await discogs.listings(want); return populateListings(want);
} }
} }
} }
log.info('finished syncing', { wants: wants.length });
events.on('error', function eventError(e) {
log.error('event error', e);
});
events.on(Events.WantAdded, async function wantAdded(want: Want) {
log.info({ event: Events.WantAdded, ...wantDetails(want) });
const listings = await populateListings(want);
log.info({ listings: listings.length, ...wantDetails(want) }, 'listings added');
events.emit(Events.ListingsUpdated);
});
events.on(Events.StartupSync, async function wantAdded() {
const wants = await pg.wantsToSync();
log.info({ event: Events.StartupSync, wants: wants.length });
for (const want of wants) {
const listings = await populateListings(want);
log.info({ listings: listings.length, ...wantDetails(want) }, 'listings added');
}
log.info({ wants: wants.length }, 'finished syncing');
events.emit(Events.ListingsUpdated);
}); });