Skip to content

Commit 2b7b74c

Browse files
committed
new api
1 parent 4eab7cd commit 2b7b74c

File tree

2 files changed

+77
-36
lines changed

2 files changed

+77
-36
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
""" _api: implements `tags` plugin **service layer**
2+
"""
3+
4+
from aiohttp import web
5+
from models_library.basic_types import IdInt
6+
from models_library.users import UserID
7+
from servicelib.aiohttp.db_asyncpg_engine import get_async_engine
8+
from simcore_postgres_database.utils_tags import TagsRepo
9+
from sqlalchemy.ext.asyncio import AsyncEngine
10+
11+
from .schemas import TagCreate, TagGet, TagUpdate
12+
13+
14+
async def create_tag(
15+
app: web.Application, user_id: UserID, new_tag: TagCreate
16+
) -> TagGet:
17+
engine: AsyncEngine = get_async_engine(app)
18+
19+
repo = TagsRepo(engine)
20+
tag = await repo.create(
21+
user_id=user_id,
22+
read=True,
23+
write=True,
24+
delete=True,
25+
**new_tag.dict(exclude_unset=True),
26+
)
27+
return TagGet.from_db(tag)
28+
29+
30+
async def list_tags(
31+
app: web.Application,
32+
user_id: UserID,
33+
) -> list[TagGet]:
34+
engine: AsyncEngine = get_async_engine(app)
35+
repo = TagsRepo(engine)
36+
tags = await repo.list_all(user_id=user_id)
37+
return [TagGet.from_db(t) for t in tags]
38+
39+
40+
async def update_tag(
41+
app: web.Application, user_id: UserID, tag_id: IdInt, tag_updates: TagUpdate
42+
) -> TagGet:
43+
engine: AsyncEngine = get_async_engine(app)
44+
45+
repo = TagsRepo(engine)
46+
tag = await repo.update(
47+
user_id=user_id,
48+
tag_id=tag_id,
49+
**tag_updates.dict(exclude_unset=True),
50+
)
51+
return TagGet.from_db(tag)
52+
53+
54+
async def delete_tag(app: web.Application, user_id: UserID, tag_id: IdInt):
55+
engine: AsyncEngine = get_async_engine(app)
56+
57+
repo = TagsRepo(engine)
58+
await repo.delete(user_id=user_id, tag_id=tag_id)

services/web/server/src/simcore_service_webserver/tags/_handlers.py

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import functools
22

33
from aiohttp import web
4-
from aiopg.sa.engine import Engine
54
from pydantic import parse_obj_as
65
from servicelib.aiohttp.requests_validation import (
76
parse_request_body_as,
@@ -12,17 +11,15 @@
1211
from simcore_postgres_database.utils_tags import (
1312
TagNotFoundError,
1413
TagOperationNotAllowedError,
15-
TagsRepo,
1614
)
1715

1816
from .._meta import API_VTAG as VTAG
19-
from ..db.plugin import get_database_engine
2017
from ..login.decorators import login_required
2118
from ..security.decorators import permission_required
2219
from ..utils_aiohttp import envelope_json_response
20+
from . import _api
2321
from .schemas import (
2422
TagCreate,
25-
TagGet,
2623
TagGroupCreate,
2724
TagGroupGet,
2825
TagGroupPathParams,
@@ -55,70 +52,56 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
5552
@permission_required("tag.crud.*")
5653
@_handle_tags_exceptions
5754
async def create_tag(request: web.Request):
58-
engine: Engine = get_database_engine(request.app)
55+
assert request.app # nosec
5956
req_ctx = TagRequestContext.parse_obj(request)
6057
new_tag = await parse_request_body_as(TagCreate, request)
6158

62-
repo = TagsRepo(user_id=req_ctx.user_id)
63-
async with engine.acquire() as conn:
64-
tag = await repo.create(
65-
conn,
66-
read=True,
67-
write=True,
68-
delete=True,
69-
**new_tag.dict(exclude_unset=True),
70-
)
71-
model = TagGet.from_db(tag)
72-
return envelope_json_response(model)
59+
created = await _api.create_tag(
60+
request.app, user_id=req_ctx.user_id, new_tag=new_tag
61+
)
62+
return envelope_json_response(created)
7363

7464

7565
@routes.get(f"/{VTAG}/tags", name="list_tags")
7666
@login_required
7767
@permission_required("tag.crud.*")
7868
@_handle_tags_exceptions
7969
async def list_tags(request: web.Request):
80-
engine: Engine = get_database_engine(request.app)
81-
req_ctx = TagRequestContext.parse_obj(request)
8270

83-
repo = TagsRepo(user_id=req_ctx.user_id)
84-
async with engine.acquire() as conn:
85-
tags = await repo.list_all(conn)
86-
return envelope_json_response(
87-
[TagGet.from_db(t).dict(by_alias=True) for t in tags]
88-
)
71+
req_ctx = TagRequestContext.parse_obj(request)
72+
got = await _api.list_tags(request.app, user_id=req_ctx.user_id)
73+
return envelope_json_response(got)
8974

9075

9176
@routes.patch(f"/{VTAG}/tags/{{tag_id}}", name="update_tag")
9277
@login_required
9378
@permission_required("tag.crud.*")
9479
@_handle_tags_exceptions
9580
async def update_tag(request: web.Request):
96-
engine: Engine = get_database_engine(request.app)
9781
req_ctx = TagRequestContext.parse_obj(request)
9882
path_params = parse_request_path_parameters_as(TagPathParams, request)
9983
tag_updates = await parse_request_body_as(TagUpdate, request)
10084

101-
repo = TagsRepo(user_id=req_ctx.user_id)
102-
async with engine.acquire() as conn:
103-
tag = await repo.update(
104-
conn, path_params.tag_id, **tag_updates.dict(exclude_unset=True)
105-
)
106-
model = TagGet.from_db(tag)
107-
return envelope_json_response(model)
85+
updated = await _api.update_tag(
86+
request.app,
87+
user_id=req_ctx.user_id,
88+
tag_id=path_params.tag_id,
89+
tag_updates=tag_updates,
90+
)
91+
return envelope_json_response(updated)
10892

10993

11094
@routes.delete(f"/{VTAG}/tags/{{tag_id}}", name="delete_tag")
11195
@login_required
11296
@permission_required("tag.crud.*")
11397
@_handle_tags_exceptions
11498
async def delete_tag(request: web.Request):
115-
engine: Engine = get_database_engine(request.app)
11699
req_ctx = TagRequestContext.parse_obj(request)
117100
path_params = parse_request_path_parameters_as(TagPathParams, request)
118101

119-
repo = TagsRepo(user_id=req_ctx.user_id)
120-
async with engine.acquire() as conn:
121-
await repo.delete(conn, tag_id=path_params.tag_id)
102+
await _api.delete_tag(
103+
request.app, user_id=req_ctx.user_id, tag_id=path_params.tag_id
104+
)
122105

123106
raise web.HTTPNoContent(content_type=MIMETYPE_APPLICATION_JSON)
124107

0 commit comments

Comments
 (0)