# Copyright (C) 2020 by Thomas Lindner # Copyright (C) 2020 by Cathy Hu # Copyright (C) 2020 by Martin Rey # # SPDX-License-Identifier: 0BSD from sqlite3 import IntegrityError from fastapi import APIRouter, Depends, HTTPException, Response, status from ormantic.exceptions import NoMatch from pydantic import BaseModel from kibicara.platformapi import Message from kibicara.platforms.test.bot import spawner from kibicara.platforms.test.model import Test from kibicara.webapi.hoods import get_hood class BodyMessage(BaseModel): text: str async def get_test(test_id: int, hood=Depends(get_hood)): try: return await Test.objects.get(id=test_id, hood=hood) except NoMatch: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) router = APIRouter() @router.get('/') async def test_read_all(hood=Depends(get_hood)): return await Test.objects.filter(hood=hood).all() @router.post('/', status_code=status.HTTP_201_CREATED) async def test_create(response: Response, hood=Depends(get_hood)): try: test = await Test.objects.create(hood=hood) spawner.start(test) response.headers['Location'] = str(test.id) return test except IntegrityError: raise HTTPException(status_code=status.HTTP_409_CONFLICT) @router.get('/{test_id}') async def test_read(test=Depends(get_test)): return test @router.delete('/{test_id}', status_code=status.HTTP_204_NO_CONTENT) async def test_delete(test=Depends(get_test)): spawner.stop(test) await test.delete() @router.get('/{test_id}/messages/') async def test_message_read_all(test=Depends(get_test)): return spawner.get(test).messages @router.post('/{test_id}/messages/') async def test_message_create(message: BodyMessage, test=Depends(get_test)): await spawner.get(test).publish(Message(message.text)) return {}