const express = require("express"); const { authenticateToken } = require("../middleware/auth"); const { User } = require("../models"); const { Rental, Item } = require("../models"); const StripeService = require("../services/stripeService"); const router = express.Router(); const platformFee = 0.1; router.post("/create-checkout-session", async (req, res) => { try { const { itemName, total, return_url } = 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" }); } const session = await StripeService.createCheckoutSession({ item_name: itemName, total: total, return_url: return_url, }); 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 { const { sessionId } = req.params; const session = await StripeService.getCheckoutSession(sessionId); res.json({ status: session.status, payment_status: session.payment_status, customer_email: session.customer_details?.email, }); } catch (error) { console.error("Error retrieving checkout session:", error); res.status(500).json({ error: error.message }); } }); // // Create connected account // router.post("/accounts", authenticateToken, async (req, res) => { // try { // const user = await User.findByPk(req.user.id); // if (!user) { // return res.status(404).json({ error: "User not found" }); // } // // Check if user already has a connected account // if (user.stripeConnectedAccountId) { // return res // .status(400) // .json({ error: "User already has a connected account" }); // } // // Create connected account // const account = await StripeService.createConnectedAccount({ // email: user.email, // country: "US", // You may want to make this configurable // }); // // Update user with account ID // await user.update({ // stripeConnectedAccountId: account.id, // }); // res.json({ // stripeConnectedAccountId: account.id, // success: true, // }); // } catch (error) { // console.error("Error creating connected account:", error); // res.status(500).json({ error: error.message }); // } // }); // // Generate onboarding link // router.post("/account-links", authenticateToken, async (req, res) => { // try { // const user = await User.findByPk(req.user.id); // if (!user || !user.stripeConnectedAccountId) { // return res.status(400).json({ error: "No connected account found" }); // } // const { refreshUrl, returnUrl } = req.body; // if (!refreshUrl || !returnUrl) { // return res // .status(400) // .json({ error: "refreshUrl and returnUrl are required" }); // } // const accountLink = await StripeService.createAccountLink( // user.stripeConnectedAccountId, // refreshUrl, // returnUrl // ); // res.json({ // url: accountLink.url, // expiresAt: accountLink.expires_at, // }); // } catch (error) { // console.error("Error creating account link:", error); // res.status(500).json({ error: error.message }); // } // }); // // Get account status // router.get("/account-status", authenticateToken, async (req, res) => { // try { // const user = await User.findByPk(req.user.id); // if (!user || !user.stripeConnectedAccountId) { // return res.status(400).json({ error: "No connected account found" }); // } // const accountStatus = await StripeService.getAccountStatus( // user.stripeConnectedAccountId // ); // res.json({ // accountId: accountStatus.id, // detailsSubmitted: accountStatus.details_submitted, // payoutsEnabled: accountStatus.payouts_enabled, // capabilities: accountStatus.capabilities, // requirements: accountStatus.requirements, // }); // } catch (error) { // console.error("Error getting account status:", error); // res.status(500).json({ error: error.message }); // } // }); // // Create payment intent for rental // router.post("/payment-intents", authenticateToken, async (req, res) => { // try { // const { rentalId, amount } = req.body; // if (!rentalId || !amount) { // return res // .status(400) // .json({ error: "rentalId and amount are required" }); // } // // Get rental details to find owner's connected account // const rental = await Rental.findByPk(rentalId, { // include: [{ model: Item, as: "item" }], // }); // if (!rental) { // return res.status(404).json({ error: "Rental not found" }); // } // if (rental.ownerId !== req.user.id) { // return res.status(403).json({ error: "Unauthorized" }); // } // // Get owner's connected account // const owner = await User.findByPk(rental.ownerId); // if (!owner || !owner.stripeConnectedAccountId) { // return res // .status(400) // .json({ error: "Owner does not have a connected account" }); // } // const applicationFeeAmount = Math.round(amount * platformFee); // const paymentIntent = await StripeService.createPaymentIntent({ // amount: Math.round(amount * 100), // Convert to cents // currency: "usd", // connectedAccountId: owner.stripeConnectedAccountId, // applicationFeeAmount: applicationFeeAmount * 100, // Convert to cents // metadata: { // rentalId: rental.id, // renterId: rental.renterId, // ownerId: owner.id, // }, // }); // res.json({ // clientSecret: paymentIntent.client_secret, // paymentIntentId: paymentIntent.id, // }); // } catch (error) { // console.error("Error creating payment intent:", error); // res.status(500).json({ error: error.message }); // } // }); module.exports = router;