Skip to content

Commit 869a08d

Browse files
♻️ refactor of project comments (#4393)
1 parent 384e9f1 commit 869a08d

File tree

6 files changed

+128
-66
lines changed

6 files changed

+128
-66
lines changed

api/specs/webserver/scripts/openapi_projects_comments.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from models_library.projects import ProjectID
2323
from models_library.projects_comments import CommentID, ProjectsCommentsAPI
2424
from pydantic import NonNegativeInt
25-
from simcore_service_webserver.projects._handlers_project_comments import (
25+
from simcore_service_webserver.projects._comments_handlers import (
2626
_ProjectCommentsBodyParams,
2727
_ProjectCommentsPathParams,
2828
_ProjectCommentsWithCommentPathParams,
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
""" Database API
2+
3+
- Adds a layer to the postgres API with a focus on the projects comments
4+
5+
"""
6+
import logging
7+
8+
from aiopg.sa.result import ResultProxy
9+
from models_library.projects import ProjectID
10+
from models_library.projects_comments import CommentID, ProjectsCommentsDB
11+
from models_library.users import UserID
12+
from pydantic import parse_obj_as
13+
from pydantic.types import PositiveInt
14+
from simcore_postgres_database.models.projects_comments import projects_comments
15+
from sqlalchemy import func, literal_column
16+
from sqlalchemy.sql import select
17+
18+
_logger = logging.getLogger(__name__)
19+
20+
21+
async def create_project_comment(
22+
conn, project_uuid: ProjectID, user_id: UserID, contents: str
23+
) -> CommentID:
24+
project_comment_id: ResultProxy = await conn.execute(
25+
projects_comments.insert()
26+
.values(
27+
project_uuid=project_uuid,
28+
user_id=user_id,
29+
contents=contents,
30+
modified=func.now(),
31+
)
32+
.returning(projects_comments.c.comment_id)
33+
)
34+
result: tuple[PositiveInt] = await project_comment_id.first()
35+
return parse_obj_as(CommentID, result[0])
36+
37+
38+
async def list_project_comments(
39+
conn,
40+
project_uuid: ProjectID,
41+
offset: PositiveInt,
42+
limit: int,
43+
) -> list[ProjectsCommentsDB]:
44+
result = []
45+
project_comment_result: ResultProxy = await conn.execute(
46+
projects_comments.select()
47+
.where(projects_comments.c.project_uuid == f"{project_uuid}")
48+
.order_by(projects_comments.c.created.asc())
49+
.offset(offset)
50+
.limit(limit)
51+
)
52+
result = [
53+
parse_obj_as(ProjectsCommentsDB, row)
54+
for row in await project_comment_result.fetchall()
55+
]
56+
return result
57+
58+
59+
async def total_project_comments(
60+
conn,
61+
project_uuid: ProjectID,
62+
) -> PositiveInt:
63+
project_comment_result: ResultProxy = await conn.execute(
64+
select(func.count())
65+
.select_from(projects_comments)
66+
.where(projects_comments.c.project_uuid == f"{project_uuid}")
67+
)
68+
result: tuple[PositiveInt] = await project_comment_result.first()
69+
return result[0]
70+
71+
72+
async def update_project_comment(
73+
conn,
74+
comment_id: CommentID,
75+
project_uuid: ProjectID,
76+
contents: str,
77+
) -> ProjectsCommentsDB:
78+
project_comment_result = await conn.execute(
79+
projects_comments.update()
80+
.values(
81+
project_uuid=project_uuid,
82+
contents=contents,
83+
modified=func.now(),
84+
)
85+
.where(projects_comments.c.comment_id == comment_id)
86+
.returning(literal_column("*"))
87+
)
88+
result = await project_comment_result.first()
89+
return parse_obj_as(ProjectsCommentsDB, result)
90+
91+
92+
async def delete_project_comment(conn, comment_id: CommentID) -> None:
93+
await conn.execute(
94+
projects_comments.delete().where(projects_comments.c.comment_id == comment_id)
95+
)
96+
97+
98+
async def get_project_comment(conn, comment_id: CommentID) -> ProjectsCommentsDB:
99+
project_comment_result = await conn.execute(
100+
projects_comments.select().where(projects_comments.c.comment_id == comment_id)
101+
)
102+
result = await project_comment_result.first()
103+
return parse_obj_as(ProjectsCommentsDB, result)

services/web/server/src/simcore_service_webserver/projects/_handlers_project_comments.py renamed to services/web/server/src/simcore_service_webserver/projects/_comments_handlers.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from ..login.decorators import login_required
2626
from ..security.decorators import permission_required
2727
from ..utils_aiohttp import envelope_json_response
28-
from . import _api_project_comments, projects_api
28+
from . import _comments_api, projects_api
2929
from ._handlers_crud import RequestContext
3030
from .exceptions import ProjectNotFoundError
3131

@@ -92,7 +92,7 @@ async def create_project_comment(request: web.Request):
9292
include_state=False,
9393
)
9494

95-
comment_id = await _api_project_comments.create_project_comment(
95+
comment_id = await _comments_api.create_project_comment(
9696
request=request,
9797
project_uuid=path_params.project_uuid,
9898
user_id=req_ctx.user_id,
@@ -136,12 +136,12 @@ async def list_project_comments(request: web.Request):
136136
include_state=False,
137137
)
138138

139-
total_project_comments = await _api_project_comments.total_project_comments(
139+
total_project_comments = await _comments_api.total_project_comments(
140140
request=request,
141141
project_uuid=path_params.project_uuid,
142142
)
143143

144-
project_comments = await _api_project_comments.list_project_comments(
144+
project_comments = await _comments_api.list_project_comments(
145145
request=request,
146146
project_uuid=path_params.project_uuid,
147147
offset=query_params.offset,
@@ -184,7 +184,7 @@ async def update_project_comment(request: web.Request):
184184
include_state=False,
185185
)
186186

187-
return await _api_project_comments.update_project_comment(
187+
return await _comments_api.update_project_comment(
188188
request=request,
189189
comment_id=path_params.comment_id,
190190
project_uuid=path_params.project_uuid,
@@ -213,7 +213,7 @@ async def delete_project_comment(request: web.Request):
213213
include_state=False,
214214
)
215215

216-
await _api_project_comments.delete_project_comment(
216+
await _comments_api.delete_project_comment(
217217
request=request,
218218
comment_id=path_params.comment_id,
219219
)
@@ -241,7 +241,7 @@ async def get_project_comment(request: web.Request):
241241
include_state=False,
242242
)
243243

244-
return await _api_project_comments.get_project_comment(
244+
return await _comments_api.get_project_comment(
245245
request=request,
246246
comment_id=path_params.comment_id,
247247
)

services/web/server/src/simcore_service_webserver/projects/db.py

Lines changed: 15 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
from servicelib.json_serialization import json_dumps
2626
from servicelib.logging_utils import get_log_record_extra, log_context
2727
from simcore_postgres_database.errors import UniqueViolation
28-
from simcore_postgres_database.models.projects_comments import projects_comments
2928
from simcore_postgres_database.models.projects_to_products import projects_to_products
3029
from simcore_postgres_database.webserver_models import ProjectType, projects, users
3130
from sqlalchemy import desc, func, literal_column
@@ -35,6 +34,14 @@
3534

3635
from ..db.models import study_tags
3736
from ..utils import now_str
37+
from ._comments_db import (
38+
create_project_comment,
39+
delete_project_comment,
40+
get_project_comment,
41+
list_project_comments,
42+
total_project_comments,
43+
update_project_comment,
44+
)
3845
from ._db_utils import (
3946
ANY_USER_ID_SENTINEL,
4047
BaseProjectDB,
@@ -777,52 +784,23 @@ async def create_project_comment(
777784
self, project_uuid: ProjectID, user_id: UserID, contents: str
778785
) -> CommentID:
779786
async with self.engine.acquire() as conn:
780-
project_comment_id: ResultProxy = await conn.execute(
781-
projects_comments.insert()
782-
.values(
783-
project_uuid=project_uuid,
784-
user_id=user_id,
785-
contents=contents,
786-
modified=func.now(),
787-
)
788-
.returning(projects_comments.c.comment_id)
789-
)
790-
result: tuple[PositiveInt] = await project_comment_id.first()
791-
return parse_obj_as(CommentID, result[0])
787+
return await create_project_comment(conn, project_uuid, user_id, contents)
792788

793789
async def list_project_comments(
794790
self,
795791
project_uuid: ProjectID,
796792
offset: PositiveInt,
797793
limit: int,
798794
) -> list[ProjectsCommentsDB]:
799-
result = []
800795
async with self.engine.acquire() as conn:
801-
project_comment_result: ResultProxy = await conn.execute(
802-
projects_comments.select()
803-
.where(projects_comments.c.project_uuid == f"{project_uuid}")
804-
.order_by(projects_comments.c.created.asc())
805-
.offset(offset)
806-
.limit(limit)
807-
)
808-
result = [
809-
parse_obj_as(ProjectsCommentsDB, row)
810-
for row in await project_comment_result.fetchall()
811-
]
812-
return result
796+
return await list_project_comments(conn, project_uuid, offset, limit)
813797

814798
async def total_project_comments(
815799
self,
816800
project_uuid: ProjectID,
817801
) -> PositiveInt:
818802
async with self.engine.acquire() as conn:
819-
project_comment_result: ResultProxy = await conn.execute(
820-
select(func.count())
821-
.select_from(projects_comments)
822-
.where(projects_comments.c.project_uuid == f"{project_uuid}")
823-
)
824-
result: tuple[PositiveInt] = await project_comment_result.first()
825-
return result[0]
803+
return await total_project_comments(conn, project_uuid)
826804

827805
async def update_project_comment(
828806
self,
@@ -831,36 +809,17 @@ async def update_project_comment(
831809
contents: str,
832810
) -> ProjectsCommentsDB:
833811
async with self.engine.acquire() as conn:
834-
project_comment_result = await conn.execute(
835-
projects_comments.update()
836-
.values(
837-
project_uuid=project_uuid,
838-
contents=contents,
839-
modified=func.now(),
840-
)
841-
.where(projects_comments.c.comment_id == comment_id)
842-
.returning(literal_column("*"))
812+
return await update_project_comment(
813+
conn, comment_id, project_uuid, contents
843814
)
844-
result = await project_comment_result.first()
845-
return parse_obj_as(ProjectsCommentsDB, result)
846815

847816
async def delete_project_comment(self, comment_id: CommentID) -> None:
848817
async with self.engine.acquire() as conn:
849-
await conn.execute(
850-
projects_comments.delete().where(
851-
projects_comments.c.comment_id == comment_id
852-
)
853-
)
818+
return await delete_project_comment(conn, comment_id)
854819

855820
async def get_project_comment(self, comment_id: CommentID) -> ProjectsCommentsDB:
856821
async with self.engine.acquire() as conn:
857-
project_comment_result = await conn.execute(
858-
projects_comments.select().where(
859-
projects_comments.c.comment_id == comment_id
860-
)
861-
)
862-
result = await project_comment_result.first()
863-
return parse_obj_as(ProjectsCommentsDB, result)
822+
return await get_project_comment(conn, comment_id)
864823

865824
#
866825
# Project HIDDEN column

services/web/server/src/simcore_service_webserver/projects/plugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515

1616
from .._constants import APP_OPENAPI_SPECS_KEY, APP_SETTINGS_KEY
1717
from . import (
18+
_comments_handlers,
1819
_handlers,
1920
_handlers_crud,
20-
_handlers_project_comments,
2121
_handlers_project_nodes,
2222
_handlers_project_ports,
2323
_handlers_project_tags,
@@ -71,7 +71,7 @@ def setup_projects(app: web.Application) -> bool:
7171
app.router.add_routes(_handlers.routes)
7272
app.router.add_routes(_handlers_crud.routes)
7373
app.router.add_routes(_handlers_project_ports.routes)
74-
app.router.add_routes(_handlers_project_comments.routes)
74+
app.router.add_routes(_comments_handlers.routes)
7575

7676
app.router.add_routes(
7777
_create_routes(

0 commit comments

Comments
 (0)