cronback_lib/database/models/
attempts.rs

1//! `SeaORM` Entity. Generated by sea-orm-codegen 0.11.3
2
3use 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}