Update picnic-api to my fork and add cart cmds

main
Yorick van Pelt 2023-02-04 21:10:20 +01:00
parent ea4cdb2c87
commit d71eb1ec02
Signed by: yorick
GPG Key ID: A36E70F9DC014A15
3 changed files with 50 additions and 20 deletions

View File

@ -2,8 +2,7 @@ import PicnicClient from "picnic-api"
import type {
ApiConfig,
Decorator,
PriceDecorator,
Delivery,
Delivery
} from "picnic-api/lib/types/picnic-api.js"
import type { ParsedArgs } from 'minimist'
import { DateTime } from "luxon"
@ -12,10 +11,11 @@ import { jsonOut, csvOut, sum, runCommands, getXdgConfigHome } from "./util.js"
import path from "node:path"
import repl from "node:repl"
type QuantityDecorator = {
type: "QUANTITY"
quantity: number
}
function getDecorator(
thing: { decorators?: Decorator[] },
name: "PROMO",
fallback?: string
): string
function getDecorator(
thing: { decorators?: Decorator[] },
name: "QUANTITY",
@ -39,6 +39,8 @@ function getDecorator<R>(
return l[0].quantity
case "PRICE":
return l[0].display_price
case "PROMO":
return l[0].text
}
}
return fallback
@ -53,16 +55,7 @@ function deliveryToCSV(delv: Delivery) {
"yyyy-MM-dd HH:mm"
)
for (const orderline of order.items) {
const totalqty = sum(
orderline.items.map(x => getDecorator(x, "QUANTITY"))
)
// todo orderline decorators
const real_price = getDecorator(
orderline as any,
"PRICE",
orderline.display_price
)
const display_price = orderline.display_price
const real_price = getDecorator(orderline, "PRICE", orderline.display_price)
const totalprice = sum(orderline.items.map(x => x.price))
const promo = real_price / totalprice
for (const orderarticle of orderline.items) {
@ -134,6 +127,44 @@ const commands = (argv: ParsedArgs) => {
}
}
},
async article(id: string) {
jsonOut(await p.getArticle(id))
},
async "cart.list"() {
const cart = await p.getShoppingCart()
if (argv.json) {
jsonOut(cart)
} else {
const out: any[] = []
cart.items.map(orderLine => {
const isGroup = orderLine.items.length > 1
if (isGroup) {
out.push({
name: `<Group ${getDecorator(orderLine, "PROMO", "???")}>`,
price: getDecorator(orderLine, "PRICE", orderLine.price)
})
}
for (const item of orderLine.items) {
out.push({
id: item.id,
name: item.name,
quantity: getDecorator(item, "QUANTITY", 1),
price: item.price
})
}
if (isGroup) out.push({name: "</Group>"})
})
console.table(out);
}
},
async "cart.add"(product: string, count: string = "1") {
if (isNaN(+count)) throw new TypeError("count must be a number")
await p.addProductToShoppingCart(product, +count)
},
async "cart.del"(product: string, count: string = "1") {
if (isNaN(+count)) throw new TypeError("count must be a number")
await p.removeProductFromShoppingCart(product, +count)
},
repl() {
repl.start().context.p = p
}

View File

@ -4,7 +4,7 @@
"dependencies": {
"luxon": "^3.2.1",
"minimist": "^1.2.7",
"picnic-api": "^2.0.1"
"picnic-api": "yorickvp/picnic-api#getArticle"
},
"bin": {
"picnic": "./bin/picnic.js"

View File

@ -598,10 +598,9 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
picnic-api@^2.0.1:
picnic-api@yorickvp/picnic-api#getArticle:
version "2.0.1"
resolved "https://registry.yarnpkg.com/picnic-api/-/picnic-api-2.0.1.tgz#0a67c3423ad20098a3c38a78f785af522e970ab5"
integrity sha512-6F1eumsFgUvkGWzQOOhDQwuiDIbbeedCdzTr4j6fkNrmud85TX4EZgEC7AQtRJPfBFA40G0bGi4eCUrROJEpjA==
resolved "https://codeload.github.com/yorickvp/picnic-api/tar.gz/338b2ba6ab8a2c54f5778cfbe8ab71eaffcd411b"
dependencies:
axios "^0.26.0"
crypto-js "^4.1.1"