56 lines
1.3 KiB
Python
56 lines
1.3 KiB
Python
|
# 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}",
|
||
|
)
|