Skip to content

Commit 195f4c4

Browse files
committed
add new subscriber to notify about new comment
1 parent e33eb5f commit 195f4c4

5 files changed

Lines changed: 57 additions & 11 deletions

File tree

src/app.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
from src.handlers import basics_router, complaint_router, other_router, github_binding_router, statistics_router
99
from src.bootstrap import get_bootstrap
1010
from src.infrastructure.faststream.events import COMPLAINT_ANSWER_TOPIC, COMPLAINT_ANSWER_CONSUMER_GROUP, \
11-
ComplaintAnswerEventSchema
11+
ComplaintAnswerEventSchema, CommentCreatedEventSchema, COMMENT_CREATED_TOPIC, COMMENT_CREATED_CONSUMER_GROUP
12+
from src.services.student import StudentService, APIStudentService
1213
from src.settings import app_settings
1314

1415
bot = Bot(token=app_settings.BOT_TOKEN)
@@ -18,13 +19,22 @@
1819

1920

2021
TelegramBot = Annotated[Bot, Depends(lambda: bot)]
22+
StudentService = Annotated[StudentService, Depends(lambda: APIStudentService())]
2123

2224
@broker.subscriber(COMPLAINT_ANSWER_TOPIC, group_id=COMPLAINT_ANSWER_CONSUMER_GROUP, auto_commit=False)
2325
async def handle_new_submission(data: ComplaintAnswerEventSchema, telegram_bot: TelegramBot) -> None:
2426
text = f"*Ответ преподавателя:*\n\n{data.answer}"
2527
await telegram_bot.send_message(data.student_telegram_user_id, text, parse_mode='Markdown')
2628

2729

30+
@broker.subscriber(COMMENT_CREATED_TOPIC, group_id=COMMENT_CREATED_CONSUMER_GROUP, auto_commit=False)
31+
async def handle_comment_created(data: CommentCreatedEventSchema, telegram_bot: TelegramBot, student_service: StudentService) -> None:
32+
student = await student_service.get_student_by_github_username(data.username)
33+
text = f"*Комментарий к работе:*"
34+
text += f"\n\nПожалуйста проверьте комментарий к вашей работе: {data.pull_request_link}"
35+
await telegram_bot.send_message(student.telegram_user_id, text, parse_mode='Markdown')
36+
37+
2838
async def stop_bot():
2939
await broker.close()
3040

src/infrastructure/faststream/events.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,12 @@
77
class ComplaintAnswerEventSchema(BaseModel):
88
student_telegram_user_id: int = Field(examples=[524234231])
99
answer: str = Field(examples=["Попробуйте перезагрузить компьютер"])
10+
11+
12+
COMMENT_CREATED_TOPIC = "comment_created"
13+
COMMENT_CREATED_CONSUMER_GROUP = "comment_created_group"
14+
15+
16+
class CommentCreatedEventSchema(BaseModel):
17+
username: str = Field(examples=["octocat"])
18+
pull_request_link: str = Field(examples=["/pull_request/1"])

src/services/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from src.services.student import StudentService, TestStudentService
1+
from src.services.student import StudentService, TestStudentService, APIStudentService
22
from src.services.task import TaskService, TestTaskService
33
from src.services.github import GitHubService, HTTPGitHubService
44
from src.services.stats import StatisticsService, TestStatisticsService

src/services/exceptions.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@ def message(self) -> str:
88

99

1010
class StudentAlreadyExistsError(ServiceError):
11-
def __init__(self, telegram_user_id: int) -> None:
12-
self.telegram_user_id = telegram_user_id
11+
def __init__(self, telegram_user: int | str) -> None:
12+
self.telegram_user = telegram_user
1313

1414
@property
1515
def message(self) -> str:
16-
return f"Пользователь с id={self.telegram_user_id} уже существует"
16+
return f"Пользователь с id={self.telegram_user} уже существует"
1717

1818

1919
class StudentNotFoundError(ServiceError):
20-
def __init__(self, telegram_user_id: int) -> None:
21-
self.telegram_user_id = telegram_user_id
20+
def __init__(self, telegram_user: int | str) -> None:
21+
self.telegram_user = telegram_user
2222

2323
@property
2424
def message(self) -> str:
25-
return f"Пользователь с id={self.telegram_user_id} уже существует"
25+
return f"Пользователь с id={self.telegram_user} не существует"

src/services/student.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ async def create_student(self, telegram_user_id: int, telegram_username: str) ->
2727
async def get_student_by_telegram_user_id(self, telegram_user_id: int) -> StudentDTO:
2828
raise NotImplementedError
2929

30+
@abstractmethod
31+
async def get_student_by_github_username(self, github_username: str) -> StudentDTO:
32+
raise NotImplementedError
33+
3034
@abstractmethod
3135
async def set_github_username(self, telegram_user_id: int, github_username: str) -> None:
3236
raise NotImplementedError
@@ -73,21 +77,44 @@ async def create_student(self, telegram_user_id: int, telegram_username: str) ->
7377
print(content)
7478

7579
async def get_student_by_telegram_user_id(self, telegram_user_id: int) -> StudentDTO:
76-
get_student_endpoint = f"{self._endpoint}/api/students/{telegram_user_id}"
80+
get_student_endpoint = f"{self._endpoint}/api/students/telegram/{telegram_user_id}"
7781
async with aiohttp.ClientSession() as session:
7882
async with session.get(get_student_endpoint) as res:
7983
if res.status == 404:
8084
raise StudentNotFoundError(telegram_user_id)
8185
content = await res.text(encoding="utf-8")
82-
print(content)
86+
data = json.loads(content)
87+
return StudentDTO(
88+
telegram_user_id=data["telegramUserId"],
89+
telegram_username=data["telegramUsername"],
90+
github_username=data["githubUsername"],
91+
joined_at=data["registeredAt"],
92+
has_enabled_notifications=True
93+
)
94+
95+
async def get_student_by_github_username(self, github_username: str) -> StudentDTO:
96+
get_student_endpoint = f"{self._endpoint}/api/students/github/{github_username}"
97+
async with aiohttp.ClientSession() as session:
98+
async with session.get(get_student_endpoint) as res:
99+
if res.status == 404:
100+
raise StudentNotFoundError(github_username)
101+
content = await res.text(encoding="utf-8")
102+
data = json.loads(content)
103+
return StudentDTO(
104+
telegram_user_id=data["telegramUserId"],
105+
telegram_username=data["telegramUsername"],
106+
github_username=data["githubUsername"],
107+
joined_at=data["registeredAt"],
108+
has_enabled_notifications=True
109+
)
83110

84111
async def set_github_username(self, telegram_user_id: int, github_username: str) -> None:
85112
set_student_github_endpoint = f"{self._endpoint}/api/students/{telegram_user_id}"
86113
async with aiohttp.ClientSession() as session:
87114
data = {
88115
"githubUsername": github_username
89116
}
90-
async with session.post(set_student_github_endpoint, json=data) as res:
117+
async with session.put(set_student_github_endpoint, json=data) as res:
91118
if res.status == 404:
92119
raise StudentNotFoundError(telegram_user_id)
93120
content = await res.text(encoding="utf-8")

0 commit comments

Comments
 (0)