L-Nafaryus 997f37d5ee
new: reconstruct project
new: pdm package manager (python)
new: workspace for three subprojects
new: dream2nix module for packaging
new: postgresql and redis images
more: and more
2024-06-17 19:52:24 +05:00

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()