Skip to content

♻️ refactor of project comments #4393

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion api/specs/webserver/scripts/openapi_projects_comments.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from models_library.projects import ProjectID
from models_library.projects_comments import CommentID, ProjectsCommentsAPI
from pydantic import NonNegativeInt
from simcore_service_webserver.projects._handlers_project_comments import (
from simcore_service_webserver.projects._comments_handlers import (
_ProjectCommentsBodyParams,
_ProjectCommentsPathParams,
_ProjectCommentsWithCommentPathParams,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
""" Database API

- Adds a layer to the postgres API with a focus on the projects comments

"""
import logging

from aiopg.sa.result import ResultProxy
from models_library.projects import ProjectID
from models_library.projects_comments import CommentID, ProjectsCommentsDB
from models_library.users import UserID
from pydantic import parse_obj_as
from pydantic.types import PositiveInt
from simcore_postgres_database.models.projects_comments import projects_comments
from sqlalchemy import func, literal_column
from sqlalchemy.sql import select

_logger = logging.getLogger(__name__)


async def create_project_comment(
conn, project_uuid: ProjectID, user_id: UserID, contents: str
) -> CommentID:
project_comment_id: ResultProxy = await conn.execute(
projects_comments.insert()
.values(
project_uuid=project_uuid,
user_id=user_id,
contents=contents,
modified=func.now(),
)
.returning(projects_comments.c.comment_id)
)
result: tuple[PositiveInt] = await project_comment_id.first()
return parse_obj_as(CommentID, result[0])


async def list_project_comments(
conn,
project_uuid: ProjectID,
offset: PositiveInt,
limit: int,
) -> list[ProjectsCommentsDB]:
result = []
project_comment_result: ResultProxy = await conn.execute(
projects_comments.select()
.where(projects_comments.c.project_uuid == f"{project_uuid}")
.order_by(projects_comments.c.created.asc())
.offset(offset)
.limit(limit)
)
result = [
parse_obj_as(ProjectsCommentsDB, row)
for row in await project_comment_result.fetchall()
]
return result


async def total_project_comments(
conn,
project_uuid: ProjectID,
) -> PositiveInt:
project_comment_result: ResultProxy = await conn.execute(
select(func.count())
.select_from(projects_comments)
.where(projects_comments.c.project_uuid == f"{project_uuid}")
)
result: tuple[PositiveInt] = await project_comment_result.first()
return result[0]


async def update_project_comment(
conn,
comment_id: CommentID,
project_uuid: ProjectID,
contents: str,
) -> ProjectsCommentsDB:
project_comment_result = await conn.execute(
projects_comments.update()
.values(
project_uuid=project_uuid,
contents=contents,
modified=func.now(),
)
.where(projects_comments.c.comment_id == comment_id)
.returning(literal_column("*"))
)
result = await project_comment_result.first()
return parse_obj_as(ProjectsCommentsDB, result)


async def delete_project_comment(conn, comment_id: CommentID) -> None:
await conn.execute(
projects_comments.delete().where(projects_comments.c.comment_id == comment_id)
)


async def get_project_comment(conn, comment_id: CommentID) -> ProjectsCommentsDB:
project_comment_result = await conn.execute(
projects_comments.select().where(projects_comments.c.comment_id == comment_id)
)
result = await project_comment_result.first()
return parse_obj_as(ProjectsCommentsDB, result)
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from ..login.decorators import login_required
from ..security.decorators import permission_required
from ..utils_aiohttp import envelope_json_response
from . import _api_project_comments, projects_api
from . import _comments_api, projects_api
from ._handlers_crud import RequestContext
from .exceptions import ProjectNotFoundError

Expand Down Expand Up @@ -92,7 +92,7 @@ async def create_project_comment(request: web.Request):
include_state=False,
)

comment_id = await _api_project_comments.create_project_comment(
comment_id = await _comments_api.create_project_comment(
request=request,
project_uuid=path_params.project_uuid,
user_id=req_ctx.user_id,
Expand Down Expand Up @@ -136,12 +136,12 @@ async def list_project_comments(request: web.Request):
include_state=False,
)

total_project_comments = await _api_project_comments.total_project_comments(
total_project_comments = await _comments_api.total_project_comments(
request=request,
project_uuid=path_params.project_uuid,
)

project_comments = await _api_project_comments.list_project_comments(
project_comments = await _comments_api.list_project_comments(
request=request,
project_uuid=path_params.project_uuid,
offset=query_params.offset,
Expand Down Expand Up @@ -184,7 +184,7 @@ async def update_project_comment(request: web.Request):
include_state=False,
)

return await _api_project_comments.update_project_comment(
return await _comments_api.update_project_comment(
request=request,
comment_id=path_params.comment_id,
project_uuid=path_params.project_uuid,
Expand Down Expand Up @@ -213,7 +213,7 @@ async def delete_project_comment(request: web.Request):
include_state=False,
)

await _api_project_comments.delete_project_comment(
await _comments_api.delete_project_comment(
request=request,
comment_id=path_params.comment_id,
)
Expand Down Expand Up @@ -241,7 +241,7 @@ async def get_project_comment(request: web.Request):
include_state=False,
)

return await _api_project_comments.get_project_comment(
return await _comments_api.get_project_comment(
request=request,
comment_id=path_params.comment_id,
)
71 changes: 15 additions & 56 deletions services/web/server/src/simcore_service_webserver/projects/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
from servicelib.json_serialization import json_dumps
from servicelib.logging_utils import get_log_record_extra, log_context
from simcore_postgres_database.errors import UniqueViolation
from simcore_postgres_database.models.projects_comments import projects_comments
from simcore_postgres_database.models.projects_to_products import projects_to_products
from simcore_postgres_database.webserver_models import ProjectType, projects, users
from sqlalchemy import desc, func, literal_column
Expand All @@ -35,6 +34,14 @@

from ..db.models import study_tags
from ..utils import now_str
from ._comments_db import (
create_project_comment,
delete_project_comment,
get_project_comment,
list_project_comments,
total_project_comments,
update_project_comment,
)
from ._db_utils import (
ANY_USER_ID_SENTINEL,
BaseProjectDB,
Expand Down Expand Up @@ -777,52 +784,23 @@ async def create_project_comment(
self, project_uuid: ProjectID, user_id: UserID, contents: str
) -> CommentID:
async with self.engine.acquire() as conn:
project_comment_id: ResultProxy = await conn.execute(
projects_comments.insert()
.values(
project_uuid=project_uuid,
user_id=user_id,
contents=contents,
modified=func.now(),
)
.returning(projects_comments.c.comment_id)
)
result: tuple[PositiveInt] = await project_comment_id.first()
return parse_obj_as(CommentID, result[0])
return await create_project_comment(conn, project_uuid, user_id, contents)

async def list_project_comments(
self,
project_uuid: ProjectID,
offset: PositiveInt,
limit: int,
) -> list[ProjectsCommentsDB]:
result = []
async with self.engine.acquire() as conn:
project_comment_result: ResultProxy = await conn.execute(
projects_comments.select()
.where(projects_comments.c.project_uuid == f"{project_uuid}")
.order_by(projects_comments.c.created.asc())
.offset(offset)
.limit(limit)
)
result = [
parse_obj_as(ProjectsCommentsDB, row)
for row in await project_comment_result.fetchall()
]
return result
return await list_project_comments(conn, project_uuid, offset, limit)

async def total_project_comments(
self,
project_uuid: ProjectID,
) -> PositiveInt:
async with self.engine.acquire() as conn:
project_comment_result: ResultProxy = await conn.execute(
select(func.count())
.select_from(projects_comments)
.where(projects_comments.c.project_uuid == f"{project_uuid}")
)
result: tuple[PositiveInt] = await project_comment_result.first()
return result[0]
return await total_project_comments(conn, project_uuid)

async def update_project_comment(
self,
Expand All @@ -831,36 +809,17 @@ async def update_project_comment(
contents: str,
) -> ProjectsCommentsDB:
async with self.engine.acquire() as conn:
project_comment_result = await conn.execute(
projects_comments.update()
.values(
project_uuid=project_uuid,
contents=contents,
modified=func.now(),
)
.where(projects_comments.c.comment_id == comment_id)
.returning(literal_column("*"))
return await update_project_comment(
conn, comment_id, project_uuid, contents
)
result = await project_comment_result.first()
return parse_obj_as(ProjectsCommentsDB, result)

async def delete_project_comment(self, comment_id: CommentID) -> None:
async with self.engine.acquire() as conn:
await conn.execute(
projects_comments.delete().where(
projects_comments.c.comment_id == comment_id
)
)
return await delete_project_comment(conn, comment_id)

async def get_project_comment(self, comment_id: CommentID) -> ProjectsCommentsDB:
async with self.engine.acquire() as conn:
project_comment_result = await conn.execute(
projects_comments.select().where(
projects_comments.c.comment_id == comment_id
)
)
result = await project_comment_result.first()
return parse_obj_as(ProjectsCommentsDB, result)
return await get_project_comment(conn, comment_id)

#
# Project HIDDEN column
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@

from .._constants import APP_OPENAPI_SPECS_KEY, APP_SETTINGS_KEY
from . import (
_comments_handlers,
_handlers,
_handlers_crud,
_handlers_project_comments,
_handlers_project_nodes,
_handlers_project_ports,
_handlers_project_tags,
Expand Down Expand Up @@ -71,7 +71,7 @@ def setup_projects(app: web.Application) -> bool:
app.router.add_routes(_handlers.routes)
app.router.add_routes(_handlers_crud.routes)
app.router.add_routes(_handlers_project_ports.routes)
app.router.add_routes(_handlers_project_comments.routes)
app.router.add_routes(_comments_handlers.routes)

app.router.add_routes(
_create_routes(
Expand Down