Android Backend Example

A mobile-optimized backend for Android applications with JWT authentication, device registration, and data synchronization.

Application Code

# app.py
import time
from flaxon import Flaxon, HTTPException
from flaxon.security import JWTBackend, login_required
from flaxon.validation import Schema, fields

app = Flaxon("android-backend")

# JWT Authentication
jwt_backend = JWTBackend(secret_key="your-secret-key")

# Schemas
class LoginRequest(Schema):
    email = fields.Email(required=True)
    password = fields.String(required=True, min_length=8)

class RegisterRequest(Schema):
    username = fields.String(required=True, min_length=3, max_length=30)
    email = fields.Email(required=True)
    password = fields.String(required=True, min_length=8)

class DeviceRegistration(Schema):
    device_id = fields.String(required=True, min_length=8)
    platform = fields.Choice(["android", "ios"], required=True)
    notification_token = fields.String(required=True, min_length=16)
    app_version = fields.String(required=False)

class SyncRequest(Schema):
    last_sync = fields.Integer(required=False, default=0)
    local_changes = fields.List(required=False)

# In-memory storage
users = {}
devices = {}
posts = []
user_id_counter = 1
post_id_counter = 1

@app.post("/api/v1/auth/register")
async def register(data: RegisterRequest):
    if data.email in users:
        raise HTTPException(400, "Email already registered")

    user = data.to_dict()
    user["id"] = user_id_counter
    user_id_counter += 1
    user["created_at"] = int(time.time())
    users[data.email] = user

    token = await jwt_backend.create_token({"id": user["id"], "email": user["email"]})
    return {"user": user, "token": token}

@app.post("/api/v1/auth/login")
async def login(data: LoginRequest):
    user = users.get(data.email)
    if not user:
        raise HTTPException(401, "Invalid credentials")

    if user["password"] != data.password:
        raise HTTPException(401, "Invalid credentials")

    token = await jwt_backend.create_token({"id": user["id"], "email": user["email"]})
    return {"user": user, "token": token}

@app.post("/api/v1/devices")
@login_required
async def register_device(request, data: DeviceRegistration):
    user = getattr(request, "user")
    device = data.to_dict()
    device["user_id"] = user["id"]
    device["registered_at"] = int(time.time())

    devices[data.device_id] = device
    return {"success": True, "device": device}

@app.get("/api/v1/profile")
@login_required
async def get_profile(request):
    user = getattr(request, "user")
    return {"user": users.get(user["email"])}

@app.put("/api/v1/profile")
@login_required
async def update_profile(request):
    user = getattr(request, "user")
    data = await request.json()

    stored_user = users.get(user["email"])
    if stored_user:
        stored_user.update(data)
        return {"updated": True, "user": stored_user}

    raise HTTPException(404, "User not found")
Key Concepts
  • JWT Authentication: Secure token-based auth
  • Device Registration: Track mobile devices
  • Mobile-Optimized: Versioned API routes
  • Profile Management: User profile CRUD