Merge branch 'feature/issue-ticket-system' into feature/background-tasks-first-class
Intègre le système de tickets/issues V1 (validé QA vert de bout en bout, mémoire tickets-v1-e2e-validated-qa) dans la branche des tâches de fond. Conflits résolus : app-tauri/state.rs, domain/events.rs, domain/lib.rs, domain/ports.rs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -14,6 +14,7 @@ use tauri::{AppHandle, Emitter};
|
||||
|
||||
use domain::events::{DomainEvent, OrchestrationSource};
|
||||
use domain::input::AgentLiveness;
|
||||
use domain::{IssueLinkKind, IssuePriority, IssueStatus};
|
||||
use infrastructure::TokioBroadcastEventBus;
|
||||
|
||||
/// Name of the Tauri event carrying relayed [`DomainEvent`]s.
|
||||
@ -193,6 +194,94 @@ pub enum DomainEventDto {
|
||||
/// Project id.
|
||||
project_id: String,
|
||||
},
|
||||
/// An issue-backed public ticket was created.
|
||||
#[serde(rename_all = "camelCase")]
|
||||
IssueCreated {
|
||||
/// Issue id.
|
||||
issue_id: String,
|
||||
/// Public ticket reference (`#N`).
|
||||
issue_ref: String,
|
||||
},
|
||||
/// An issue-backed public ticket was updated.
|
||||
#[serde(rename_all = "camelCase")]
|
||||
IssueUpdated {
|
||||
/// Public ticket reference (`#N`).
|
||||
issue_ref: String,
|
||||
/// New optimistic version.
|
||||
version: u64,
|
||||
},
|
||||
/// A public ticket status changed.
|
||||
#[serde(rename_all = "camelCase")]
|
||||
IssueStatusChanged {
|
||||
/// Public ticket reference (`#N`).
|
||||
issue_ref: String,
|
||||
/// New status.
|
||||
status: String,
|
||||
/// New optimistic version.
|
||||
version: u64,
|
||||
},
|
||||
/// A public ticket priority changed.
|
||||
#[serde(rename_all = "camelCase")]
|
||||
IssuePriorityChanged {
|
||||
/// Public ticket reference (`#N`).
|
||||
issue_ref: String,
|
||||
/// New priority.
|
||||
priority: String,
|
||||
/// New optimistic version.
|
||||
version: u64,
|
||||
},
|
||||
/// A public ticket carnet changed.
|
||||
#[serde(rename_all = "camelCase")]
|
||||
IssueCarnetUpdated {
|
||||
/// Public ticket reference (`#N`).
|
||||
issue_ref: String,
|
||||
/// New optimistic version.
|
||||
version: u64,
|
||||
},
|
||||
/// A public ticket link was added.
|
||||
#[serde(rename_all = "camelCase")]
|
||||
IssueLinked {
|
||||
/// Public source ticket reference (`#N`).
|
||||
issue_ref: String,
|
||||
/// Public target ticket reference (`#N`).
|
||||
target: String,
|
||||
/// Link kind.
|
||||
kind: String,
|
||||
/// New optimistic version.
|
||||
version: u64,
|
||||
},
|
||||
/// A public ticket link was removed.
|
||||
#[serde(rename_all = "camelCase")]
|
||||
IssueUnlinked {
|
||||
/// Public source ticket reference (`#N`).
|
||||
issue_ref: String,
|
||||
/// Public target ticket reference (`#N`).
|
||||
target: String,
|
||||
/// Link kind.
|
||||
kind: String,
|
||||
/// New optimistic version.
|
||||
version: u64,
|
||||
},
|
||||
/// An agent was assigned to a public ticket.
|
||||
#[serde(rename_all = "camelCase")]
|
||||
IssueAgentAssigned {
|
||||
/// Public ticket reference (`#N`).
|
||||
issue_ref: String,
|
||||
/// Assigned agent id.
|
||||
agent_id: String,
|
||||
/// New optimistic version.
|
||||
version: u64,
|
||||
},
|
||||
/// An agent was unassigned from a public ticket.
|
||||
#[serde(rename_all = "camelCase")]
|
||||
IssueAgentUnassigned {
|
||||
/// Public ticket reference (`#N`).
|
||||
issue_ref: String,
|
||||
/// Unassigned agent id.
|
||||
agent_id: String,
|
||||
/// New optimistic version.
|
||||
version: u64,
|
||||
},
|
||||
/// An orchestrator request was processed on behalf of a requester agent.
|
||||
#[serde(rename_all = "camelCase")]
|
||||
OrchestratorRequestProcessed {
|
||||
@ -347,6 +436,34 @@ impl From<OrchestrationSource> for OrchestrationSourceDto {
|
||||
}
|
||||
}
|
||||
|
||||
fn issue_status_wire(status: IssueStatus) -> &'static str {
|
||||
match status {
|
||||
IssueStatus::Open => "open",
|
||||
IssueStatus::InProgress => "inProgress",
|
||||
IssueStatus::Qa => "QA",
|
||||
IssueStatus::Closed => "closed",
|
||||
}
|
||||
}
|
||||
|
||||
fn issue_priority_wire(priority: IssuePriority) -> &'static str {
|
||||
match priority {
|
||||
IssuePriority::Low => "low",
|
||||
IssuePriority::Medium => "medium",
|
||||
IssuePriority::High => "high",
|
||||
IssuePriority::Critical => "critical",
|
||||
}
|
||||
}
|
||||
|
||||
fn issue_link_kind_wire(kind: IssueLinkKind) -> &'static str {
|
||||
match kind {
|
||||
IssueLinkKind::RelatesTo => "relatesTo",
|
||||
IssueLinkKind::Blocks => "blocks",
|
||||
IssueLinkKind::BlockedBy => "blockedBy",
|
||||
IssueLinkKind::Duplicates => "duplicates",
|
||||
IssueLinkKind::DependsOn => "dependsOn",
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&DomainEvent> for DomainEventDto {
|
||||
fn from(e: &DomainEvent) -> Self {
|
||||
match e {
|
||||
@ -544,6 +661,79 @@ impl From<&DomainEvent> for DomainEventDto {
|
||||
DomainEvent::GitStateChanged { project_id } => Self::GitStateChanged {
|
||||
project_id: project_id.to_string(),
|
||||
},
|
||||
DomainEvent::IssueCreated {
|
||||
issue_id,
|
||||
issue_ref,
|
||||
} => Self::IssueCreated {
|
||||
issue_id: issue_id.to_string(),
|
||||
issue_ref: issue_ref.to_string(),
|
||||
},
|
||||
DomainEvent::IssueUpdated { issue_ref, version } => Self::IssueUpdated {
|
||||
issue_ref: issue_ref.to_string(),
|
||||
version: version.get(),
|
||||
},
|
||||
DomainEvent::IssueStatusChanged {
|
||||
issue_ref,
|
||||
status,
|
||||
version,
|
||||
} => Self::IssueStatusChanged {
|
||||
issue_ref: issue_ref.to_string(),
|
||||
status: issue_status_wire(*status).to_owned(),
|
||||
version: version.get(),
|
||||
},
|
||||
DomainEvent::IssuePriorityChanged {
|
||||
issue_ref,
|
||||
priority,
|
||||
version,
|
||||
} => Self::IssuePriorityChanged {
|
||||
issue_ref: issue_ref.to_string(),
|
||||
priority: issue_priority_wire(*priority).to_owned(),
|
||||
version: version.get(),
|
||||
},
|
||||
DomainEvent::IssueCarnetUpdated { issue_ref, version } => Self::IssueCarnetUpdated {
|
||||
issue_ref: issue_ref.to_string(),
|
||||
version: version.get(),
|
||||
},
|
||||
DomainEvent::IssueLinked {
|
||||
issue_ref,
|
||||
target,
|
||||
kind,
|
||||
version,
|
||||
} => Self::IssueLinked {
|
||||
issue_ref: issue_ref.to_string(),
|
||||
target: target.to_string(),
|
||||
kind: issue_link_kind_wire(*kind).to_owned(),
|
||||
version: version.get(),
|
||||
},
|
||||
DomainEvent::IssueUnlinked {
|
||||
issue_ref,
|
||||
target,
|
||||
kind,
|
||||
version,
|
||||
} => Self::IssueUnlinked {
|
||||
issue_ref: issue_ref.to_string(),
|
||||
target: target.to_string(),
|
||||
kind: issue_link_kind_wire(*kind).to_owned(),
|
||||
version: version.get(),
|
||||
},
|
||||
DomainEvent::IssueAgentAssigned {
|
||||
issue_ref,
|
||||
agent_id,
|
||||
version,
|
||||
} => Self::IssueAgentAssigned {
|
||||
issue_ref: issue_ref.to_string(),
|
||||
agent_id: agent_id.to_string(),
|
||||
version: version.get(),
|
||||
},
|
||||
DomainEvent::IssueAgentUnassigned {
|
||||
issue_ref,
|
||||
agent_id,
|
||||
version,
|
||||
} => Self::IssueAgentUnassigned {
|
||||
issue_ref: issue_ref.to_string(),
|
||||
agent_id: agent_id.to_string(),
|
||||
version: version.get(),
|
||||
},
|
||||
DomainEvent::OrchestratorRequestProcessed {
|
||||
requester_id,
|
||||
action,
|
||||
|
||||
Reference in New Issue
Block a user