File size: 3,302 Bytes
5564ecb
 
 
 
 
 
 
 
 
df37f6e
 
5564ecb
 
 
 
df37f6e
 
5564ecb
df37f6e
5564ecb
 
df37f6e
5564ecb
 
c506a3f
87a0ffb
5564ecb
 
df37f6e
5564ecb
df37f6e
5564ecb
df37f6e
ea3086a
df37f6e
 
 
 
9239ad2
 
5564ecb
 
df37f6e
 
 
 
 
 
 
5564ecb
 
 
 
df37f6e
 
5564ecb
df37f6e
 
 
5564ecb
 
df37f6e
5564ecb
 
 
 
 
df37f6e
 
5564ecb
 
df37f6e
5564ecb
df37f6e
5564ecb
 
df37f6e
5564ecb
 
df37f6e
5564ecb
df37f6e
 
 
5564ecb
df37f6e
 
5564ecb
 
df37f6e
 
5564ecb
df37f6e
 
5564ecb
 
df37f6e
 
 
 
5564ecb
 
df37f6e
5564ecb
 
df37f6e
 
 
5564ecb
 
 
 
 
 
 
df37f6e
5564ecb
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import os
from dotenv import load_dotenv
from functools import lru_cache
from typing import Any, Literal
from pydantic import model_validator
from pydantic_settings import BaseSettings, SettingsConfigDict

from core.path_conf import BASE_PATH

load_dotenv()


class Settings(BaseSettings):

    model_config = SettingsConfigDict(
        env_file=f"{BASE_PATH}/.env",
        env_file_encoding="utf-8",
        extra="ignore",
        case_sensitive=True,
    )

    ENVIRONMENT: Literal["dev", "pro"]

    API_BASE_URL: str
    API_BASE_URL_VATO: str
    API_BASE_URL_ACCESS_TOKEN: str

    # DATABASE_TYPE: Literal['mysql', 'postgresql']
    # DATABASE_HOST: str
    # DATABASE_PORT: int
    # DATABASE_USER: str
    # DATABASE_PASSWORD: str

    # MODEl NER
    NER_MODEL_DIR: str = "app/ner/models/ner"
    TASK_NAME: str = "token-classification"
    ACCELERATOR: str = "ort"
    DEVICE: str = "cpu"
    TRUNCATE: bool = True
    MAX_LENGTH: int = 512

    # FastAPI
    FASTAPI_API_V1_PATH: str = "/api/v1"
    FASTAPI_TITLE: str = "FastAPI"
    FASTAPI_VERSION: str = "0.0.1"
    FASTAPI_DESCRIPTION: str = "FastAPI"
    FASTAPI_DOCS_URL: str = "/docs"
    FASTAPI_REDOC_URL: str = "/redoc"
    FASTAPI_OPENAPI_URL: str | None = "/openapi"
    FASTAPI_STATIC_FILES: bool = True

    DATABASE_ECHO: bool = False
    DATABASE_POOL_ECHO: bool = False
    DATABASE_SCHEMA: str = "fba"
    DATABASE_CHARSET: str = "utf8mb4"

    CORS_ALLOWED_ORIGINS: list[str] = [
        "http://127.0.0.1:8000",
        "http://localhost:5173",
    ]
    CORS_EXPOSE_HEADERS: list[str] = [
        "X-Request-ID",
    ]

    MIDDLEWARE_CORS: bool = True
    MIDDLEWARE_ACCESS: bool = True

    DATETIME_TIMEZONE: str = "Asia/Ho_Chi_Minh"
    DATETIME_FORMAT: str = "%Y-%m-%d %H:%M:%S"

    UPLOAD_READ_SIZE: int = 1024
    UPLOAD_IMAGE_EXT_INCLUDE: list[str] = ["jpg", "jpeg", "png", "gif", "webp"]
    UPLOAD_IMAGE_SIZE_MAX: int = 5 * 1024 * 1024  # 5 MB
    UPLOAD_VIDEO_EXT_INCLUDE: list[str] = ["mp4", "mov", "avi", "flv"]
    UPLOAD_VIDEO_SIZE_MAX: int = 20 * 1024 * 1024  # 20 MB

    TRACE_ID_REQUEST_HEADER_KEY: str = "X-Request-ID"

    # 日志
    LOG_CID_DEFAULT_VALUE: str = "-"
    LOG_CID_UUID_LENGTH: int = 32  # 日志 correlation_id 长度,必须小于等于 32
    LOG_STD_LEVEL: str = "INFO"
    LOG_ACCESS_FILE_LEVEL: str = "INFO"
    LOG_ERROR_FILE_LEVEL: str = "ERROR"
    LOG_STD_FORMAT: str = (
        "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</> | <lvl>{level: <8}</> | "
        "<cyan> {correlation_id} </> | <lvl>{message}</>"
    )
    LOG_FILE_FORMAT: str = (
        "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</> | <lvl>{level: <8}</> | "
        "<cyan> {correlation_id} </> | <lvl>{message}</>"
    )
    LOG_ACCESS_FILENAME: str = "fba_access.log"
    LOG_ERROR_FILENAME: str = "fba_error.log"

    OPERA_LOG_PATH_EXCLUDE: list[str] = [
        "/favicon.ico",
        "/docs",
        "/redoc",
        "/openapi",
    ]

    @model_validator(mode="before")
    @classmethod
    def check_env(cls, values: Any) -> Any:
        if values.get("ENVIRONMENT") == "pro":
            values["FASTAPI_OPENAPI_URL"] = None
            values["FASTAPI_STATIC_FILES"] = False
        return values


@lru_cache
def get_settings() -> Settings:
    return Settings()


settings = get_settings()