Skip to content

Commit

Permalink
-Fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
onstabb committed Dec 11, 2023
1 parent d3ceca0 commit 12d7155
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 17 deletions.
4 changes: 2 additions & 2 deletions src/contacts/routers.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,14 @@ def send_message(
current_user: CurrentActiveCompletedUser,
target_user: TargetActiveCompletedUser,
):
contact = service.get_contact_by_users_pair(current_user.id, target_user.id)
contact = service.get_contact_by_users_pair(current_user, target_user)
if not contact or not contact.established:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Contact must be established")

if service.get_messages_count_from_sender(contact, current_user) >= config.MAX_SENT_MESSAGES:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Limit of the messages has been exceeded")

message = service.create_message(contact, sender=current_user, message_in=message_in)
message_out = MessageOut.model_validate(message)
message_out = MessageOut.model_validate(message, from_attributes=True)
notification_manager.put_notification(message_out, recipient_id=target_user.id, notification_type=NotificationType.MESSAGE)
return message_out
15 changes: 9 additions & 6 deletions src/contacts/schemas.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from datetime import datetime
from functools import cached_property

from pydantic import BaseModel, Field, constr, computed_field
from pydantic import AliasChoices, BaseModel, Field, constr, computed_field

from contacts import config
from contacts.enums import ContactState
from models import PydanticObjectId
from models import PydanticObjectId, DateTimeFromObjectId
from users.schemas import UserPublicOut


Expand All @@ -22,13 +22,11 @@ class MessageOut(MessageBase):
date: datetime = Field(validation_alias="created_at")


class ContactOut(BaseModel):
class ContactBaseOut(BaseModel):
initiator: UserPublicOut | PydanticObjectId = Field(exclude=True)
respondent: UserPublicOut | PydanticObjectId = Field(exclude=True)
opposite_user: UserPublicOut | None = Field(exclude=True, default=None)

status: ContactState | None
messages: list[MessageOut]
created_at: DateTimeFromObjectId = Field(validation_alias=AliasChoices("_id", "id"), )

@computed_field
@cached_property
Expand All @@ -44,6 +42,11 @@ def user(self) -> UserPublicOut | None:
return None


class ContactOut(ContactBaseOut):
status: ContactState | None
messages: list[MessageOut]


class ContactStateIn(BaseModel):
action: ContactState

Expand Down
6 changes: 4 additions & 2 deletions src/contacts/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,13 @@ def update_contact_status(contact_state_data: ContactStateIn, user: User, contac


def create_message(contact: Contact, sender: User, message_in: MessageIn) -> Message:
return contact.messages.create(sender=sender, text=message_in.text)
message = contact.messages.create(sender=sender, text=message_in.text)
contact.save()
return message


def get_messages_count_from_sender(contact: Contact, sender: User) -> int:
if sender not in (contact.initiator, contact.respondent):
if sender.id not in (contact.initiator, contact.respondent):
raise ValueError(f"Contact does not contain user with {sender.id}")

return len(contact.messages.filter(sender=sender))
Expand Down
7 changes: 3 additions & 4 deletions src/likes/routers.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
from fastapi import APIRouter

from contacts.schemas import ContactBaseOut
from likes import service
from users.dependencies import CurrentActiveCompletedUser
from users.schemas import UserPublicOut


router = APIRouter()


@router.get("", response_model=list[UserPublicOut])
@router.get("", response_model=list[ContactBaseOut])
def get_who_liked(current_user: CurrentActiveCompletedUser):
return [contact.initiator for contact in service.get_likes_for_user(current_user)]

return service.get_likes_for_user(current_user)
7 changes: 6 additions & 1 deletion src/likes/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,9 @@ def get_likes_for_user(user: User) -> list[Contact]:
result = Contact.objects(
respondent=user, initiator_state=ContactState.ESTABLISHED, status=None
).exclude("respondent")
return list(result)

def set_respondent_id(contact: Contact) -> Contact:
contact.respondent = user.id
return contact

return list(contact for contact in map(set_respondent_id, result))
4 changes: 2 additions & 2 deletions src/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
DoesNotExist,
)
from mongoengine.base import BaseField, LazyReference
from pydantic import GetCoreSchemaHandler, GetJsonSchemaHandler, PlainSerializer
from pydantic import GetCoreSchemaHandler, GetJsonSchemaHandler, PlainSerializer, BeforeValidator
from pydantic.json_schema import JsonSchemaValue
from pydantic_core import core_schema

Expand Down Expand Up @@ -82,4 +82,4 @@ def created_at(self) -> datetime:


SerializeDocToId = PlainSerializer(lambda doc: doc.id, return_type=str, when_used="json")

DateTimeFromObjectId = typing.Annotated[datetime, BeforeValidator(lambda value: value.generation_time)]

0 comments on commit 12d7155

Please sign in to comment.