Skip to content

Commit 0c779b8

Browse files
committed
Refactoring
- Improve stability and performance - Fix bugs - Adjust dark and light themes to be more consistent - Feature enhancements
1 parent 880a8a5 commit 0c779b8

737 files changed

Lines changed: 41470 additions & 28799 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 86 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,99 @@
1-
from sqlalchemy.orm import Session
2-
from database.models.alerts_model import Alert
3-
from database.schemas.alerts_schema import AlertCreateSchema, AlertUpdateSchema
4-
from datetime import datetime
1+
from datetime import datetime, timezone
52

6-
def get_all_alerts(db: Session):
7-
return db.query(Alert).all()
3+
from sqlalchemy import select, update, delete, func
4+
from sqlalchemy.ext.asyncio import AsyncSession
85

9-
def get_alert_by_id(db: Session, alert_id: int):
10-
return db.query(Alert).filter(Alert.id == alert_id).first()
6+
from ..models.alerts_models import Alert
117

12-
def create_alert(db: Session, alert_data: AlertCreateSchema):
8+
9+
async def get_all_alerts(db: AsyncSession, skip: int = 0, limit: int = 100) -> list[Alert]:
10+
"""Retrieve all alerts from the database with pagination"""
11+
result = await db.execute(
12+
select(Alert).order_by(Alert.timestamp.desc()).offset(skip).limit(limit)
13+
)
14+
return list(result.scalars().all())
15+
16+
17+
async def get_alert_by_id(db: AsyncSession, alert_id: int) -> Alert | None:
18+
"""Retrieve a specific alert by ID"""
19+
result = await db.execute(select(Alert).where(Alert.id == alert_id))
20+
return result.scalar_one_or_none()
21+
22+
23+
async def get_alerts_by_module(db: AsyncSession, module: str, skip: int = 0, limit: int = 100) -> list[Alert]:
24+
"""Retrieve alerts for a specific module with pagination"""
25+
result = await db.execute(
26+
select(Alert)
27+
.where(Alert.module == module)
28+
.order_by(Alert.timestamp.desc())
29+
.offset(skip)
30+
.limit(limit)
31+
)
32+
return list(result.scalars().all())
33+
34+
35+
async def create_alert(db: AsyncSession, module: str, title: str, message: str) -> Alert:
36+
"""Create a new alert"""
1337
new_alert = Alert(
14-
module=alert_data.module,
15-
title=alert_data.title,
16-
message=alert_data.message,
38+
module=module,
39+
title=title,
40+
message=message,
1741
read=False
1842
)
1943
db.add(new_alert)
20-
db.commit()
21-
db.refresh(new_alert)
44+
await db.flush()
2245
return new_alert
2346

24-
def mark_alert_as_read(db: Session, alert_id: int):
25-
alert = db.query(Alert).filter(Alert.id == alert_id).first()
26-
if alert:
27-
alert.read = True
28-
alert.timestamp_read = datetime.utcnow()
29-
db.commit()
30-
db.refresh(alert)
47+
48+
async def update_alert_read_status(db: AsyncSession, alert_id: int, read: bool) -> Alert | None:
49+
"""Update the read status of an alert"""
50+
alert = await get_alert_by_id(db, alert_id)
51+
if not alert:
52+
return None
53+
54+
alert.read = read
55+
if read and not alert.timestamp_read:
56+
alert.timestamp_read = datetime.now(timezone.utc)
57+
elif not read:
58+
alert.timestamp_read = None
59+
60+
await db.flush()
3161
return alert
3262

33-
def mark_all_alerts_as_read(db: Session):
34-
alerts = db.query(Alert).filter(Alert.read == False).all()
35-
for alert in alerts:
36-
alert.read = True
37-
alert.timestamp_read = datetime.utcnow()
38-
db.commit()
39-
return alerts
40-
41-
def delete_alert(db: Session, alert_id: int):
42-
alert = db.query(Alert).filter(Alert.id == alert_id).first()
43-
db.delete(alert)
44-
db.commit()
63+
64+
async def bulk_mark_all_alerts_read(db: AsyncSession) -> int:
65+
"""Mark all unread alerts as read in a single query"""
66+
result = await db.execute(
67+
update(Alert)
68+
.where(Alert.read.is_(False))
69+
.values(read=True, timestamp_read=datetime.now(timezone.utc))
70+
.execution_options(synchronize_session=False)
71+
)
72+
await db.flush()
73+
return result.rowcount
74+
75+
76+
async def delete_alert_by_id(db: AsyncSession, alert_id: int) -> Alert | None:
77+
"""Delete a specific alert"""
78+
alert = await get_alert_by_id(db, alert_id)
79+
if not alert:
80+
return None
81+
82+
await db.delete(alert)
83+
await db.flush()
4584
return alert
4685

47-
def delete_all_alerts(db: Session):
48-
alerts = db.query(Alert).all()
49-
for alert in alerts:
50-
db.delete(alert)
51-
db.commit()
52-
return alerts
86+
87+
async def bulk_delete_all_alerts(db: AsyncSession) -> int:
88+
"""Delete all alerts in a single query"""
89+
result = await db.execute(delete(Alert).execution_options(synchronize_session=False))
90+
await db.flush()
91+
return result.rowcount
92+
93+
94+
async def count_unread_alerts(db: AsyncSession) -> int:
95+
"""Count the number of unread alerts"""
96+
result = await db.execute(
97+
select(func.count()).select_from(Alert).where(Alert.read.is_(False))
98+
)
99+
return result.scalar_one()
Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,20 @@
1-
from sqlalchemy import Column, Integer, String, Boolean, DateTime
1+
import datetime
2+
3+
from sqlalchemy import String, DateTime
4+
from sqlalchemy.orm import Mapped, mapped_column
25
from sqlalchemy.sql import func
6+
37
from app.core.database import Base
48

9+
510
class Alert(Base):
11+
"""Alert model for storing system notifications"""
612
__tablename__ = 'alerts'
7-
8-
id = Column(Integer, primary_key=True)
9-
module = Column(String, nullable=False)
10-
title = Column(String, nullable=False)
11-
message = Column(String, nullable=False)
12-
read = Column(Boolean, default=False)
13-
timestamp = Column(DateTime(timezone=True), server_default=func.now())
14-
timestamp_read = Column(DateTime(timezone=True), nullable=True)
1513

16-
def to_dict(self):
17-
return {
18-
'id': self.id,
19-
'module': self.module,
20-
'title': self.title,
21-
'message': self.message,
22-
'read': self.read,
23-
'timestamp': self.timestamp,
24-
'timestamp_read': self.timestamp_read,
25-
}
14+
id: Mapped[int] = mapped_column(primary_key=True)
15+
module: Mapped[str] = mapped_column(String(100), index=True)
16+
title: Mapped[str] = mapped_column(String(200))
17+
message: Mapped[str] = mapped_column(String(1000))
18+
read: Mapped[bool] = mapped_column(default=False, index=True)
19+
timestamp: Mapped[datetime.datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
20+
timestamp_read: Mapped[datetime.datetime | None] = mapped_column(DateTime(timezone=True))

0 commit comments

Comments
 (0)