Skip to content
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
4 changes: 2 additions & 2 deletions .github/workflows/lint-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
python-version: "3.13.7"
source: "apigateway"
sonar-inclusions: "src/**,Dockerfile"
sonar-exclusions: "**/stubs/**"
sonar-coverage-exclusions: "src/apigateway/server.py,src/apigateway/settings.py"
sonar-exclusions: "**/stubs/**,src/apigateway/clients/**,src/apigateway/resolvers/**"
sonar-coverage-exclusions: "src/apigateway/clients/**,src/apigateway/resolvers/**,src/apigateway/esclient_graphql.py,src/apigateway/server.py,src/apigateway/settings.py"
secrets:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
6 changes: 3 additions & 3 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ LOAD_ENVS_URL := 'https://raw.githubusercontent.com/esclient/tools/refs/heads/ma

PROTO_REPO := 'https://raw.githubusercontent.com/esclient/protos'

COMMENT_PROTO_TAG := 'v0.0.8'
COMMENT_PROTO_TAG := 'v0.1.2'
COMMENT_PROTO_NAME := 'comment.proto'

USER_PROTO_TAG := 'v0.0.8'
USER_PROTO_TAG := 'v0.1.2'
USER_PROTO_NAME := 'user.proto'

RATING_PROTO_TAG := 'v0.0.15'
RATING_PROTO_TAG := 'v0.1.2'
RATING_PROTO_NAME := 'rating.proto'

MOD_PROTO_TAG := 'v0.1.2'
Expand Down
10 changes: 9 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,15 @@ relative_files = true

[tool.coverage.report]
include = [
"src/apigateway/*",
"src/apigateway/converters/*",
"src/apigateway/helpers/*",
]
omit = [
"src/apigateway/clients/*",
"src/apigateway/resolvers/*",
"src/apigateway/esclient_graphql.py",
"src/apigateway/server.py",
"src/apigateway/settings.py",
]

[project]
Expand Down
37 changes: 37 additions & 0 deletions src/apigateway/resolvers/query/rating.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from typing import Any

from ariadne import ObjectType
from graphql import GraphQLResolveInfo
from pydantic import BaseModel, field_validator

from apigateway.helpers.id_helper import validate_and_convert_id

from ..grpc_error_wrapper import handle_grpc_errors


class GetRatesInput(BaseModel):
mod_id: int

@field_validator("mod_id", mode="before")
def _mod_id(cls, v: Any) -> int:
return validate_and_convert_id(v, "mod_id")


rating_query = ObjectType("RatingQuery")


@rating_query.field("getRates")
@handle_grpc_errors
async def resolve_get_rates(parent: object, info: GraphQLResolveInfo, input: GetRatesInput) -> dict[str, int]:
data = GetRatesInput.model_validate(input)
client = info.context["clients"]["rating_service"]
resp = await client.get_rates(data.mod_id)

return {
"rates_total": resp.rates_total,
"rate_1": resp.rate_1,
"rate_2": resp.rate_2,
"rate_3": resp.rate_3,
"rate_4": resp.rate_4,
"rate_5": resp.rate_5,
}
6 changes: 6 additions & 0 deletions src/apigateway/resolvers/query/root.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,9 @@ def resolve_comment_root(obj: Any, info: GraphQLResolveInfo, **kwargs: Any) -> d
@handle_grpc_errors
def resolve_mod_root(obj: Any, info: GraphQLResolveInfo, **kwargs: Any) -> dict[str, Any]:
return {}


@query.field("rating")
@handle_grpc_errors
def resolve_rating_root(obj: Any, info: GraphQLResolveInfo, **kwargs: Any) -> dict[str, Any]:
return {}
16 changes: 16 additions & 0 deletions src/apigateway/schema/query/rating.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
type RatingQuery {
getRates(input: GetRatesInput!): RatesInfo!
}

type RatesInfo {
rates_total: Int!
rate_1: Int!
rate_2: Int!
rate_3: Int!
rate_4: Int!
rate_5: Int!
}

input GetRatesInput {
mod_id: ID!
}
1 change: 1 addition & 0 deletions src/apigateway/schema/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ type Mutation {
type Query {
comment: CommentQuery
mod: ModQuery
rating: RatingQuery
}
4 changes: 4 additions & 0 deletions src/apigateway/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
from apigateway.clients.client_factory import GrpcClientFactory
from apigateway.resolvers.mutation.comment import comment_mutation
from apigateway.resolvers.mutation.mod import mod_mutation
from apigateway.resolvers.mutation.rating import rating_mutation
from apigateway.resolvers.mutation.root import mutation
from apigateway.resolvers.query.comment import comment_query
from apigateway.resolvers.query.mod import mod_query
from apigateway.resolvers.query.rating import rating_query
from apigateway.resolvers.query.root import query
from apigateway.settings import Settings

Expand All @@ -29,9 +31,11 @@
query,
comment_query,
mod_query,
rating_query,
mutation,
comment_mutation,
mod_mutation,
rating_mutation,
)

