jebin2 commited on
Commit
2dbfc89
·
1 Parent(s): 887aa67

credit issue fix

Browse files
routers/gemini.py CHANGED
@@ -72,7 +72,7 @@ async def create_job(
72
  credits_reserved: int = 0
73
  ) -> GeminiJob:
74
  """Create a new job in the queue."""
75
- from services.gemini_job_worker import get_priority_for_job_type, get_pool
76
 
77
  job_id = f"job_{uuid.uuid4().hex[:16]}"
78
  priority = get_priority_for_job_type(job_type)
@@ -339,7 +339,7 @@ async def get_job_status(
339
 
340
 
341
  if job.status == "processing" and job.job_type == "video" and job.third_party_id:
342
- from services.gemini_job_worker import GeminiJobProcessor
343
  processor = GeminiJobProcessor()
344
  job = await processor.check_status(job, db)
345
  await db.commit()
 
72
  credits_reserved: int = 0
73
  ) -> GeminiJob:
74
  """Create a new job in the queue."""
75
+ from services.gemini_service.job_processor import get_priority_for_job_type, get_pool
76
 
77
  job_id = f"job_{uuid.uuid4().hex[:16]}"
78
  priority = get_priority_for_job_type(job_type)
 
339
 
340
 
341
  if job.status == "processing" and job.job_type == "video" and job.third_party_id:
342
+ from services.gemini_service.job_processor import GeminiJobProcessor
343
  processor = GeminiJobProcessor()
344
  job = await processor.check_status(job, db)
345
  await db.commit()
services/credit_service/middleware.py CHANGED
@@ -89,6 +89,7 @@ class CreditMiddleware(BaseServiceMiddleware):
89
  request.state.credit_transaction_id = transaction.transaction_id
90
  request.state.endpoint_type = endpoint_type
91
  request.state.credit_cost = credit_cost
 
92
 
