takahe/api/views/media.py

80 lines
2.3 KiB
Python
Raw Normal View History

from django.core.files import File
2022-12-11 11:37:28 -08:00
from django.shortcuts import get_object_or_404
2023-02-13 18:40:10 -08:00
from hatchway import ApiError, QueryOrBody, api_view
2022-12-11 11:37:28 -08:00
from activities.models import PostAttachment, PostAttachmentStates
from api import schemas
from core.files import blurhash_image, resize_image
2023-02-19 10:37:02 -08:00
from ..decorators import scope_required
2022-12-11 11:37:28 -08:00
2023-02-19 10:37:02 -08:00
@scope_required("write:media")
@api_view.post
2022-12-11 11:37:28 -08:00
def upload_media(
request,
file: File,
description: QueryOrBody[str] = "",
focus: QueryOrBody[str] = "0,0",
) -> schemas.MediaAttachment:
2022-12-11 11:37:28 -08:00
main_file = resize_image(
file,
size=(2000, 2000),
cover=False,
)
thumbnail_file = resize_image(
file,
size=(400, 225),
cover=True,
)
attachment = PostAttachment.objects.create(
blurhash=blurhash_image(thumbnail_file),
mimetype="image/webp",
width=main_file.image.width,
height=main_file.image.height,
name=description or None,
2022-12-11 11:37:28 -08:00
state=PostAttachmentStates.fetched,
author=request.identity,
2022-12-11 11:37:28 -08:00
)
attachment.file.save(
main_file.name,
main_file,
)
attachment.thumbnail.save(
thumbnail_file.name,
thumbnail_file,
)
attachment.save()
return schemas.MediaAttachment.from_post_attachment(attachment)
2022-12-11 11:37:28 -08:00
2023-02-19 10:37:02 -08:00
@scope_required("read:media")
@api_view.get
2022-12-11 11:37:28 -08:00
def get_media(
request,
id: str,
) -> schemas.MediaAttachment:
2022-12-11 11:37:28 -08:00
attachment = get_object_or_404(PostAttachment, pk=id)
if attachment.post:
if attachment.post.author != request.identity:
raise ApiError(401, "Not the author of this attachment")
elif attachment.author and attachment.author != request.identity:
2023-02-13 18:40:10 -08:00
raise ApiError(401, "Not the author of this attachment")
return schemas.MediaAttachment.from_post_attachment(attachment)
2022-12-11 11:37:28 -08:00
2023-02-19 10:37:02 -08:00
@scope_required("write:media")
@api_view.put
2022-12-11 11:37:28 -08:00
def update_media(
request,
id: str,
description: QueryOrBody[str] = "",
focus: QueryOrBody[str] = "0,0",
) -> schemas.MediaAttachment:
2022-12-11 11:37:28 -08:00
attachment = get_object_or_404(PostAttachment, pk=id)
2023-02-13 18:40:10 -08:00
if attachment.post.author != request.identity:
raise ApiError(401, "Not the author of this attachment")
attachment.name = description or None
2022-12-11 11:37:28 -08:00
attachment.save()
return schemas.MediaAttachment.from_post_attachment(attachment)