local Luan = require "luan:Luan.luan" local error = Luan.error local ipairs = Luan.ipairs or error() local pairs = Luan.pairs or error() local stringify = Luan.stringify or error() local Parsers = require "luan:Parsers.luan" local json_parse = Parsers.json_parse or error() local Shared = require "site:/lib/Shared.luan" local user_error = Shared.user_error or error() local After = require "site:/lib/After.luan" local users = require "site:/private/lib/users.luan" local shippers = require "site:/lib/shippers/shippers.luan" local Order = require "site:/lib/Order.luan" local Api = {} local function check(request) local user = request.user or user_error "missing 'user'" local password = request.password or user_error "missing 'password'" local target = request.target or user_error "missing 'target'" target=="test" or target=="production" or user_error "target must be 'test' or 'production'" local user_info = users[user] if user_info == nil then target=="test" or user_error "invalid user" else password == user_info.password or user_error "invalid password" end end function Api.respond(request) check(request) local action = request.action or user_error "missing 'action'" local orders = request.orders or user_error "missing 'orders'" local rtn_orders = {} local shipper_requests = {} local check_keys = request.checkKeys==true for key, order in pairs(orders) do local shipper = order.shipper if shipper == nil then rtn_orders[key] = { okay=false, error="missing 'shipper'" } continue end if shippers[shipper] == nil then rtn_orders[key] = { okay=false, error="invalid shipper '"..shipper.."'" } continue end if shippers[shipper][action] == nil then rtn_orders[key] = { okay=false, error="shipper '"..shipper.."' doesn't support action '"..action.."'" } continue end if check_keys then local order_id = order.orderId if order_id == nil then rtn_orders[key] = { okay=false, error="checkKeys set but no orderId" } continue end local order = Order.get(shipper,order_id) if order ~= nil then local req = json_parse(order.request) local req_key = pairs(req.orders)() or error() if key ~= req_key then rtn_orders[key] = { okay=false, error="checkKeys failed, keys don't match, expected '"..req_key.."'" } continue end end end shipper_requests[shipper] = shipper_requests[shipper] or {} shipper_requests[shipper][key] = order --order.shipper = nil end for shipper, orders in pairs(shipper_requests) do local response_orders = shippers[shipper][action](request,orders) for key, order in pairs(response_orders) do if not order.okay and order.error==nil then error("invalid response "..stringify(order).."\nto "..action.." "..stringify(orders[key])) end rtn_orders[key] = order end end After[action] and After[action](request,rtn_orders) return { okay = true orders = rtn_orders } end return Api