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
11 changes: 10 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ services:
condition: service_started
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "celery --app core.celery.celery_app inspect ping -d celery@$$HOSTNAME"]
test: [ "CMD-SHELL", "celery --app core.celery.celery_app inspect ping -d celery@$$HOSTNAME" ]
interval: 30s
timeout: 10s
retries: 3
Expand Down Expand Up @@ -104,6 +104,15 @@ services:
condition: service_started
restart: unless-stopped

grpc-service:
build: .
container_name: grpc-container
command: ../.venv/bin/python ./run_grpc.py
ports:
- "50052:50052"
networks:
- app-network

networks:
app-network:
driver: bridge
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ dependencies = [
"black>=25.1.0",
"yookassa>=3.7.0",
"redis>=4.6.0",
"grpcio-tools>=1.76.0",
]

[dependency-groups]
Expand Down
48 changes: 0 additions & 48 deletions realtimemap/api/v1/auth/view.py

This file was deleted.

2 changes: 1 addition & 1 deletion realtimemap/core/app/create_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
from starlette.staticfiles import StaticFiles

from admin import setup_admin
from api.v1 import router as v1_router
from core.config import conf
from middleware import ProcessTimeMiddleware
from transport.http.api.v1 import router as v1_router
from .exception_handler import register_exception_handler
from .lifespan import lifespan
from .socket import sio_app
Expand Down
3 changes: 2 additions & 1 deletion realtimemap/core/config/config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from functools import lru_cache
from pathlib import Path

from pydantic_settings import BaseSettings, SettingsConfigDict
Expand All @@ -7,6 +6,7 @@
from .celery import CeleryConfig
from .database import DatabaseConfig
from .frontend import FrontendConfig
from .grpc import GRPCConfig
from .logging import LoggingConfig
from .payment import YooKassaPayment
from .redis import RedisConfig
Expand All @@ -32,6 +32,7 @@ class AppConfig(BaseSettings):
log: LoggingConfig = LoggingConfig()
payment: YooKassaPayment

grpc: GRPCConfig = GRPCConfig()
mode: str = "dev"

