Example
Shop / Purchase Flow
Server-authoritative | validates stock and currency, deducts, then pushes the inventory update reliably.
app:Get("shop/catalogue", function(Player, Payload, req, res)
res:Send(catalogue)
end)
app:Get("shop/balance/:userId=number", function(Player, Payload, req, res)
res:Send({ balance = currency[req.params.userId] or 0 })
end)
app:Post("shop/buy", function(Player, Payload, req, res)
local item = catalogue[req.data and req.data.itemId]
if not item then res:Status(404):Error("Not found"); return end
if item.stock <= 0 then res:Status(400):Error("Out of stock"); return end
if (currency[Player.UserId] or 0) < item.price then res:Status(400):Error("Insufficient funds"); return end
currency[Player.UserId] -= item.price; item.stock -= 1
app:Push(Player, "shop.purchased", { item = req.data.itemId, balance = currency[Player.UserId] })
res:Send({ success = true })
end)
See also
App · Server Push · Router | typed param :userId=number · MVC Pattern | refactoring this into clean architecture · Inventory System | full CRUD with DataStore