Design the inventory service for Blinkit store. Support checkAvailability(prodID, qty),
reserve(ProdID, qty, orderId) (a temporary hold), confirm(orderId) (order placed), and release(orderId) (payment failed).
Pls review my below design for this. Feel free to write your version of it.
class ReservedItem{
uid,
orderID;
prodID;
qtty
expiryTime
};
class Product{
uint id;
string name;
}
class Inventory{
unordered_map<uint,uint> ItemQtty;
unordered_map<uint, unordered_map<uint,ReservedItem>> reservedItems; //orderID vs prodID vs qtty
bool checkAvailability(uint productID, size_t qtty){
return ItemQtty[productID] >= qtty;
}
bool reserve(orderID, prodID, qtty){
{
lock(mtx);
if(checkAvailability(prodID, qtty) == false) return false;
reservedItems[orderID][prodID]+= qtty;
ItemQtty[prodID]-= qtty;
}
}
void handleExpiredreservedItems(){
for(all reservedItem : reservedItems)
if(reservedItem.expired())
deleteItem;
ItemQtty[reserveditem.prodID]+= reserveditem.qtty;
}
void confirm(orderID){
reservedItems.erase(orderID);
}
void release(orderID){
for(all prodID : reservedItems[orderID]
ItemQtty[prodID]+= qtty;
reservedItems.erase(orderID);
}
};
class Order{
uint id;
uint usrID;
vector<uint> productID;
}
class Orders{
hasmap<uint, Order> orders;
}
class Blinkit{
Inventory inv;
bool checkAvailability(productID, qtty){
return inv.checkAvailiabilty(productID, qtty);
}
};