feat: integrate MR notifications and implementation results

This commit is contained in:
2026-10-15 19:40:29 +09:00
33 changed files with 2196 additions and 24 deletions
+57
View File
@@ -370,6 +370,8 @@ impl_openapi_schema!(
TicketAssignmentAnswerResponse,
NotificationDiagnosticsQuery,
NotificationDiagnosticsPage,
TicketImplementationResultRequest,
TicketImplementationResultReceipt,
TicketAssignmentDiagnosticsQuery,
TicketAssignmentDiagnosticsPage,
TicketQueryRequest,
@@ -3289,6 +3291,33 @@ pub trait ServerApi {
#[body] request: TicketAssignmentAnswerRequest,
) -> Result<TicketAssignmentAnswerResponse, RepositoryApiError>;
#[post("/workspaces/{workspace_id}/tickets/{ticket_id}/implementation-results", status = 200, error_status = 400, additional_error_statuses = [401, 403, 404, 409, 422, 500], bearer_auth = true, browser_auth = true)]
async fn ticket_implementation_result(
&self,
#[extension] context: ServerRequestContext,
#[path] workspace_id: String,
#[path] ticket_id: String,
#[body] request: TicketImplementationResultRequest,
) -> Result<TicketImplementationResultReceipt, RepositoryApiError>;
#[post("/api/w/{workspace_id}/tickets/{ticket_id}/implementation-results", status = 200, error_status = 400, additional_error_statuses = [401, 403, 404, 409, 422, 500], bearer_auth = true, browser_auth = true)]
async fn ticket_implementation_result_browser(
&self,
#[extension] context: ServerRequestContext,
#[path] workspace_id: String,
#[path] ticket_id: String,
#[body] request: TicketImplementationResultRequest,
) -> Result<TicketImplementationResultReceipt, RepositoryApiError>;
#[get("/workspaces/{workspace_id}/tickets/{ticket_id}/implementation-results/{result_id}", status = 200, error_status = 400, additional_error_statuses = [401, 403, 404, 500], bearer_auth = true, browser_auth = true)]
async fn ticket_implementation_result_get(
&self,
#[extension] context: ServerRequestContext,
#[path] workspace_id: String,
#[path] ticket_id: String,
#[path] result_id: String,
) -> Result<TicketImplementationResultReceipt, RepositoryApiError>;
#[get("/workspaces/{workspace_id}/tickets/{ticket_id}/assignment-tracking", status = 200, error_status = 400, additional_error_statuses = [401, 403, 404, 500], bearer_auth = true, browser_auth = true)]
async fn ticket_assignment_tracking_get(
&self,
@@ -8018,6 +8047,34 @@ transparent_ticket_dto!(
ticket::TicketAssignmentAnswerReceipt
);
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TicketImplementationResultKind {
Handoff,
Result,
Blocker,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct TicketImplementationResultRequest {
pub operation_key: String,
pub assignment_id: String,
pub orchestrator_assignment_id: String,
pub kind: TicketImplementationResultKind,
pub body: String,
pub merge_request: Option<MergeRequestReviewSubject>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct TicketImplementationResultReceipt {
pub result_id: String,
pub ticket_id: String,
pub request: TicketImplementationResultRequest,
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct TicketAssignmentDiagnosticsQuery {
@@ -550,6 +550,27 @@ fn validate_ticket_browser_operations(
request: None,
successes: &[("200", "TicketAssignmentDiagnosticsPage")],
},
OperationContract {
path: "/workspaces/{workspace_id}/tickets/{ticket_id}/implementation-results",
method: "post",
operation_id: "ticket_implementation_result",
request: Some("TicketImplementationResultRequest"),
successes: &[("200", "TicketImplementationResultReceipt")],
},
OperationContract {
path: "/api/w/{workspace_id}/tickets/{ticket_id}/implementation-results",
method: "post",
operation_id: "ticket_implementation_result_browser",
request: Some("TicketImplementationResultRequest"),
successes: &[("200", "TicketImplementationResultReceipt")],
},
OperationContract {
path: "/workspaces/{workspace_id}/tickets/{ticket_id}/implementation-results/{result_id}",
method: "get",
operation_id: "ticket_implementation_result_get",
request: None,
successes: &[("200", "TicketImplementationResultReceipt")],
},
OperationContract {
path: "/workspaces/{workspace_id}/tickets/{ticket_id}/assignment-answer",
method: "post",