From 12c2c1e0e654adeed8d888cde2519601a070767a Mon Sep 17 00:00:00 2001 From: Andres-Nju <1572378310@qq.com> Date: Wed, 8 Nov 2023 23:51:27 +0800 Subject: [PATCH] sync between mega and git --- git-sync-rs/README.md | 5 + git-sync-rs/sync/Cargo.toml | 51 +++++++++ git-sync-rs/sync/README.md | 5 + git-sync-rs/sync/src/dto/issue.rs | 87 +++++++++++++++ git-sync-rs/sync/src/dto/mod.rs | 2 + git-sync-rs/sync/src/dto/pull_request.rs | 128 +++++++++++++++++++++++ git-sync-rs/sync/src/mod.rs | 2 + git-sync-rs/sync/src/service.rs | 50 +++++++++ 8 files changed, 330 insertions(+) create mode 100644 git-sync-rs/README.md create mode 100644 git-sync-rs/sync/Cargo.toml create mode 100644 git-sync-rs/sync/README.md create mode 100644 git-sync-rs/sync/src/dto/issue.rs create mode 100644 git-sync-rs/sync/src/dto/mod.rs create mode 100644 git-sync-rs/sync/src/dto/pull_request.rs create mode 100644 git-sync-rs/sync/src/mod.rs create mode 100644 git-sync-rs/sync/src/service.rs diff --git a/git-sync-rs/README.md b/git-sync-rs/README.md new file mode 100644 index 00000000..d0d921c8 --- /dev/null +++ b/git-sync-rs/README.md @@ -0,0 +1,5 @@ +这个目录是mega项目的git同步部分,并不能直接运行 + +详情请查看 + +[https://github.com/web3infra-foundation/mega.git](https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Fweb3infra-foundation%2Fmega.git) \ No newline at end of file diff --git a/git-sync-rs/sync/Cargo.toml b/git-sync-rs/sync/Cargo.toml new file mode 100644 index 00000000..11814547 --- /dev/null +++ b/git-sync-rs/sync/Cargo.toml @@ -0,0 +1,51 @@ +[package] +name = "sync" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + + +[lib] +name = "sync" +path = "src/mod.rs" + + +[dependencies] +database = { path = "../database" } +common = { path = "../common" } +entity = { path = "../database/entity" } +anyhow = "1.0.75" +bstr = "1.5.0" +chrono = "0.4.24" +colored = "2.0.0" +deflate = "1.0.0" +flate2 = "1.0.26" +hex = "0.4.3" +sha1 = "0.10.5" +thiserror = "1.0.47" +futures = "0.3.28" +bytes = "1.4.0" +tracing = "0.1.37" +tokio = "1.32.0" +axum = "0.6.20" +hyper = "0.14.27" +byteorder = "1.4.3" +crc = "3.0.1" +tokio-test = "0.4.2" +russh = "0.37.1" +russh-keys = "0.37.1" +async-trait = "0.1.71" +rand = "0.8.5" +serde = "1.0.188" +serde_json = "1.0.105" +lru = "0.11.0" +async-recursion = "1.0.4" +num_cpus = "1.16.0" +dotenvy = "0.15.7" +diffs = "0.5.1" +sea-orm = { version = "0.12.2", features = [ + "runtime-tokio-rustls", + "macros", + "mock", +] } \ No newline at end of file diff --git a/git-sync-rs/sync/README.md b/git-sync-rs/sync/README.md new file mode 100644 index 00000000..a424bc18 --- /dev/null +++ b/git-sync-rs/sync/README.md @@ -0,0 +1,5 @@ +### Start a webhook + +```shell +cargo run webhook +``` \ No newline at end of file diff --git a/git-sync-rs/sync/src/dto/issue.rs b/git-sync-rs/sync/src/dto/issue.rs new file mode 100644 index 00000000..3fc4b8e3 --- /dev/null +++ b/git-sync-rs/sync/src/dto/issue.rs @@ -0,0 +1,87 @@ +use serde::{Deserialize, Serialize}; +use entity::issue; +use sea_orm::{Set}; +use chrono::NaiveDateTime; + +#[derive(Serialize, Deserialize, Debug)] +pub struct IssueEventDto{ + action: String, + issue: Issue, + repository: Repository, + sender: User, +} + + + +#[derive(Serialize, Deserialize, Debug)] +pub struct Issue{ + id: i64, + number: i64, + title: String, + user: User, + state: String, + created_at: String, + updated_at: String, + closed_at: Option, +} + +#[derive(Serialize, Deserialize, Debug)] +struct User{ + login: String, + id: i64, +} + +#[derive(Serialize, Deserialize, Debug)] +struct Repository{ + id: i64, + name: String, + full_name: String, +} + +impl IssueEventDto{ + pub fn convert_to_model(&self) -> issue::ActiveModel { + let closed_at = self.issue.closed_at.as_ref() + .map(|s| NaiveDateTime::parse_from_str(s.as_str(), "%Y-%m-%dT%H:%M:%SZ") + .unwrap()); + issue::ActiveModel{ + id: Set(self.issue.id), + number: Set(self.issue.number), + title: Set(self.issue.title.clone()), + sender_name: Set(self.sender.login.clone()), + sender_id: Set(self.sender.id), + state: Set(self.action.clone()), + created_at: Set(NaiveDateTime::parse_from_str(self.issue.created_at.as_str(), "%Y-%m-%dT%H:%M:%SZ").unwrap()), + updated_at: Set(NaiveDateTime::parse_from_str(self.issue.created_at.as_str(), "%Y-%m-%dT%H:%M:%SZ").unwrap()), + closed_at: Set(closed_at), + repo_path: Set(self.repository.full_name.clone()), + repo_id: Set(self.repository.id), + } + } + + pub fn id(&self) -> i64{ + self.issue.id + } + + pub fn action(&self) -> &String{ + &self.action + } +} + +pub fn convert_model_to_dto(issue: &issue::ActiveModel) -> Issue{ + let closed_at = issue.closed_at.clone() + .unwrap() + .map(|date_time| date_time.to_string()); + Issue{ + id: issue.id.clone().unwrap(), + number: issue.number.clone().unwrap(), + title: issue.title.clone().unwrap(), + state: issue.state.clone().unwrap(), + user: User{ + login: issue.sender_name.clone().unwrap(), + id: issue.sender_id.clone().unwrap(), + }, + created_at: issue.created_at.clone().unwrap().to_string(), + updated_at: issue.updated_at.clone().unwrap().to_string(), + closed_at, + } +} \ No newline at end of file diff --git a/git-sync-rs/sync/src/dto/mod.rs b/git-sync-rs/sync/src/dto/mod.rs new file mode 100644 index 00000000..9d44e001 --- /dev/null +++ b/git-sync-rs/sync/src/dto/mod.rs @@ -0,0 +1,2 @@ +pub mod issue; +pub mod pull_request; \ No newline at end of file diff --git a/git-sync-rs/sync/src/dto/pull_request.rs b/git-sync-rs/sync/src/dto/pull_request.rs new file mode 100644 index 00000000..476ad624 --- /dev/null +++ b/git-sync-rs/sync/src/dto/pull_request.rs @@ -0,0 +1,128 @@ +use serde::{Deserialize, Serialize}; +use entity::pull_request; +use sea_orm::{Set}; +use chrono::NaiveDateTime; + +#[derive(Serialize, Deserialize, Debug)] +pub struct PullRequestEventDto{ + action: String, + pull_request: PullRequest, + repository: Repository, + sender: User, +} + + + +#[derive(Serialize, Deserialize, Debug)] +pub struct PullRequest{ + id: i64, + number: i64, + title: String, + user: User, + state: String, + created_at: String, + updated_at: String, + closed_at: Option, + merged_at: Option, + merge_commit_sha: Option, + commits_url: String, + patch_url: String, + head: Commit, + base: Commit, +} + +#[derive(Serialize, Deserialize, Debug)] +struct User{ + login: String, + id: i64, +} + +#[derive(Serialize, Deserialize, Debug)] +struct Repository{ + id: i64, + name: String, + full_name: String, +} + +#[derive(Serialize, Deserialize, Debug)] +struct Commit{ + label: String, + r#ref: String, +} + + +impl PullRequestEventDto{ + pub fn convert_to_model(&self) -> pull_request::ActiveModel { + let closed_at = self.pull_request.closed_at.as_ref() + .map(|s| NaiveDateTime::parse_from_str(s.as_str(), "%Y-%m-%dT%H:%M:%SZ") + .unwrap()); + let merged_at = self.pull_request.merged_at.as_ref() + .map(|s| NaiveDateTime::parse_from_str(s.as_str(), "%Y-%m-%dT%H:%M:%SZ") + .unwrap()); + pull_request::ActiveModel{ + id: Set(self.pull_request.id), + number: Set(self.pull_request.number), + title: Set(self.pull_request.title.clone()), + sender_name: Set(self.sender.login.clone()), + sender_id: Set(self.sender.id), + state: Set(self.action.clone()), + created_at: Set(NaiveDateTime::parse_from_str(self.pull_request.created_at.as_str(), "%Y-%m-%dT%H:%M:%SZ").unwrap()), + updated_at: Set(NaiveDateTime::parse_from_str(self.pull_request.created_at.as_str(), "%Y-%m-%dT%H:%M:%SZ").unwrap()), + closed_at: Set(closed_at), + merged_at: Set(merged_at), + repo_path: Set(self.repository.full_name.clone()), + repo_id: Set(self.repository.id), + merge_commit_sha: Set(self.pull_request.merge_commit_sha.clone()), + user_name: Set(self.pull_request.user.login.clone()), + user_id: Set(self.pull_request.user.id), + commits_url: Set(self.pull_request.commits_url.clone()), + patch_url: Set(self.pull_request.patch_url.clone()), + head_label: Set(self.pull_request.head.label.clone()), + head_ref: Set(self.pull_request.head.r#ref.clone()), + base_label: Set(self.pull_request.base.label.clone()), + base_ref: Set(self.pull_request.base.r#ref.clone()), + } + } + + pub fn id(&self) -> i64{ + self.pull_request.id + } + + pub fn action(&self) -> &String{ + &self.action + } +} + +pub fn convert_model_to_dto(pull_request: &pull_request::ActiveModel) -> PullRequest{ + let closed_at = pull_request.closed_at.clone() + .unwrap() + .map(|date_time| date_time.to_string()); + let merged_at = pull_request.merged_at.clone() + .unwrap() + .map(|date_time| date_time.to_string()); + PullRequest{ + id: pull_request.id.clone().unwrap(), + number: pull_request.number.clone().unwrap(), + title: pull_request.title.clone().unwrap(), + state: pull_request.state.clone().unwrap(), + user: User{ + login: pull_request.sender_name.clone().unwrap(), + id: pull_request.sender_id.clone().unwrap(), + }, + created_at: pull_request.created_at.clone().unwrap().to_string(), + updated_at: pull_request.updated_at.clone().unwrap().to_string(), + closed_at, + merged_at, + merge_commit_sha: pull_request.merge_commit_sha.clone().unwrap(), + commits_url: pull_request.commits_url.clone().unwrap().to_string(), + patch_url: pull_request.patch_url.clone().unwrap().to_string(), + head: Commit { + label: pull_request.head_label.clone().unwrap().to_string(), + r#ref: pull_request.head_ref.clone().unwrap().to_string() + }, + base: Commit { + label: pull_request.base_label.clone().unwrap().to_string(), + r#ref: pull_request.base_ref.clone().unwrap().to_string() + }, + } +} \ No newline at end of file diff --git a/git-sync-rs/sync/src/mod.rs b/git-sync-rs/sync/src/mod.rs new file mode 100644 index 00000000..490b58bc --- /dev/null +++ b/git-sync-rs/sync/src/mod.rs @@ -0,0 +1,2 @@ +pub mod service; +pub mod dto; \ No newline at end of file diff --git a/git-sync-rs/sync/src/service.rs b/git-sync-rs/sync/src/service.rs new file mode 100644 index 00000000..09cf5715 --- /dev/null +++ b/git-sync-rs/sync/src/service.rs @@ -0,0 +1,50 @@ + +use axum::body::Body; +use bytes::{BytesMut}; +use futures::StreamExt; +use hyper::Request; +use crate::dto::{issue::IssueEventDto, pull_request::PullRequestEventDto}; + + + +pub async fn resolve_issue_event( + req: Request, +)-> IssueEventDto { + tracing::info!("req: {:?}", req); + let (_parts, mut body) = req.into_parts(); + + let mut request_body = BytesMut::new(); + + while let Some(chunk) = body.next().await { + tracing::info!("client sends :{:?}", chunk); + let bytes = chunk.unwrap(); + request_body.extend_from_slice(&bytes); + } + + let issue_dto: IssueEventDto = serde_json::from_slice(request_body.freeze().as_ref()).unwrap(); + println!("{:?}", issue_dto); + + issue_dto + //Ok(resp.body(body).unwrap()) +} + +pub async fn resolve_pull_request_event( + req: Request, +)-> PullRequestEventDto { + tracing::info!("req: {:?}", req); + let (_parts, mut body) = req.into_parts(); + + let mut request_body = BytesMut::new(); + + while let Some(chunk) = body.next().await { + tracing::info!("client sends :{:?}", chunk); + let bytes = chunk.unwrap(); + request_body.extend_from_slice(&bytes); + } + + let pull_request_dto: PullRequestEventDto = serde_json::from_slice(request_body.freeze().as_ref()).unwrap(); + println!("{:?}", pull_request_dto); + + pull_request_dto + //Ok(resp.body(body).unwrap()) +} \ No newline at end of file -- Gitee