93
  self.log_request(
94
  request,
 
89
  request.state.credit_transaction_id = transaction.transaction_id
90
  request.state.endpoint_type = endpoint_type
91
  request.state.credit_cost = credit_cost
92
+ request.state.credits_reserved = credit_cost # For gemini router compatibility
93
 
94
  self.log_request(
95
  request,
services/credit_service/transaction_manager.py CHANGED
@@ -70,7 +70,7 @@ class CreditTransactionManager:
70
 
71
  Args:
72
  session: Database session
73
- user: User model instance
74
  amount: Number of credits to reserve
75
  source: Source of transaction (e.g., "middleware")
76
  reference_type: Type of reference (e.g., "request", "job")
@@ -84,10 +84,17 @@ class CreditTransactionManager:
84
 
85
  Raises:
86
  InsufficientCreditsError: If user doesn't have enough credits
 
87
  """
88
- if user.credits < amount:
 
 
 
 
 
 
89
  raise InsufficientCreditsError(
90
- f"User has {user.credits} credits, needs {amount}"
91
  )
92
 
93
  # Generate transaction ID
@@ -111,11 +118,11 @@ class CreditTransactionManager:
111
  # Create transaction record
112
  transaction = CreditTransaction(
113
  transaction_id=transaction_id,
114
- user_id=user.id,
115
  transaction_type="reserve",
116
  amount=-amount, # Negative for deduction
117
- balance_before=user.credits,
118
- balance_after=user.credits - amount,
119
  source=source,
120
  reference_type=reference_type,
121
  reference_id=reference_id,
@@ -126,15 +133,15 @@ class CreditTransactionManager:
126
  )
127
 
128
  # Update user balance
129
- user.credits -= amount
130
- user.last_used_at = datetime.utcnow()
131
 
132
  session.add(transaction)
133
  await session.flush() # Don't commit yet - let caller handle
134
 
135
  logger.info(
136
- f"Reserved {amount} credits for user {user.user_id}, "
137
- f"transaction: {transaction_id}, new balance: {user.credits}"
138
  )
139
 
140
  return transaction
@@ -299,7 +306,7 @@ class CreditTransactionManager:
299
 
300
  Args:
301
  session: Database session
302
- user: User model instance
303
  amount: Number of credits to add
304
  source: Source of transaction (e.g., "payment")
305
  reference_type: Type of reference (e.g., "payment")
@@ -309,16 +316,25 @@ class CreditTransactionManager:
309
 
310
  Returns:
311
  CreditTransaction record
 
 
 
312
  """
 
 
 
 
 
 
313
  transaction_id = f"add_{uuid.uuid4().hex[:16]}"
314
 
315
  transaction = CreditTransaction(
316
  transaction_id=transaction_id,
317
- user_id=user.id,
318
  transaction_type="purchase",
319
  amount=amount,
320
- balance_before=user.credits,
321
- balance_after=user.credits + amount,
322
  source=source,
323
  reference_type=reference_type,
324
  reference_id=reference_id,
@@ -326,14 +342,14 @@ class CreditTransactionManager:
326
  extra_data=metadata
327
  )
328
 
329
- user.credits += amount
330
 
331
  session.add(transaction)
332
  await session.flush()
333
 
334
  logger.info(
335
- f"Added {amount} credits to user {user.user_id}, "
336
- f"source: {source}, new balance: {user.credits}"
337
  )
338
 
339
  return transaction
 
70
 
71
  Args:
72
  session: Database session
73
+ user: User model instance (used for user.id reference)
74
  amount: Number of credits to reserve
75
  source: Source of transaction (e.g., "middleware")
76
  reference_type: Type of reference (e.g., "request", "job")
 
84
 
85
  Raises:
86
  InsufficientCreditsError: If user doesn't have enough credits
87
+ UserNotFoundError: If user not found in database
88
  """
89
+ # Fetch fresh user from DB to ensure we have current state
90
+ # (user parameter may be detached from AuthMiddleware's closed session)
91
+ db_user = await session.get(User, user.id)
92
+ if not db_user:
93
+ raise UserNotFoundError(f"User {user.id} not found")
94
+
95
+ if db_user.credits < amount:
96
  raise InsufficientCreditsError(
97
+ f"User has {db_user.credits} credits, needs {amount}"
98
  )
99
 
100
  # Generate transaction ID
 
118
  # Create transaction record
119
  transaction = CreditTransaction(
120
  transaction_id=transaction_id,
121
+ user_id=db_user.id,
122
  transaction_type="reserve",
123
  amount=-amount, # Negative for deduction
124
+ balance_before=db_user.credits,
125
+ balance_after=db_user.credits - amount,
126
  source=source,
127
  reference_type=reference_type,
128
  reference_id=reference_id,
 
133
  )
134
 
135
  # Update user balance
136
+ db_user.credits -= amount
137
+ db_user.last_used_at = datetime.utcnow()
138
 
139
  session.add(transaction)
140
  await session.flush() # Don't commit yet - let caller handle
141
 
142
  logger.info(
143
+ f"Reserved {amount} credits for user {db_user.user_id}, "
144
+ f"transaction: {transaction_id}, new balance: {db_user.credits}"
145
  )
146
 
147
  return transaction
 
306
 
307
  Args:
308
  session: Database session
309
+ user: User model instance (used for user.id reference)
310
  amount: Number of credits to add
311
  source: Source of transaction (e.g., "payment")
312
  reference_type: Type of reference (e.g., "payment")
 
316
 
317
  Returns:
318
  CreditTransaction record
319
+
320
+ Raises:
321
+ UserNotFoundError: If user not found in database
322
  """
323
+ # Fetch fresh user from DB to ensure we have current state
324
+ # (user parameter may be detached from AuthMiddleware's closed session)
325
+ db_user = await session.get(User, user.id)
326
+ if not db_user:
327
+ raise UserNotFoundError(f"User {user.id} not found")
328
+
329
  transaction_id = f"add_{uuid.uuid4().hex[:16]}"
330
 
331
  transaction = CreditTransaction(
332
  transaction_id=transaction_id,
333
+ user_id=db_user.id,
334
  transaction_type="purchase",
335
  amount=amount,
336
+ balance_before=db_user.credits,
337
+ balance_after=db_user.credits + amount,
338
  source=source,
339
  reference_type=reference_type,
340
  reference_id=reference_id,
 
342
  extra_data=metadata
343
  )
344
 
345
+ db_user.credits += amount
346
 
347
  session.add(transaction)
348
  await session.flush()
349
 
350
  logger.info(
351
+ f"Added {amount} credits to user {db_user.user_id}, "
352
+ f"source: {source}, new balance: {db_user.credits}"
353
  )
354
 
355
  return transaction
tests/test_worker_pool.py CHANGED
@@ -30,7 +30,7 @@ from services.priority_worker_pool import (
30
  )
31
 
32
  # Test the Gemini-specific implementation
33
- from services.gemini_job_worker import (
34
  get_priority_for_job_type as gemini_get_priority,
35
  JOB_PRIORITY_MAP,
36
  GeminiJobProcessor
 
30
  )
31
 
32
  # Test the Gemini-specific implementation
33
+ from services.gemini_service.job_processor import (
34
  get_priority_for_job_type as gemini_get_priority,
35
  JOB_PRIORITY_MAP,
36
  GeminiJobProcessor