foxfiles/foxfiles/blueprints/api/upload.py

56 lines
1.3 KiB
Python
Raw Normal View History

# SPDX-License-Identifier: Apache-2.0
from flask import Blueprint, g, request
from flask_pydantic import validate
from pydantic import BaseModel
from sqlalchemy.orm import Session
from werkzeug.utils import secure_filename
from foxfiles.errors import Errors
from foxfiles.db import File, engine
from foxfiles.files import upload_file
from foxfiles.user import maybe_token, require_user
from foxfiles.settings import BASE_URL
bp = Blueprint("upload_api", __name__)
class UploadResponse(BaseModel):
id: int
url_id: str
filename: str
hash: str
content_type: str
url: str
@bp.post("/api/upload")
@maybe_token
@require_user
@validate()
def upload():
file = request.files.get("file")
if not file:
return Errors.MISSING_FILE
hash, content_type = upload_file(file)
with Session(engine) as session:
db_file = File(
filename=secure_filename(file.filename),
hash=hash,
content_type=content_type,
user_id=g.user.id,
)
session.add(db_file)
session.commit()
return UploadResponse(
id=db_file.id,
url_id=db_file.url_id,
filename=db_file.filename,
hash=db_file.hash,
content_type=db_file.content_type,
url=f"{BASE_URL}/{db_file.path}",
)