jebin2 commited on
Commit
cfe2de7
·
1 Parent(s): a42ab7e
core/models.py CHANGED
@@ -348,7 +348,7 @@ class CreditTransaction(Base):
348
 
349
  # Additional details
350
  reason = Column(Text, nullable=True) # Human-readable reason
351
- metadata = Column(JSON, nullable=True) # Additional context (endpoint_type, error_message, etc.)
352
 
353
  # Timestamps
354
  created_at = Column(DateTime(timezone=True), server_default=func.now(), index=True)
 
348
 
349
  # Additional details
350
  reason = Column(Text, nullable=True) # Human-readable reason
351
+ extra_data = Column(JSON, nullable=True) # Additional context (endpoint_type, error_message, etc.)
352
 
353
  # Timestamps
354
  created_at = Column(DateTime(timezone=True), server_default=func.now(), index=True)
services/audit_service/__init__.py CHANGED
@@ -7,11 +7,7 @@ from services.audit_service.config import AuditServiceConfig
7
  from services.audit_service.middleware import AuditMiddleware
8
 
9
  # Import the existing AuditService from parent
10
- import sys
11
- import os
12
- # Add parent directory to path to import audit_service.py
13
- sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
14
- from audit_service import AuditService
15
 
16
  __all__ = [
17
  'AuditServiceConfig',
 
7
  from services.audit_service.middleware import AuditMiddleware
8
 
9
  # Import the existing AuditService from parent
10
+ from .core import AuditService
 
 
 
 
11
 
12
  __all__ = [
13
  'AuditServiceConfig',
services/{audit_service.py → audit_service/core.py} RENAMED
File without changes
services/credit_service/middleware.py CHANGED
@@ -44,14 +44,16 @@ class CreditMiddleware(BaseServiceMiddleware):
44
  path = request.url.path
45
 
46
 
 
47
  config = CreditServiceConfig.get_config(path)
48
  credit_cost = config.get("cost", 0)
49
  endpoint_type = config.get("type", "free")
50
 
51
-
 
52
  return await call_next(request)
53
 
54
-
55
  user = getattr(request.state, 'user', None)
56
  if not user:
57
  return JSONResponse(
@@ -59,9 +61,9 @@ class CreditMiddleware(BaseServiceMiddleware):
59
  content={"detail": "Authentication required for this endpoint"}
60
  )
61
 
62
-
63
  async with async_session_maker() as db:
64
-
65
  transaction = await CreditTransactionManager.reserve_credits(
66
  session=db,
67
  user=user,
@@ -79,7 +81,7 @@ class CreditMiddleware(BaseServiceMiddleware):
79
 
80
  await db.commit()
81
 
82
-
83
  request.state.credit_transaction_id = transaction.transaction_id
84
  request.state.endpoint_type = endpoint_type
85
  request.state.credit_cost = credit_cost
@@ -108,23 +110,24 @@ class CreditMiddleware(BaseServiceMiddleware):
108
  )
109
 
110
 
 
111
  response = await call_next(request)
112
 
113
-
114
  transaction_id = getattr(request.state, 'credit_transaction_id', None)
115
-
116
  return response
117
 
118
-
119
  response_body = b""
120
  async for chunk in response.body_iterator:
121
  response_body += chunk
122
 
123
-
124
  response_data = ResponseInspector.parse_response_body(response_body)
125
  inspector = ResponseInspector()
126
 
127
-
128
  async with async_session_maker() as db:
129
  try:
130
  should_confirm = inspector.should_confirm(
@@ -134,7 +137,7 @@ class CreditMiddleware(BaseServiceMiddleware):
134
  response, endpoint_type, response_data
135
  )
136
 
137
-
138
  await CreditTransactionManager.confirm_credits(
139
  session=db,
140
  transaction_id=transaction_id,
@@ -150,7 +153,7 @@ class CreditMiddleware(BaseServiceMiddleware):
150
  f"Credits confirmed for {transaction_id} (success)"
151
  )
152
 
153
-
154
  reason = inspector.get_refund_reason(response, response_data)
155
  await CreditTransactionManager.refund_credits(
156
  session=db,
@@ -169,14 +172,14 @@ class CreditMiddleware(BaseServiceMiddleware):
169
  f"Credits refunded for {transaction_id}: {reason}"
170
  )
171
 
172
-
173
  self.log_request(
174
  request,
175
  f"Credits kept reserved for {transaction_id} (async pending)"
176
  )
177
 
178
  except Exception as e:
179
-
180
 
181
 
182
  return Response(
 
44
  path = request.url.path
45
 
46
 
47
+
48
  config = CreditServiceConfig.get_config(path)
49
  credit_cost = config.get("cost", 0)
50
  endpoint_type = config.get("type", "free")
51
 
52
+ # Skip free endpoints
53
+ if credit_cost == 0:
54
  return await call_next(request)
55
 
56
+ # Require authentication for paid endpoints
57
  user = getattr(request.state, 'user', None)
58
  if not user:
59
  return JSONResponse(
 
61
  content={"detail": "Authentication required for this endpoint"}
62
  )
63
 
64
+ # Reserve credits
65
  async with async_session_maker() as db:
66
+ try:
67
  transaction = await CreditTransactionManager.reserve_credits(
68
  session=db,
69
  user=user,
 
81
 
82
  await db.commit()
83
 
84
+ # Store transaction info in request state
85
  request.state.credit_transaction_id = transaction.transaction_id
86
  request.state.endpoint_type = endpoint_type
87
  request.state.credit_cost = credit_cost
 
110
  )
111
 
112
 
113
+ # Process request
114
  response = await call_next(request)
115
 
116
+ # Check if credits were reserved
117
  transaction_id = getattr(request.state, 'credit_transaction_id', None)
118
+ if not transaction_id:
119
  return response
120
 
121
+ # Read response body for inspection
122
  response_body = b""
123
  async for chunk in response.body_iterator:
124
  response_body += chunk
125
 
126
+ # Inspect response to determine credit handling
127
  response_data = ResponseInspector.parse_response_body(response_body)
128
  inspector = ResponseInspector()
129
 
130
+ # Confirm or refund based on response
131
  async with async_session_maker() as db:
132
  try:
133
  should_confirm = inspector.should_confirm(
 
137
  response, endpoint_type, response_data
138
  )
139
 
140
+ if should_confirm:
141
  await CreditTransactionManager.confirm_credits(
142
  session=db,
143
  transaction_id=transaction_id,
 
153
  f"Credits confirmed for {transaction_id} (success)"
154
  )
155
 
156
+ elif should_refund:
157
  reason = inspector.get_refund_reason(response, response_data)
158
  await CreditTransactionManager.refund_credits(
159
  session=db,
 
172
  f"Credits refunded for {transaction_id}: {reason}"
173
  )
174
 
175
+ else:
176
  self.log_request(
177
  request,
178
  f"Credits kept reserved for {transaction_id} (async pending)"
179
  )
180
 
181
  except Exception as e:
182
+ logger.error(f"Error processing credit confirmation/refund: {e}", exc_info=True)
183
 
184
 
185
  return Response(
services/credit_service/transaction_manager.py CHANGED
@@ -122,7 +122,7 @@ class CreditTransactionManager:
122
  request_path=request_path,
123
  request_method=request_method,
124
  reason=reason or f"Reserved for {request_path or 'operation'}",
125
- metadata={**request_metadata, **(metadata or {})}
126
  )
127
 
128
  # Update user balance
@@ -187,7 +187,7 @@ class CreditTransactionManager:
187
  request_path=original.request_path,
188
  request_method=original.request_method,
189
  reason=f"Confirmed usage for {original.transaction_id}",
190
- metadata={
191
  "original_transaction_id": transaction_id,
192
  **(metadata or {})
193
  }
@@ -262,7 +262,7 @@ class CreditTransactionManager:
262
  request_path=original.request_path,
263
  request_method=original.request_method,
264
  reason=reason,
265
- metadata={
266
  "original_transaction_id": transaction_id,
267
  **(metadata or {})
268
  }
@@ -323,7 +323,7 @@ class CreditTransactionManager:
323
  reference_type=reference_type,
324
  reference_id=reference_id,
325
  reason=reason,
326
- metadata=metadata
327
  )
328
 
329
  user.credits += amount
 
122
  request_path=request_path,
123
  request_method=request_method,
124
  reason=reason or f"Reserved for {request_path or 'operation'}",
125
+ extra_data={**request_metadata, **(metadata or {})}
126
  )
127
 
128
  # Update user balance
 
187
  request_path=original.request_path,
188
  request_method=original.request_method,
189
  reason=f"Confirmed usage for {original.transaction_id}",
190
+ extra_data={
191
  "original_transaction_id": transaction_id,
192
  **(metadata or {})
193
  }
 
262
  request_path=original.request_path,
263
  request_method=original.request_method,
264
  reason=reason,
265
+ extra_data={
266
  "original_transaction_id": transaction_id,
267
  **(metadata or {})
268
  }
 
323
  reference_type=reference_type,
324
  reference_id=reference_id,
325
  reason=reason,
326
+ extra_data=metadata
327
  )
