2.6 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
This is a Fission-based serverless Python microservice for AI user administration. It runs on Kubernetes with PostgreSQL as the data store.
Stack: Python 3.10, Flask, Fission FaaS, PostgreSQL, Pydantic
Build & Deploy Commands
# Build (installs Python dependencies)
cd apps && ./build.sh
# Deploy to Kubernetes (reconciles all Fission specs)
fission spec apply
# Watch and redeploy on changes
fission spec apply --watch
Architecture
Two Fission functions handle all HTTP endpoints:
| Function | Routes | Operations |
|---|---|---|
ai-admin-filter-create-user |
GET/POST /ai/admin/users |
Filter users with pagination, create new user |
ai-admin-update-delete-user |
PUT/DELETE /ai/admin/users/{UserID} |
Update/delete user by ID |
Source structure (apps/):
filter_insert.py- GET (filter) & POST (create) handler withmain()entry pointupdate_delete.py- PUT (update) & DELETE handler withmain()entry pointschemas.py- Pydantic models (AiUserCreate,AiUserUpdate) for validationhelpers.py- Database connection, K8s secrets, CORS headers, utilitiesvault.py- PyNaCl symmetric encryption (encrypt_vault/decrypt_vault)
Deployment configs (.fission/):
local-deployment.json,dev-deployment.json,test-deployment.json,staging-deployment.json,deployment.json
Fission specs (specs/):
env-work-py.yaml- Python 3.10 runtime environmentpackage-ai-work.yaml- Build configuration- Function and HTTP trigger definitions
Key Patterns
Error handling:
try:
conn = init_db_connection()
# operations
except ValidationError as e:
return jsonify({"errorCode": "VALIDATION_ERROR", "details": e.errors()}), 400, CORS_HEADERS
except IntegrityError:
return jsonify({"errorCode": "DUPLICATE_TAG", ...}), 409, CORS_HEADERS
finally:
if conn:
conn.close()
Dynamic SQL filtering: Build conditions list and values dict, join with AND for WHERE clause.
Fission route params: Extracted from headers (e.g., X-Fission-Params-UserID).
Concurrent updates: Uses PostgreSQL row-level locking (FOR UPDATE).
Secrets & Configuration
Secrets are read from K8s mounted volumes via helpers.get_secret() and helpers.get_config(), not environment variables. PostgreSQL credentials come from the fission-ai-work-env secret.
Function Configuration
- Executor:
newdeploy(dedicated pod per function) - Timeout: 300 seconds
- Min/Max Scale: 1
- Concurrency: 500 requests per pod