File size: 3,176 Bytes
962a395
 
 
 
 
 
 
 
 
 
 
 
ac347e7
742dee2
2d3a0d2
 
 
 
 
 
 
 
 
 
 
 
 
37bcb58
 
 
 
28227c9
93ff956
28227c9
2690ca5
 
 
 
 
 
 
 
 
 
 
 
ac347e7
962a395
b65231d
 
 
 
 
00c3bab
 
 
 
 
 
 
 
 
 
962a395
ef8e0a7
 
 
 
 
37bcb58
 
 
 
ef8e0a7
962a395
 
 
 
ac347e7
 
742dee2
 
962a395
 
 
 
 
 
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
import os
from functools import lru_cache
from pathlib import Path

from dotenv import load_dotenv


ENV_PATH = Path(__file__).resolve().parents[1] / "config.env"
load_dotenv(ENV_PATH)


class Settings:
    gemini_api_key: str = os.getenv("GEMINI_API_KEY", "")
    mistral_api_key: str = os.getenv("MISTRAL_API_KEY", "")
    # Accept both plain and NEXT_PUBLIC_ prefixed names (config.env uses NEXT_PUBLIC_)
    supabase_url: str = (
        os.getenv("SUPABASE_URL")
        or os.getenv("NEXT_PUBLIC_SUPABASE_URL", "")
    )
    supabase_key: str = (
        os.getenv("SUPABASE_KEY")
        or os.getenv("NEXT_PUBLIC_SUPABASE_KEY", "")
    )
    supabase_anon_key: str = (
        os.getenv("SUPABASE_ANON_KEY")
        or os.getenv("NEXT_PUBLIC_SUPABASE_ANON_KEY", "")
    )
    supabase_jwt_secret: str = (
        os.getenv("SUPABASE_JWT_SECRET")
        or os.getenv("JWT_SECRET", "")
    )
    database_url: str = os.getenv("DATABASE_URL", "")
    redis_url: str    = os.getenv("REDIS_URL", "")

    cloudinary_cloud_name: str = (
        os.getenv("CLOUDINARY_CLOUD_NAME")
        or os.getenv("CLOUD_NAME", "")
    )
    cloudinary_api_key: str = (
        os.getenv("CLOUDINARY_API_KEY")
        or os.getenv("CLOUD_API_KEY", "")
    )
    cloudinary_api_secret: str = (
        os.getenv("CLOUDINARY_API_SECRET")
        or os.getenv("CLOUD_SECRET", "")
    )
    model_name: str = os.getenv("MODEL_NAME", "gemini-3.1-flash-lite")
    transformers_no_tf: str = os.getenv("TRANSFORMERS_NO_TF", "1")
    cors_allowed_origins: list[str] = [
        origin.strip()
        for origin in os.getenv("CORS_ALLOWED_ORIGINS", "").split(",")
        if origin.strip()
    ]
    local_arabic_nsfw_words: list[str] = [
        w.strip()
        for w in os.getenv("LOCAL_ARABIC_NSFW_WORDS", "").split(",")
        if w.strip()
    ]
    local_nsfw_words: list[str] = [
        w.strip()
        for w in os.getenv("LOCAL_NSFW_WORDS", "").split(",")
        if w.strip()
    ]

    # ── JWT / Refresh-Token Auth ───────────────────────────────────────────────
    jwt_secret_key: str = os.getenv("JWT_SECRET_KEY", "")
    jwt_algorithm: str  = os.getenv("JWT_ALGORITHM", "HS256")
    # Set to 'development' locally so Secure cookie flag is not required over HTTP
    environment: str    = os.getenv("ENVIRONMENT", "production")
    # Supabase JWT secret β€” used to verify Supabase-issued tokens locally (stateless).
    # Found in: Supabase Dashboard β†’ Project Settings β†’ API β†’ JWT Settings β†’ JWT Secret
    # This avoids the 403 "Session does not exist" error from stateful get_user() calls.
    supabase_jwt_secret: str = os.getenv("SUPABASE_JWT_SECRET", "")


@lru_cache()
def get_settings() -> Settings:
    s = Settings()
    if s.gemini_api_key:
        os.environ["GEMINI_API_KEY"] = s.gemini_api_key
    if s.mistral_api_key:
        os.environ["MISTRAL_API_KEY"] = s.mistral_api_key
    if "TRANSFORMERS_NO_TF" not in os.environ and s.transformers_no_tf:
        os.environ["TRANSFORMERS_NO_TF"] = s.transformers_no_tf
    return s


settings = get_settings()