context_viewer = GQLContextViewer()
Expand Down
43 changes: 22 additions & 21 deletions src/apigateway/stubs/comment/comment_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 6 additions & 3 deletions src/apigateway/stubs/comment/comment_pb2.pyi
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import datetime

from google.protobuf import timestamp_pb2 as _timestamp_pb2
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
Expand All @@ -16,9 +19,9 @@ class Comment(_message.Message):
id: int
author_id: int
text: str
created_at: int
edited_at: int
def __init__(self, id: _Optional[int] = ..., author_id: _Optional[int] = ..., text: _Optional[str] = ..., created_at: _Optional[int] = ..., edited_at: _Optional[int] = ...) -> None: ...
created_at: _timestamp_pb2.Timestamp
edited_at: _timestamp_pb2.Timestamp
def __init__(self, id: _Optional[int] = ..., author_id: _Optional[int] = ..., text: _Optional[str] = ..., created_at: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., edited_at: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ...

class CreateCommentRequest(_message.Message):
__slots__ = ("mod_id", "author_id", "text")
Expand Down
12 changes: 6 additions & 6 deletions src/apigateway/stubs/rating/rating_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 12 additions & 6 deletions src/apigateway/stubs/rating/rating_pb2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,17 @@ class GetRatesRequest(_message.Message):
def __init__(self, mod_id: _Optional[int] = ...) -> None: ...

class GetRatesResponse(_message.Message):
__slots__ = ("rates_total", "likes", "dislikes")
__slots__ = ("rates_total", "rate_1", "rate_2", "rate_3", "rate_4", "rate_5")
RATES_TOTAL_FIELD_NUMBER: _ClassVar[int]
LIKES_FIELD_NUMBER: _ClassVar[int]
DISLIKES_FIELD_NUMBER: _ClassVar[int]
RATE_1_FIELD_NUMBER: _ClassVar[int]
RATE_2_FIELD_NUMBER: _ClassVar[int]
RATE_3_FIELD_NUMBER: _ClassVar[int]
RATE_4_FIELD_NUMBER: _ClassVar[int]
RATE_5_FIELD_NUMBER: _ClassVar[int]
rates_total: int
likes: int
dislikes: int
def __init__(self, rates_total: _Optional[int] = ..., likes: _Optional[int] = ..., dislikes: _Optional[int] = ...) -> None: ...
rate_1: int
rate_2: int
rate_3: int
rate_4: int
rate_5: int
def __init__(self, rates_total: _Optional[int] = ..., rate_1: _Optional[int] = ..., rate_2: _Optional[int] = ..., rate_3: _Optional[int] = ..., rate_4: _Optional[int] = ..., rate_5: _Optional[int] = ...) -> None: ...
18 changes: 11 additions & 7 deletions src/apigateway/stubs/user/user_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions src/apigateway/stubs/user/user_pb2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,14 @@ class RegisterUserRequest(_message.Message):
confirm_password: str
def __init__(self, login: _Optional[str] = ..., email: _Optional[str] = ..., password: _Optional[str] = ..., confirm_password: _Optional[str] = ...) -> None: ...

class VerifyUserRequest(_message.Message):
__slots__ = ("user_id", "confirmation_code")
USER_ID_FIELD_NUMBER: _ClassVar[int]
CONFIRMATION_CODE_FIELD_NUMBER: _ClassVar[int]
user_id: int
confirmation_code: str
def __init__(self, user_id: _Optional[int] = ..., confirmation_code: _Optional[str] = ...) -> None: ...

class LoginUserResponse(_message.Message):
__slots__ = ("user_id",)
USER_ID_FIELD_NUMBER: _ClassVar[int]
Expand All @@ -35,3 +43,9 @@ class RegisterUserResponse(_message.Message):
USER_ID_FIELD_NUMBER: _ClassVar[int]
user_id: int
def __init__(self, user_id: _Optional[int] = ...) -> None: ...

class VerifyUserResponse(_message.Message):
__slots__ = ("is_verified",)
IS_VERIFIED_FIELD_NUMBER: _ClassVar[int]
is_verified: bool
def __init__(self, is_verified: bool = ...) -> None: ...
Loading