328
 
329
  user.credits += amount
services/gemini_service/__init__.py CHANGED
@@ -16,7 +16,6 @@ from services.gemini_service.api_client import (
16
  get_gemini_api_key,
17
  MOCK_MODE,
18
  MOCK_VIDEO_URL,
19
- GeminiAPIClient, # Added
20
  )
21
 
22
  # Job Processor exports
@@ -41,7 +40,6 @@ __all__ = [
41
  'get_gemini_api_key',
42
  'MOCK_MODE',
43
  'MOCK_VIDEO_URL',
44
- 'GeminiAPIClient',
45
 
46
  # Job Processor
47
  'GeminiJobProcessor',
 
16
  get_gemini_api_key,
17
  MOCK_MODE,
18
  MOCK_VIDEO_URL,
 
19
  )
20
 
21
  # Job Processor exports
 
40
  'get_gemini_api_key',
41
  'MOCK_MODE',
42
  'MOCK_VIDEO_URL',
 
43
 
44
  # Job Processor
45
  'GeminiJobProcessor',
services/gemini_service/api_key_middleware.py CHANGED
@@ -68,7 +68,7 @@ class APIKeyMiddleware(BaseHTTPMiddleware):
68
  response = await call_next(request)
69
 
70
  # Handle quota errors
71
- if response.status_code == 429 and API KeyServiceConfig._retry_on_quota_error:
72
  logger.warning(f"Quota error on key {key_index}, attempting retry")
