larxius commited on
Commit
8d85744
·
verified ·
1 Parent(s): fdc252b

Update backend_structured/__init__.py

Browse files
Files changed (1) hide show
  1. backend_structured/__init__.py +79 -74
backend_structured/__init__.py CHANGED
@@ -1,74 +1,79 @@
1
- # pyright: reportGeneralTypeIssues=false, reportAttributeAccessIssue=false
2
- from flask import Flask
3
- from .config import Config, _is_redis_running
4
- from .extensions import db, celery, socketio, limiter, cache
5
- from flask_cors import CORS
6
-
7
- def create_app():
8
- app = Flask(__name__)
9
- app.config.from_object(Config)
10
-
11
- # Initialize extensions
12
- db.init_app(app)
13
- from .extensions import migrate
14
- migrate.init_app(app, db) # type: ignore
15
- socketio.init_app(app, cors_allowed_origins="*") # type: ignore
16
- app.socketio = socketio # type: ignore
17
-
18
- # Configure Caching dynamically based on Redis availability
19
- redis_url = app.config.get('CELERY_BROKER_URL', 'redis://localhost:6379/0')
20
- if _is_redis_running(redis_url):
21
- app.config['CACHE_TYPE'] = 'RedisCache'
22
- app.config['CACHE_REDIS_URL'] = redis_url
23
- else:
24
- app.config['CACHE_TYPE'] = 'SimpleCache'
25
-
26
- cache.init_app(app)
27
-
28
- # Initialize Firebase Cloud Storage (for logos, PDFs, and file uploads)
29
- from utils.firebase_storage import init_firebase
30
- init_firebase()
31
-
32
- # Optional Celery config update
33
- celery.conf.update(
34
- broker_url=redis_url,
35
- result_backend=app.config.get('CELERY_RESULT_BACKEND', 'redis://localhost:6379/0')
36
- )
37
-
38
- CORS(app, resources={r"/api/*": {"origins": "*"}}) # type: ignore
39
-
40
- with app.app_context():
41
- # Import routes to register blueprints
42
- from .routes import api_bp, auth_bp, scans_bp, vuln_bp, reports_bp
43
- app.register_blueprint(api_bp)
44
- app.register_blueprint(auth_bp, url_prefix='/api/auth')
45
- app.register_blueprint(scans_bp, url_prefix='/api/scans')
46
- app.register_blueprint(vuln_bp, url_prefix='/api/vulnerabilities')
47
- app.register_blueprint(reports_bp, url_prefix='/api/reports')
48
-
49
- # Create tables
50
- db.create_all()
51
-
52
- # Seed superadmin user (created once, never overwritten)
53
- from .models import User
54
- import os
55
- if not User.query.filter_by(email='superadmin@gmail.com').first():
56
- sa = User(email='superadmin@gmail.com', role='super_admin', org_id=None)
57
- sa.set_password(os.getenv('SUPERADMIN_PASSWORD', 'larshield2025'))
58
- db.session.add(sa)
59
- db.session.commit()
60
- print("[System] Superadmin user seeded (superadmin@gmail.com)")
61
-
62
- # Cleanup stale scans that were interrupted during a restart
63
- from .models import Scan
64
- try:
65
- stale_scans = Scan.query.filter(Scan.status.in_(['queued', 'scanning'])).all()
66
- for scan in stale_scans:
67
- scan.status = 'failed'
68
- if stale_scans:
69
- db.session.commit()
70
- print(f"[System] Marked {len(stale_scans)} interrupted scans as failed on startup.")
71
- except Exception as e:
72
- print(f"[System] Failed to clean up stale scans: {e}")
73
-
74
- return app
 
 
 
 
 
 
1
+ # pyright: reportGeneralTypeIssues=false, reportAttributeAccessIssue=false
2
+ from flask import Flask
3
+ from .config import Config, _is_redis_running
4
+ from .extensions import db, celery, socketio, limiter, cache
5
+ from flask_cors import CORS
6
+
7
+ def create_app():
8
+ app = Flask(__name__)
9
+ app.config.from_object(Config)
10
+
11
+ # Initialize extensions
12
+ db.init_app(app)
13
+ from .extensions import migrate
14
+ migrate.init_app(app, db) # type: ignore
15
+ socketio.init_app(app, cors_allowed_origins="*") # type: ignore
16
+ app.socketio = socketio # type: ignore
17
+
18
+ # Configure Caching dynamically based on Redis availability
19
+ redis_url = app.config.get('CELERY_BROKER_URL', 'redis://localhost:6379/0')
20
+ if _is_redis_running(redis_url):
21
+ app.config['CACHE_TYPE'] = 'RedisCache'
22
+ app.config['CACHE_REDIS_URL'] = redis_url
23
+ else:
24
+ app.config['CACHE_TYPE'] = 'SimpleCache'
25
+
26
+ cache.init_app(app)
27
+
28
+ # Initialize Firebase Cloud Storage (for logos, PDFs, and file uploads)
29
+ from utils.firebase_storage import init_firebase
30
+ init_firebase()
31
+
32
+ # Optional Celery config update
33
+ celery.conf.update(
34
+ broker_url=redis_url,
35
+ result_backend=app.config.get('CELERY_RESULT_BACKEND', 'redis://localhost:6379/0')
36
+ )
37
+
38
+ CORS(app, resources={r"/api/*": {"origins": "*"}}) # type: ignore
39
+
40
+ with app.app_context():
41
+ # Import routes to register blueprints
42
+ from .routes import api_bp, auth_bp, scans_bp, vuln_bp, reports_bp
43
+ app.register_blueprint(api_bp)
44
+ app.register_blueprint(auth_bp, url_prefix='/api/auth')
45
+ app.register_blueprint(scans_bp, url_prefix='/api/scans')
46
+ app.register_blueprint(vuln_bp, url_prefix='/api/vulnerabilities')
47
+ app.register_blueprint(reports_bp, url_prefix='/api/reports')
48
+
49
+ # Create tables
50
+ db.create_all()
51
+
52
+ # Seed superadmin user (created once, never overwritten)
53
+ from .models import User
54
+ import os
55
+ if not User.query.filter_by(email='superadmin@gmail.com').first():
56
+ sa = User(email='superadmin@gmail.com', role='super_admin', org_id=None)
57
+ sa.set_password(os.getenv('SUPERADMIN_PASSWORD', 'larshield2025'))
58
+ db.session.add(sa)
59
+ db.session.commit()
60
+ print("[System] Superadmin user seeded (superadmin@gmail.com)")
61
+
62
+ # Cleanup stale scans that were truly abandoned/interrupted (> 10 mins old)
63
+ from .models import Scan
64
+ from datetime import datetime, timezone, timedelta
65
+ try:
66
+ ten_mins_ago = datetime.now(timezone.utc) - timedelta(minutes=10)
67
+ stale_scans = Scan.query.filter(
68
+ Scan.status.in_(['queued', 'scanning']),
69
+ (Scan.started_at < ten_mins_ago) | (Scan.started_at == None)
70
+ ).all()
71
+ for scan in stale_scans:
72
+ scan.status = 'failed'
73
+ if stale_scans:
74
+ db.session.commit()
75
+ print(f"[System] Marked {len(stale_scans)} stale/interrupted scans as failed on startup.")
76
+ except Exception as e:
77
+ print(f"[System] Failed to clean up stale scans: {e}")
78
+
79
+ return app