new: pdm package manager (python) new: workspace for three subprojects new: dream2nix module for packaging new: postgresql and redis images more: and more
52 lines
1.9 KiB
Python
52 lines
1.9 KiB
Python
import os
|
|
import time
|
|
from pathlib import Path
|
|
from fastapi import APIRouter, Depends, HTTPException, Request, UploadFile, status
|
|
from fastapi.responses import StreamingResponse
|
|
from sqlalchemy import and_, insert, select, update
|
|
|
|
from materia import db
|
|
from materia.api import schema
|
|
from materia.api.state import ConfigState, DatabaseState
|
|
from materia.api.middleware import JwtMiddleware
|
|
from materia.config import Config
|
|
from materia.api import repository, directory
|
|
|
|
router = APIRouter(tags = ["file"])
|
|
|
|
@router.put("/file", dependencies = [Depends(JwtMiddleware())])
|
|
async def upload(request: Request, file: UploadFile, directory_path: Path = Path(), config: ConfigState = Depends(), database: DatabaseState = Depends()):
|
|
user = request.state.user
|
|
|
|
try:
|
|
await repository.create(request, config = config, database = database)
|
|
except:
|
|
pass
|
|
|
|
#try:
|
|
# directory_info = directory.info
|
|
# await directory.create(request, path = directory_path, config = config, database = database)
|
|
|
|
async with database.session() as session:
|
|
if file_ := (await session
|
|
.scalars(select(db.File)
|
|
.where(and_(db.File.name == file.filename, db.File.path == str(directory_path))))
|
|
).first():
|
|
await session.execute(update(db.File).where(db.File.id == file_.id).values(updated_unix = time.time(), size = file.size))
|
|
else:
|
|
file_ = db.File(
|
|
repository_id = user.repository.id,
|
|
parent_id = directory.id if directory else None,
|
|
name = file.filename,
|
|
path = str(directory_path),
|
|
size = file.size
|
|
)
|
|
session.add(file_)
|
|
|
|
try:
|
|
(repository_path / directory_path / file.filename).write_bytes(await file.read())
|
|
except OSError:
|
|
raise HTTPException(status.HTTP_500_INTERNAL_SERVER_ERROR, "Failed to write a file")
|
|
|
|
await session.commit()
|