pushing for testing on vps

This commit is contained in:
Gvidas Juknevičius 2024-03-30 17:06:34 +02:00
parent 4bd3425b1b
commit cdcc9764ae
Signed by: MCorange
GPG Key ID: 12B1346D720B7FBB
27 changed files with 966 additions and 67 deletions

1
.env Normal file
View File

@ -0,0 +1 @@
DATABASE_URL="postgresql://mc_test:mc_test@nya-1.mcorangehq.xyz/mc_test"

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"rust-analyzer.showUnlinkedFileNotification": false
}

10
Cargo.lock generated
View File

@ -1569,6 +1569,15 @@ dependencies = [
"windows-targets 0.48.5", "windows-targets 0.48.5",
] ]
[[package]]
name = "parse_int"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d695b79916a2c08bcff7be7647ab60d1402885265005a6658ffe6d763553c5a"
dependencies = [
"num-traits",
]
[[package]] [[package]]
name = "password-hash" name = "password-hash"
version = "0.5.0" version = "0.5.0"
@ -2664,6 +2673,7 @@ dependencies = [
"env_logger", "env_logger",
"futures", "futures",
"log", "log",
"parse_int",
"rand", "rand",
"serde", "serde",
"serde_json", "serde_json",

View File

@ -37,6 +37,7 @@ futures = "0.3.30"
bitflags = "2.5.0" bitflags = "2.5.0"
rand = "0.8.5" rand = "0.8.5"
serde_json = "1.0.115" serde_json = "1.0.115"
parse_int = "0.6.0"
[profile.dev.package.sqlx-macros] [profile.dev.package.sqlx-macros]
opt-level = 3 opt-level = 3

1
env.sh
View File

@ -1 +0,0 @@
export DATABASE_URL="postgresql://postgres@localhost/mctest"

View File

@ -0,0 +1,2 @@
-- Add down migration script here
DROP TABLE users;

View File

@ -1,5 +1,5 @@
-- Add up migration script here
CREATE TABLE IF NOT EXISTS Users ( CREATE TABLE IF NOT EXISTS users (
id UUID NOT NULL UNIQUE, id UUID NOT NULL UNIQUE,
email TEXT NOT NULL, email TEXT NOT NULL,
username TEXT NOT NULL, username TEXT NOT NULL,

View File

@ -0,0 +1,2 @@
-- Add down migration script here
DROP TABLE tokens;

View File

@ -1,5 +1,5 @@
-- Add up migration script here
CREATE TABLE IF NOT EXISTS Tokens ( CREATE TABLE IF NOT EXISTS tokens (
token TEXT NOT NULL UNIQUE, token TEXT NOT NULL UNIQUE,
owner_id UUID NOT NULL, owner_id UUID NOT NULL,
permissions BIGINT NOT NULL, permissions BIGINT NOT NULL,

View File

@ -0,0 +1,2 @@
-- Add down migration script here
DROP TABLE posts;

View File

@ -1,11 +1,11 @@
-- Add up migration script here
CREATE TABLE IF NOT EXISTS Posts ( CREATE TABLE IF NOT EXISTS posts (
id UUID NOT NULL UNIQUE, id UUID NOT NULL UNIQUE,
title TEXT NOT NULL, title TEXT NOT NULL,
descr TEXT NOT NULL, descr TEXT NOT NULL,
img_url TEXT NOT NULL, img_url TEXT NOT NULL,
origin_url TEXT NOT NULL, origin_url TEXT NOT NULL,
original_request JSON NOT NULL, original_request JSON NOT NULL,
posted_on TIMESTAMP NOT NULL posted_on TIMESTAMP NOT NULL,
PRIMARY KEY (id) PRIMARY KEY (id)
) )

View File

@ -1,2 +0,0 @@
-- This file should undo anything in `up.sql`
DROP TABLE Users

View File

@ -1,5 +1,9 @@
use clap::Parser; use std::str::FromStr;
use clap::{Parser, Subcommand};
use uuid::Uuid;
use crate::database::{models::Permissions, Database};
#[derive(Debug, Clone, Parser)] #[derive(Debug, Clone, Parser)]
#[command(version, about, long_about = None)] #[command(version, about, long_about = None)]
@ -18,4 +22,54 @@ pub struct CliArgs {
#[arg(long, short, default_value="./config.toml")] #[arg(long, short, default_value="./config.toml")]
pub config: camino::Utf8PathBuf, pub config: camino::Utf8PathBuf,
#[command(subcommand)]
pub command: Option<CliArgsCommand>
}
#[derive(Debug, Clone, Subcommand)]
pub enum CliArgsCommand {
#[command(arg_required_else_help = true)]
GenerateToken {
#[arg(long)]
owner_id: String,
#[arg(long)]
permissions: i64,
},
#[command(arg_required_else_help = true)]
CreateUser {
#[arg(long)]
email: String,
#[arg(long)]
username: String,
#[arg(long)]
password: String
}
}
pub async fn handle_command(cli: &CliArgs, db: &mut Database) -> anyhow::Result<bool> {
let Some(command) = cli.command.clone() else {
return Ok(false);
};
match command {
CliArgsCommand::GenerateToken {
owner_id, permissions
} => {
let permissions = Permissions::from_bits(permissions).unwrap();
let owner_id = Uuid::from_str(&owner_id)?;
let token = crate::database::models::tokens::Token::create_new(db, owner_id, permissions).await?;
log::info!("Generated token: {token:#?}");
Ok(true)
},
CliArgsCommand::CreateUser {
email, username, password
} => {
let user = crate::database::models::users::User::create_new(db, email, username, password).await?;
log::info!("Created user: {user:?}");
Ok(true)
},
}
} }

View File

@ -16,17 +16,18 @@ pub struct Database {
impl Database { impl Database {
pub async fn new(config: &Config) -> anyhow::Result<Self> { pub async fn new(config: &Config) -> anyhow::Result<Self> {
sqlx::migrate!("./migrations");
log::info!("Database connecting to {}", config.database.url); log::info!("Database connecting to {}", config.database.url);
let conn = PgPoolOptions::new() let conn = PgPoolOptions::new()
.max_connections(5) .max_connections(5)
.connect(&config.database.url).await; .connect(&config.database.url).await;
match conn { match conn {
Ok(c) => { Ok(c) => {
log::info!("Connection successfull"); log::info!("Connection successfull");
log::info!("Running migrations");
sqlx::migrate!("./migrations").run(&c).await?;
Ok(Self { Ok(Self {
connection: c connection: c
}) })

View File

@ -4,9 +4,11 @@ pub mod users;
pub mod tokens; pub mod tokens;
pub mod posts; pub mod posts;
#[derive(Debug, Clone)]
pub struct Permissions(i64);
bitflags! { bitflags! {
struct Permissions: i64 { impl Permissions: i64 {
const MAKE_POST = 1 << 0; const MAKE_POST = 1 << 0;
} }
} }

View File

@ -11,7 +11,7 @@ pub struct Post {
pub descr: String, pub descr: String,
pub img_url: String, pub img_url: String,
pub origin_url: String, pub origin_url: String,
pub original_request: Value, pub original_request: String,
pub posted_on: i64, pub posted_on: i64,
} }

View File

@ -6,7 +6,7 @@ use futures::TryStreamExt;
use super::Permissions; use super::Permissions;
#[derive(sqlx::FromRow)] #[derive(sqlx::FromRow, Debug)]
pub struct Token { pub struct Token {
pub token: String, pub token: String,
pub owner_id: Uuid, pub owner_id: Uuid,

View File

@ -19,7 +19,7 @@ impl User {
let hash = bcrypt::hash(password, 15)?; let hash = bcrypt::hash(password, 15)?;
sqlx::query(r#" sqlx::query(r#"
INSERT INTO users ( id, email, username, pw_hash, permissions ) INSERT INTO "users" ( id, email, username, pw_hash, permissions )
VALUES ( $1, $2, $3, $4, 0 ) VALUES ( $1, $2, $3, $4, 0 )
RETURNING id RETURNING id
"#) "#)

View File

@ -7,7 +7,7 @@ mod config;
mod database; mod database;
#[actix_web::main] #[actix_web::main]
async fn main() -> std::io::Result<()> { async fn main() -> anyhow::Result<()> {
let cli = cli::CliArgs::parse(); let cli = cli::CliArgs::parse();
logger::init_logger(&cli); logger::init_logger(&cli);
@ -19,7 +19,12 @@ async fn main() -> std::io::Result<()> {
} }
}; };
let Ok(database) = database::Database::new(config.get_ref()).await else {return Ok(())}; let Ok(mut database) = database::Database::new(config.get_ref()).await else {return Ok(())};
if cli::handle_command(&cli, &mut database).await? {
log::info!("Command exectuted, exiting");
return Ok(());
}
if let Err(e) = web::start_actix(config.get_ref(), database).await { if let Err(e) = web::start_actix(config.get_ref(), database).await {
log::error!("Actix had an error: {e}"); log::error!("Actix had an error: {e}");

View File

@ -1,10 +1,9 @@
pub mod routes;
mod routes; pub mod templates;
mod templates;
use std::sync::Mutex; use std::sync::Mutex;
use actix_web::{web, App, HttpServer, Route}; use actix_web::{web, App, HttpServer};
use actix_files as actix_fs; use actix_files as actix_fs;
use crate::{config::definition::Config, database::Database}; use crate::{config::definition::Config, database::Database};

View File

@ -1,6 +1,6 @@
mod webhooks; pub mod webhooks;
use actix_web::{web, Route, Scope}; use actix_web::Scope;

View File

@ -0,0 +1,28 @@
use std::{borrow::BorrowMut, sync::Mutex};
use actix_web::{web::Data, HttpResponse, HttpResponseBuilder, Result};
use crate::database::{models::{self, tokens::Token}, Database};
use super::types::ReleaseEvent;
pub async fn release_handler(db: Data<Mutex<Database>>, token: Token, body: ReleaseEvent, raw_body: String,) -> Result<HttpResponseBuilder> {
let title = format!("{} has been released on {}!", body.release.tag_name, body.repository.full_name);
dbg!(body);
// models::posts::Post::create_new(
// db.lock().unwrap().borrow_mut(),
// title,
// descr,
// img_url,
// origin_url,
// orignal_request
// );
Ok(HttpResponse::Ok())
}

View File

@ -1,9 +1,11 @@
pub mod types;
pub mod events;
use std::{borrow::BorrowMut, sync::Mutex}; use std::{borrow::BorrowMut, sync::Mutex};
use actix_web::{http::header, web::{self, Data}, HttpRequest, HttpResponse, HttpResponseBuilder, Responder, Result, Scope}; use actix_web::{http::header, web::{self, Bytes, Data}, HttpRequest, HttpResponse, Responder, Result, Scope};
use serde_json::Value;
use crate::database::{models::{self, tokens::Token}, Database}; use crate::database::{models, Database};
pub fn get_scope() -> Scope { pub fn get_scope() -> Scope {
Scope::new("/github") Scope::new("/github")
@ -13,7 +15,7 @@ pub fn get_scope() -> Scope {
) )
} }
pub async fn handler(req: HttpRequest, body: web::Json<Value>, db: Data<Mutex<Database>>) -> Result<impl Responder> { pub async fn handler(req: HttpRequest, body: Bytes, db: Data<Mutex<Database>>) -> Result<impl Responder> {
let Some(auth) = req.headers().get(header::AUTHORIZATION) else { let Some(auth) = req.headers().get(header::AUTHORIZATION) else {
return Ok(HttpResponse::Unauthorized()); return Ok(HttpResponse::Unauthorized());
}; };
@ -43,41 +45,17 @@ pub async fn handler(req: HttpRequest, body: web::Json<Value>, db: Data<Mutex<Da
return Ok(HttpResponse::BadRequest()); return Ok(HttpResponse::BadRequest());
}; };
match event_type { let Ok(json) = String::from_utf8(body.to_vec()) else {
"release" => { return Ok(HttpResponse::BadRequest());
release_handler(db, token, body).await };
}
let Ok(event) = types::Event::from_raw_json(event_type, json.clone()) else {
return Ok(HttpResponse::BadRequest());
};
match event {
types::Event::Release(body) => events::release_handler(db, token, body, json).await,
_ => Ok(HttpResponse::Ok()) _ => Ok(HttpResponse::Ok())
} }
}
pub async fn release_handler(db: Data<Mutex<Database>>, token: Token, body: web::Json<Value>) -> Result<HttpResponseBuilder> {
let Some(release) = body.get("release") else {
return Ok(HttpResponse::BadRequest());
};
let Some(origin_url) = release.get("repository") else {
return Ok(HttpResponse::BadRequest());
};
models::posts::Post::create_new(
db.lock().unwrap().borrow_mut(),
title,
descr,
img_url,
origin_url,
orignal_request
);
Ok(HttpResponse::Ok())
} }

View File

@ -0,0 +1,814 @@
use serde::Deserialize;
//? Taken from https://github.com/softprops/afterparty/blob/master/src/events.rs.in
//? Examples of payloads in https://github.com/softprops/afterparty/blob/master/data/
impl Event {
pub fn from_raw_json(event: &str, json: String) -> anyhow::Result<Self> {
let json = format!("{{\"{event}\": {json}}}");
let json: Self = serde_json::from_str(&json)?;
Ok(json)
}
}
#[derive(Debug, Deserialize, Clone)]
pub struct Value { pub json: serde_json::Value }
#[derive(Debug, Deserialize, Clone)]
pub enum Event {
CommitComment(CommitCommentEvent),
Create(CreateEvent),
Delete(DeleteEvent),
Deployment(DeploymentEvent),
DeploymentStatus(DeploymentStatusEvent),
Fork(ForkEvent),
Gollum(GollumEvent),
IssueComment(IssueCommentEvent),
Issues(IssuesEvent),
Member(MemberEvent),
Membership(MembershipEvent),
PageBuild(PageBuildEvent),
Ping(PingEvent),
Public(PublicEvent),
PullRequest(PullRequestEvent),
PullRequestReviewComment(PullRequestReviewCommentEvent),
Push(PushEvent),
Release(ReleaseEvent),
Repository(RepositoryEvent),
Status(StatusEvent),
TeamAdd(TeamAddEvent),
Watch(WatchEvent),
}
#[derive(Debug, Deserialize, Clone)]
pub struct CommitCommentEvent {
pub action: String,
pub comment: Comment,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct CreateEvent {
pub description: String,
pub master_branch: String,
pub pusher_type: String,
#[serde(rename="ref")]
pub _ref: String,
#[serde(rename="ref_type")]
pub ref_type: String,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct DeleteEvent {
pub pusher_type: String,
#[serde(rename="ref")]
pub _ref: String,
pub ref_type: String,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct DeploymentEvent {
pub deployment: Deployment,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct DeploymentStatusEvent {
pub deployment: Deployment,
pub deployment_status: DeploymentStatus,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ForkEvent {
pub forkee: Repository,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct GollumEvent {
pub pages: Vec<Pages>,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct IssueCommentEvent {
pub action: String,
pub comment: IssueCommentComment,
pub issue: Issue,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct IssuesEvent {
pub action: String,
pub issue: Issue,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct MemberEvent {
pub action: String,
pub member: User,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct MembershipEvent {
pub action: String,
pub member: User,
pub organization: Organization,
pub scope: String,
pub sender: User,
pub team: Team,
}
#[derive(Debug, Deserialize, Clone)]
pub struct PageBuildEvent {
pub build: PageBuild,
pub id: u64,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct PingEvent {
pub hook: Hook,
pub hook_id: u64,
pub repository: Repository,
pub sender: User,
pub zen: String,
}
#[derive(Debug, Deserialize, Clone)]
pub struct PublicEvent {
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct PullRequestEvent {
pub action: String,
pub number: u64,
pub pull_request: PullRequestDetails,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct PullRequestReviewCommentEvent {
pub action: String,
pub comment: PullRequestReviewComment,
pub pull_request: PullRequest,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct PushEvent {
pub after: String,
pub base_ref: Option<String>,
pub before: String,
pub commits: Vec<CommitStats>,
pub compare: String,
pub created: bool,
pub deleted: bool,
pub forced: bool,
pub head_commit: CommitStats,
pub pusher: UserRef, // note there aren't may fields here
#[serde(rename="ref")]
pub _ref: String,
pub repository: PushRepository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ReleaseEvent {
pub action: String,
pub release: Release,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct RepositoryEvent {
pub action: String,
pub organization: Organization,
pub repository: Repository,
pub sender: User,
}
#[derive(Debug, Deserialize, Clone)]
pub struct StatusEvent {
//pub branches: Vec<BranchRef>,
pub commit: CommitRef,
pub context: String,
pub created_at: String,
pub description: Option<String>,
pub id: u64,
pub name: String,
pub repository: Repository,
pub sender: User,
pub sha: String,
pub state: String,
pub target_url: Option<String>,
pub updated_at: String,
}
#[derive(Debug, Deserialize, Clone)]
pub struct TeamAddEvent {
pub organization: Organization,
pub repository: Repository,
pub sender: User,
pub team: Team,
}
#[derive(Debug, Deserialize, Clone)]
pub struct WatchEvent {
pub action: String,
pub repository: Repository,
pub sender: User,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Commit {
pub author: GitUser,
pub committer: GitUser,
pub message: String,
pub tree: GitRef,
pub url: String,
pub comment_count: u64
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct BranchRef {
pub commit: GitRef,
pub name: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct PageBuild {
pub commit: String,
pub created_at: String,
pub duration: u64,
pub error: Error,
pub pusher: User,
pub status: String,
pub updated_at: String,
pub url: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Comment {
pub body: String,
pub commit_id: String,
pub created_at: String,
pub html_url: String,
pub id: u64,
pub line: Option<String>,
pub path: Option<String>,
pub position: Option<String>,
pub updated_at: String,
pub url: String,
pub user: User,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct CommitRef {
pub author: User,
pub comments_url: String,
pub commit: Commit,
pub committer: User,
pub html_url: String,
pub parents: Vec<GitRef>,
pub sha: String,
pub url: String,
}
#[derive(Debug, Deserialize, Clone)]
pub struct Deployment {
pub created_at: String,
pub creator: User,
pub description: Option<String>,
pub environment: String,
pub id: u64,
pub payload: Value,
#[serde(rename="ref")]
pub _ref: String,
pub repository_url: String,
pub sha: String,
pub statuses_url: String,
pub task: String,
pub updated_at: String,
pub url: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct DeploymentStatus {
pub created_at: String,
pub creator: User,
pub deployment_url: String,
pub description: Option<String>,
pub id: u64,
pub repository_url: String,
pub state: String,
pub target_url: Option<String>,
pub updated_at: String,
pub url: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct CommitStats {
pub added: Vec<String>,
pub author: GitUser,
pub committer: GitUser,
pub distinct: bool,
pub id: String,
pub message: String,
pub modified: Vec<String>,
pub removed: Vec<String>,
pub timestamp: String,
pub tree_id: String,
pub url: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Hook {
pub active: bool,
pub config: Config,
pub created_at: String,
pub events: Vec<String>,
pub id: u64,
pub last_response: LastResponse,
pub name: String,
pub ping_url: String,
pub test_url: String,
pub _type: String,
pub updated_at: String,
pub url: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Issue {
pub assignee: Option<String>,
pub body: Option<String>,
pub closed_at: Option<String>,
pub comments: u64,
pub comments_url: String,
pub created_at: String,
pub events_url: String,
pub html_url: String,
pub id: u64,
pub labels: Vec<Label>,
pub labels_url: String,
pub locked: bool,
pub milestone: Option<String>,
pub number: u64,
pub state: String,
pub title: String,
pub updated_at: String,
pub url: String,
pub user: User,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct IssueCommentComment {
pub body: String,
pub created_at: String,
pub html_url: String,
pub id: u64,
pub issue_url: String,
pub updated_at: String,
pub url: String,
pub user: User,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Organization {
pub avatar_url: String,
pub events_url: String,
pub id: u64,
pub login: String,
pub members_url: String,
pub public_members_url: String,
pub repos_url: String,
pub url: String,
pub description: Option<String>
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Pages {
pub action: String,
pub html_url: String,
pub page_name: String,
pub sha: String,
pub summary: Option<String>,
pub title: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct PullRequestDetails {
pub _links: PullRequestLinks,
pub assignee: Option<String>,
pub base: PullSource,
pub body: Option<String>,
pub closed_at: Option<String>,
pub comments_url: String,
pub commits_url: String,
pub created_at: String,
pub diff_url: String,
pub head: PullSource,
pub html_url: String,
pub id: u64,
pub issue_url: String,
pub locked: bool,
pub merge_commit_sha: String,
pub merged_at: Option<String>,
pub milestone: Option<String>,
pub number: u64,
pub patch_url: String,
pub review_comment_url: String,
pub review_comments_url: String,
pub state: String,
pub statuses_url: String,
pub title: String,
pub updated_at: String,
pub url: String,
pub user: User,
pub merged: bool,
//mergeable": null,
pub mergeable_state: String,
//"merged_by": null,
pub comments: u64,
pub review_comments: u64,
pub commits: u64,
pub additions: u64,
pub deletions: u64,
pub changed_files: u64
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct PullRequest {
pub _links: PullRequestLinks,
pub assignee: Option<String>,
pub base: PullSource,
pub body: Option<String>,
pub closed_at: Option<String>,
pub comments_url: String,
pub commits_url: String,
pub created_at: String,
pub diff_url: String,
pub head: PullSource,
pub html_url: String,
pub id: u64,
pub issue_url: String,
pub locked: bool,
pub merge_commit_sha: String,
pub merged_at: Option<String>,
pub milestone: Option<String>,
pub number: u64,
pub patch_url: String,
pub review_comment_url: String,
pub review_comments_url: String,
pub state: String,
pub statuses_url: String,
pub title: String,
pub updated_at: String,
pub url: String,
pub user: User,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct PullRequestReviewComment {
#[serde(rename="_links")]
pub _links: PullRequestReviewCommentLinks,
pub body: String,
pub commit_id: String,
pub created_at: String,
pub diff_hunk: String,
pub html_url: String,
pub id: u64,
pub original_commit_id: String,
pub original_position: u64,
pub path: String,
pub position: u64,
pub pull_request_url: String,
pub updated_at: String,
pub url: String,
pub user: User,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Release {
pub assets: Vec<String>,
pub assets_url: String,
pub author: User,
pub body: Option<String>,
pub created_at: String,
pub draft: bool,
pub html_url: String,
pub id: u64,
pub name: Option<String>,
pub prerelease: bool,
pub published_at: String,
pub tag_name: String,
pub tarball_url: String,
pub target_commitish: String,
pub upload_url: String,
pub url: String,
pub zipball_url: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct UserRef {
pub name: String,
pub email: Option<String>
}
/// differs from Repository in owner type and some timestamp field types
#[derive(Default, Debug, Deserialize, Clone)]
pub struct PushRepository {
pub archive_url: String,
pub assignees_url: String,
pub blobs_url: String,
pub branches_url: String,
pub clone_url: String,
pub collaborators_url: String,
pub comments_url: String,
pub commits_url: String,
pub compare_url: String,
pub contents_url: String,
pub contributors_url: String,
pub created_at: u64,
pub default_branch: String,
pub description: String,
pub downloads_url: String,
pub events_url: String,
pub fork: bool,
pub forks_count: u64,
pub forks_url: String,
pub full_name: String,
pub git_commits_url: String,
pub git_refs_url: String,
pub git_tags_url: String,
pub git_url: String,
pub has_downloads: bool,
pub has_issues: bool,
pub has_pages: bool,
pub has_wiki: bool,
pub homepage: Option<String>,
pub hooks_url: String,
pub html_url: String,
pub id: u64,
pub issue_comment_url: String,
pub issue_events_url: String,
pub issues_url: String,
pub keys_url: String,
pub labels_url: String,
pub language: Option<String>,
pub languages_url: String,
pub merges_url: String,
pub milestones_url: String,
pub mirror_url: Option<String>,
pub name: String,
pub notifications_url: String,
pub open_issues: u64,
pub open_issues_count: u64,
pub owner: UserRef,
pub private: bool,
pub pulls_url: String,
pub pushed_at: u64,
pub releases_url: String,
pub size: u64,
pub ssh_url: String,
pub stargazers_count: u64,
pub stargazers_url: String,
pub statuses_url: String,
pub subscribers_url: String,
pub subscription_url: String,
pub svn_url: String,
pub tags_url: String,
pub teams_url: String,
pub trees_url: String,
pub updated_at: String,
pub url: String,
pub watchers: u64,
pub watchers_count: u64,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Repository {
pub archive_url: String,
pub assignees_url: String,
pub blobs_url: String,
pub branches_url: String,
pub clone_url: String,
pub collaborators_url: String,
pub comments_url: String,
pub commits_url: String,
pub compare_url: String,
pub contents_url: String,
pub contributors_url: String,
pub created_at: String,
pub default_branch: String,
pub description: String,
pub downloads_url: String,
pub events_url: String,
pub forks: u64,
pub forks_count: u64,
pub forks_url: String,
pub full_name: String,
pub git_commits_url: String,
pub git_refs_url: String,
pub git_tags_url: String,
pub git_url: String,
pub has_downloads: bool,
pub has_issues: bool,
pub has_pages: bool,
pub has_wiki: bool,
pub homepage: Option<String>,
pub hooks_url: String,
pub html_url: String,
pub id: u64,
pub issue_comment_url: String,
pub issue_events_url: String,
pub issues_url: String,
pub keys_url: String,
pub labels_url: String,
pub language: Option<String>,
pub languages_url: String,
pub merges_url: String,
pub milestones_url: String,
pub mirror_url: Option<String>,
pub name: String,
pub notifications_url: String,
pub open_issues: u64,
pub open_issues_count: u64,
pub owner: User,
pub private: bool,
pub pulls_url: String,
pub pushed_at: String,
pub releases_url: String,
pub size: u64,
pub ssh_url: String,
pub stargazers_count: u64,
pub stargazers_url: String,
pub statuses_url: String,
pub subscribers_url: String,
pub subscription_url: String,
pub svn_url: String,
pub tags_url: String,
pub teams_url: String,
pub trees_url: String,
pub updated_at: String,
pub url: String,
pub watchers: u64,
pub watchers_count: u64,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Team {
pub id: u64,
pub members_url: String,
pub name: String,
pub permission: String,
pub repositories_url: String,
pub slug: String,
pub url: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct GitUser {
pub email: String,
pub name: String,
pub username: Option<String>,
pub date: Option<String>
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Config {
pub content_type: String,
pub insecure_ssl: String,
pub secret: String,
pub url: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Error {
pub message: Option<String>,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct PullSource {
pub label: String,
#[serde(rename="ref")]
pub _ref: String,
pub repo: Repository,
pub sha: String,
pub user: User,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Label {
pub color: String,
pub name: String,
pub url: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct LastResponse {
pub code: Option<String>,
pub message: Option<String>,
pub status: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct PullRequestLinks {
pub comments: Link,
pub commits: Link,
pub html: Link,
pub issue: Link,
pub review_comment: Link,
pub review_comments: Link,
#[serde(rename="self")]
pub _self: Link,
pub statuses: Link,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct PullRequestInnerBase {
pub label: String,
#[serde(rename="ref")]
pub _ref: String,
pub repo: Repository,
pub sha: String,
pub user: User,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct PullRequestInnerHead {
pub label: String,
#[serde(rename="ref")]
pub _ref: String,
pub repo: Repository,
pub sha: String,
pub user: User,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct PullRequestReviewCommentLinks {
pub html: Link,
pub pull_request: Link,
#[serde(rename="self")]
pub _self: Link,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct User {
pub avatar_url: String,
pub events_url: String,
pub followers_url: String,
pub following_url: String,
pub gists_url: String,
pub gravatar_id: String,
pub html_url: String,
pub id: u64,
pub login: String,
pub organizations_url: String,
pub received_events_url: String,
pub repos_url: String,
pub site_admin: bool,
pub starred_url: String,
pub subscriptions_url: String,
#[serde(rename="type")]
pub _type: String,
pub url: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct Link {
pub href: String,
}
#[derive(Default, Debug, Deserialize, Clone)]
pub struct GitRef {
pub sha: String,
pub url: String,
}

View File

@ -1,6 +1,6 @@
use actix_web::{web, Scope}; use actix_web::Scope;
mod github; pub mod github;
pub fn get_scope() -> Scope { pub fn get_scope() -> Scope {