feat: add Playwright configuration and initial e2e test for authentication
- Created Playwright configuration file to set up testing environment. - Added a new e2e test for user authentication in login.spec.ts. - Updated tsconfig.node.json to include playwright.config.ts. - Enhanced vite.config.ts to include API proxying for backend integration. - Added a placeholder for last run test results in .last-run.json.
This commit is contained in:
@@ -1,11 +1,15 @@
|
||||
"""Repository abstractions for database access."""
|
||||
|
||||
from backend.app.repositories.stations import StationRepository
|
||||
from backend.app.repositories.train_schedules import TrainScheduleRepository
|
||||
from backend.app.repositories.tracks import TrackRepository
|
||||
from backend.app.repositories.trains import TrainRepository
|
||||
from backend.app.repositories.users import UserRepository
|
||||
|
||||
__all__ = [
|
||||
"StationRepository",
|
||||
"TrainScheduleRepository",
|
||||
"TrackRepository",
|
||||
"TrainRepository",
|
||||
"UserRepository",
|
||||
]
|
||||
|
||||
45
backend/app/repositories/train_schedules.py
Normal file
45
backend/app/repositories/train_schedules.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import sqlalchemy as sa
|
||||
from uuid import UUID
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from backend.app.db.models import TrainSchedule
|
||||
from backend.app.models import TrainScheduleCreate
|
||||
from backend.app.repositories.base import BaseRepository
|
||||
|
||||
|
||||
class TrainScheduleRepository(BaseRepository[TrainSchedule]):
|
||||
"""Persistence operations for train timetables."""
|
||||
|
||||
model = TrainSchedule
|
||||
|
||||
def __init__(self, session: Session) -> None:
|
||||
super().__init__(session)
|
||||
|
||||
@staticmethod
|
||||
def _ensure_uuid(value: UUID | str) -> UUID:
|
||||
if isinstance(value, UUID):
|
||||
return value
|
||||
return UUID(str(value))
|
||||
|
||||
def list_for_train(self, train_id: UUID | str) -> list[TrainSchedule]:
|
||||
identifier = self._ensure_uuid(train_id)
|
||||
statement = (
|
||||
sa.select(self.model)
|
||||
.where(self.model.train_id == identifier)
|
||||
.order_by(self.model.sequence_index.asc())
|
||||
)
|
||||
return list(self.session.scalars(statement))
|
||||
|
||||
def create(self, data: TrainScheduleCreate) -> TrainSchedule:
|
||||
schedule = TrainSchedule(
|
||||
train_id=self._ensure_uuid(data.train_id),
|
||||
station_id=self._ensure_uuid(data.station_id),
|
||||
sequence_index=data.sequence_index,
|
||||
scheduled_arrival=data.scheduled_arrival,
|
||||
scheduled_departure=data.scheduled_departure,
|
||||
dwell_seconds=data.dwell_seconds,
|
||||
)
|
||||
self.session.add(schedule)
|
||||
return schedule
|
||||
37
backend/app/repositories/users.py
Normal file
37
backend/app/repositories/users.py
Normal file
@@ -0,0 +1,37 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from backend.app.db.models import User
|
||||
from backend.app.models import UserCreate
|
||||
from backend.app.repositories.base import BaseRepository
|
||||
|
||||
|
||||
class UserRepository(BaseRepository[User]):
|
||||
"""Data access helpers for user accounts."""
|
||||
|
||||
model = User
|
||||
|
||||
def __init__(self, session: Session) -> None:
|
||||
super().__init__(session)
|
||||
|
||||
def get_by_username(self, username: str) -> User | None:
|
||||
statement = sa.select(self.model).where(sa.func.lower(self.model.username) == username.lower())
|
||||
return self.session.scalar(statement)
|
||||
|
||||
def list_recent(self, limit: int = 50) -> list[User]:
|
||||
statement = sa.select(self.model).order_by(self.model.created_at.desc()).limit(limit)
|
||||
return list(self.session.scalars(statement))
|
||||
|
||||
def create(self, data: UserCreate) -> User:
|
||||
user = User(
|
||||
username=data.username,
|
||||
email=data.email,
|
||||
full_name=data.full_name,
|
||||
password_hash=data.password_hash,
|
||||
role=data.role,
|
||||
preferences=data.preferences,
|
||||
)
|
||||
self.session.add(user)
|
||||
return user
|
||||
Reference in New Issue
Block a user