| from fastapi import APIRouter, HTTPException |
| from datetime import datetime, timedelta |
| import random |
| from backend.models.user import OTPRequest, OTPVerify |
| from backend.core.database import get_database |
| from backend.core.security import create_access_token |
| from backend.services.telethon_client import send_telegram_message |
| from backend.worker.telegram_bot import send_sys_log |
|
|
| router = APIRouter(prefix="/auth", tags=["Authentication"]) |
|
|
| @router.post("/send-otp") |
| async def send_otp(request: OTPRequest): |
| db = get_database() |
| identifier = request.telegram_username_or_phone |
| |
| |
| otp_code = str(random.randint(100000, 999999)) |
| expiry = datetime.utcnow() + timedelta(minutes=5) |
| |
| |
| await db["otps"].update_one( |
| {"identifier": identifier}, |
| {"$set": {"otp": otp_code, "expires_at": expiry}}, |
| upsert=True |
| ) |
| |
| |
| message = f"π Your HF Cron Manager Pro login OTP is: {otp_code}\n\nThis code is valid for 5 minutes." |
| |
| try: |
| await send_telegram_message(identifier, message) |
| except Exception as e: |
| print("Telethon Execution Error:", str(e)) |
| raise HTTPException(status_code=500, detail=f"Failed to send Telegram message via Telethon. Ensure you have started the bot. Error: {str(e)}") |
| |
| return {"message": "OTP sent successfully. Please check Telegram."} |
|
|
| @router.post("/verify-otp") |
| async def verify_otp(request: OTPVerify): |
| db = get_database() |
| identifier = request.telegram_username_or_phone |
| |
| |
| otp_record = await db["otps"].find_one({"identifier": identifier}) |
| |
| if not otp_record or otp_record["otp"] != request.otp: |
| raise HTTPException(status_code=400, detail="Invalid OTP") |
| |
| if otp_record["expires_at"] < datetime.utcnow(): |
| await db["otps"].delete_one({"identifier": identifier}) |
| raise HTTPException(status_code=400, detail="OTP has expired") |
| |
| |
| await db["otps"].delete_one({"identifier": identifier}) |
| |
| |
| user = await db["users"].find_one({"telegram_id": identifier}) |
| if not user: |
| new_user = { |
| "telegram_id": identifier, |
| "telegram_username": identifier, |
| "is_admin": False, |
| "created_at": datetime.utcnow() |
| } |
| await db["users"].insert_one(new_user) |
| |
| |
| access_token = create_access_token(data={"sub": identifier}) |
| |
| |
| await send_sys_log(f"π€ **User Access:** Telegram ID `{identifier}` just logged into the portal.") |
| |
| return { |
| "access_token": access_token, |
| "token_type": "bearer", |
| "message": "Login successful" |
| } |
| |