File size: 2,580 Bytes
361f517
 
 
 
 
 
 
7d9b88f
 
a289111
7d9b88f
361f517
 
 
 
 
 
 
 
 
 
 
 
eb20f8e
361f517
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d48cc9c
361f517
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70547e8
361f517
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import logging
import os
from contextlib import asynccontextmanager

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from api import api_router
# from config import API_TITLE, API_VERSION
# from db import init_db
from services.erp_sync_job_service import trigger_sync

try:
    from apscheduler.schedulers.background import BackgroundScheduler
    from apscheduler.triggers.cron import CronTrigger
    import pytz

    APSCHEDULER_AVAILABLE = True
except ImportError:
    APSCHEDULER_AVAILABLE = False

logger = logging.getLogger("main")

ENABLE_SCHEDULER = os.getenv("ENABLE_SCHEDULER", "true").lower() == "true"
DE_TIMEZONE = "Europe/Berlin"
SCHEDULE_HOUR = 0
SCHEDULE_MINUTE = 0


def _scheduled_sync_job():
    result = trigger_sync()
    if result.get("started"):
        logger.info("[SCHEDULER] Nightly ERP-WC sync started.")
    else:
        logger.warning(
            "[SCHEDULER] Nightly ERP-WC sync skipped (already running, started_at=%s).",
            result.get("started_at"),
        )


@asynccontextmanager
async def lifespan(app: FastAPI):
    # init_db()
    scheduler = None

    if ENABLE_SCHEDULER and not APSCHEDULER_AVAILABLE:
        logger.warning(
            "[SCHEDULER] ENABLE_SCHEDULER=true but APScheduler/pytz is not installed. "
            "Install with: pip install apscheduler pytz"
        )

    if ENABLE_SCHEDULER and APSCHEDULER_AVAILABLE:
        de = pytz.timezone(DE_TIMEZONE)
        scheduler = BackgroundScheduler(timezone=de)
        scheduler.add_job(
            _scheduled_sync_job,
            trigger=CronTrigger(
                hour=SCHEDULE_HOUR,
                minute=SCHEDULE_MINUTE,
                timezone=de,
            ),
            id="nightly_erp_wc_sync",
            replace_existing=True,
            misfire_grace_time=600,
            coalesce=True,
        )
        scheduler.start()

        next_run = scheduler.get_job("nightly_erp_wc_sync").next_run_time
        logger.info(
            "[SCHEDULER] Nightly ERP-WC sync scheduled at %02d:%02d (%s). Next run: %s",
            SCHEDULE_HOUR,
            SCHEDULE_MINUTE,
            DE_TIMEZONE,
            next_run.strftime("%Y-%m-%d %H:%M:%S %Z"),
        )

    yield

    if scheduler:
        scheduler.shutdown(wait=False)
        logger.info("[SCHEDULER] Shutdown.")

app = FastAPI(title="E3k", version="1.0", lifespan=lifespan)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

app.include_router(api_router)