feat(models): add actions CI entities, job tokens and schema
ZhenYi committed
Added lib/models/src/ci/actions_cache.rs lib/models/src/ci/actions_cache.rs +24 −0 View lib/models/src/ci/actions_cache.rs
@@ -0,0 +1,24 @@
1use sea_orm::entity::prelude::*;
2use time::OffsetDateTime;
3use uuid::Uuid;
4
5#[sea_orm::model]
6#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
7#[sea_orm(table_name = "ci_actions_cache")]
8pub struct Model {
9 #[sea_orm(primary_key, auto_increment = true)]
10 pub id: i64,
11 pub repo_id: Uuid,
12 pub job_id: Uuid,
13 pub git_ref: String,
14 pub key: String,
15 pub version: String,
16 pub object_key: String,
17 pub size: i64,
18 pub ready: bool,
19 pub created_at: OffsetDateTime,
20 pub last_accessed_at: OffsetDateTime,
21 pub expires_at: OffsetDateTime,
22}
23
24impl ActiveModelBehavior for ActiveModel {}
Added lib/models/src/ci/actions_identity.rs lib/models/src/ci/actions_identity.rs +15 −0 View lib/models/src/ci/actions_identity.rs
@@ -0,0 +1,15 @@
1use sea_orm::entity::prelude::*;
2use uuid::Uuid;
3
4#[sea_orm::model]
5#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
6#[sea_orm(table_name = "ci_actions_identity")]
7pub struct Model {
8 #[sea_orm(primary_key, auto_increment = true)]
9 pub id: i64,
10 #[sea_orm(unique)]
11 pub entity_id: Uuid,
12 pub kind: String,
13}
14
15impl ActiveModelBehavior for ActiveModel {}
Added lib/models/src/ci/actions_schedule.rs lib/models/src/ci/actions_schedule.rs +18 −0 View lib/models/src/ci/actions_schedule.rs
@@ -0,0 +1,18 @@
1use sea_orm::entity::prelude::*;
2use time::OffsetDateTime;
3use uuid::Uuid;
4
5#[sea_orm::model]
6#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
7#[sea_orm(table_name = "ci_actions_schedule")]
8pub struct Model {
9 #[sea_orm(primary_key, auto_increment = false)]
10 pub id: Uuid,
11 pub repo_id: Uuid,
12 pub workflow_file: String,
13 pub cron: String,
14 pub next_at: OffsetDateTime,
15 pub updated_at: OffsetDateTime,
16}
17
18impl ActiveModelBehavior for ActiveModel {}
Modified lib/models/src/ci/ci_environment.rs lib/models/src/ci/ci_environment.rs +3 −0 View lib/models/src/ci/ci_environment.rs
@@ -10,6 +10,9 @@
1010 #[sea_orm(primary_key, auto_increment = false)]
1111 pub id: Uuid,
1212 pub space_id: Uuid,
13 pub repo_id: Option<Uuid>,
14 #[sea_orm(column_type = "JsonBinary")]
15 pub rules: Option<JsonValue>,
1316 pub name: String,
1417 pub description: Option<String>,
1518 #[sea_orm(column_type = "JsonBinary")]
Added lib/models/src/ci/environment_review.rs lib/models/src/ci/environment_review.rs +23 −0 View lib/models/src/ci/environment_review.rs
@@ -0,0 +1,23 @@
1use sea_orm::entity::prelude::*;
2use time::OffsetDateTime;
3use uuid::Uuid;
4
5#[sea_orm::model]
6#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
7#[sea_orm(table_name = "ci_environment_review")]
8pub struct Model {
9 #[sea_orm(primary_key, auto_increment = false)]
10 pub id: Uuid,
11 #[sea_orm(unique)]
12 pub job_id: Uuid,
13 pub repo_id: Uuid,
14 pub environment_id: Uuid,
15 pub state: String,
16 pub reviewer_id: Option<Uuid>,
17 pub comment: Option<String>,
18 pub requested_at: OffsetDateTime,
19 pub eligible_at: OffsetDateTime,
20 pub updated_at: OffsetDateTime,
21}
22
23impl ActiveModelBehavior for ActiveModel {}
Added lib/models/src/ci/job_token.rs lib/models/src/ci/job_token.rs +21 −0 View lib/models/src/ci/job_token.rs
@@ -0,0 +1,21 @@
1use sea_orm::entity::prelude::*;
2use time::OffsetDateTime;
3use uuid::Uuid;
4
5#[sea_orm::model]
6#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
7#[sea_orm(table_name = "ci_job_token")]
8pub struct Model {
9 #[sea_orm(primary_key, auto_increment = false)]
10 pub id: Uuid,
11 pub job_id: Uuid,
12 pub repo_id: Uuid,
13 pub actor_id: Uuid,
14 pub token_hash: String,
15 pub lease_token: String,
16 pub contents_read: bool,
17 pub contents_write: bool,
18 pub expires_at: OffsetDateTime,
19}
20
21impl ActiveModelBehavior for ActiveModel {}
Modified lib/models/src/ci/mod.rs lib/models/src/ci/mod.rs +7 −0 View lib/models/src/ci/mod.rs
@@ -1,10 +1,17 @@
1pub mod actions_cache;
2pub mod actions_identity;
3pub mod actions_schedule;
14pub mod ci_deployment;
25pub mod ci_environment;
36pub mod ci_log_chunk;
47pub mod ci_secret;
8pub mod environment_review;
9pub mod job_token;
510pub mod runner;
611pub mod runner_token;
12pub mod variable;
713pub mod workflow_artifact;
14pub mod workflow_counter;
815pub mod workflow_job;
916pub mod workflow_run;
1017pub mod workflow_step;
Modified lib/models/src/ci/runner.rs lib/models/src/ci/runner.rs +3 −0 View lib/models/src/ci/runner.rs
@@ -39,6 +39,9 @@
3939 #[sea_orm(default_value = 1)]
4040 pub capacity: i32,
4141 pub version: Option<String>,
42 pub protocol_version: Option<i32>,
43 #[sea_orm(column_type = "JsonBinary")]
44 pub capabilities: Option<JsonValue>,
4245 pub state: RunnerState,
4346 pub space_id: Option<Uuid>,
4447 pub last_seen_at: Option<OffsetDateTime>,
Added lib/models/src/ci/variable.rs lib/models/src/ci/variable.rs +17 −0 View lib/models/src/ci/variable.rs
@@ -0,0 +1,17 @@
1use sea_orm::entity::prelude::*;
2use time::OffsetDateTime;
3use uuid::Uuid;
4
5#[sea_orm::model]
6#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
7#[sea_orm(table_name = "ci_variable")]
8pub struct Model {
9 #[sea_orm(primary_key, auto_increment = false)]
10 pub id: Uuid,
11 pub repo_id: Uuid,
12 pub name: String,
13 pub value: String,
14 pub updated_at: OffsetDateTime,
15}
16
17impl ActiveModelBehavior for ActiveModel {}
Modified lib/models/src/ci/workflow_artifact.rs lib/models/src/ci/workflow_artifact.rs +1 −0 View lib/models/src/ci/workflow_artifact.rs
@@ -43,6 +43,7 @@
4343 pub object_key: String,
4444 pub size: i64,
4545 pub sha256: Option<String>,
46 pub mime_type: Option<String>,
4647 pub state: ArtifactState,
4748 pub expires_at: Option<OffsetDateTime>,
4849 pub created_at: OffsetDateTime,
Added lib/models/src/ci/workflow_counter.rs lib/models/src/ci/workflow_counter.rs +15 −0 View lib/models/src/ci/workflow_counter.rs
@@ -0,0 +1,15 @@
1use sea_orm::entity::prelude::*;
2use uuid::Uuid;
3
4#[sea_orm::model]
5#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
6#[sea_orm(table_name = "ci_workflow_counter")]
7pub struct Model {
8 #[sea_orm(primary_key, auto_increment = false)]
9 pub repo_id: Uuid,
10 #[sea_orm(primary_key, auto_increment = false)]
11 pub workflow_file: String,
12 pub last_number: i64,
13}
14
15impl ActiveModelBehavior for ActiveModel {}
Modified lib/models/src/ci/workflow_job.rs lib/models/src/ci/workflow_job.rs +9 −0 View lib/models/src/ci/workflow_job.rs
@@ -86,6 +86,15 @@
8686 #[sea_orm(column_type = "JsonBinary")]
8787 pub definition: JsonValue,
8888 #[sea_orm(column_type = "JsonBinary")]
89 pub actions_context: Option<JsonValue>,
90 #[sea_orm(column_type = "JsonBinary")]
91 pub outputs: Option<JsonValue>,
92 pub outcome: Option<String>,
93 pub logical_job_id: Option<Uuid>,
94 #[sea_orm(default_value = false)]
95 pub is_template: bool,
96 pub actions_id: Option<i64>,
97 #[sea_orm(column_type = "JsonBinary")]
8998 pub runs_on: JsonValue,
9099 pub environment: Option<String>,
91100 #[sea_orm(column_type = "JsonBinary")]
Modified lib/models/src/ci/workflow_run.rs lib/models/src/ci/workflow_run.rs +12 −0 View lib/models/src/ci/workflow_run.rs
@@ -58,6 +58,12 @@
5858 PullRequest,
5959 #[sea_orm(num_value = 2)]
6060 WorkflowDispatch,
61 #[sea_orm(num_value = 3)]
62 Schedule,
63 #[sea_orm(num_value = 4)]
64 RepositoryDispatch,
65 #[sea_orm(num_value = 5)]
66 WorkflowRun,
6167}
6268
6369impl WorkflowEventKind {
@@ -67,6 +73,9 @@
6773 Self::Push => "push",
6874 Self::PullRequest => "pull_request",
6975 Self::WorkflowDispatch => "workflow_dispatch",
76 Self::Schedule => "schedule",
77 Self::RepositoryDispatch => "repository_dispatch",
78 Self::WorkflowRun => "workflow_run",
7079 }
7180 }
7281}
@@ -85,6 +94,9 @@
8594 pub event: WorkflowEventKind,
8695 pub event_payload: JsonValue,
8796 pub definition: JsonValue,
97 pub actions_id: Option<i64>,
98 pub run_number: Option<i64>,
99 pub event_key: Option<String>,
88100 pub commit_sha: String,
89101 pub git_ref: String,
90102 pub branch: Option<String>,
Modified lib/models/src/ci/workflow_step.rs lib/models/src/ci/workflow_step.rs +10 −0 View lib/models/src/ci/workflow_step.rs
@@ -1,3 +1,4 @@
1use sea_orm::JsonValue;
12use sea_orm::entity::prelude::*;
23use serde::{Deserialize, Serialize};
34use time::OffsetDateTime;
@@ -45,6 +46,15 @@
4546 pub step_index: i32,
4647 pub name: String,
4748 pub script: String,
49 pub step_key: Option<String>,
50 pub stage: Option<String>,
51 pub outcome: Option<String>,
52 pub conclusion: Option<String>,
53 #[sea_orm(column_type = "JsonBinary")]
54 pub outputs: Option<JsonValue>,
55 #[sea_orm(column_type = "JsonBinary")]
56 pub annotations: Option<JsonValue>,
57 pub summary: Option<String>,
4858 pub shell: Option<String>,
4959 pub working_directory: Option<String>,
5060 pub state: WorkflowStepState,
Modified lib/models/schema_extras.sql lib/models/schema_extras.sql +7 −0 View lib/models/schema_extras.sql
@@ -299,3 +299,10 @@
299299
300300CREATE INDEX IF NOT EXISTS idx_ci_runner_state
301301 ON ci_runner (state, last_seen_at DESC);
302CREATE UNIQUE INDEX IF NOT EXISTS idx_ci_run_event_key ON workflow_run(event_key) WHERE event_key IS NOT NULL;
303CREATE UNIQUE INDEX IF NOT EXISTS idx_ci_job_run_key ON workflow_job(run_id,job_key);
304CREATE UNIQUE INDEX IF NOT EXISTS idx_ci_step_key_stage ON workflow_step(job_id,step_key,stage) WHERE step_key IS NOT NULL;
305CREATE UNIQUE INDEX IF NOT EXISTS idx_ci_env_repo_name ON ci_environment(repo_id,name) WHERE repo_id IS NOT NULL;
306CREATE UNIQUE INDEX IF NOT EXISTS idx_ci_schedule_key ON ci_actions_schedule(repo_id,workflow_file,cron);
307CREATE UNIQUE INDEX IF NOT EXISTS idx_ci_variable_name ON ci_variable(repo_id,name);
308CREATE UNIQUE INDEX IF NOT EXISTS idx_ci_actions_cache_key ON ci_actions_cache(repo_id,git_ref,key,version);
Modified lib/models/schema_pre_sync.sql lib/models/schema_pre_sync.sql +9 −3 View lib/models/schema_pre_sync.sql
@@ -17,6 +17,13 @@
1717DROP INDEX IF EXISTS idx_chat_gdm_key;
1818DROP INDEX IF EXISTS idx_chat_draft_unique;
1919DROP INDEX IF EXISTS idx_space_join_request_pending;
20DROP INDEX IF EXISTS idx_ci_run_event_key;
21DROP INDEX IF EXISTS idx_ci_job_run_key;
22DROP INDEX IF EXISTS idx_ci_step_key_stage;
23DROP INDEX IF EXISTS idx_ci_env_repo_name;
24DROP INDEX IF EXISTS idx_ci_schedule_key;
25DROP INDEX IF EXISTS idx_ci_variable_name;
26DROP INDEX IF EXISTS idx_ci_actions_cache_key;
2027
2128-- scheduled messages feature removed; drop the legacy table before sync
2229DROP TABLE IF EXISTS user_scheduled_message;
@@ -35,8 +42,8 @@
3542 AND EXISTS (
3643 SELECT 1 FROM pg_constraint
3744 WHERE conname = 'fk-rooms-parent_id'
38 AND conrelid = 'rooms'::regclass
39 AND confrelid <> 'dir'::regclass
45 AND conrelid = to_regclass('rooms')
46 AND confrelid <> to_regclass('dir')
4047 ) THEN
4148 ALTER TABLE rooms DROP CONSTRAINT "fk-rooms-parent_id";
4249 -- Defensive: anything the old constraint let through cannot be a dir
@@ -130,4 +137,3 @@
130137 ADD COLUMN IF NOT EXISTS required_status_contexts VARCHAR NOT NULL DEFAULT '';
131138 END IF;
132139END $$;
133