refactor: simplify code - extract constants, reduce complexity
This commit is contained in:
@@ -6,7 +6,7 @@ from fastapi import Depends
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from core.auth.models import CurrentUser
|
||||
from core.db.session import get_db
|
||||
from core.db import get_db
|
||||
from v1.inbox_messages.repository import SQLAlchemyInboxMessageRepository
|
||||
from v1.inbox_messages.service import InboxMessageService
|
||||
from v1.users.dependencies import get_current_user
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from enum import Enum
|
||||
from typing import TYPE_CHECKING
|
||||
from uuid import UUID
|
||||
|
||||
@@ -74,13 +73,12 @@ class InboxMessageService(BaseService):
|
||||
message = await self._repository.get_by_id(message_id, user_id)
|
||||
if message is None:
|
||||
raise HTTPException(status_code=404, detail="Inbox message not found")
|
||||
if self._status_value(message.status) != InboxMessageStatus.PENDING.value:
|
||||
if message.status.value != InboxMessageStatus.PENDING.value:
|
||||
raise HTTPException(
|
||||
status_code=400, detail="Inbox message already handled"
|
||||
)
|
||||
if (
|
||||
self._type_value(message.message_type)
|
||||
!= InboxMessageType.CALENDAR.value
|
||||
message.message_type.value != InboxMessageType.CALENDAR.value
|
||||
or message.schedule_item_id is None
|
||||
):
|
||||
raise HTTPException(
|
||||
@@ -139,7 +137,7 @@ class InboxMessageService(BaseService):
|
||||
message = await self._repository.get_by_id(message_id, user_id)
|
||||
if message is None:
|
||||
raise HTTPException(status_code=404, detail="Inbox message not found")
|
||||
if self._status_value(message.status) != InboxMessageStatus.PENDING.value:
|
||||
if message.status.value != InboxMessageStatus.PENDING.value:
|
||||
raise HTTPException(
|
||||
status_code=400, detail="Inbox message already handled"
|
||||
)
|
||||
@@ -170,11 +168,11 @@ class InboxMessageService(BaseService):
|
||||
id=message.id,
|
||||
recipient_id=message.recipient_id,
|
||||
sender_id=message.sender_id,
|
||||
message_type=InboxMessageType(self._type_value(message.message_type)),
|
||||
message_type=InboxMessageType(message.message_type),
|
||||
schedule_item_id=message.schedule_item_id,
|
||||
content=message.content,
|
||||
is_read=bool(message.is_read),
|
||||
status=InboxMessageStatus(self._status_value(message.status)),
|
||||
status=InboxMessageStatus(message.status),
|
||||
created_at=message.created_at,
|
||||
)
|
||||
|
||||
@@ -186,13 +184,3 @@ class InboxMessageService(BaseService):
|
||||
return int(data.get("permission", 0))
|
||||
except (json.JSONDecodeError, ValueError, TypeError):
|
||||
return 0
|
||||
|
||||
def _status_value(self, status: object) -> str:
|
||||
if isinstance(status, Enum):
|
||||
return str(status.value)
|
||||
return str(status)
|
||||
|
||||
def _type_value(self, message_type: object) -> str:
|
||||
if isinstance(message_type, Enum):
|
||||
return str(message_type.value)
|
||||
return str(message_type)
|
||||
|
||||
@@ -38,17 +38,7 @@ async def list_schedule_items(
|
||||
) -> list[ScheduleItemListItem]:
|
||||
request = ScheduleItemListRequest(start_at=start_at, end_at=end_at)
|
||||
items = await service.list_by_date_range(request)
|
||||
return [
|
||||
ScheduleItemListItem(
|
||||
id=item.id,
|
||||
title=item.title,
|
||||
start_at=item.start_at,
|
||||
end_at=item.end_at,
|
||||
timezone=item.timezone,
|
||||
status=item.status,
|
||||
)
|
||||
for item in items
|
||||
]
|
||||
return [ScheduleItemListItem.model_validate(item) for item in items]
|
||||
|
||||
|
||||
@router.get("/{item_id}", response_model=ScheduleItemResponse)
|
||||
|
||||
@@ -98,6 +98,12 @@ class ScheduleItemListRequest(BaseModel):
|
||||
end_at: datetime
|
||||
|
||||
|
||||
# Permission bit constants (matching PermissionBits in inbox_messages/schemas.py)
|
||||
_PERMISSION_VIEW = 1 # 001
|
||||
_PERMISSION_INVITE = 2 # 010
|
||||
_PERMISSION_EDIT = 4 # 100
|
||||
|
||||
|
||||
class ScheduleItemShareRequest(BaseModel):
|
||||
model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid")
|
||||
|
||||
@@ -109,11 +115,11 @@ class ScheduleItemShareRequest(BaseModel):
|
||||
def _permission_value(self) -> int:
|
||||
value = 0
|
||||
if self.permission_view:
|
||||
value |= 1
|
||||
value |= _PERMISSION_VIEW
|
||||
if self.permission_edit:
|
||||
value |= 4
|
||||
value |= _PERMISSION_EDIT
|
||||
if self.permission_invite:
|
||||
value |= 2
|
||||
value |= _PERMISSION_INVITE
|
||||
return value
|
||||
|
||||
|
||||
|
||||
@@ -112,26 +112,16 @@ class ScheduleItemService(BaseService):
|
||||
if existing is None:
|
||||
raise HTTPException(status_code=404, detail="Schedule item not found")
|
||||
|
||||
update_data: dict = {}
|
||||
if request.title is not None:
|
||||
update_data["title"] = request.title
|
||||
if request.description is not None:
|
||||
update_data["description"] = request.description
|
||||
if request.start_at is not None:
|
||||
update_data["start_at"] = request.start_at
|
||||
if request.end_at is not None:
|
||||
update_data["end_at"] = request.end_at
|
||||
if request.timezone is not None:
|
||||
update_data["timezone"] = request.timezone
|
||||
if request.status is not None:
|
||||
update_data["status"] = request.status
|
||||
if request.metadata is not None:
|
||||
update_data["metadata"] = request.metadata.model_dump()
|
||||
# Build update dict from non-null fields
|
||||
update_data = request.model_dump(exclude_unset=True)
|
||||
|
||||
next_start = (
|
||||
request.start_at if request.start_at is not None else existing.start_at
|
||||
)
|
||||
next_end = request.end_at if request.end_at is not None else existing.end_at
|
||||
# Handle metadata separately (model_dump returns dict)
|
||||
if "metadata" in update_data and update_data["metadata"] is not None:
|
||||
update_data["metadata"] = update_data["metadata"].model_dump()
|
||||
|
||||
# Validate time range
|
||||
next_start = update_data.get("start_at", existing.start_at)
|
||||
next_end = update_data.get("end_at", existing.end_at)
|
||||
if next_end is not None and next_end <= next_start:
|
||||
raise HTTPException(
|
||||
status_code=400, detail="end_at must be after start_at"
|
||||
|
||||
Reference in New Issue
Block a user