refund and delayed charge

This commit is contained in:
jackiettran
2025-09-04 16:44:47 -04:00
parent b59fc07fc3
commit b22e4fa910
19 changed files with 1255 additions and 594 deletions

View File

@@ -4,66 +4,6 @@ const { User, Item } = require("../models");
const StripeService = require("../services/stripeService");
const router = express.Router();
router.post("/create-checkout-session", authenticateToken, async (req, res) => {
try {
const { itemName, total, return_url, rentalData } = req.body;
if (!itemName) {
return res.status(400).json({ error: "No item name found" });
}
if (total == null || total === undefined) {
return res.status(400).json({ error: "No total found" });
}
if (!return_url) {
return res.status(400).json({ error: "No return_url found" });
}
// Validate rental data and user authorization
if (rentalData && rentalData.itemId) {
const item = await Item.findByPk(rentalData.itemId);
if (!item) {
return res.status(404).json({ error: "Item not found" });
}
if (!item.availability) {
return res
.status(400)
.json({ error: "Item is not available for rent" });
}
// Check if user is trying to rent their own item
if (item.ownerId === req.user.id) {
return res.status(400).json({ error: "You cannot rent your own item" });
}
}
// Prepare metadata - Stripe metadata keys must be strings
const metadata = rentalData
? {
itemId: rentalData.itemId,
renterId: req.user.id.toString(), // Add authenticated user ID
startDateTime: rentalData.startDateTime,
endDateTime: rentalData.endDateTime,
totalAmount: rentalData.totalAmount.toString(),
deliveryMethod: rentalData.deliveryMethod,
}
: { renterId: req.user.id.toString() };
const session = await StripeService.createCheckoutSession({
item_name: itemName,
total: total,
return_url: return_url,
metadata: metadata,
});
res.json({ clientSecret: session.client_secret });
} catch (error) {
console.error("Error creating checkout session:", error);
res.status(500).json({ error: error.message });
}
});
// Get checkout session status
router.get("/checkout-session/:sessionId", async (req, res) => {
try {
@@ -75,6 +15,7 @@ router.get("/checkout-session/:sessionId", async (req, res) => {
status: session.status,
payment_status: session.payment_status,
customer_email: session.customer_details?.email,
setup_intent: session.setup_intent,
metadata: session.metadata,
});
} catch (error) {
@@ -179,4 +120,54 @@ router.get("/account-status", authenticateToken, async (req, res) => {
}
});
// Create embedded setup checkout session for collecting payment method
router.post("/create-setup-checkout-session", authenticateToken, async (req, res) => {
try {
const { rentalData } = req.body;
const user = await User.findByPk(req.user.id);
if (!user) {
return res.status(404).json({ error: "User not found" });
}
// Create or get Stripe customer
let stripeCustomerId = user.stripeCustomerId;
if (!stripeCustomerId) {
// Create new Stripe customer
const customer = await StripeService.createCustomer({
email: user.email,
name: `${user.firstName} ${user.lastName}`,
metadata: {
userId: user.id.toString()
}
});
stripeCustomerId = customer.id;
// Save customer ID to user record
await user.update({ stripeCustomerId });
}
// Add rental data to metadata if provided
const metadata = rentalData ? {
rentalData: JSON.stringify(rentalData)
} : {};
const session = await StripeService.createSetupCheckoutSession({
customerId: stripeCustomerId,
metadata
});
res.json({
clientSecret: session.client_secret,
sessionId: session.id
});
} catch (error) {
console.error("Error creating setup checkout session:", error);
res.status(500).json({ error: error.message });
}
});
module.exports = router;