File size: 3,606 Bytes
a73fa4e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
メインアプリケーションモジュール
Main application module
"""

import asyncio
import sys
from pathlib import Path
from letter_config import Config
from letter_logger import get_app_logger

# プロジェクトルートをPythonパスに追加
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))

logger = get_app_logger()

class LetterApp:
    """非同期手紙生成アプリケーションのメインクラス"""
    
    def __init__(self):
        """アプリケーションを初期化"""
        self.config = Config()
        self.logger = logger
        self._initialized = False
    
    async def initialize(self) -> bool:
        """
        アプリケーションを初期化する
        
        Returns:
            初期化が成功したかどうか
        """
        try:
            self.logger.info("アプリケーションを初期化中...")
            
            # 設定の妥当性をチェック
            if not self.config.validate_config():
                self.logger.error("設定の検証に失敗しました")
                return False
            
            # ストレージディレクトリを作成
            await self._setup_storage_directories()
            
            # ログディレクトリを作成
            await self._setup_log_directories()
            
            self._initialized = True
            self.logger.info("アプリケーションの初期化が完了しました")
            return True
            
        except Exception as e:
            self.logger.error(f"アプリケーションの初期化中にエラーが発生しました: {e}")
            return False
    
    async def _setup_storage_directories(self):
        """ストレージディレクトリを作成"""
        storage_dir = Path(self.config.STORAGE_PATH).parent
        backup_dir = Path(self.config.BACKUP_PATH)
        
        storage_dir.mkdir(parents=True, exist_ok=True)
        backup_dir.mkdir(parents=True, exist_ok=True)
        
        self.logger.info(f"ストレージディレクトリを作成: {storage_dir}")
        self.logger.info(f"バックアップディレクトリを作成: {backup_dir}")
    
    async def _setup_log_directories(self):
        """ログディレクトリを作成"""
        if not self.config.DEBUG_MODE:
            log_dir = Path("/mnt/data/logs")
            log_dir.mkdir(parents=True, exist_ok=True)
            self.logger.info(f"ログディレクトリを作成: {log_dir}")
    
    def is_initialized(self) -> bool:
        """アプリケーションが初期化されているかチェック"""
        return self._initialized
    
    def get_config(self) -> Config:
        """設定オブジェクトを取得"""
        return self.config

# グローバルアプリケーションインスタンス
app_instance = None

async def get_app() -> LetterApp:
    """アプリケーションインスタンスを取得(シングルトン)"""
    global app_instance
    
    if app_instance is None:
        app_instance = LetterApp()
        await app_instance.initialize()
    
    return app_instance

def run_app():
    """アプリケーションを実行"""
    async def main():
        app = await get_app()
        if app.is_initialized():
            logger.info("アプリケーションが正常に起動しました")
        else:
            logger.error("アプリケーションの起動に失敗しました")
            sys.exit(1)
    
    asyncio.run(main())

if __name__ == "__main__":
    run_app()