diff options
| author | Fuwn <[email protected]> | 2022-03-24 02:17:31 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2022-03-24 02:17:31 -0700 |
| commit | 993ae59613d41ff25c33f814aed6415a645477dc (patch) | |
| tree | ae70cc1059a242b00996336844eb1d53e43bf466 /src/utils.rs | |
| parent | feat: cache github api (diff) | |
| download | api-worker-993ae59613d41ff25c33f814aed6415a645477dc.tar.xz api-worker-993ae59613d41ff25c33f814aed6415a645477dc.zip | |
feat(routes): support for anime boys
Diffstat (limited to 'src/utils.rs')
| -rw-r--r-- | src/utils.rs | 90 |
1 files changed, 69 insertions, 21 deletions
diff --git a/src/utils.rs b/src/utils.rs index 333a1c0..c42c15c 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -20,25 +20,52 @@ use std::{lazy::SyncLazy, sync::Mutex}; use worker::Cors; -use crate::{constants, structures::GitHubAPIResponse}; - -static CACHE_UNSET: SyncLazy<Mutex<bool>> = SyncLazy::new(|| Mutex::new(true)); -static CACHE_ACCESS_COUNT: SyncLazy<Mutex<usize>> = - SyncLazy::new(|| Mutex::new(0)); -static GITHUB_API_CACHE: SyncLazy<Mutex<GitHubAPIResponse>> = - SyncLazy::new(|| Mutex::new(GitHubAPIResponse::default())); +use crate::{ + constants, + structures::{GitHubAPIResponse, Type}, +}; + +static CACHE_UNSET: SyncLazy<Mutex<(bool, bool)>> = + SyncLazy::new(|| Mutex::new((true, true))); +static CACHE_ACCESS_COUNT: SyncLazy<Mutex<(usize, usize)>> = + SyncLazy::new(|| Mutex::new((0, 0))); +static GITHUB_API_CACHE: SyncLazy< + Mutex<(GitHubAPIResponse, GitHubAPIResponse)>, +> = SyncLazy::new(|| { + Mutex::new((GitHubAPIResponse::default(), GitHubAPIResponse::default())) +}); + +use crate::boys; /// # Errors /// if GitHub API is unresponsive pub async fn github_api( + repository: Type, ) -> Result<GitHubAPIResponse, Box<dyn std::error::Error>> { - if *CACHE_UNSET.lock().unwrap() - || *CACHE_ACCESS_COUNT.lock().unwrap() % 50 == 0 - { - *CACHE_UNSET.lock().unwrap() = false; + let unset = if repository == Type::Girls { + (*CACHE_UNSET.lock().unwrap()).0 + } else { + (*CACHE_UNSET.lock().unwrap()).1 + }; + let access_count = if repository == Type::Girls { + (*CACHE_ACCESS_COUNT.lock().unwrap()).0 + } else { + (*CACHE_ACCESS_COUNT.lock().unwrap()).1 + }; + + if unset || access_count % 50 == 0 { + if repository == Type::Girls { + (*CACHE_UNSET.lock().unwrap()).0 = false; + } else { + (*CACHE_UNSET.lock().unwrap()).1 = false; + }; let mut client = reqwest::Client::new() - .get(&*constants::GITHUB_API_ENDPOINT) + .get(if repository == Type::Girls { + &*constants::GITHUB_API_ENDPOINT + } else { + &*boys::GITHUB_API_ENDPOINT + }) .header( "User-Agent", format!("senpy-club/api-worker - {}", env!("VERGEN_GIT_SHA")), @@ -54,25 +81,39 @@ pub async fn github_api( ); } - *GITHUB_API_CACHE.lock().unwrap() = client + let response = client .send() .await? .json::<GitHubAPIResponse>() .await .unwrap_or_default(); - } - *CACHE_ACCESS_COUNT.lock().unwrap() += 1; + if repository == Type::Girls { + (*GITHUB_API_CACHE.lock().unwrap()).0 = response; + } else { + (*GITHUB_API_CACHE.lock().unwrap()).1 = response; + } + } - Ok((*GITHUB_API_CACHE.lock().unwrap()).clone()) + if repository == Type::Girls { + (*CACHE_ACCESS_COUNT.lock().unwrap()).0 += 1; + } else { + (*CACHE_ACCESS_COUNT.lock().unwrap()).1 += 1; + }; + + Ok(if repository == Type::Girls { + (*GITHUB_API_CACHE.lock().unwrap()).0.clone() + } else { + (*GITHUB_API_CACHE.lock().unwrap()).1.clone() + }) } /// # Panics /// if GitHub API is unresponsive -pub async fn filter_languages() -> Vec<String> { +pub async fn filter_languages(repository: Type) -> Vec<String> { let mut languages = vec![]; - for i in github_api().await.unwrap().tree { + for i in github_api(repository).await.unwrap().tree { if i.r#type == "tree" { languages.push(i.path); } @@ -83,19 +124,26 @@ pub async fn filter_languages() -> Vec<String> { /// # Panics /// if GitHub API is unresponsive -pub async fn filter_images_by_language(language: &str) -> Vec<String> { +pub async fn filter_images_by_language( + language: &str, + repository: Type, +) -> Vec<String> { let mut images = vec![]; // URL (percent) encoding of pound symbol to pound symbol let language = language.replace("%23", "#"); - for item in github_api().await.unwrap().tree { + for item in github_api(repository.clone()).await.unwrap().tree { if item.path.split('/').collect::<Vec<&str>>()[0] == language && item.path.contains('/') { images.push(format!( "{}{}", - *constants::GITHUB_USER_CONTENT, + if repository == Type::Girls { + &*constants::GITHUB_USER_CONTENT + } else { + &*boys::GITHUB_USER_CONTENT + }, // Pound symbols to URL (percent) encoding of pound symbol because we // are pushing a URL, not a string item.path.replace('#', "%23") |