Files
TMS/transportmanager/server/app.py
2025-08-31 17:55:26 +03:00

93 lines
3.1 KiB
Python

import os
from flask import Flask, jsonify
from routes.auth import auth_bp
from flask_jwt_extended import JWTManager
from routes.profile import profile_bp
from routes.clients import clients_bp
from routes.transporters import transporters_bp
from routes.destinations import destinations_bp
from routes.orders_out import orders_bp
from routes.ouders_in import orders_in_bp
from routes.report import report_bp
from admin.subscription import admin_subscription_bp
from routes.subscription import subscription_bp
from admin.tenants import admin_user_bp
from apscheduler.schedulers.background import BackgroundScheduler
from models.subscription import Subscription
from flask_cors import CORS
app = Flask(__name__)
CORS(
app,
resources={r"/*": {"origins": [os.getenv("WEB_ORIGIN", "*")]}},
allow_headers=["Authorization", "Content-Type"],
expose_headers=["Content-Type"],
)
@app.get("/db/check")
def db_check():
try:
import psycopg # psycopg3 client
except Exception as e:
return {"ok": False, "error": f"psycopg not available: {e}"}, 500
dsn = os.getenv("DATABASE_URL")
if not dsn:
return {"ok": False, "error": "DATABASE_URL not set"}, 500
try:
with psycopg.connect(dsn, connect_timeout=5) as conn:
with conn.cursor() as cur:
cur.execute("SELECT version();")
ver = cur.fetchone()[0]
return {"ok": True, "version": ver}, 200
except Exception as e:
return {"ok": False, "error": str(e)}, 500
@app.get("/health")
def health():
return {"ok": True}, 200
app.config["JWT_SECRET_KEY"] = os.environ.get("JWT_SECRET_KEY", "your-jwt-secret")
app.config["JWT_TOKEN_LOCATION"] = ["headers", "query_string"]
app.config["JWT_QUERY_STRING_NAME"] = "token"
jwt = JWTManager(app)
env = os.environ.get("FLASK_ENV", "development")
# Register blueprints
app.register_blueprint(auth_bp, url_prefix="/auth")
app.register_blueprint(profile_bp, url_prefix="/profile")
app.register_blueprint(clients_bp)
app.register_blueprint(transporters_bp, url_prefix="/transporters")
app.register_blueprint(destinations_bp, url_prefix="/destinations")
app.register_blueprint(orders_bp, url_prefix="/orders")
app.register_blueprint(orders_in_bp, url_prefix="/orders_in")
app.register_blueprint(report_bp, url_prefix="/report")
app.register_blueprint(admin_subscription_bp)
app.register_blueprint(subscription_bp)
app.register_blueprint(admin_user_bp)
def update_subscription_statuses_job():
print("[Scheduler] Running daily subscription status check...")
subscription_model = Subscription()
subscription_model.update_subscription_statuses()
RUN_SCHEDULER = os.getenv("RUN_SCHEDULER", "1") == "1"
if RUN_SCHEDULER:
scheduler = BackgroundScheduler(daemon=True)
scheduler.add_job(func=update_subscription_statuses_job, trigger="interval", days=1)
scheduler.start()
if __name__ == "__main__":
if env != "production":
# Avoid running the scheduler twice in development mode
import logging
logging.getLogger("apscheduler").setLevel(logging.DEBUG)
app.run(debug=(env == "development"), use_reloader=False)