model_config = SettingsConfigDict(
Expand Down
5 changes: 5 additions & 0 deletions realtimemap/core/config/grpc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from pydantic import BaseModel


class GRPCConfig(BaseModel):
port:str = "[::]:50052"
2 changes: 1 addition & 1 deletion realtimemap/modules/gamefication/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
DBSession = Annotated[AsyncSession, Depends(get_session)]


async def get_pg_level_repository(
def get_pg_level_repository(
session: DBSession,
) -> "LevelRepository":
adapter = PgAdapter[Level, None, None](session, Level)
Expand Down
2 changes: 1 addition & 1 deletion realtimemap/modules/user/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
DBSession = Annotated[AsyncSession, Depends(get_session)]


async def get_pg_user_repository(
def get_pg_user_repository(
session: DBSession,
) -> "UserRepository":
adapter = PgAdapter[User, UserCreate, UserUpdate](session, User)
Expand Down
11 changes: 11 additions & 0 deletions realtimemap/modules/user/service_depenencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
UsersBanRepository,
UserSubscriptionRepository,
)
from sqlalchemy.ext.asyncio import AsyncSession


async def get_user_service(
Expand All @@ -26,3 +27,13 @@ async def get_user_service(
level_repo: Annotated["LevelRepository", Depends(get_pg_level_repository)],
) -> "UserService":
return UserService(user_repo, user_ban_repo, user_subs_repo, level_repo)


# Для gRPC!
async def create_user_service(session: "AsyncSession") -> "UserService":
user_repo = get_pg_user_repository(session)
user_ban_repo = get_user_ban_repository(session)
user_subs_repo = get_user_subscription_repository(session)
level_repo = get_pg_level_repository(session)

return UserService(user_repo, user_ban_repo, user_subs_repo, level_repo)
2 changes: 1 addition & 1 deletion realtimemap/modules/user_ban/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from core.common.repository import UsersBanRepository


async def get_user_ban_repository(
def get_user_ban_repository(
session: Annotated["AsyncSession", Depends(get_session)],
) -> "UsersBanRepository":
adapter = PgAdapter[UsersBan, UsersBanCreate, UpdateUsersBan](session, UsersBan)
Expand Down
2 changes: 1 addition & 1 deletion realtimemap/modules/user_subscription/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from core.common.repository import UserSubscriptionRepository


async def get_user_subscription_repository(
def get_user_subscription_repository(
session: Annotated["AsyncSession", Depends(get_session)],
) -> "UserSubscriptionRepository":
adapter = PgAdapter[
Expand Down
6 changes: 6 additions & 0 deletions realtimemap/run_grpc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import asyncio

from transport.grpc.server import create_grpc_server

if __name__ == "__main__":
asyncio.get_event_loop().run_until_complete(create_grpc_server())
40 changes: 40 additions & 0 deletions realtimemap/transport/grpc/generated/user_service_pb2.py

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

23 changes: 23 additions & 0 deletions realtimemap/transport/grpc/generated/user_service_pb2.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Optional as _Optional

DESCRIPTOR: _descriptor.FileDescriptor

class UserRequest(_message.Message):
__slots__ = ("id",)
ID_FIELD_NUMBER: _ClassVar[int]
id: int
def __init__(self, id: _Optional[int] = ...) -> None: ...

class UserResponse(_message.Message):
__slots__ = ("id", "username", "email", "is_superuser")
ID_FIELD_NUMBER: _ClassVar[int]
USERNAME_FIELD_NUMBER: _ClassVar[int]
EMAIL_FIELD_NUMBER: _ClassVar[int]
IS_SUPERUSER_FIELD_NUMBER: _ClassVar[int]
id: int
username: str
email: str
is_superuser: bool
def __init__(self, id: _Optional[int] = ..., username: _Optional[str] = ..., email: _Optional[str] = ..., is_superuser: bool = ...) -> None: ...
107 changes: 107 additions & 0 deletions realtimemap/transport/grpc/generated/user_service_pb2_grpc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

from . import user_service_pb2 as user__service__pb2

GRPC_GENERATED_VERSION = "1.76.0"
GRPC_VERSION = grpc.__version__
_version_not_supported = False


try:
from grpc._utilities import first_version_is_lower

_version_not_supported = first_version_is_lower(
GRPC_VERSION, GRPC_GENERATED_VERSION
)
except ImportError:
_version_not_supported = True

if _version_not_supported:
raise RuntimeError(
f"The grpc package installed is at version {GRPC_VERSION},"
+ " but the generated code in user_service_pb2_grpc.py depends on"
+ f" grpcio>={GRPC_GENERATED_VERSION}."
+ f" Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}"
+ f" or downgrade your generated code using grpcio-tools<={GRPC_VERSION}."
)


class UserServiceStub(object):
"""Missing associated documentation comment in .proto file."""

def __init__(self, channel):
"""Constructor.

Args:
channel: A grpc.Channel.
"""
self.GetUserById = channel.unary_unary(
"/userservice.UserService/GetUserById",
request_serializer=user__service__pb2.UserRequest.SerializeToString,
response_deserializer=user__service__pb2.UserResponse.FromString,
_registered_method=True,
)


class UserServiceServicer(object):
"""Missing associated documentation comment in .proto file."""

def GetUserById(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details("Method not implemented!")
raise NotImplementedError("Method not implemented!")


def add_UserServiceServicer_to_server(servicer, server):
rpc_method_handlers = {
"GetUserById": grpc.unary_unary_rpc_method_handler(
servicer.GetUserById,
request_deserializer=user__service__pb2.UserRequest.FromString,
response_serializer=user__service__pb2.UserResponse.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
"userservice.UserService", rpc_method_handlers
)
server.add_generic_rpc_handlers((generic_handler,))
server.add_registered_method_handlers(
"userservice.UserService", rpc_method_handlers
)


# This class is part of an EXPERIMENTAL API.
class UserService(object):
"""Missing associated documentation comment in .proto file."""

@staticmethod
def GetUserById(
request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None,
):
return grpc.experimental.unary_unary(
request,
target,
"/userservice.UserService/GetUserById",
user__service__pb2.UserRequest.SerializeToString,
user__service__pb2.UserResponse.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True,
)
18 changes: 18 additions & 0 deletions realtimemap/transport/grpc/protos/user_service.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
syntax = "proto3";

package userservice;

service UserService{
rpc GetUserById(UserRequest) returns (UserResponse) {}
}

message UserRequest {
int64 id = 1;
}

message UserResponse {
int64 id = 1;
string username = 2;
string email = 3;
bool is_superuser = 4;
}
13 changes: 13 additions & 0 deletions realtimemap/transport/grpc/server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import grpc.aio

from core.config import conf
from transport.grpc.generated import user_service_pb2_grpc
from transport.grpc.service.user_service import UserService


async def create_grpc_server():
server = grpc.aio.server()
user_service_pb2_grpc.add_UserServiceServicer_to_server(UserService(), server)
server.add_insecure_port(conf.grpc.port)
await server.start()
await server.wait_for_termination()
Loading
Loading