File size: 3,317 Bytes
5564ecb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c506a3f
87a0ffb
5564ecb
 
 
 
 
 
ea3086a
 
5816e57
 
 
 
9239ad2
 
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
119
120
121
122
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()