Skip to content

Commit

Permalink
feat: users count in same school (#21)
Browse files Browse the repository at this point in the history
* feat: users count in same school

* fix: function name refactor

* style: fix ci

* refactor: clearer function name

* test: read users from school info
  • Loading branch information
star0202 committed May 19, 2023
1 parent 9d4ea94 commit f28b007
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 42 deletions.
35 changes: 31 additions & 4 deletions crenata/database/repository/user.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
from dataclasses import asdict
from typing import Optional

from sqlalchemy import select
from sqlalchemy.ext.asyncio.session import AsyncSession
from sqlalchemy.orm import selectinload
from sqlalchemy.orm import joinedload, selectinload

from crenata.abc.domain import AbstractDomain
from crenata.database import Database
from crenata.database.schema import UserSchema
from crenata.database.schema import SchoolInfoSchema, UserSchema


class UserRepository:
Expand Down Expand Up @@ -72,3 +71,31 @@ async def delete(self, user: UserSchema) -> None:
async with session.begin():
await session.delete(user)
return None

async def read_all_user_from_school_info(
self, school_info: SchoolInfoSchema
) -> list[UserSchema]:
"""
같은 학교에 다니는 유저들를 읽어옵니다.
"""
async with AsyncSession(
self.database.engine, expire_on_commit=False
) as session:
async with session.begin():
stmt = (
select(UserSchema)
.join(UserSchema.school_info)
.where(
SchoolInfoSchema.ATPT_OFCDC_SC_CODE
== school_info.ATPT_OFCDC_SC_CODE,
SchoolInfoSchema.SD_SCHUL_CODE == school_info.SD_SCHUL_CODE,
)
)

stmt = stmt.options(
selectinload(UserSchema.preferences),
joinedload(UserSchema.school_info),
)

result = await session.execute(stmt)
return result.scalars().all()
25 changes: 13 additions & 12 deletions crenata/discord/commands/__init__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
from crenata.discord.commands.exit import exit
from crenata.discord.commands.preferences import preferences
from crenata.discord.commands.preferences.edit import preferences_edit as _
from crenata.discord.commands.profile import profile
from crenata.discord.commands.register import register
from crenata.discord.commands.school import school
from crenata.discord.commands.school.meal import meal as _
from crenata.discord.commands.school.search import search as _
from crenata.discord.commands.school.set import school_set as _
from crenata.discord.commands.school.timetable import time_table as _

commands = [register, profile, exit, school, preferences]
from crenata.discord.commands.exit import exit
from crenata.discord.commands.preferences import preferences
from crenata.discord.commands.preferences.edit import preferences_edit as _
from crenata.discord.commands.profile import profile
from crenata.discord.commands.register import register
from crenata.discord.commands.school import school
from crenata.discord.commands.school.meal import meal as _
from crenata.discord.commands.school.search import search as _
from crenata.discord.commands.school.set import school_set as _
from crenata.discord.commands.school.timetable import time_table as _
from crenata.discord.commands.school.users import users as _

commands = [register, profile, exit, school, preferences]
24 changes: 24 additions & 0 deletions crenata/discord/commands/school/users.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from crenata.discord import CrenataInteraction
from crenata.discord.commands.school import school
from crenata.discord.embed import school_users_embed_maker
from crenata.exception import NeedSchoolRegister


@school.command(name="유저", description="나와 학교가 같은 유저 수를 가져옵니다.")
async def users(interaction: CrenataInteraction) -> None:
user = await interaction.client.ctx.query.user.read(interaction.user.id)

if not user or not user.school_info:
raise NeedSchoolRegister

users = await interaction.client.ctx.query.user.read_all_user_from_school_info(
user.school_info
)

embed = school_users_embed_maker(
user.school_info.school_name, len(users), user.preferences.private
)

await interaction.response.send_message(
embed=embed, ephemeral=user.preferences.ephemeral
)
15 changes: 15 additions & 0 deletions crenata/discord/embed.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,18 @@ def parse_homepage_url(url: str) -> Optional[str]:
return f"http://{url}"
else:
return None


def school_users_embed_maker(school_name: str, users: int, private: bool) -> Embed:
"""
같은 학교의 사용자 수를 Embed를 만들어주는 함수입니다.
"""
if private:
school_name = "비공개"
embed = Embed(
title=f'"{school_name}" 의 유저 수',
description=f"👥 {users} 명",
color=5681003,
)
embed.set_author(name="🔍 학교 사용자 검색 결과")
return embed
61 changes: 35 additions & 26 deletions tests/test_user.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,35 @@
import pytest

from crenata.database.query import Query
from crenata.database.schema import UserSchema


@pytest.mark.asyncio
async def test_user_read(query: Query):
user = await query.user.read(1)
assert user


@pytest.mark.asyncio
async def test_user_update(query: Query, new_user: UserSchema):
new_user.preferences.private = False
await query.user.update(new_user)
user = await query.user.read(1)
assert user
assert user.preferences.private is False


@pytest.mark.asyncio
async def test_user_delete(query: Query, new_user: UserSchema):
await query.user.delete(new_user)
user = await query.user.read(1)
assert user is None
import pytest

from crenata.database.query import Query
from crenata.database.schema import SchoolInfoSchema, UserSchema


@pytest.mark.asyncio
async def test_user_read(query: Query):
user = await query.user.read(1)
assert user


@pytest.mark.asyncio
async def test_user_update(query: Query, new_user: UserSchema):
new_user.preferences.private = False
await query.user.update(new_user)
user = await query.user.read(1)
assert user
assert user.preferences.private is False


@pytest.mark.asyncio
async def test_user_delete(query: Query, new_user: UserSchema):
await query.user.delete(new_user)
user = await query.user.read(1)
assert user is None


@pytest.mark.asyncio
async def test_user_read_from_school_info(
query: Query,
new_school_info: SchoolInfoSchema,
):
user = await query.user.read_all_user_from_school_info(new_school_info)
assert user

0 comments on commit f28b007

Please sign in to comment.