feat: add archived column to notifications and implement archiving functionality

- Introduced an archived boolean column in the notifications table to allow users to archive inbox items without deletion.
- Updated Notification model to include the archived field with default value.
- Added ArchiveRequest and ArchiveResponse models for handling archive/unarchive operations.
- Implemented API endpoint to archive or unarchive notifications, ensuring real-time updates with Electric SQL.
- Enhanced InboxSidebar to filter and display archived notifications appropriately.
This commit is contained in:
Anish Sarkar 2026-01-21 20:34:58 +05:30
parent 93aa1dcf3c
commit 22b2d6e400
8 changed files with 178 additions and 39 deletions

View file

@ -30,6 +30,19 @@ class MarkAllReadResponse(BaseModel):
updated_count: int
class ArchiveRequest(BaseModel):
"""Request body for archive/unarchive operations."""
archived: bool
class ArchiveResponse(BaseModel):
"""Response for archive operations."""
success: bool
message: str
@router.patch("/{notification_id}/read", response_model=MarkReadResponse)
async def mark_notification_as_read(
notification_id: int,
@ -100,3 +113,41 @@ async def mark_all_notifications_as_read(
message=f"Marked {updated_count} notification(s) as read",
updated_count=updated_count,
)
@router.patch("/{notification_id}/archive", response_model=ArchiveResponse)
async def archive_notification(
notification_id: int,
request: ArchiveRequest,
user: User = Depends(current_active_user),
session: AsyncSession = Depends(get_async_session),
) -> ArchiveResponse:
"""
Archive or unarchive a notification.
Electric SQL will automatically sync this change to all connected clients.
"""
# Verify the notification belongs to the user
result = await session.execute(
select(Notification).where(
Notification.id == notification_id,
Notification.user_id == user.id,
)
)
notification = result.scalar_one_or_none()
if not notification:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Notification not found",
)
# Update the notification
notification.archived = request.archived
await session.commit()
action = "archived" if request.archived else "unarchived"
return ArchiveResponse(
success=True,
message=f"Notification {action}",
)