switched public api to caching library
This commit is contained in:
26
backend/public/Cargo.lock
generated
26
backend/public/Cargo.lock
generated
@@ -225,6 +225,15 @@ dependencies = [
|
|||||||
"either",
|
"either",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cache"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"fred",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.1.21"
|
version = "1.1.21"
|
||||||
@@ -1252,6 +1261,7 @@ name = "public"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"axum",
|
"axum",
|
||||||
|
"cache",
|
||||||
"chrono",
|
"chrono",
|
||||||
"dotenvy",
|
"dotenvy",
|
||||||
"fred",
|
"fred",
|
||||||
@@ -1517,18 +1527,18 @@ checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.210"
|
version = "1.0.219"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
|
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.210"
|
version = "1.0.219"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
|
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -1537,9 +1547,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.128"
|
version = "1.0.140"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8"
|
checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itoa",
|
"itoa",
|
||||||
"memchr",
|
"memchr",
|
||||||
@@ -1911,9 +1921,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.77"
|
version = "2.0.87"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
|
checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@@ -25,3 +25,4 @@ serde_json = "1.0.128"
|
|||||||
chrono = "0.4.38"
|
chrono = "0.4.38"
|
||||||
xml = "0.8.20"
|
xml = "0.8.20"
|
||||||
fred = "10.1.0"
|
fred = "10.1.0"
|
||||||
|
cache = { version = "*", path = "../cache" }
|
||||||
|
@@ -5,7 +5,7 @@ use axum::{
|
|||||||
routing::get,
|
routing::get,
|
||||||
Json,
|
Json,
|
||||||
};
|
};
|
||||||
use fred::types::Expiration;
|
use cache::Expiration;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::{datasources::authors::AuthorsDatasource, state::AppState};
|
use crate::{datasources::authors::AuthorsDatasource, state::AppState};
|
||||||
|
@@ -6,8 +6,8 @@ use axum::{
|
|||||||
routing::{get, post},
|
routing::{get, post},
|
||||||
Json,
|
Json,
|
||||||
};
|
};
|
||||||
|
use cache::{Expiration, SetOptions};
|
||||||
use chrono::Utc;
|
use chrono::Utc;
|
||||||
use fred::types::{Expiration, SetOptions};
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
|
@@ -15,8 +15,8 @@ use axum::{
|
|||||||
routing::get,
|
routing::get,
|
||||||
Json, Router,
|
Json, Router,
|
||||||
};
|
};
|
||||||
|
use cache::Expiration;
|
||||||
use chrono::Utc;
|
use chrono::Utc;
|
||||||
use fred::types::Expiration;
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
use crate::{datasources::projects::ProjectsDatasource, state::AppState, utils::datetime::*};
|
use crate::{datasources::projects::ProjectsDatasource, state::AppState, utils::datetime::*};
|
||||||
use axum::http::{HeaderMap, HeaderValue};
|
|
||||||
use axum::{extract::State, http::StatusCode, response::IntoResponse, routing::get, Json, Router};
|
use axum::{extract::State, http::StatusCode, response::IntoResponse, routing::get, Json, Router};
|
||||||
use fred::types::Expiration;
|
use cache::Expiration;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(sqlx::FromRow, Deserialize, Serialize, Debug, Clone)]
|
#[derive(sqlx::FromRow, Deserialize, Serialize, Debug, Clone)]
|
||||||
|
@@ -1,83 +1,17 @@
|
|||||||
use fred::interfaces::KeysInterface;
|
|
||||||
use fred::{clients::Pool, prelude::*};
|
|
||||||
use sqlx::PgPool;
|
use sqlx::PgPool;
|
||||||
|
|
||||||
pub type AppState = std::sync::Arc<tokio::sync::Mutex<AppInternalState>>;
|
pub type AppState = std::sync::Arc<tokio::sync::Mutex<AppInternalState>>;
|
||||||
|
|
||||||
pub struct AppInternalState {
|
pub struct AppInternalState {
|
||||||
pub database: sqlx::postgres::PgPool,
|
pub database: sqlx::postgres::PgPool,
|
||||||
pub cache: Cache,
|
pub cache: cache::Cache,
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Cache {
|
|
||||||
pub inmem: Pool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AppInternalState {
|
impl AppInternalState {
|
||||||
pub fn new(database: PgPool, cache: Pool) -> Self {
|
pub fn new(database: PgPool, cache: cache::Pool) -> Self {
|
||||||
AppInternalState {
|
AppInternalState {
|
||||||
database,
|
database,
|
||||||
cache: Cache { inmem: cache },
|
cache: cache::Cache { inmem: cache },
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Cache {
|
|
||||||
pub async fn get<T>(&mut self, key: String) -> Result<Option<T>, Box<dyn std::error::Error>>
|
|
||||||
where
|
|
||||||
T: for<'de> serde::Deserialize<'de>,
|
|
||||||
{
|
|
||||||
self.is_connected()?;
|
|
||||||
let value: Option<String> = self.inmem.get(&key).await?;
|
|
||||||
|
|
||||||
match value {
|
|
||||||
Some(json_str) => match serde_json::from_str::<T>(&json_str) {
|
|
||||||
Ok(deserialized) => Ok(Some(deserialized)),
|
|
||||||
Err(_) => Ok(None),
|
|
||||||
},
|
|
||||||
None => Ok(None),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn set<T>(
|
|
||||||
&mut self,
|
|
||||||
key: String,
|
|
||||||
contents: &T,
|
|
||||||
expiration: Option<Expiration>,
|
|
||||||
set_opts: Option<SetOptions>,
|
|
||||||
get: bool,
|
|
||||||
) -> Result<(), Box<dyn std::error::Error>>
|
|
||||||
where
|
|
||||||
T: for<'de> serde::Deserialize<'de> + serde::Serialize,
|
|
||||||
{
|
|
||||||
self.is_connected()?;
|
|
||||||
let json_string = match serde_json::to_string::<T>(contents) {
|
|
||||||
Ok(s) => s,
|
|
||||||
Err(_) => {
|
|
||||||
return Err(Box::new(std::io::Error::new(
|
|
||||||
std::io::ErrorKind::Other,
|
|
||||||
"Unable to deserialize contents passed to cache".to_string(),
|
|
||||||
)))
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok(self
|
|
||||||
.inmem
|
|
||||||
.set(key, json_string, expiration, set_opts, get)
|
|
||||||
.await?)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn del(&mut self, key: String) -> Result<(), Box<dyn std::error::Error>> {
|
|
||||||
Ok(self.inmem.del(key).await?)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn is_connected(&mut self) -> Result<(), Box<dyn std::error::Error>> {
|
|
||||||
match self.inmem.is_connected() {
|
|
||||||
true => Ok(()),
|
|
||||||
false => Err(Box::new(std::io::Error::new(
|
|
||||||
std::io::ErrorKind::Other,
|
|
||||||
"Not connected to cache".to_string(),
|
|
||||||
))),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user