95 lines
2.8 KiB
Python
Executable File
95 lines
2.8 KiB
Python
Executable File
from typing import List
|
|
|
|
from fastapi import APIRouter, Body, Depends, status
|
|
|
|
from app.api.dependencies.auth import get_current_active_user
|
|
from app.api.dependencies.factory import Factory
|
|
from app.core.data_types import UUID7Field
|
|
from app.core.params import CommonParams
|
|
from app.schemas.base import PaginatedResponse
|
|
from app.schemas.user_schema import UserCreateSchema, UserSchema, UserUpdateSchema
|
|
from app.services import UserService
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/users", response_model=PaginatedResponse[UserSchema])
|
|
async def get_users(
|
|
params: CommonParams = Depends(),
|
|
user_active: UserSchema = Depends(get_current_active_user),
|
|
service: UserService = Depends(Factory().get_user_service),
|
|
):
|
|
filter = params.filter
|
|
sort = params.sort
|
|
search = params.search
|
|
group_by = params.group_by
|
|
limit = params.limit
|
|
offset = params.offset
|
|
users, total = await service.find_all(
|
|
filters=filter,
|
|
sort=sort,
|
|
search=search,
|
|
group_by=group_by,
|
|
limit=limit,
|
|
offset=offset,
|
|
user=user_active,
|
|
)
|
|
|
|
return PaginatedResponse(
|
|
items=[UserSchema.model_validate(user) for user in users],
|
|
total=total,
|
|
limit=limit,
|
|
offset=offset,
|
|
has_more=total > (offset + limit),
|
|
)
|
|
|
|
|
|
@router.get("/users/{id}", response_model=UserSchema)
|
|
async def get_user(
|
|
id: UUID7Field,
|
|
user: UserSchema = Depends(get_current_active_user),
|
|
service: UserService = Depends(Factory().get_user_service),
|
|
):
|
|
user = await service.find_by_id(id, user)
|
|
return user
|
|
|
|
|
|
@router.post("/users", response_model=UserSchema, status_code=status.HTTP_201_CREATED)
|
|
async def create_user(
|
|
data: UserCreateSchema,
|
|
user: UserSchema = Depends(get_current_active_user),
|
|
service: UserService = Depends(Factory().get_user_service),
|
|
):
|
|
user = await service.create(data.dict(), user)
|
|
return user
|
|
|
|
|
|
@router.patch("/users/activation", status_code=status.HTTP_204_NO_CONTENT)
|
|
async def update_user_activation(
|
|
ids: List[UUID7Field] = Body(...),
|
|
is_active: bool = Body(...),
|
|
user: UserSchema = Depends(get_current_active_user),
|
|
service: UserService = Depends(Factory().get_user_service),
|
|
):
|
|
await service.bulk_update_activation(ids, is_active, user)
|
|
|
|
|
|
@router.patch("/users/{id}", response_model=UserSchema)
|
|
async def update_user(
|
|
id: UUID7Field,
|
|
data: UserUpdateSchema,
|
|
user: UserSchema = Depends(get_current_active_user),
|
|
service: UserService = Depends(Factory().get_user_service),
|
|
):
|
|
user = await service.update(id, data.dict(exclude_unset=True), user)
|
|
return user
|
|
|
|
|
|
@router.delete(
|
|
"/users/{id}",
|
|
status_code=status.HTTP_204_NO_CONTENT,
|
|
dependencies=[Depends(get_current_active_user)],
|
|
)
|
|
async def delete_user(id: UUID7Field, service: UserService = Depends(Factory().get_user_service)):
|
|
await service.delete(id)
|