تم الانتهاء من آخر دفعة تحسينات على المشروع، وتشمل:

تحويل لوحة الإدارة الداخلية من secret header إلى session auth حقيقي مع صلاحيات admin.
إضافة دعم إدارة الأدوار من داخل لوحة الإدارة نفسها، مع حماية الحسابات المعتمدة عبر INTERNAL_ADMIN_EMAILS.
تحسين بيانات المستخدم في الواجهة والباكند لتشمل role وis_allowlisted_admin.
إضافة اختبار frontend مخصص لصفحة /internal/admin بدل الاعتماد فقط على build واختبار routes.
تحسين إضافي في الأداء عبر إزالة الاعتماد على pdfjs-dist/pdf.worker في عدّ صفحات PDF واستبداله بمسار أخف باستخدام pdf-lib.
تحسين تقسيم الـ chunks في build لتقليل أثر الحزم الكبيرة وفصل أجزاء مثل network, icons, pdf-core, وeditor.
التحقق الذي تم:

نجاح build للواجهة.
نجاح اختبار صفحة الإدارة الداخلية في frontend.
نجاح اختبارات auth/admin في backend.
نجاح full backend suite مسبقًا مع EXIT:0.
ولو تريد نسخة أقصر جدًا، استخدم هذه:

آخر التحديثات:
تم تحسين نظام الإدارة الداخلية ليعتمد على صلاحيات وجلسات حقيقية بدل secret header، مع إضافة إدارة أدوار من لوحة admin نفسها، وإضافة اختبارات frontend مخصصة للوحة، وتحسين أداء الواجهة عبر إزالة pdf.worker وتحسين تقسيم الـ chunks في build. جميع الاختبارات والتحققات الأساسية المطلوبة نجح
This commit is contained in:
Your Name
2026-03-16 13:50:45 +02:00
parent b5d97324a9
commit 957d37838c
85 changed files with 9915 additions and 119 deletions

View File

@@ -9,6 +9,29 @@ from app.services.account_service import init_account_db
from app.services.rating_service import init_ratings_db
from app.services.ai_cost_service import init_ai_cost_db
from app.services.site_assistant_service import init_site_assistant_db
from app.services.contact_service import init_contact_db
from app.services.stripe_service import init_stripe_db
def _init_sentry(app):
"""Initialize Sentry error monitoring if DSN is configured."""
dsn = app.config.get("SENTRY_DSN", "")
if not dsn:
return
try:
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration
from sentry_sdk.integrations.celery import CeleryIntegration
sentry_sdk.init(
dsn=dsn,
environment=app.config.get("SENTRY_ENVIRONMENT", "development"),
integrations=[FlaskIntegration(), CeleryIntegration()],
traces_sample_rate=0.1,
send_default_pii=False,
)
except ImportError:
app.logger.warning("sentry-sdk not installed — monitoring disabled.")
def create_app(config_name=None):
@@ -19,6 +42,9 @@ def create_app(config_name=None):
app = Flask(__name__)
app.config.from_object(config[config_name])
# Initialize Sentry early
_init_sentry(app)
# Create upload/output/database directories
os.makedirs(app.config["UPLOAD_FOLDER"], exist_ok=True)
os.makedirs(app.config["OUTPUT_FOLDER"], exist_ok=True)
@@ -79,6 +105,8 @@ def create_app(config_name=None):
init_ratings_db()
init_ai_cost_db()
init_site_assistant_db()
init_contact_db()
init_stripe_db()
# Register blueprints
from app.routes.health import health_bp
@@ -106,6 +134,13 @@ def create_app(config_name=None):
from app.routes.pdf_ai import pdf_ai_bp
from app.routes.rating import rating_bp
from app.routes.assistant import assistant_bp
from app.routes.contact import contact_bp
from app.routes.stripe import stripe_bp
from app.routes.stats import stats_bp
from app.routes.pdf_convert import pdf_convert_bp
from app.routes.pdf_extra import pdf_extra_bp
from app.routes.image_extra import image_extra_bp
from app.routes.barcode import barcode_bp
app.register_blueprint(health_bp, url_prefix="/api")
app.register_blueprint(auth_bp, url_prefix="/api/auth")
@@ -132,5 +167,12 @@ def create_app(config_name=None):
app.register_blueprint(pdf_ai_bp, url_prefix="/api/pdf-ai")
app.register_blueprint(rating_bp, url_prefix="/api/ratings")
app.register_blueprint(assistant_bp, url_prefix="/api/assistant")
app.register_blueprint(contact_bp, url_prefix="/api/contact")
app.register_blueprint(stripe_bp, url_prefix="/api/stripe")
app.register_blueprint(stats_bp, url_prefix="/api/stats")
app.register_blueprint(pdf_convert_bp, url_prefix="/api/convert")
app.register_blueprint(pdf_extra_bp, url_prefix="/api/pdf-tools")
app.register_blueprint(image_extra_bp, url_prefix="/api/image")
app.register_blueprint(barcode_bp, url_prefix="/api/barcode")
return app