Compare commits
No commits in common. 'brickowl' and 'master' have entirely different histories.
@ -1,168 +0,0 @@
|
|||||||
const superagent = require('superagent');
|
|
||||||
const LotListing = require('./LotListing')
|
|
||||||
const brickLinkAgent = superagent.agent().set('Accept', 'application/json');
|
|
||||||
const htmlParser = require('node-html-parser');
|
|
||||||
const _ = require('lodash');
|
|
||||||
const brickOwlKey = process.env.brickowlKey
|
|
||||||
module.exports = {
|
|
||||||
getInternalPartId(legoPartNumber, type = 'Part') {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
brickLinkAgent.get(`https://api.brickowl.com/v1/catalog/id_lookup`)
|
|
||||||
.query({
|
|
||||||
key: brickOwlKey,
|
|
||||||
id: legoPartNumber,
|
|
||||||
type: type,
|
|
||||||
})
|
|
||||||
// .set('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:107.0) Gecko/20100101 Firefox/107.0')
|
|
||||||
.then((response => {
|
|
||||||
if(response.statusCode !== 200) throw response.statusCode;
|
|
||||||
const possibleIds = _.get(response, 'body.boids');
|
|
||||||
if(possibleIds.length != 1) {
|
|
||||||
throw new Error(`Unable to uniquely get internal id for part ${legoPartNumber}, found ${possibleIds}`)
|
|
||||||
}
|
|
||||||
return resolve(possibleIds[0]);
|
|
||||||
})).catch(error => {
|
|
||||||
reject(error);
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
},
|
|
||||||
getListings(internalPartId, colorId) {
|
|
||||||
return new Promise(async (resolve, reject) => {
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, Math.random() * 500 + 100));
|
|
||||||
var query = {
|
|
||||||
key: brickOwlKey,
|
|
||||||
boid: internalPartId,
|
|
||||||
country: 'US'
|
|
||||||
// loc: 'US',
|
|
||||||
// rpp: 100
|
|
||||||
// cond: 'U'
|
|
||||||
}
|
|
||||||
if(colorId){
|
|
||||||
query.color = colorId
|
|
||||||
}
|
|
||||||
brickLinkAgent.get(`https://api.brickowl.com/v1/catalog/availability`)
|
|
||||||
.query(query)
|
|
||||||
// .set('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:107.0) Gecko/20100101 Firefox/107.0')
|
|
||||||
.set('Accept', 'application/json').then(response => {
|
|
||||||
if(!response.body) {
|
|
||||||
console.log(response.body, query)
|
|
||||||
return reject('no list found');
|
|
||||||
}
|
|
||||||
//convert to array
|
|
||||||
const list = _.values(response.body).filter(lot => {
|
|
||||||
return lot.country === 'US' && lot.base_currency === 'USD'
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
resolve(list.map(l => new LotListing({
|
|
||||||
idInv: l.lot_id,
|
|
||||||
strDesc: l.url,
|
|
||||||
codeNew: l.con === 'new' ? 'N' : 'U',
|
|
||||||
codeComplete: null,
|
|
||||||
n4Qty: parseInt(l.qty),
|
|
||||||
strColor: 'UHHHH',
|
|
||||||
idColor: l.boid.includes('-') ? l.boid.substring(l.boid.indexOf('-') + 1) : 0,
|
|
||||||
mMinBuy: l.minimum_order,
|
|
||||||
strSellerUsername: l.store_id,
|
|
||||||
strStorename: l.store_name,
|
|
||||||
instantCheckout: false,
|
|
||||||
legoPartNumber: 'UHHHH',
|
|
||||||
boid: l.boid,
|
|
||||||
mDisplaySalePrice: l.price
|
|
||||||
|
|
||||||
})));
|
|
||||||
}).catch(error => {
|
|
||||||
console.error('HTTP error from getListings', error)
|
|
||||||
reject(error);
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
},
|
|
||||||
getListingsByLegoPartNumber(legoPartNumber, colorId){
|
|
||||||
return module.exports.getInternalPartId(legoPartNumber).then((blPartNumber) => module.exports.getListings(blPartNumber, colorId)).then(listings => {
|
|
||||||
return listings.map(listing => {
|
|
||||||
listing.legoPartNumber = legoPartNumber
|
|
||||||
return listing;
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
getStoreId(sellerUsername) {
|
|
||||||
return new Error('Not implemented');
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
brickLinkAgent.get(`https://store.bricklink.com/${sellerUsername}`)
|
|
||||||
.then((response => {
|
|
||||||
const storeIdRegex = /username:\s+'.+',\s+id:\s+(?<storeId>\d+)/gm;
|
|
||||||
const matches = storeIdRegex.exec(response.text);
|
|
||||||
resolve(matches.groups?.storeId)
|
|
||||||
})).catch(error => {
|
|
||||||
console.error('HTTP error from getStoreId', error)
|
|
||||||
reject(error);
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
},
|
|
||||||
getSetInventory(setId) {
|
|
||||||
return new Promise(async (resolve, reject) => {
|
|
||||||
const setBoid = await module.exports.getInternalPartId(setId, 'Set')
|
|
||||||
brickLinkAgent.get(`https://api.brickowl.com/v1/catalog/inventory`)
|
|
||||||
.query({
|
|
||||||
key: brickOwlKey,
|
|
||||||
boid: setBoid
|
|
||||||
})
|
|
||||||
.then((response => {
|
|
||||||
return resolve(_.get(response, 'body.inventory', []).map(type => {
|
|
||||||
return {
|
|
||||||
partNumber: null,
|
|
||||||
internalPartId: type.boid,
|
|
||||||
colorId: null,
|
|
||||||
quantity: type.quantity
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
|
|
||||||
// var root = htmlParser.parse(response.text);
|
|
||||||
|
|
||||||
// const rows = root.querySelectorAll('.IV_ITEM')
|
|
||||||
// const parsed = rows.map(row => {
|
|
||||||
// const partRegex = /\/v2\/catalog\/catalogitem.page\?P=(?<legoPartNumber>.+)&idColor=(?<colorId>\d+)/gm;
|
|
||||||
// const quantityRegex = /<TD ALIGN="RIGHT">\ (?<quantity>\d+)/gm
|
|
||||||
// const matches = partRegex.exec(row.innerHTML);
|
|
||||||
// const quantityMatches = quantityRegex.exec(row.innerHTML);
|
|
||||||
// if(!matches) return null;
|
|
||||||
// return {
|
|
||||||
// partNumber: matches.groups?.legoPartNumber,
|
|
||||||
// colorId: parseInt(matches.groups?.colorId),
|
|
||||||
// quantity: parseInt(quantityMatches.groups?.quantity)
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// }).filter(r => r !== null);
|
|
||||||
|
|
||||||
|
|
||||||
resolve(parsed)
|
|
||||||
})).catch(error => {
|
|
||||||
console.error('HTTP error from getStoreId', error)
|
|
||||||
reject(error);
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
},
|
|
||||||
getDetails(boid) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
brickLinkAgent.get(`https://api.brickowl.com/v1/catalog/lookup`)
|
|
||||||
.query({
|
|
||||||
key: brickOwlKey,
|
|
||||||
boid: boid
|
|
||||||
})
|
|
||||||
.then((response => {
|
|
||||||
|
|
||||||
resolve(response.body)
|
|
||||||
})).catch(error => {
|
|
||||||
console.error('HTTP error from getStoreId', error)
|
|
||||||
reject(error);
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
@ -1,12 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"partNumber": 30295,
|
|
||||||
"quantity": 1,
|
|
||||||
"colorId": 53
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"partNumber": 30324,
|
|
||||||
"quantity": 4,
|
|
||||||
"colorId": 38
|
|
||||||
}
|
|
||||||
]
|
|
||||||
Loading…
Reference in New Issue