- تنفيذ مكون ProcedureSelection لتمكين المستخدمين من اختيار الإجراءات من قائمة، وإدارة الاختيارات، ومعالجة الإجراءات المرفوضة. - إنشاء مكون StepProgress لعرض تقدم معالج متعدد الخطوات بشكل مرئي. - تعريف أنواع مشتركة للإجراءات، وخطوات التدفق، ورسائل الدردشة في ملف types.ts. - إضافة اختبارات وحدة لخطافات useFileUpload و useTaskPolling لضمان الأداء السليم ومعالجة الأخطاء. - تنفيذ اختبارات واجهة برمجة التطبيقات (API) للتحقق من تنسيقات نقاط النهاية وضمان اتساق ربط الواجهة الأمامية بالخلفية.
78 lines
2.6 KiB
Python
78 lines
2.6 KiB
Python
"""Flask Application Factory."""
|
|
import os
|
|
|
|
from flask import Flask
|
|
|
|
from config import config
|
|
from app.extensions import cors, limiter, talisman, init_celery
|
|
|
|
|
|
def create_app(config_name=None):
|
|
"""Create and configure the Flask application."""
|
|
if config_name is None:
|
|
config_name = os.getenv("FLASK_ENV", "development")
|
|
|
|
app = Flask(__name__)
|
|
app.config.from_object(config[config_name])
|
|
|
|
# Create upload/output directories
|
|
os.makedirs(app.config["UPLOAD_FOLDER"], exist_ok=True)
|
|
os.makedirs(app.config["OUTPUT_FOLDER"], exist_ok=True)
|
|
|
|
# Initialize extensions
|
|
cors.init_app(app, origins=app.config["CORS_ORIGINS"])
|
|
|
|
limiter.init_app(app)
|
|
|
|
# Talisman security headers (relaxed CSP for AdSense)
|
|
csp = {
|
|
"default-src": "'self'",
|
|
"script-src": [
|
|
"'self'",
|
|
"'unsafe-inline'",
|
|
"https://pagead2.googlesyndication.com",
|
|
"https://www.googletagmanager.com",
|
|
"https://www.google-analytics.com",
|
|
],
|
|
"style-src": ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com"],
|
|
"font-src": ["'self'", "https://fonts.gstatic.com"],
|
|
"img-src": ["'self'", "data:", "https://pagead2.googlesyndication.com"],
|
|
"frame-src": ["https://googleads.g.doubleclick.net"],
|
|
"connect-src": [
|
|
"'self'",
|
|
"https://www.google-analytics.com",
|
|
"https://*.amazonaws.com",
|
|
],
|
|
}
|
|
talisman.init_app(
|
|
app,
|
|
content_security_policy=csp,
|
|
force_https=config_name == "production",
|
|
)
|
|
|
|
# Initialize Celery
|
|
init_celery(app)
|
|
|
|
# Register blueprints
|
|
from app.routes.health import health_bp
|
|
from app.routes.convert import convert_bp
|
|
from app.routes.compress import compress_bp
|
|
from app.routes.image import image_bp
|
|
from app.routes.video import video_bp
|
|
from app.routes.tasks import tasks_bp
|
|
from app.routes.download import download_bp
|
|
from app.routes.pdf_tools import pdf_tools_bp
|
|
from app.routes.flowchart import flowchart_bp
|
|
|
|
app.register_blueprint(health_bp, url_prefix="/api")
|
|
app.register_blueprint(convert_bp, url_prefix="/api/convert")
|
|
app.register_blueprint(compress_bp, url_prefix="/api/compress")
|
|
app.register_blueprint(image_bp, url_prefix="/api/image")
|
|
app.register_blueprint(video_bp, url_prefix="/api/video")
|
|
app.register_blueprint(pdf_tools_bp, url_prefix="/api/pdf-tools")
|
|
app.register_blueprint(flowchart_bp, url_prefix="/api/flowchart")
|
|
app.register_blueprint(tasks_bp, url_prefix="/api/tasks")
|
|
app.register_blueprint(download_bp, url_prefix="/api/download")
|
|
|
|
return app
|