update
This commit is contained in:
@@ -0,0 +1 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
@@ -0,0 +1,60 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Repository für Employee-CRUD – einziger Ort der direkt mit der DB spricht."""
|
||||
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from ..core.models import Employee
|
||||
from ..core.schemas import EmployeeCreate, EmployeeUpdate
|
||||
|
||||
|
||||
class EmployeeRepository:
|
||||
def __init__(self, db: Session):
|
||||
self.db = db
|
||||
|
||||
def get_by_id(self, employee_id: str) -> Optional[Employee]:
|
||||
return self.db.query(Employee).filter(Employee.id == employee_id).first()
|
||||
|
||||
def get_by_email(self, email: str) -> Optional[Employee]:
|
||||
return self.db.query(Employee).filter(Employee.email == email).first()
|
||||
|
||||
def list_all(self, active_only: bool = True) -> list[Employee]:
|
||||
q = self.db.query(Employee)
|
||||
if active_only:
|
||||
q = q.filter(Employee.is_active == True)
|
||||
return q.order_by(Employee.name).all()
|
||||
|
||||
def list_by_department(self, department: str) -> list[Employee]:
|
||||
return (
|
||||
self.db.query(Employee)
|
||||
.filter(Employee.department == department, Employee.is_active == True)
|
||||
.order_by(Employee.name)
|
||||
.all()
|
||||
)
|
||||
|
||||
def create(self, data: EmployeeCreate) -> Employee:
|
||||
emp = Employee(**data.model_dump())
|
||||
self.db.add(emp)
|
||||
self.db.flush()
|
||||
return emp
|
||||
|
||||
def update(self, employee_id: str, data: EmployeeUpdate) -> Optional[Employee]:
|
||||
emp = self.get_by_id(employee_id)
|
||||
if not emp:
|
||||
return None
|
||||
for field, value in data.model_dump(exclude_unset=True).items():
|
||||
setattr(emp, field, value)
|
||||
self.db.flush()
|
||||
return emp
|
||||
|
||||
def delete(self, employee_id: str) -> bool:
|
||||
emp = self.get_by_id(employee_id)
|
||||
if not emp:
|
||||
return False
|
||||
self.db.delete(emp)
|
||||
self.db.flush()
|
||||
return True
|
||||
|
||||
def count_active(self) -> int:
|
||||
return self.db.query(Employee).filter(Employee.is_active == True).count()
|
||||
@@ -0,0 +1,53 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Service Layer für Mitarbeiterverwaltung."""
|
||||
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from ..core.models import Employee
|
||||
from ..core.schemas import EmployeeCreate, EmployeeUpdate, EmployeeRead
|
||||
from .repository import EmployeeRepository
|
||||
|
||||
|
||||
class EmployeeService:
|
||||
def __init__(self, db: Session):
|
||||
self.db = db
|
||||
self.repo = EmployeeRepository(db)
|
||||
|
||||
def create_employee(self, data: EmployeeCreate) -> Employee:
|
||||
if data.email:
|
||||
existing = self.repo.get_by_email(data.email)
|
||||
if existing:
|
||||
raise ValueError(f"E-Mail {data.email} ist bereits vergeben")
|
||||
emp = self.repo.create(data)
|
||||
self.db.commit()
|
||||
return emp
|
||||
|
||||
def update_employee(self, employee_id: str, data: EmployeeUpdate) -> Optional[Employee]:
|
||||
if data.email:
|
||||
existing = self.repo.get_by_email(data.email)
|
||||
if existing and existing.id != employee_id:
|
||||
raise ValueError(f"E-Mail {data.email} ist bereits vergeben")
|
||||
emp = self.repo.update(employee_id, data)
|
||||
if emp:
|
||||
self.db.commit()
|
||||
return emp
|
||||
|
||||
def delete_employee(self, employee_id: str) -> bool:
|
||||
ok = self.repo.delete(employee_id)
|
||||
if ok:
|
||||
self.db.commit()
|
||||
return ok
|
||||
|
||||
def deactivate_employee(self, employee_id: str) -> Optional[Employee]:
|
||||
return self.update_employee(employee_id, EmployeeUpdate(is_active=False))
|
||||
|
||||
def get_employee(self, employee_id: str) -> Optional[Employee]:
|
||||
return self.repo.get_by_id(employee_id)
|
||||
|
||||
def list_employees(self, active_only: bool = True) -> list[Employee]:
|
||||
return self.repo.list_all(active_only)
|
||||
|
||||
def list_by_department(self, department: str) -> list[Employee]:
|
||||
return self.repo.list_by_department(department)
|
||||
Reference in New Issue
Block a user