diff --git a/api/index.ts b/api/index.ts index 4d12a0c..0c70153 100644 --- a/api/index.ts +++ b/api/index.ts @@ -28,7 +28,7 @@ async function start() { events, } = createServices(log); - // events.emit(Events.StartupSync); + events.emit(Events.StartupSync); // events.emit(Events.ListingsUpdated); api.listen(); diff --git a/api/prisma/schema.prisma b/api/prisma/schema.prisma index 36d6411..a368cb8 100644 --- a/api/prisma/schema.prisma +++ b/api/prisma/schema.prisma @@ -72,13 +72,13 @@ model Offer { comparison Decimal @db.Money listingId Int - listing Listing @relation(fields: [listingId], references: [id]) + listing Listing @relation(fields: [listingId], references: [id], onDelete: Restrict) 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 - 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 // @@unique([userId, wantId]) diff --git a/api/src/api.ts b/api/src/api.ts index b7c4e48..09cc6b8 100644 --- a/api/src/api.ts +++ b/api/src/api.ts @@ -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 release = await discogs.release(releaseId); const want = await pg.wantCreate(release, user); - events.emit(Events.WantsAdded, [want]); + events.emit(Events.WantAdded, 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 user = await pg.userFindId(ctx.state.user.id); const wants = await discogs.wantListSync(username, user); - events.emit(Events.WantsAdded, wants); + wants.forEach(w => events.emit(Events.WantAdded, w)); ctx.response.body = wants; }); diff --git a/api/src/events.ts b/api/src/events.ts index 0568550..3dcfe89 100644 --- a/api/src/events.ts +++ b/api/src/events.ts @@ -9,7 +9,7 @@ import { wantDetails } from './utils'; import routerAuth from './routers/router.auth'; export enum Events { - WantsAdded = 'WantsAdded', + WantAdded = 'WantAdded', StartupSync = 'StartupSync', ListingsUpdated = 'ListingsUpdated', } @@ -17,37 +17,41 @@ export enum Events { export default function createEvents(log: Log, pg: Pg, discogs, offers) { const events = new EventEmitter({ captureRejections: true }); + async function populateListings(want: Want) { + try { + const listings = await discogs.listings(want); + return listings; + } catch (e) { + if (e.message === 'rate limited') { + log.warn('rate limited, trying again in 60s'); + await setTimeout(60 * 1000); + return populateListings(want); + } + } + } + events.on('error', function eventError(e) { 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.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 wantsAdded() { + 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) { - try { - const listings = await discogs.listings(want); - log.info({ count: listings.length, ...wantDetails(want) }, 'listings added') - } catch (e) { - if (e.message === 'rate limited') { - log.warn('rate limited, trying again in 60s'); - await setTimeout(60 * 1000); - const listings = await discogs.listings(want); - } - } + const listings = await populateListings(want); + log.info({ listings: listings.length, ...wantDetails(want) }, 'listings added'); } - log.info('finished syncing', { wants: wants.length }); + + log.info({ wants: wants.length }, 'finished syncing'); + events.emit(Events.ListingsUpdated); });