diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/helpers.rs | 17 | ||||
-rw-r--r-- | src/repository/models.rs | 16 |
2 files changed, 31 insertions, 2 deletions
diff --git a/src/helpers.rs b/src/helpers.rs index d915a50..2dbacfd 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -1,3 +1,4 @@ +use regex::Regex; use uuid::Uuid; /// Returns a valid Uuid if `id` is not a valid Uuid @@ -7,3 +8,19 @@ pub fn uuid_from_string(id: &String) -> Uuid { Err(_) => Uuid::parse_str("00000000000000000000000000000000").unwrap(), }; } + +/// Check if a path is into the "valid git repositories" and returns the name +pub fn name_of_git_repository(url: &String) -> Option<String> { + const GITHUB_RE: &str = r"^(http(s)?://)?(www.)?github.com/(?P<username>[a-zA-Z0-9-]+)/(?P<repository>[a-zA-Z0-9-]+)"; + let re = Regex::new(GITHUB_RE).unwrap(); + + if !re.is_match(&url) { + return None; + } + + let captures = re.captures(&url).unwrap(); + let name = captures.name("username").unwrap().as_str(); + let repo = captures.name("repository").unwrap().as_str(); + + Some(format!("{}/{}", name, repo)) +} diff --git a/src/repository/models.rs b/src/repository/models.rs index 1fd1649..1cbf3bb 100644 --- a/src/repository/models.rs +++ b/src/repository/models.rs @@ -1,5 +1,6 @@ use crate::db::get_client; use crate::errors::{AppError, AppErrorType}; +use crate::helpers::name_of_git_repository; use chrono::NaiveDateTime; use deadpool_postgres::{Client, Pool}; @@ -133,9 +134,20 @@ impl Repository { ) -> Result<Repository, AppError> { let client = get_client(pool.clone()).await.unwrap(); + let repo_name: String = match name_of_git_repository(&data.url) { + Some(path) => path, + None => { + return Err(AppError { + message: Some("Repository not found".to_string()), + cause: Some("".to_string()), + error_type: AppErrorType::NotFoundError, + }); + } + }; + // Search a repository that matches with that url, because if it's // exists, the server do not create a clone - let repo_search = Repository::search(&client, data.url.clone()).await; + let repo_search = Repository::search(&client, repo_name.clone()).await; match repo_search { Ok(_) => { return Err(AppError { @@ -168,7 +180,7 @@ impl Repository { }; let repo = client - .query(&statement, &[&uuid, &data.url, &user_ip]) + .query(&statement, &[&uuid, &repo_name, &user_ip]) .await? .iter() .map(|row| Repository::from_row_ref(row).unwrap()) |