updated the db
Browse files- App/Messages/Model.py +1 -0
- App/Subscriptions/Schema.py +14 -0
- App/Subscriptions/SubscriptionRoutes.py +73 -0
- App/modelInit.py +29 -6
App/Messages/Model.py
CHANGED
@@ -19,6 +19,7 @@ class Message(Model):
|
|
19 |
sim_number = fields.IntField(null=True)
|
20 |
parsed_data = fields.JSONField(null=True) # New field for parsed data
|
21 |
created_time = fields.DatetimeField(auto_now_add=True)
|
|
|
22 |
|
23 |
class Meta:
|
24 |
table = "messages"
|
|
|
19 |
sim_number = fields.IntField(null=True)
|
20 |
parsed_data = fields.JSONField(null=True) # New field for parsed data
|
21 |
created_time = fields.DatetimeField(auto_now_add=True)
|
22 |
+
|
23 |
|
24 |
class Meta:
|
25 |
table = "messages"
|
App/Subscriptions/Schema.py
CHANGED
@@ -14,6 +14,20 @@ class CreateSubscriptionRequest(BaseModel):
|
|
14 |
plan_id: str = Field(..., description="ID of the plan to base the subscription on")
|
15 |
|
16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
class UpdateUsageRequest(BaseModel):
|
18 |
download_mb: float = Field(0.0, ge=0, description="Download usage in megabytes")
|
19 |
upload_mb: float = Field(0.0, ge=0, description="Upload usage in megabytes")
|
|
|
14 |
plan_id: str = Field(..., description="ID of the plan to base the subscription on")
|
15 |
|
16 |
|
17 |
+
class CreateCustomSubscriptionRequest(BaseModel):
|
18 |
+
user_id: Optional[str] = Field(
|
19 |
+
None, description="ID of the user to create subscription for"
|
20 |
+
)
|
21 |
+
phone_number: Optional[str] = Field(
|
22 |
+
None, description="The Phone Number of the user to create subscription for"
|
23 |
+
)
|
24 |
+
plan_id: str = Field(..., description="ID of the plan to base the subscription on")
|
25 |
+
expiration_time: str = Field(
|
26 |
+
...,
|
27 |
+
description="The expiration time of the subscription in 'day/month' format (e.g., 12/1 for 12th January)",
|
28 |
+
)
|
29 |
+
|
30 |
+
|
31 |
class UpdateUsageRequest(BaseModel):
|
32 |
download_mb: float = Field(0.0, ge=0, description="Download usage in megabytes")
|
33 |
upload_mb: float = Field(0.0, ge=0, description="Upload usage in megabytes")
|
App/Subscriptions/SubscriptionRoutes.py
CHANGED
@@ -9,6 +9,7 @@ from .Schema import (
|
|
9 |
SubscriptionResponse,
|
10 |
BaseResponse,
|
11 |
UpdateUsageRequest,
|
|
|
12 |
SubscriptionListResponse,
|
13 |
)
|
14 |
|
@@ -171,3 +172,75 @@ async def deactivate_subscription(subscription_id: str):
|
|
171 |
return BaseResponse(
|
172 |
code=200, message="Subscription and user deactivated successfully"
|
173 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
SubscriptionResponse,
|
10 |
BaseResponse,
|
11 |
UpdateUsageRequest,
|
12 |
+
CreateCustomSubscriptionRequest,
|
13 |
SubscriptionListResponse,
|
14 |
)
|
15 |
|
|
|
172 |
return BaseResponse(
|
173 |
code=200, message="Subscription and user deactivated successfully"
|
174 |
)
|
175 |
+
|
176 |
+
|
177 |
+
from datetime import datetime, time
|
178 |
+
|
179 |
+
|
180 |
+
from datetime import datetime
|
181 |
+
|
182 |
+
|
183 |
+
@subscription_router.post("/subscription/custom", response_model=BaseResponse)
|
184 |
+
async def create_subscription(request: CreateCustomSubscriptionRequest):
|
185 |
+
# Find user by user_id or phone_number
|
186 |
+
user = None
|
187 |
+
if request.user_id: # Check if user_id is provided
|
188 |
+
user = await User.get_or_none(id=request.user_id)
|
189 |
+
elif request.phone_number: # Check if phone_number is provided
|
190 |
+
user = await User.get_or_none(phoneNumber=request.phone_number)
|
191 |
+
|
192 |
+
if not user:
|
193 |
+
raise HTTPException(
|
194 |
+
status_code=status.HTTP_404_NOT_FOUND, detail="User not found"
|
195 |
+
)
|
196 |
+
|
197 |
+
# Check if plan exists
|
198 |
+
plan = await Plan.get_or_none(id=request.plan_id)
|
199 |
+
if not plan:
|
200 |
+
raise HTTPException(
|
201 |
+
status_code=status.HTTP_404_NOT_FOUND, detail="Plan not found"
|
202 |
+
)
|
203 |
+
|
204 |
+
# Parse expiration_time
|
205 |
+
try:
|
206 |
+
# Expecting expiration_time in "day/month" format (e.g., "12/1" for 12th January)
|
207 |
+
day, month = map(int, request.expiration_time.split("/"))
|
208 |
+
today = datetime.now()
|
209 |
+
expiration_date = datetime(
|
210 |
+
year=today.year, # Always use the current year
|
211 |
+
month=month,
|
212 |
+
day=day,
|
213 |
+
hour=12, # Fixed time at 12 PM
|
214 |
+
minute=0,
|
215 |
+
second=0,
|
216 |
+
)
|
217 |
+
except (ValueError, IndexError):
|
218 |
+
raise HTTPException(
|
219 |
+
status_code=status.HTTP_400_BAD_REQUEST,
|
220 |
+
detail="Invalid expiration_time format. Use 'day/month' (e.g., '12/1').",
|
221 |
+
)
|
222 |
+
|
223 |
+
# Validate expiration_date is not in the past
|
224 |
+
if expiration_date < datetime.now():
|
225 |
+
raise HTTPException(
|
226 |
+
status_code=status.HTTP_400_BAD_REQUEST,
|
227 |
+
detail="Expiration time cannot be in the past",
|
228 |
+
)
|
229 |
+
|
230 |
+
# Create new subscription based on plan details
|
231 |
+
subscription = await Subscription.create(
|
232 |
+
user=user,
|
233 |
+
plan=plan,
|
234 |
+
duration=plan.duration,
|
235 |
+
download_mb=plan.download_speed * 1024, # Converting Mbps to MB
|
236 |
+
upload_mb=plan.upload_speed * 1024, # Converting Mbps to MB
|
237 |
+
expiration_time=expiration_date,
|
238 |
+
active=True,
|
239 |
+
)
|
240 |
+
await subscription.save()
|
241 |
+
|
242 |
+
return BaseResponse(
|
243 |
+
code=200,
|
244 |
+
message="Subscription created successfully",
|
245 |
+
payload={"subscription_id": str(subscription.id)},
|
246 |
+
)
|
App/modelInit.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
import ssl
|
2 |
from App.discovery import discover_models
|
3 |
|
4 |
# Set up SSL context for secure database connections
|
@@ -13,17 +13,40 @@ print("Discovered models:", models)
|
|
13 |
## for migrations
|
14 |
models.append("aerich.models")
|
15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
TORTOISE_ORM = {
|
17 |
"connections": {
|
18 |
"default": {
|
19 |
"engine": "tortoise.backends.asyncpg",
|
20 |
"credentials": {
|
21 |
-
"host": "
|
22 |
"port": "5432",
|
23 |
-
"user": "
|
24 |
-
"
|
25 |
-
"database": "
|
26 |
-
"ssl": ssl_context, #
|
27 |
},
|
28 |
}
|
29 |
},
|
|
|
1 |
+
import ssl, os
|
2 |
from App.discovery import discover_models
|
3 |
|
4 |
# Set up SSL context for secure database connections
|
|
|
13 |
## for migrations
|
14 |
models.append("aerich.models")
|
15 |
|
16 |
+
# TORTOISE_ORM = {
|
17 |
+
# "connections": {
|
18 |
+
# "default": {
|
19 |
+
# "engine": "tortoise.backends.asyncpg",
|
20 |
+
# "credentials": {
|
21 |
+
# "host": "ep-patient-darkness-a5bmmt9r.us-east-2.aws.neon.tech",
|
22 |
+
# "port": "5432",
|
23 |
+
# "user": "neondb_owner",
|
24 |
+
# "password": "l2kE5dbMyqfx",
|
25 |
+
# "database": "neondb",
|
26 |
+
# "ssl": ssl_context, # Pass the SSL context here
|
27 |
+
# },
|
28 |
+
# }
|
29 |
+
# },
|
30 |
+
# "apps": {
|
31 |
+
# "models": {
|
32 |
+
# "models": models,
|
33 |
+
# "default_connection": "default",
|
34 |
+
# }
|
35 |
+
# },
|
36 |
+
# }
|
37 |
+
|
38 |
+
|
39 |
TORTOISE_ORM = {
|
40 |
"connections": {
|
41 |
"default": {
|
42 |
"engine": "tortoise.backends.asyncpg",
|
43 |
"credentials": {
|
44 |
+
"host": "aws-0-us-west-1.pooler.supabase.com",
|
45 |
"port": "5432",
|
46 |
+
"user": os.getenv("DB_USER"),
|
47 |
+
"user": os.getenv("DB_PASSWORD"),
|
48 |
+
"database": "postgres",
|
49 |
+
# "ssl": ssl_context, # Uncomment this if SSL is required
|
50 |
},
|
51 |
}
|
52 |
},
|