Skip to content

Instantly share code, notes, and snippets.

@Pyrolistical
Created October 22, 2021 23:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Pyrolistical/8ef172eb9c80c827d43b26f575d94cc3 to your computer and use it in GitHub Desktop.
Save Pyrolistical/8ef172eb9c80c827d43b26f575d94cc3 to your computer and use it in GitHub Desktop.
ecommerce-escalation v2 repo
export default (mongoClient, db) => {
return {
async checkoutTransaction(closure) {
const session = mongoClient.startSession({
causalConsistency: true
});
try {
const sessionRepository = {
async findInventoryByProuctSkus(productSkus) {
return db.collection('inventory').find({
productSku: {
$in: productSkus
}
}, {
session
})
.toArray();
},
async updateInventoryStock(updates) {
return db.collection('inventory').bulkWrite(updates.map(({productSku, stock}) => {
return {
updateOne: {
filter: {
productSku
},
update: {
$set: stock
}
}
}
}), {
session
});
},
async createOrder(order) {
const {insertedId} = await db.collection('order').insertOne(order, {
session
});
return insertedId;
}
};
return session.withTransaction(closure(sessionRepository));
} finally {
await session.endSession();
}
}
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment