cronback_lib/database/models/
attempts.rs1use std::time::Duration;
4
5use chrono::{DateTime, Utc};
6use dto::IntoProto;
7use sea_orm::entity::prelude::*;
8use sea_orm::{DeriveActiveEnum, EnumIter, FromJsonQueryResult};
9use serde::{Deserialize, Serialize};
10
11use crate::database::pagination::PaginatedEntity;
12use crate::model::ValidShardedId;
13use crate::types::{AttemptId, ProjectId, RunId, TriggerId};
14
15#[derive(
16 Clone,
17 Serialize,
18 Deserialize,
19 Debug,
20 IntoProto,
21 PartialEq,
22 DeriveEntityModel,
23 Eq,
24 FromJsonQueryResult,
25)]
26#[proto(target = "proto::attempt_proto::Attempt")]
27#[sea_orm(table_name = "attempts")]
28pub struct Model {
29 #[sea_orm(primary_key, auto_increment = false)]
30 #[proto(required)]
31 pub id: AttemptId,
32 #[proto(required)]
33 pub run_id: RunId,
34 #[proto(skip)]
35 pub trigger_id: TriggerId,
36 #[sea_orm(primary_key, auto_increment = false)]
37 #[proto(skip)]
38 pub project_id: ValidShardedId<ProjectId>,
39 pub status: AttemptStatus,
40 #[proto(required)]
41 pub details: AttemptDetails,
42 pub attempt_num: u32,
43 #[proto(required)]
44 pub created_at: DateTime<Utc>,
45}
46
47impl PaginatedEntity for Entity {
48 fn cursor_column() -> Self::Column {
49 Column::Id
50 }
51}
52
53#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
54pub enum Relation {}
55
56impl ActiveModelBehavior for ActiveModel {}
57
58#[derive(Debug, Serialize, Deserialize, IntoProto, Clone, PartialEq, Eq)]
59#[proto(target = "proto::attempt_proto::WebhookAttemptDetails")]
60pub struct WebhookAttemptDetails {
61 pub response_code: Option<i32>,
62 #[into_proto(map = "Duration::as_secs_f64", map_by_ref)]
63 pub response_latency_s: Duration,
64 pub error_message: Option<String>,
65}
66
67impl WebhookAttemptDetails {
68 pub fn is_success(&self) -> bool {
69 (200..=299).contains(&self.response_code.unwrap_or(500))
70 }
71
72 pub fn with_error(err: String) -> Self {
73 Self {
74 response_code: None,
75 response_latency_s: Duration::default(),
76 error_message: Some(err),
77 }
78 }
79}
80
81#[derive(
82 Debug,
83 Clone,
84 Serialize,
85 Deserialize,
86 IntoProto,
87 PartialEq,
88 Eq,
89 FromJsonQueryResult,
90)]
91#[proto(target = "proto::attempt_proto::AttemptDetails", oneof = "details")]
92pub enum AttemptDetails {
93 #[proto(name = "Webhook")]
94 WebhookAttemptDetails(WebhookAttemptDetails),
95}
96
97#[derive(
98 Debug,
99 Serialize,
100 Deserialize,
101 IntoProto,
102 Clone,
103 PartialEq,
104 Eq,
105 EnumIter,
106 DeriveActiveEnum,
107)]
108#[sea_orm(rs_type = "String", db_type = "String(None)")]
109#[proto(target = "proto::attempt_proto::AttemptStatus")]
110pub enum AttemptStatus {
111 #[sea_orm(string_value = "Succeeded")]
112 Succeeded,
113 #[sea_orm(string_value = "Failed")]
114 Failed,
115}