73
 
74
  # Mark key in cooldown
 
68
  response = await call_next(request)
69
 
70
  # Handle quota errors
71
+ if response.status_code == 429 and APIKeyServiceConfig._retry_on_quota_error:
72
  logger.warning(f"Quota error on key {key_index}, attempting retry")
73
 
74
  # Mark key in cooldown
services/payment_service/transaction_manager.py CHANGED
@@ -73,7 +73,7 @@ class PaymentTransactionManager:
73
  amount_paise=amount_paise,
74
  currency=currency,
75
  status="created",
76
- metadata=metadata or {},
77
  created_at=datetime.utcnow()
78
  )
79
 
@@ -128,7 +128,7 @@ class PaymentTransactionManager:
128
  transaction.paid_at = datetime.utcnow()
129
 
130
  if metadata:
131
- transaction.metadata.update(metadata)
132
 
133
  logger.info(
134
  f"Verified payment: {transaction_id}, "
@@ -170,7 +170,7 @@ class PaymentTransactionManager:
170
  transaction.error_message = error_message[:1000] # Truncate
171
 
172
  if metadata:
173
- transaction.metadata.update(metadata)
174
 
175
  logger.warning(f"Payment failed: {transaction_id}, reason: {error_message}")
176
 
 
73
  amount_paise=amount_paise,
74
  currency=currency,
75
  status="created",
76
+ extra_data=metadata or {},
77
  created_at=datetime.utcnow()
78
  )
79
 
 
128
  transaction.paid_at = datetime.utcnow()
129
 
130
  if metadata:
131
+ transaction.extra_data.update(metadata)
132
 
133
  logger.info(
134
  f"Verified payment: {transaction_id}, "
 
170
  transaction.error_message = error_message[:1000] # Truncate
171
 
172
  if metadata:
173
+ transaction.extra_data.update(metadata)
174
 
175
  logger.warning(f"Payment failed: {transaction_id}, reason: {error_message}")
176