lib.itmens/users/apis.py

75 lines
2 KiB
Python

from typing import Literal
from django.conf import settings
from ninja import Schema
from ninja.schema import Field
from common.api import NOT_FOUND, Result, api
from mastodon.models import SocialAccount
from users.models import APIdentity
class ExternalAccountSchema(Schema):
platform: str
handle: str
url: str | None
class UserSchema(Schema):
url: str
external_acct: str | None = Field(deprecated=True)
external_accounts: list[ExternalAccountSchema]
display_name: str
avatar: str
username: str
roles: list[Literal["admin", "staff"]]
@api.get(
"/me",
response={200: UserSchema, 401: Result},
summary="Get current user's basic info",
tags=["user"],
)
def me(request):
accts = SocialAccount.objects.filter(user=request.user)
return 200, {
"username": request.user.username,
"url": settings.SITE_INFO["site_url"] + request.user.url,
"external_acct": (
request.user.mastodon.handle if request.user.mastodon else None
),
"external_accounts": accts,
"display_name": request.user.display_name,
"avatar": request.user.avatar,
"roles": request.user.get_roles(),
}
@api.get(
"/user/{handle}",
response={200: UserSchema, 401: Result, 403: Result, 404: Result},
tags=["user"],
)
def user(request, handle: str):
"""
Get user's basic info
More detailed info can be fetched from Mastodon API
"""
try:
target = APIdentity.get_by_handle(handle)
except APIdentity.DoesNotExist:
return NOT_FOUND
viewer = request.user.identity
if target.is_blocking(viewer) or target.is_blocked_by(viewer):
return 403, {"message": "unavailable"}
return 200, {
"username": target.handle,
"url": target.url,
"external_acct": None,
"external_accounts": [],
"display_name": target.display_name,
"avatar": target.avatar,
"roles": target.user.get_roles() if target.local else [],
}