mirror of
https://github.com/mattintech/simplefileupload-server.git
synced 2026-07-11 15:31:52 +00:00
Migrate storage from JSON to SQLite with enhanced MVC architecture
- Replace JSON file storage with SQLite database for improved concurrency and data integrity - Implement repository pattern with dedicated model layer (admin_model, file_model, chunk_model) - Add database.py with automatic migration from existing JSON files - Enable WAL mode for thread-safe concurrent access across Gunicorn workers - Store database files in dedicated db/ folder - Update controllers to use model layer instead of direct JSON access - Add admin authentication system with TOTP 2FA support
This commit is contained in:
19
src/app.py
19
src/app.py
@@ -1,5 +1,6 @@
|
||||
import os
|
||||
from functools import wraps
|
||||
from datetime import timedelta
|
||||
from flask import Flask, request, jsonify, send_from_directory
|
||||
from werkzeug.utils import secure_filename
|
||||
import utils.mLogger as log
|
||||
@@ -8,15 +9,26 @@ from controllers.file_controller import (
|
||||
start_chunked_upload, upload_chunk, verify_chunks, complete_chunked_upload,
|
||||
cleanup_expired_files, cleanup_abandoned_uploads
|
||||
)
|
||||
from controllers.admin_controller import (
|
||||
setup_admin, setup_admin_totp, admin_login, admin_dashboard, admin_logout
|
||||
)
|
||||
from views import views
|
||||
from models import init_db, migrate_from_json
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['UPLOAD_FOLDER'] = 'tmp/uploads'
|
||||
app.config['CLIENT_KEY'] = os.environ.get('CLIENT_KEY', 'default-secret-key')
|
||||
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', os.urandom(24).hex())
|
||||
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=24)
|
||||
|
||||
if not os.path.exists(app.config['UPLOAD_FOLDER']):
|
||||
os.makedirs(app.config['UPLOAD_FOLDER'])
|
||||
|
||||
# Initialize database
|
||||
log.i("Initializing database...")
|
||||
init_db()
|
||||
migrate_from_json()
|
||||
|
||||
# Run cleanup on startup
|
||||
cleanup_expired_files()
|
||||
cleanup_abandoned_uploads()
|
||||
@@ -53,6 +65,13 @@ app.route('/download/<code>', methods=['GET'])(download_file)
|
||||
# Route for deleting the file
|
||||
app.route('/delete/<code>', methods=['DELETE'])(delete_file)
|
||||
|
||||
# Admin routes
|
||||
app.route('/admin/setup', methods=['GET', 'POST'], endpoint='setup_admin')(setup_admin)
|
||||
app.route('/admin/setup/totp', methods=['GET', 'POST'], endpoint='setup_admin_totp')(setup_admin_totp)
|
||||
app.route('/admin/login', methods=['GET', 'POST'], endpoint='admin_login')(admin_login)
|
||||
app.route('/admin', methods=['GET'], endpoint='admin_dashboard')(admin_dashboard)
|
||||
app.route('/admin/logout', methods=['GET'], endpoint='admin_logout')(admin_logout)
|
||||
|
||||
# Register frontend views
|
||||
app.register_blueprint(views)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user