diff --git a/family_api/controllers/family.py b/family_api/controllers/family.py index 43abf39..237f819 100644 --- a/family_api/controllers/family.py +++ b/family_api/controllers/family.py @@ -22,3 +22,7 @@ async def get_family_info(family_id: int, conn): async def update_family(family_id: int, family_data, conn): return await family_repository.update_family(family_id, family_data, conn) + + +async def delete_family(family_id: int, conn): + return await family_repository.delete_family(family_id, conn) diff --git a/family_api/repositories/family_repository.py b/family_api/repositories/family_repository.py index 18dab2e..14a87c0 100644 --- a/family_api/repositories/family_repository.py +++ b/family_api/repositories/family_repository.py @@ -5,9 +5,13 @@ async def insert_family(family_obj, conn) -> int: return await conn.scalar(families_table.insert().values(family_obj)) -async def update_family(family_id, family_obj, conn) -> int: +async def update_family(family_id, family_obj, conn): return await conn.execute(families_table.update().values(family_obj).where(families_table.c.id == family_id)) +async def delete_family(family_id, conn): + return await conn.execute(families_table.delete().where(families_table.c.id == family_id)) + + async def get_by_id(family_id, conn): return await (await conn.execute(families_table.select().where(families_table.c.id == family_id))).first() diff --git a/family_api/views/family_view.py b/family_api/views/family_view.py index df93c02..f01dea4 100644 --- a/family_api/views/family_view.py +++ b/family_api/views/family_view.py @@ -3,7 +3,7 @@ from aiohttp import web from aiohttp_apispec import docs, request_schema, response_schema -from family_api.controllers.family import register_family, get_family_info, update_family +from family_api.controllers.family import register_family, get_family_info, update_family, delete_family from family_api.controllers.family_member import add_family_member from family_api.decorators import is_current_user_in_family from family_api.schemas import FamilySchema @@ -46,3 +46,12 @@ async def put(self): async with self.request.app['db'].acquire() as conn: await update_family(family_id, family_obj, conn) return web.Response(status=204) + + @docs(summary="Delete family", + responses={204: "Successfully deleted"}) + @is_current_user_in_family + async def delete(self): + family_id = self.request.match_info['family_id'] + async with self.request.app['db'].acquire() as conn: + await delete_family(family_id, conn) + return web.Response(status=204) diff --git a/tests/test_family.py b/tests/test_family.py index 037a421..9acff18 100644 --- a/tests/test_family.py +++ b/tests/test_family.py @@ -60,7 +60,7 @@ async def test_get_family_info(app: web.Application, cli: TestClient, make_heade assert response['babies'][0]['date_of_birth'] == baby['date_of_birth'].strftime("%Y-%m-%dT%H:%M:%S.%f") -async def test_rename_family(app: web.Application, cli: TestClient, make_headers, family_factory, +async def test_update_family(app: web.Application, cli: TestClient, make_headers, family_factory, family_member_factory): user_uuid = str(uuid4()) async with app['db'].acquire() as conn: @@ -86,3 +86,27 @@ async def test_rename_family(app: web.Application, cli: TestClient, make_headers assert stored_family is not None assert stored_family.id == family['id'] assert stored_family.title == "My super family" + + +async def test_delete_family(app: web.Application, cli: TestClient, make_headers, family_factory, + family_member_factory): + user_uuid = str(uuid4()) + async with app['db'].acquire() as conn: + family = family_factory.create() + family['id'] = await family_repository.insert_family(family, conn) + another_family = family_factory.create() + another_family['id'] = await family_repository.insert_family(another_family, conn) + family_member = family_member_factory.create(family_id=family['id'], user_uuid=user_uuid) + family_member['id'] = await family_member_repository.insert_family_member(family_member, conn) + + resp = await cli.delete(f"/v1/family/{another_family['id']}", + headers=make_headers(user_uuid)) + assert resp.status == 403, await resp.text() + + resp = await cli.delete(f"/v1/family/{family['id']}", + headers=make_headers(user_uuid)) + assert resp.status == 204, await resp.text() + + async with app['db'].acquire() as conn: + stored_family = await family_repository.get_by_id(family['id'], conn) + assert stored_family is None