AkashKumarave commited on
Commit
dba33dd
·
verified ·
1 Parent(s): 0cf60e2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -25
app.py CHANGED
@@ -23,10 +23,17 @@ logger = logging.getLogger(__name__)
23
  # Initialize FastAPI app
24
  app = FastAPI(title="Kling AI Multi-Image Generator API with Razorpay")
25
 
26
- # Enable CORS for the frontend
27
  app.add_middleware(
28
  CORSMiddleware,
29
- allow_origins=["https://hivili.web.app", "https://your-lovable-app.lovable.dev", "http://localhost:3000"], # Add your Lovable.dev URL
 
 
 
 
 
 
 
30
  allow_credentials=True,
31
  allow_methods=["*"],
32
  allow_headers=["*"],
@@ -147,6 +154,7 @@ def create_razorpay_order(amount: int):
147
  "payment_capture": 1 # Auto-capture payment
148
  }
149
  order = razorpay_client.order.create(data=order_data)
 
150
  return order
151
  except Exception as e:
152
  logger.error(f"Failed to create Razorpay order: {str(e)}")
@@ -161,6 +169,7 @@ def verify_payment_signature(order_id: str, payment_id: str, signature: str):
161
  "razorpay_signature": signature
162
  }
163
  razorpay_client.utility.verify_payment_signature(params_dict)
 
164
  return True
165
  except SignatureVerificationError as e:
166
  logger.error(f"Payment signature verification failed: {str(e)}")
