feat: refactor imageBlock

This commit is contained in:
swve 2023-03-23 22:27:14 +01:00
parent 619688676b
commit b16daaa780
6 changed files with 44 additions and 109 deletions

View file

@ -11,7 +11,7 @@ export default Node.create({
addAttributes() { addAttributes() {
return { return {
fileObject: { blockObject: {
default: null, default: null,
}, },
}; };

View file

@ -2,13 +2,13 @@ import { NodeViewWrapper } from "@tiptap/react";
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { AlertCircle, AlertTriangle, Image, ImagePlus, Info } from "lucide-react"; import { AlertCircle, AlertTriangle, Image, ImagePlus, Info } from "lucide-react";
import { getImageFile, uploadNewImageFile } from "../../../../services/files/images"; import { getImageFile, uploadNewImageFile } from "../../../../services/blocks/Image/images";
import { getBackendUrl } from "../../../../services/config"; import { getBackendUrl } from "../../../../services/config";
function ImageBlockComponent(props: any) { function ImageBlockComponent(props: any) {
const [image, setImage] = React.useState(null); const [image, setImage] = React.useState(null);
const [isLoading, setIsLoading] = React.useState(false); const [isLoading, setIsLoading] = React.useState(false);
const [fileObject, setfileObject] = React.useState(props.node.attrs.fileObject); const [blockObject, setblockObject] = React.useState(props.node.attrs.blockObject);
const handleImageChange = (event: React.ChangeEvent<any>) => { const handleImageChange = (event: React.ChangeEvent<any>) => {
setImage(event.target.files[0]); setImage(event.target.files[0]);
@ -19,15 +19,15 @@ function ImageBlockComponent(props: any) {
setIsLoading(true); setIsLoading(true);
let object = await uploadNewImageFile(image, props.extension.options.lecture.lecture_id); let object = await uploadNewImageFile(image, props.extension.options.lecture.lecture_id);
setIsLoading(false); setIsLoading(false);
setfileObject(object); setblockObject(object);
props.updateAttributes({ props.updateAttributes({
fileObject: object, blockObject: object,
}); });
}; };
return ( return (
<NodeViewWrapper className="block-image"> <NodeViewWrapper className="block-image">
{!fileObject && ( {!blockObject && (
<BlockImageWrapper contentEditable={props.extension.options.editable}> <BlockImageWrapper contentEditable={props.extension.options.editable}>
<div> <div>
<Image color="#e1e0e0" size={50} /> <Image color="#e1e0e0" size={50} />
@ -38,11 +38,11 @@ function ImageBlockComponent(props: any) {
<button onClick={handleSubmit}>Submit</button> <button onClick={handleSubmit}>Submit</button>
</BlockImageWrapper> </BlockImageWrapper>
)} )}
{fileObject && ( {blockObject && (
<BlockImage> <BlockImage>
<img <img
src={`${getBackendUrl()}content/uploads/files/images/${props.extension.options.lecture.lecture_id}/${fileObject.file_id}.${ src={`${getBackendUrl()}content/uploads/files/lectures/${props.extension.options.lecture.lecture_id}/blocks/imageBlock/${blockObject.block_id}/${blockObject.block_data.file_id}.${
fileObject.file_format blockObject.block_data.file_format
}`} }`}
alt="" alt=""
/> />

View file

@ -1,7 +1,7 @@
from fastapi import APIRouter, Depends, UploadFile, Form, Request from fastapi import APIRouter, Depends, UploadFile, Form, Request
from src.dependencies.auth import get_current_user from src.dependencies.auth import get_current_user
from fastapi import HTTPException, status, UploadFile from fastapi import HTTPException, status, UploadFile
from src.services.blocks.block_types.imageBlock.images import create_image_file, get_image_file from src.services.blocks.block_types.imageBlock.images import create_image_block, get_image_block
from src.services.blocks.block_types.videoBlock.videoBlock import create_video_block, get_video_block from src.services.blocks.block_types.videoBlock.videoBlock import create_video_block, get_video_block
from src.services.blocks.block_types.pdfBlock.pdfBlock import create_pdf_block, get_pdf_block from src.services.blocks.block_types.pdfBlock.pdfBlock import create_pdf_block, get_pdf_block
from src.services.blocks.block_types.quizBlock.quizBlock import create_quiz_block, get_quiz_block_answers, get_quiz_block_options, quizBlock from src.services.blocks.block_types.quizBlock.quizBlock import create_quiz_block, get_quiz_block_answers, get_quiz_block_options, quizBlock
@ -18,7 +18,7 @@ async def api_create_image_file_block(request: Request, file_object: UploadFile,
""" """
Create new image file Create new image file
""" """
return await create_image_file(request, file_object, lecture_id) return await create_image_block(request, file_object, lecture_id)
@router.get("/image") @router.get("/image")
@ -26,7 +26,7 @@ async def api_get_image_file_block(request: Request, file_id: str, current_user:
""" """
Get image file Get image file
""" """
return await get_image_file(request, file_id, current_user) return await get_image_block(request, file_id, current_user)
#################### ####################
# Video Block # Video Block

View file

@ -3,110 +3,45 @@ from pydantic import BaseModel
from fastapi import HTTPException, status, UploadFile, Request from fastapi import HTTPException, status, UploadFile, Request
from fastapi.responses import StreamingResponse from fastapi.responses import StreamingResponse
import os import os
from src.services.blocks.schemas.blocks import Block
from src.services.blocks.utils.upload_files import upload_file_and_return_file_object
from src.services.users.users import PublicUser from src.services.users.users import PublicUser
class PhotoFile(BaseModel): async def create_image_block(request: Request, image_file: UploadFile, lecture_id: str):
file_id: str blocks = request.app.db["blocks"]
file_format: str lecture = request.app.db["lectures"]
file_name: str
file_size: int block_type = "imageBlock"
file_type: str
lecture_id: str # get org_id from lecture
lecture = await lecture.find_one({"lecture_id": lecture_id}, {"_id": 0, "org_id": 1})
org_id = lecture["org_id"]
# get block id
block_id = str(f"block_{uuid4()}")
block_data = await upload_file_and_return_file_object(request, image_file, lecture_id, block_id, ["jpg", "jpeg", "png", "gif"], block_type)
# create block
block = Block(block_id=block_id, lecture_id=lecture_id,
block_type=block_type, block_data=block_data, org_id=org_id)
# insert block
await blocks.insert_one(block.dict())
return block
async def create_image_file(request: Request,image_file: UploadFile, lecture_id: str): async def get_image_block(request: Request, file_id: str, current_user: PublicUser):
photos = request.app.db["files"] blocks = request.app.db["blocks"]
# generate file_id video_block = await blocks.find_one({"block_id": file_id})
file_id = str(f"file_{uuid4()}")
# get file format if video_block:
file_format = image_file.filename.split(".")[-1] return Block(**video_block)
# validate file format
if file_format not in ["jpg", "jpeg", "png", "gif"]:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Image file format not supported")
# create file
file = await image_file.read()
# get file size
file_size = len(file)
# get file type
file_type = image_file.content_type
# get file name
file_name = image_file.filename
# create file object
uploadable_file = PhotoFile(
file_id=file_id,
file_format=file_format,
file_name=file_name,
file_size=file_size,
file_type=file_type,
lecture_id=lecture_id
)
# create folder for lecture
if not os.path.exists(f"content/uploads/files/images/{lecture_id}"):
os.mkdir(f"content/uploads/files/images/{lecture_id}")
# upload file to server
with open(f"content/uploads/files/images/{lecture_id}/{file_id}.{file_format}", 'wb') as f:
f.write(file)
f.close()
# insert file object into database
photo_file_in_db = await photos.insert_one(uploadable_file.dict())
if not photo_file_in_db:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Photo file could not be created")
return uploadable_file
async def get_image_object(request: Request,file_id: str):
photos = request.app.db["files"]
photo_file = await photos.find_one({"file_id": file_id})
if photo_file:
photo_file = PhotoFile(**photo_file)
return photo_file
else: else:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Photo file does not exist") status_code=status.HTTP_409_CONFLICT, detail="Image block does not exist")
async def get_image_file(request: Request,file_id: str, current_user: PublicUser):
photos = request.app.db["files"]
photo_file = await photos.find_one({"file_id": file_id})
# TODO : check if user has access to file
if photo_file:
# check media type
if photo_file.format not in ["jpg", "jpeg", "png", "gif"]:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Photo file format not supported")
# stream file
photo_file = PhotoFile(**photo_file)
file_format = photo_file.file_format
lecture_id = photo_file.lecture_id
file = open(
f"content/uploads/files/images/{lecture_id}/{file_id}.{file_format}", 'rb')
return StreamingResponse(file, media_type=photo_file.file_type)
else:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Photo file does not exist")

View file

@ -9,5 +9,5 @@ class Block(BaseModel):
block_id: str block_id: str
lecture_id: str lecture_id: str
org_id: str org_id: str
block_type: Literal["quizBlock", "videoBlock", "pdfBlock"] block_type: Literal["quizBlock", "videoBlock", "pdfBlock", "imageBlock"]
block_data: Any block_data: Any