248 lines
9.2 KiB
Python
248 lines
9.2 KiB
Python
"""项目管理 SQLAlchemy Repository 实现"""
|
|
|
|
import json
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from packages.domain import Milestone, Task, TaskIssue
|
|
from packages.ports.project_management_repositories import (
|
|
MilestoneRepository,
|
|
TaskIssueRepository,
|
|
TaskRepository,
|
|
)
|
|
|
|
from .models import MilestoneModel, TaskIssueModel, TaskModel
|
|
|
|
|
|
class SQLAlchemyTaskRepository(TaskRepository):
|
|
"""任务 SQLAlchemy 仓储实现"""
|
|
|
|
def __init__(self, session: Session):
|
|
self._session = session
|
|
|
|
def create(self, task: Task) -> Task:
|
|
model = TaskModel(
|
|
id=task.id,
|
|
project_id=task.project_id,
|
|
workspace_id=task.workspace_id,
|
|
name=task.name,
|
|
description=task.description,
|
|
status=task.status.value,
|
|
priority=task.priority.value,
|
|
parent_task_id=task.parent_task_id,
|
|
assignee_user_id=task.assignee_user_id,
|
|
progress=task.progress,
|
|
planned_start_date=task.planned_start_date,
|
|
planned_end_date=task.planned_end_date,
|
|
actual_start_date=task.actual_start_date,
|
|
actual_end_date=task.actual_end_date,
|
|
tags_json=json.dumps(task.tags, ensure_ascii=False),
|
|
created_at=task.created_at,
|
|
updated_at=task.updated_at,
|
|
)
|
|
self._session.add(model)
|
|
self._session.commit()
|
|
return task
|
|
|
|
def get_by_id(self, task_id: str) -> Task | None:
|
|
model = self._session.query(TaskModel).filter(TaskModel.id == task_id).first()
|
|
if not model:
|
|
return None
|
|
return self._model_to_entity(model)
|
|
|
|
def list_by_project(self, project_id: str) -> list[Task]:
|
|
models = self._session.query(TaskModel).filter(TaskModel.project_id == project_id).all()
|
|
return [self._model_to_entity(m) for m in models]
|
|
|
|
def list_by_parent(self, parent_task_id: str) -> list[Task]:
|
|
models = self._session.query(TaskModel).filter(TaskModel.parent_task_id == parent_task_id).all()
|
|
return [self._model_to_entity(m) for m in models]
|
|
|
|
def update(self, task: Task) -> Task:
|
|
model = self._session.query(TaskModel).filter(TaskModel.id == task.id).first()
|
|
if not model:
|
|
raise ValueError(f"Task {task.id} not found")
|
|
|
|
model.name = task.name
|
|
model.description = task.description
|
|
model.status = task.status.value
|
|
model.priority = task.priority.value
|
|
model.parent_task_id = task.parent_task_id
|
|
model.assignee_user_id = task.assignee_user_id
|
|
model.progress = task.progress
|
|
model.planned_start_date = task.planned_start_date
|
|
model.planned_end_date = task.planned_end_date
|
|
model.actual_start_date = task.actual_start_date
|
|
model.actual_end_date = task.actual_end_date
|
|
model.tags_json = json.dumps(task.tags, ensure_ascii=False)
|
|
model.updated_at = task.updated_at
|
|
|
|
self._session.commit()
|
|
return task
|
|
|
|
def delete(self, task_id: str) -> None:
|
|
self._session.query(TaskModel).filter(TaskModel.id == task_id).delete()
|
|
self._session.commit()
|
|
|
|
def _model_to_entity(self, model: TaskModel) -> Task:
|
|
from packages.domain.project_management import TaskPriority, TaskStatus
|
|
|
|
return Task(
|
|
id=model.id,
|
|
project_id=model.project_id,
|
|
workspace_id=model.workspace_id,
|
|
name=model.name,
|
|
description=model.description,
|
|
status=TaskStatus(model.status),
|
|
priority=TaskPriority(model.priority),
|
|
parent_task_id=model.parent_task_id,
|
|
assignee_user_id=model.assignee_user_id,
|
|
progress=model.progress,
|
|
planned_start_date=model.planned_start_date,
|
|
planned_end_date=model.planned_end_date,
|
|
actual_start_date=model.actual_start_date,
|
|
actual_end_date=model.actual_end_date,
|
|
tags=json.loads(model.tags_json),
|
|
created_at=model.created_at,
|
|
updated_at=model.updated_at,
|
|
)
|
|
|
|
|
|
class SQLAlchemyMilestoneRepository(MilestoneRepository):
|
|
"""里程碑 SQLAlchemy 仓储实现"""
|
|
|
|
def __init__(self, session: Session):
|
|
self._session = session
|
|
|
|
def create(self, milestone: Milestone) -> Milestone:
|
|
model = MilestoneModel(
|
|
id=milestone.id,
|
|
project_id=milestone.project_id,
|
|
workspace_id=milestone.workspace_id,
|
|
name=milestone.name,
|
|
description=milestone.description,
|
|
target_date=milestone.target_date,
|
|
completed=milestone.completed,
|
|
completed_at=milestone.completed_at,
|
|
created_at=milestone.created_at,
|
|
updated_at=milestone.updated_at,
|
|
)
|
|
self._session.add(model)
|
|
self._session.commit()
|
|
return milestone
|
|
|
|
def get_by_id(self, milestone_id: str) -> Milestone | None:
|
|
model = self._session.query(MilestoneModel).filter(MilestoneModel.id == milestone_id).first()
|
|
if not model:
|
|
return None
|
|
return self._model_to_entity(model)
|
|
|
|
def list_by_project(self, project_id: str) -> list[Milestone]:
|
|
models = self._session.query(MilestoneModel).filter(MilestoneModel.project_id == project_id).all()
|
|
return [self._model_to_entity(m) for m in models]
|
|
|
|
def update(self, milestone: Milestone) -> Milestone:
|
|
model = self._session.query(MilestoneModel).filter(MilestoneModel.id == milestone.id).first()
|
|
if not model:
|
|
raise ValueError(f"Milestone {milestone.id} not found")
|
|
|
|
model.name = milestone.name
|
|
model.description = milestone.description
|
|
model.target_date = milestone.target_date
|
|
model.completed = milestone.completed
|
|
model.completed_at = milestone.completed_at
|
|
model.updated_at = milestone.updated_at
|
|
|
|
self._session.commit()
|
|
return milestone
|
|
|
|
def delete(self, milestone_id: str) -> None:
|
|
self._session.query(MilestoneModel).filter(MilestoneModel.id == milestone_id).delete()
|
|
self._session.commit()
|
|
|
|
def _model_to_entity(self, model: MilestoneModel) -> Milestone:
|
|
return Milestone(
|
|
id=model.id,
|
|
project_id=model.project_id,
|
|
workspace_id=model.workspace_id,
|
|
name=model.name,
|
|
description=model.description,
|
|
target_date=model.target_date,
|
|
completed=model.completed,
|
|
completed_at=model.completed_at,
|
|
created_at=model.created_at,
|
|
updated_at=model.updated_at,
|
|
)
|
|
|
|
|
|
class SQLAlchemyTaskIssueRepository(TaskIssueRepository):
|
|
"""任务问题 SQLAlchemy 仓储实现"""
|
|
|
|
def __init__(self, session: Session):
|
|
self._session = session
|
|
|
|
def create(self, issue: TaskIssue) -> TaskIssue:
|
|
model = TaskIssueModel(
|
|
id=issue.id,
|
|
task_id=issue.task_id,
|
|
project_id=issue.project_id,
|
|
workspace_id=issue.workspace_id,
|
|
title=issue.title,
|
|
description=issue.description,
|
|
resolved=issue.resolved,
|
|
resolved_at=issue.resolved_at,
|
|
created_by_user_id=issue.created_by_user_id,
|
|
created_at=issue.created_at,
|
|
updated_at=issue.updated_at,
|
|
)
|
|
self._session.add(model)
|
|
self._session.commit()
|
|
return issue
|
|
|
|
def get_by_id(self, issue_id: str) -> TaskIssue | None:
|
|
model = self._session.query(TaskIssueModel).filter(TaskIssueModel.id == issue_id).first()
|
|
if not model:
|
|
return None
|
|
return self._model_to_entity(model)
|
|
|
|
def list_by_task(self, task_id: str) -> list[TaskIssue]:
|
|
models = self._session.query(TaskIssueModel).filter(TaskIssueModel.task_id == task_id).all()
|
|
return [self._model_to_entity(m) for m in models]
|
|
|
|
def list_by_project(self, project_id: str) -> list[TaskIssue]:
|
|
models = self._session.query(TaskIssueModel).filter(TaskIssueModel.project_id == project_id).all()
|
|
return [self._model_to_entity(m) for m in models]
|
|
|
|
def update(self, issue: TaskIssue) -> TaskIssue:
|
|
model = self._session.query(TaskIssueModel).filter(TaskIssueModel.id == issue.id).first()
|
|
if not model:
|
|
raise ValueError(f"TaskIssue {issue.id} not found")
|
|
|
|
model.title = issue.title
|
|
model.description = issue.description
|
|
model.resolved = issue.resolved
|
|
model.resolved_at = issue.resolved_at
|
|
model.updated_at = issue.updated_at
|
|
|
|
self._session.commit()
|
|
return issue
|
|
|
|
def delete(self, issue_id: str) -> None:
|
|
self._session.query(TaskIssueModel).filter(TaskIssueModel.id == issue_id).delete()
|
|
self._session.commit()
|
|
|
|
def _model_to_entity(self, model: TaskIssueModel) -> TaskIssue:
|
|
return TaskIssue(
|
|
id=model.id,
|
|
task_id=model.task_id,
|
|
project_id=model.project_id,
|
|
workspace_id=model.workspace_id,
|
|
title=model.title,
|
|
description=model.description,
|
|
resolved=model.resolved,
|
|
resolved_at=model.resolved_at,
|
|
created_by_user_id=model.created_by_user_id,
|
|
created_at=model.created_at,
|
|
updated_at=model.updated_at,
|
|
)
|