bundle offers grouped

This commit is contained in:
ntr committed 2022-10-23 15:22:15 +11:00
1 parent 7946259550
commit 623d0f3938
12 files changed
+228 -148

No files matched your search

+30 -41
View File
@@ -11,12 +11,11 @@
"dependencies": {
"@koa/cors": "^3.3.0",
"@koa/router": "^12.0.0",
"@prisma/client": "^4.1.0",
"@prisma/client": "^4.5.0",
"bcrypt": "^5.0.1",
"bluebird": "^3.7.2",
"bunyan": "^1.8.15",
"cheerio": "^1.0.0-rc.12",
"json-rpc-2.0": "^1.4.1",
"koa": "^2.13.4",
"koa-body": "^5.0.0",
"koa-passport": "^5.0.0",
@@ -35,7 +34,7 @@
"axios": "^0.27.2",
"mocha": "^10.0.0",
"node-dev": "^7.4.3",
"prisma": "^4.1.0",
"prisma": "^4.5.0",
"ts-node-dev": "^2.0.0",
"typescript": "^4.7.4"
}
@@ -136,12 +135,12 @@
}
},
"node_modules/@prisma/client": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.1.0.tgz",
"integrity": "sha512-MvfPGAd42vHTiCYxwS6N+2U3F+ukoJ48D2QRnX1zSPJHBkh1CBtshl75daKzvVfgQwSouzSQeugKDej5di+E/g==",
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.5.0.tgz",
"integrity": "sha512-B2cV0OPI1smhdYUxsJoLYQLoMlLH06MUxgFUWQnHodGMX98VRVXKmQE/9OcrTNkqtke5RC+YU24Szxd04tZA2g==",
"hasInstallScript": true,
"dependencies": {
"@prisma/engines-version": "4.1.0-48.8d8414deb360336e4698a65aa45a1fbaf1ce13d8"
"@prisma/engines-version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452"
},
"engines": {
"node": ">=14.17"
@@ -156,16 +155,16 @@
}
},
"node_modules/@prisma/engines": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.1.0.tgz",
"integrity": "sha512-quqHXD3P83NBLVtRlts4SgKHmqgA8GMiyDTJ7af03Wg0gl6F5t65mBYvIuwmD+52vHm42JtIsp/fAO9YIV0JBA==",
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.5.0.tgz",
"integrity": "sha512-4t9ir2SbQQr/wMCNU4YpHWp5hU14J2m3wHUZnGJPpmBF8YtkisxyVyQsKd1e6FyLTaGq8LOLhm6VLYHKqKNm+g==",
"devOptional": true,
"hasInstallScript": true
},
"node_modules/@prisma/engines-version": {
"version": "4.1.0-48.8d8414deb360336e4698a65aa45a1fbaf1ce13d8",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.1.0-48.8d8414deb360336e4698a65aa45a1fbaf1ce13d8.tgz",
"integrity": "sha512-cRRJwpHFGFJZvtHbY3GZjMffNBEjjZk68ztn+S2hDgPCGB4H66IK26roK94GJxBodSehwRJ0wGyebC2GoIH1JQ=="
"version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452.tgz",
"integrity": "sha512-o7LyVx8PPJBLrEzLl6lpxxk2D5VnlM4Fwmrbq0NoT6pr5aa1OuHD9ZG+WJY6TlR/iD9bhmo2LNcxddCMr5Rv2A=="
},
"node_modules/@tsconfig/node10": {
"version": "1.0.9",
@@ -1873,11 +1872,6 @@
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/json-rpc-2.0": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/json-rpc-2.0/-/json-rpc-2.0-1.4.1.tgz",
"integrity": "sha512-OX1NJhpIfuK4GjDnJ/gKtZy1HOYo0l4eL0a4rb0rNeQheX1xlyQ9+JMmPzs/sFNthpS/TXKPWlGo09X7B5l81A=="
},
"node_modules/keygrip": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz",
@@ -2989,13 +2983,13 @@
}
},
"node_modules/prisma": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-4.1.0.tgz",
"integrity": "sha512-iwqpAT6In1uvMSwQAM3PqmaBdhh2OaQ/2t+n3RjpW4vAKP3R7E1T34FZUU4zGOWtMWm5dt0sPThQkT/h87r6gw==",
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-4.5.0.tgz",
"integrity": "sha512-9Aeg4qiKlv9Wsjz4NO8k2CzRzlvS3A4FYVJ5+28sBBZ0eEwbiVOE/Jj7v6rZC1tFW2s4GSICQOAyuOjc6WsNew==",
"devOptional": true,
"hasInstallScript": true,
"dependencies": {
"@prisma/engines": "4.1.0"
"@prisma/engines": "4.5.0"
},
"bin": {
"prisma": "build/index.js",
@@ -3790,23 +3784,23 @@
}
},
"@prisma/client": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.1.0.tgz",
"integrity": "sha512-MvfPGAd42vHTiCYxwS6N+2U3F+ukoJ48D2QRnX1zSPJHBkh1CBtshl75daKzvVfgQwSouzSQeugKDej5di+E/g==",
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.5.0.tgz",
"integrity": "sha512-B2cV0OPI1smhdYUxsJoLYQLoMlLH06MUxgFUWQnHodGMX98VRVXKmQE/9OcrTNkqtke5RC+YU24Szxd04tZA2g==",
"requires": {
"@prisma/engines-version": "4.1.0-48.8d8414deb360336e4698a65aa45a1fbaf1ce13d8"
"@prisma/engines-version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452"
}
},
"@prisma/engines": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.1.0.tgz",
"integrity": "sha512-quqHXD3P83NBLVtRlts4SgKHmqgA8GMiyDTJ7af03Wg0gl6F5t65mBYvIuwmD+52vHm42JtIsp/fAO9YIV0JBA==",
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.5.0.tgz",
"integrity": "sha512-4t9ir2SbQQr/wMCNU4YpHWp5hU14J2m3wHUZnGJPpmBF8YtkisxyVyQsKd1e6FyLTaGq8LOLhm6VLYHKqKNm+g==",
"devOptional": true
},
"@prisma/engines-version": {
"version": "4.1.0-48.8d8414deb360336e4698a65aa45a1fbaf1ce13d8",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.1.0-48.8d8414deb360336e4698a65aa45a1fbaf1ce13d8.tgz",
"integrity": "sha512-cRRJwpHFGFJZvtHbY3GZjMffNBEjjZk68ztn+S2hDgPCGB4H66IK26roK94GJxBodSehwRJ0wGyebC2GoIH1JQ=="
"version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452.tgz",
"integrity": "sha512-o7LyVx8PPJBLrEzLl6lpxxk2D5VnlM4Fwmrbq0NoT6pr5aa1OuHD9ZG+WJY6TlR/iD9bhmo2LNcxddCMr5Rv2A=="
},
"@tsconfig/node10": {
"version": "1.0.9",
@@ -5100,11 +5094,6 @@
"argparse": "^2.0.1"
}
},
"json-rpc-2.0": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/json-rpc-2.0/-/json-rpc-2.0-1.4.1.tgz",
"integrity": "sha512-OX1NJhpIfuK4GjDnJ/gKtZy1HOYo0l4eL0a4rb0rNeQheX1xlyQ9+JMmPzs/sFNthpS/TXKPWlGo09X7B5l81A=="
},
"keygrip": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz",
@@ -5939,12 +5928,12 @@
"dev": true
},
"prisma": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-4.1.0.tgz",
"integrity": "sha512-iwqpAT6In1uvMSwQAM3PqmaBdhh2OaQ/2t+n3RjpW4vAKP3R7E1T34FZUU4zGOWtMWm5dt0sPThQkT/h87r6gw==",
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-4.5.0.tgz",
"integrity": "sha512-9Aeg4qiKlv9Wsjz4NO8k2CzRzlvS3A4FYVJ5+28sBBZ0eEwbiVOE/Jj7v6rZC1tFW2s4GSICQOAyuOjc6WsNew==",
"devOptional": true,
"requires": {
"@prisma/engines": "4.1.0"
"@prisma/engines": "4.5.0"
}
},
"qs": {
+2 -2
View File
@@ -21,14 +21,14 @@
"axios": "^0.27.2",
"mocha": "^10.0.0",
"node-dev": "^7.4.3",
"prisma": "^4.1.0",
"prisma": "^4.5.0",
"ts-node-dev": "^2.0.0",
"typescript": "^4.7.4"
},
"dependencies": {
"@koa/cors": "^3.3.0",
"@koa/router": "^12.0.0",
"@prisma/client": "^4.1.0",
"@prisma/client": "^4.5.0",
"bcrypt": "^5.0.1",
"bluebird": "^3.7.2",
"bunyan": "^1.8.15",
+1
View File
@@ -65,6 +65,7 @@ model Offer {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
status String
condition String @default("")
item Decimal @db.Money
// markup Decimal @db.Money
+1 -1
View File
@@ -41,6 +41,7 @@ export default function createEvents(log: Log, pg: Pg, discogs, offers) {
for (const want of wants) {
const listings = await populateListings(want);
log.info({ listings: listings.length, ...wantDetails(want) }, 'listings added');
events.emit(Events.ListingsUpdated);
}
log.info({ wants: wants.length }, 'finished syncing');
@@ -50,7 +51,6 @@ export default function createEvents(log: Log, pg: Pg, discogs, offers) {
log.info({ event: Events.WantsAdded, wants: wants.map(w => wantDetails(w)) }, 'starting listings population');
await updateWantListings(wants);
log.info({ event: Events.WantsAdded, wants: wants.map(w => wantDetails(w)) }, 'finished populating listings');
events.emit(Events.ListingsUpdated);
});
events.on(Events.StartupSync, async function startupSync() {
+9 -1
View File
@@ -27,7 +27,7 @@ export default function createOffers(log: Log, pg: Pg) {
// log.info({ listings }, 'creating offers for listings')
const shipping = 10 + Math.random(); // yolt
const shipping = 7.5; // yolt
// const shipping = bulkShipping / listings.length;
// how to deal with users who don't want all items in a bundle...
@@ -41,6 +41,8 @@ export default function createOffers(log: Log, pg: Pg) {
status: Status.Pending,
condition: l.data.condition,
item: l.data.price.value,
shipping,
total: l.data.price.value + shipping,
@@ -145,11 +147,17 @@ export default function createOffers(log: Log, pg: Pg) {
return sellerOffers;
}
async function userOffers(user: User) {
const offers = await pg.userOffers(user);
return groupBy(offers, (o) => o.wantId);
}
return {
generate,
accept,
bundles,
statusSet,
acpOffers,
userOffers,
};
}
+3 -3
View File
@@ -150,7 +150,7 @@ export default function createPg(log: Log, prisma: PrismaClient): Pg {
return prisma.$transaction(async (prisma) => {
log.debug({ currentListingIds });
const openOfferStatuses = [Status.Pending, Status.Accepted];
const protectedOfferStatuses = [Status.Confirmed, Status.Complete];
// can't delete a listing with an open offer
// so delete those offers first
@@ -161,7 +161,7 @@ export default function createPg(log: Log, prisma: PrismaClient): Pg {
notIn: currentListingIds,
},
status: {
in: openOfferStatuses,
notIn: protectedOfferStatuses,
},
}
});
@@ -174,7 +174,7 @@ export default function createPg(log: Log, prisma: PrismaClient): Pg {
where: {
wantId: want.id,
status: {
notIn: openOfferStatuses,
in: protectedOfferStatuses,
}
},
select: {
+2 -2
View File
@@ -24,7 +24,7 @@ export default function createRpc(log: Log, pg: Pg, user: User, ws, discogs, off
}
async function userOffers(): Promise<OffersMessage> {
return [RpcMessageType.Offers, await pg.userOffers(user)];
return [RpcMessageType.Offers, await offers.userOffers(user)];
}
async function userWants(): Promise<WantsMessage> {
@@ -37,7 +37,7 @@ export default function createRpc(log: Log, pg: Pg, user: User, ws, discogs, off
assert(Status[status], 'unknown status');
const offer = await offers.statusSet(user, id, status);
const userOffers = await pg.userOffers(user);
const userOffers = await offers.userOffers(user);
return [RpcMessageType.Offers, userOffers]
}