some ui refactorings,

use_user_db option for storing api user inside db file
This commit is contained in:
euzu
2025-02-26 13:46:23 +01:00
parent 4a5f1b488d
commit cbef4e3d4b
16 changed files with 493 additions and 123 deletions
+7
View File
@@ -50,6 +50,7 @@ async fn save_config_api_proxy_user(
) -> HttpResponse {
let mut users = req.0;
let mut usernames = HashSet::new();
let mut tokens = HashSet::new();
for target_user in &mut users {
for credential in &mut target_user.credentials {
credential.trim();
@@ -60,6 +61,12 @@ async fn save_config_api_proxy_user(
return HttpResponse::BadRequest().json(json!({"error": format!("Duplicate username {}", &credential.username)}));
}
usernames.insert(&credential.username);
if let Some(token) = &credential.token {
if tokens.contains(token) {
return HttpResponse::BadRequest().json(json!({"error": format!("Duplicate token {token}")}));
}
tokens.insert(token);
}
}
}
@@ -387,56 +387,56 @@ pub async fn create_provider_stream(cfg: &Config,
}
}
#[cfg(test)]
mod tests {
use crate::api::model::streams::provider_stream_factory::PlaylistItemType;
use crate::api::model::streams::provider_stream_factory::{create_provider_stream, BufferStreamOptions};
use actix_web::test;
use actix_web::test::TestRequest;
use actix_web::web;
use actix_web::App;
use actix_web::{HttpRequest, HttpResponse};
use futures::StreamExt;
use std::sync::Arc;
use crate::model::config::Config;
#[actix_rt::test]
async fn test_stream() {
let app = App::new().route("/test", web::get().to(test_stream_handler));
let server = test::init_service(app).await;
let req = TestRequest::get().uri("/test").to_request();
let _response = test::call_service(&server, req).await;
}
async fn test_stream_handler(req: HttpRequest) -> HttpResponse {
let cfg = Config::default();
let mut counter = 5;
let client = Arc::new(reqwest::Client::new());
let url = url::Url::parse("https://info.cern.ch/hypertext/WWW/TheProject.html").unwrap();
let input = None;
let options = BufferStreamOptions::new(PlaylistItemType::Live, true, true, 0, false);
let value = create_provider_stream(&cfg, Arc::clone(&client), &url, &req, input, options);
let mut values = value.await;
'outer: while let Some((ref mut stream, info)) = values.as_mut() {
if info.is_some() {
println!("{:?}", info.as_ref().unwrap());
}
while let Some(result) = stream.next().await {
match result {
Ok(bytes) => {
println!("Received {} bytes {bytes:?}", bytes.len());
counter -= 1;
if counter < 0 {
break 'outer;
}
}
Err(err) => {
eprintln!("Error occurred: {}", err);
break 'outer;
}
}
}
}
HttpResponse::Ok().finish()
}
}
// #[cfg(test)]
// mod tests {
// use crate::api::model::streams::provider_stream_factory::PlaylistItemType;
// use crate::api::model::streams::provider_stream_factory::{create_provider_stream, BufferStreamOptions};
// use actix_web::test;
// use actix_web::test::TestRequest;
// use actix_web::web;
// use actix_web::App;
// use actix_web::{HttpRequest, HttpResponse};
// use futures::StreamExt;
// use std::sync::Arc;
// use crate::model::config::Config;
//
// #[actix_rt::test]
// async fn test_stream() {
// let app = App::new().route("/test", web::get().to(test_stream_handler));
// let server = test::init_service(app).await;
// let req = TestRequest::get().uri("/test").to_request();
// let _response = test::call_service(&server, req).await;
// }
// async fn test_stream_handler(req: HttpRequest) -> HttpResponse {
// let cfg = Config::default();
// let mut counter = 5;
// let client = Arc::new(reqwest::Client::new());
// let url = url::Url::parse("https://info.cern.ch/hypertext/WWW/TheProject.html").unwrap();
// let input = None;
//
// let options = BufferStreamOptions::new(PlaylistItemType::Live, true, true, 0, false);
// let value = create_provider_stream(&cfg, Arc::clone(&client), &url, &req, input, options);
// let mut values = value.await;
// 'outer: while let Some((ref mut stream, info)) = values.as_mut() {
// if info.is_some() {
// println!("{:?}", info.as_ref().unwrap());
// }
// while let Some(result) = stream.next().await {
// match result {
// Ok(bytes) => {
// println!("Received {} bytes {bytes:?}", bytes.len());
// counter -= 1;
// if counter < 0 {
// break 'outer;
// }
// }
// Err(err) => {
// eprintln!("Error occurred: {}", err);
// break 'outer;
// }
// }
// }
// }
// HttpResponse::Ok().finish()
// }
// }