aboutsummaryrefslogtreecommitdiff
path: root/src/utils.rs
diff options
context:
space:
mode:
authorFuwn <[email protected]>2022-03-24 02:17:31 -0700
committerFuwn <[email protected]>2022-03-24 02:17:31 -0700
commit993ae59613d41ff25c33f814aed6415a645477dc (patch)
treeae70cc1059a242b00996336844eb1d53e43bf466 /src/utils.rs
parentfeat: cache github api (diff)
downloadapi-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.rs90
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")