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