@@ -235,36 +244,54 @@ async def generate_image_endpoint(
235
  raise HTTPException(status_code=500, detail=str(e))
236
 
237
  @app.post("/create-razorpay-order")
238
- async def create_razorpay_order(
239
  request: Request,
240
  amount: Optional[int] = Form(None),
241
  body: Optional[CreateOrderRequest] = None
242
  ):
243
  """Create a Razorpay order (supports form-data and JSON)"""
 
 
244
  if not RAZORPAY_KEY_ID or not RAZORPAY_KEY_SECRET:
 
245
  raise HTTPException(status_code=500, detail="Razorpay configuration missing")
246
 
247
  # Handle JSON body if provided
248
- if body and body.amount:
249
- amount = body.amount
250
- elif not amount:
251
- raise HTTPException(status_code=422, detail="Missing or invalid 'amount' parameter")
252
-
253
  try:
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  logger.info(f"Creating order with amount: {amount}")
255
  order = create_razorpay_order(amount)
256
- return JSONResponse(content={
 
257
  "id": order["id"],
258
  "amount": order["amount"],
259
  "currency": order["currency"],
260
  "key_id": RAZORPAY_KEY_ID
261
- })
 
 
 
 
 
 
262
  except Exception as e:
263
  logger.error(f"Error creating order: {str(e)}")
264
  raise HTTPException(status_code=500, detail=f"Failed to create order: {str(e)}")
265
 
266
  @app.post("/verify-razorpay-payment")
267
- async def verify_razorpay_payment(
268
  request: Request,
269
  razorpay_order_id: Optional[str] = Form(None),
270
  razorpay_payment_id: Optional[str] = Form(None),
@@ -273,34 +300,81 @@ async def verify_razorpay_payment(
273
  body: Optional[VerifyPaymentRequest] = None
274
  ):
275
  """Verify Razorpay payment signature (supports form-data and JSON)"""
276
- # Handle JSON body if provided
277
- if body:
278
- razorpay_order_id = razorpay_order_id or body.razorpay_order_id
279
- razorpay_payment_id = razorpay_payment_id or body.razorpay_payment_id
280
- razorpay_signature = razorpay_signature or body.razorpay_signature
281
- user_id = user_id or body.user_id
 
 
 
 
 
 
 
 
 
 
 
 
 
282
 
283
- # Validate required fields
284
- if not all([razorpay_order_id, razorpay_payment_id, razorpay_signature]):
285
- raise HTTPException(status_code=422, detail="Missing required fields: razorpay_order_id, razorpay_payment_id, or razorpay_signature")
 
 
 
 
 
 
 
 
 
286
 
287
- try:
288
  logger.info(f"Verifying payment for order_id: {razorpay_order_id}")
289
  is_valid = verify_payment_signature(razorpay_order_id, razorpay_payment_id, razorpay_signature)
 
290
  if is_valid:
291
  if user_id and supabase:
292
  logger.info(f"Updating Supabase for user_id: {user_id}")
293
- supabase.table("users").update({"is_premium": True}).eq("user_id", user_id).execute()
294
- return JSONResponse(content={"success": True})
 
 
 
 
 
 
295
  else:
296
- return JSONResponse(content={"success": False}, status_code=400)
 
 
 
 
297
  except Exception as e:
298
  logger.error(f"Error verifying payment: {str(e)}")
299
  raise HTTPException(status_code=500, detail=f"Verification error: {str(e)}")
300
 
301
  @app.get("/")
302
  async def index():
303
- return {"status": "Kling AI Multi-Image Generator API with Razorpay is running"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
304
 
305
  if __name__ == "__main__":
306
  import uvicorn
 
23
  # Initialize FastAPI app
24
  app = FastAPI(title="Kling AI Multi-Image Generator API with Razorpay")
25
 
26
+ # Enable CORS for the frontend - Updated for Lovable domains
27
  app.add_middleware(
28
  CORSMiddleware,
29
+ allow_origins=[
30
+ "https://hivili.web.app",
31
+ "http://localhost:3000",
32
+ "https://*.lovable.dev",
33
+ "https://*.sandbox.lovable.dev",
34
+ # Add pattern matching for Lovable subdomains
35
+ ],
36
+ allow_origin_regex=r"https://.*\.lovable\.dev|https://.*\.sandbox\.lovable\.dev",
37
  allow_credentials=True,
38
  allow_methods=["*"],
39
  allow_headers=["*"],
 
154
  "payment_capture": 1 # Auto-capture payment
155
  }
156
  order = razorpay_client.order.create(data=order_data)
157
+ logger.info(f"Razorpay order created successfully: {order['id']}")
158
  return order
159
  except Exception as e:
160
  logger.error(f"Failed to create Razorpay order: {str(e)}")
 
169
  "razorpay_signature": signature
170
  }
171
  razorpay_client.utility.verify_payment_signature(params_dict)
172
+ logger.info(f"Payment signature verified successfully for order: {order_id}")
173
  return True
174
  except SignatureVerificationError as e:
175
  logger.error(f"Payment signature verification failed: {str(e)}")
 
244
  raise HTTPException(status_code=500, detail=str(e))
245
 
246
  @app.post("/create-razorpay-order")
247
+ async def create_order_endpoint(
248
  request: Request,
249
  amount: Optional[int] = Form(None),
250
  body: Optional[CreateOrderRequest] = None
251
  ):
252
  """Create a Razorpay order (supports form-data and JSON)"""
253
+ logger.info("Received create order request")
254
+
255
  if not RAZORPAY_KEY_ID or not RAZORPAY_KEY_SECRET:
256
+ logger.error("Razorpay configuration missing")
257
  raise HTTPException(status_code=500, detail="Razorpay configuration missing")
258
 
259
  # Handle JSON body if provided
 
 
 
 
 
260
  try:
261
+ if body and body.amount:
262
+ amount = body.amount
263
+ elif not amount:
264
+ # Try to parse JSON from request body
265
+ try:
266
+ json_body = await request.json()
267
+ amount = json_body.get('amount')
268
+ except:
269
+ pass
270
+
271
+ if not amount or amount <= 0:
272
+ raise HTTPException(status_code=422, detail="Missing or invalid 'amount' parameter")
273
+
274
  logger.info(f"Creating order with amount: {amount}")
275
  order = create_razorpay_order(amount)
276
+
277
+ response_data = {
278
  "id": order["id"],
279
  "amount": order["amount"],
280
  "currency": order["currency"],
281
  "key_id": RAZORPAY_KEY_ID
282
+ }
283
+
284
+ logger.info(f"Order created successfully: {order['id']}")
285
+ return JSONResponse(content=response_data)
286
+
287
+ except HTTPException:
288
+ raise
289
  except Exception as e:
290
  logger.error(f"Error creating order: {str(e)}")
291
  raise HTTPException(status_code=500, detail=f"Failed to create order: {str(e)}")
292
 
293
  @app.post("/verify-razorpay-payment")
294
+ async def verify_payment_endpoint(
295
  request: Request,
296
  razorpay_order_id: Optional[str] = Form(None),
297
  razorpay_payment_id: Optional[str] = Form(None),
 
300
  body: Optional[VerifyPaymentRequest] = None
301
  ):
302
  """Verify Razorpay payment signature (supports form-data and JSON)"""
303
+ logger.info("Received payment verification request")
304
+
305
+ try:
306
+ # Handle JSON body if provided
307
+ if body:
308
+ razorpay_order_id = razorpay_order_id or body.razorpay_order_id
309
+ razorpay_payment_id = razorpay_payment_id or body.razorpay_payment_id
310
+ razorpay_signature = razorpay_signature or body.razorpay_signature
311
+ user_id = user_id or body.user_id
312
+ else:
313
+ # Try to parse JSON from request body
314
+ try:
315
+ json_body = await request.json()
316
+ razorpay_order_id = razorpay_order_id or json_body.get('razorpay_order_id')
317
+ razorpay_payment_id = razorpay_payment_id or json_body.get('razorpay_payment_id')
318
+ razorpay_signature = razorpay_signature or json_body.get('razorpay_signature')
319
+ user_id = user_id or json_body.get('user_id')
320
+ except:
321
+ pass
322
 
323
+ # Validate required fields
324
+ if not all([razorpay_order_id, razorpay_payment_id, razorpay_signature]):
325
+ missing_fields = []
326
+ if not razorpay_order_id: missing_fields.append("razorpay_order_id")
327
+ if not razorpay_payment_id: missing_fields.append("razorpay_payment_id")
328
+ if not razorpay_signature: missing_fields.append("razorpay_signature")
329
+
330
+ logger.error(f"Missing required fields: {missing_fields}")
331
+ raise HTTPException(
332
+ status_code=422,
333
+ detail=f"Missing required fields: {', '.join(missing_fields)}"
334
+ )
335
 
 
336
  logger.info(f"Verifying payment for order_id: {razorpay_order_id}")
337
  is_valid = verify_payment_signature(razorpay_order_id, razorpay_payment_id, razorpay_signature)
338
+
339
  if is_valid:
340
  if user_id and supabase:
341
  logger.info(f"Updating Supabase for user_id: {user_id}")
342
+ try:
343
+ supabase.table("users").update({"is_premium": True}).eq("user_id", user_id).execute()
344
+ logger.info(f"Successfully updated premium status for user: {user_id}")
345
+ except Exception as e:
346
+ logger.error(f"Failed to update Supabase: {str(e)}")
347
+ # Don't fail the payment verification if Supabase update fails
348
+
349
+ return JSONResponse(content={"success": True, "message": "Payment verified successfully"})
350
  else:
351
+ logger.warning(f"Payment verification failed for order: {razorpay_order_id}")
352
+ return JSONResponse(content={"success": False, "message": "Payment verification failed"}, status_code=400)
353
+
354
+ except HTTPException:
355
+ raise
356
  except Exception as e:
357
  logger.error(f"Error verifying payment: {str(e)}")
358
  raise HTTPException(status_code=500, detail=f"Verification error: {str(e)}")
359
 
360
  @app.get("/")
361
  async def index():
362
+ return {
363
+ "status": "Kling AI Multi-Image Generator API with Razorpay is running",
364
+ "endpoints": {
365
+ "generate": "POST /generate",
366
+ "create_order": "POST /create-razorpay-order",
367
+ "verify_payment": "POST /verify-razorpay-payment"
368
+ }
369
+ }
370
+
371
+ @app.get("/health")
372
+ async def health_check():
373
+ return {
374
+ "status": "healthy",
375
+ "razorpay_configured": bool(RAZORPAY_KEY_ID and RAZORPAY_KEY_SECRET),
376
+ "supabase_configured": bool(SUPABASE_URL and SUPABASE_KEY)
377
+ }
378
 
379
  if __name__ == "__main__":
380
  import uvicorn