From 6ff34e0ddb1940aeb7b69e4d6b6f35b348a6f541 Mon Sep 17 00:00:00 2001 From: jb-alvarado Date: Sun, 4 Sep 2022 17:07:16 +0200 Subject: [PATCH] replace timezone with utc offset --- Cargo.lock | 2 +- docs/api.md | 8 ++++---- ffplayout-api/Cargo.toml | 2 +- ffplayout-api/src/utils/handles.rs | 25 ++++++++++++++----------- ffplayout-api/src/utils/mod.rs | 17 +++++++++++++++++ ffplayout-api/src/utils/models.rs | 5 ++++- ffplayout-api/src/utils/routes.rs | 8 ++++---- 7 files changed, 45 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 41911677..f672e953 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -960,7 +960,7 @@ dependencies = [ [[package]] name = "ffplayout-api" -version = "0.5.4" +version = "0.6.0" dependencies = [ "actix-files", "actix-multipart", diff --git a/docs/api.md b/docs/api.md index 020ddcaf..d2b21627 100644 --- a/docs/api.md +++ b/docs/api.md @@ -70,8 +70,8 @@ curl -X GET http://127.0.0.1:8787/api/channel/1 -H "Authorization: Bearer ```BASH curl -X PATCH http://127.0.0.1:8787/api/channel/1 -H "Content-Type: application/json" \ -d '{ "id": 1, "name": "Channel 1", "preview_url": "http://localhost/live/stream.m3u8", \ -"config_path": "/etc/ffplayout/ffplayout.yml", "extra_extensions": "jpg,jpeg,png", "timezone": "Europe/Berlin"}' \ +"config_path": "/etc/ffplayout/ffplayout.yml", "extra_extensions": "jpg,jpeg,png"}' \ -H "Authorization: Bearer " ``` @@ -96,7 +96,7 @@ curl -X PATCH http://127.0.0.1:8787/api/channel/1 -H "Content-Type: application/ curl -X POST http://127.0.0.1:8787/api/channel/ -H "Content-Type: application/json" \ -d '{ "name": "Channel 2", "preview_url": "http://localhost/live/channel2.m3u8", \ "config_path": "/etc/ffplayout/channel2.yml", "extra_extensions": "jpg,jpeg,png", -"timezone": "Europe/Berlin", "service": "ffplayout@channel2.service" }' \ +"service": "ffplayout@channel2.service" }' \ -H "Authorization: Bearer " ``` diff --git a/ffplayout-api/Cargo.toml b/ffplayout-api/Cargo.toml index a3cd863c..b89eb28e 100644 --- a/ffplayout-api/Cargo.toml +++ b/ffplayout-api/Cargo.toml @@ -4,7 +4,7 @@ description = "Rest API for ffplayout" license = "GPL-3.0" authors = ["Jonathan Baecker jonbae77@gmail.com"] readme = "README.md" -version = "0.5.4" +version = "0.6.0" edition = "2021" [dependencies] diff --git a/ffplayout-api/src/utils/handles.rs b/ffplayout-api/src/utils/handles.rs index 6ab132e0..f505b5de 100644 --- a/ffplayout-api/src/utils/handles.rs +++ b/ffplayout-api/src/utils/handles.rs @@ -8,7 +8,7 @@ use simplelog::*; use sqlx::{migrate::MigrateDatabase, sqlite::SqliteQueryResult, Pool, Sqlite, SqlitePool}; use crate::utils::{ - db_path, + db_path, local_utc_offset, models::{Channel, TextPreset, User}, GlobalSettings, }; @@ -40,7 +40,6 @@ async fn create_schema() -> Result { preview_url TEXT NOT NULL, config_path TEXT NOT NULL, extra_extensions TEXT NOT NULL, - timezone TEXT NOT NULL, service TEXT NOT NULL, UNIQUE(name, service) ); @@ -111,8 +110,8 @@ pub async fn db_init(domain: Option) -> Result<&'static str, Box Result { pub async fn db_get_channel(id: &i64) -> Result { let conn = db_connection().await?; let query = "SELECT * FROM channels WHERE id = $1"; - let result: Channel = sqlx::query_as(query).bind(id).fetch_one(&conn).await?; + let mut result: Channel = sqlx::query_as(query).bind(id).fetch_one(&conn).await?; conn.close().await; + result.utc_offset = local_utc_offset(); + Ok(result) } pub async fn db_get_all_channels() -> Result, sqlx::Error> { let conn = db_connection().await?; let query = "SELECT * FROM channels"; - let result: Vec = sqlx::query_as(query).fetch_all(&conn).await?; + let mut results: Vec = sqlx::query_as(query).fetch_all(&conn).await?; conn.close().await; - Ok(result) + for result in results.iter_mut() { + result.utc_offset = local_utc_offset(); + } + + Ok(results) } pub async fn db_update_channel( @@ -171,14 +176,13 @@ pub async fn db_update_channel( ) -> Result { let conn = db_connection().await?; - let query = "UPDATE channels SET name = $2, preview_url = $3, config_path = $4, extra_extensions = $5, timezone = $6 WHERE id = $1"; + let query = "UPDATE channels SET name = $2, preview_url = $3, config_path = $4, extra_extensions = $5 WHERE id = $1"; let result: SqliteQueryResult = sqlx::query(query) .bind(id) .bind(channel.name) .bind(channel.preview_url) .bind(channel.config_path) .bind(channel.extra_extensions) - .bind(channel.timezone) .execute(&conn) .await?; conn.close().await; @@ -189,13 +193,12 @@ pub async fn db_update_channel( pub async fn db_add_channel(channel: Channel) -> Result { let conn = db_connection().await?; - let query = "INSERT INTO channels (name, preview_url, config_path, extra_extensions, timezone, service) VALUES($1, $2, $3, $4, $5, $6)"; + let query = "INSERT INTO channels (name, preview_url, config_path, extra_extensions, service) VALUES($1, $2, $3, $4, $5)"; let result = sqlx::query(query) .bind(channel.name) .bind(channel.preview_url) .bind(channel.config_path) .bind(channel.extra_extensions) - .bind(channel.timezone) .bind(channel.service) .execute(&conn) .await?; diff --git a/ffplayout-api/src/utils/mod.rs b/ffplayout-api/src/utils/mod.rs index 00386ca3..e60ed063 100644 --- a/ffplayout-api/src/utils/mod.rs +++ b/ffplayout-api/src/utils/mod.rs @@ -5,6 +5,7 @@ use std::{ path::Path, }; +use chrono::prelude::*; use faccess::PathExt; use once_cell::sync::OnceCell; use rpassword::read_password; @@ -222,3 +223,19 @@ pub async fn read_log_file(channel_id: &i64, date: &str) -> Result i32 { + let mut offset = Local::now().format("%:z").to_string(); + let operator = offset.remove(0); + let mut utc_offset = 0; + + if let Some((r, f)) = offset.split_once(':') { + utc_offset = r.parse::().unwrap_or(0) * 60 + f.parse::().unwrap_or(0); + + if operator == '-' && utc_offset > 0 { + utc_offset = -utc_offset; + } + } + + utc_offset +} diff --git a/ffplayout-api/src/utils/models.rs b/ffplayout-api/src/utils/models.rs index 0e8fdd1d..df57b73e 100644 --- a/ffplayout-api/src/utils/models.rs +++ b/ffplayout-api/src/utils/models.rs @@ -66,6 +66,9 @@ pub struct Channel { pub preview_url: String, pub config_path: String, pub extra_extensions: String, - pub timezone: String, pub service: String, + + #[sqlx(default)] + #[serde(default)] + pub utc_offset: i32, } diff --git a/ffplayout-api/src/utils/routes.rs b/ffplayout-api/src/utils/routes.rs index 28a41b09..da750d4c 100644 --- a/ffplayout-api/src/utils/routes.rs +++ b/ffplayout-api/src/utils/routes.rs @@ -235,8 +235,8 @@ async fn add_user(data: web::Json) -> Result /// "preview_url": "http://localhost/live/preview.m3u8", /// "config_path": "/etc/ffplayout/ffplayout.yml", /// "extra_extensions": "jpg,jpeg,png", -/// "timezone": "UTC", -/// "service": "ffplayout.service" +/// "service": "ffplayout.service", +/// "utc_offset": "+120" /// } /// ``` #[get("/channel/{id}")] @@ -269,7 +269,7 @@ async fn get_all_channels() -> Result { /// ```BASH /// curl -X PATCH http://127.0.0.1:8787/api/channel/1 -H "Content-Type: application/json" \ /// -d '{ "id": 1, "name": "Channel 1", "preview_url": "http://localhost/live/stream.m3u8", \ -/// "config_path": "/etc/ffplayout/ffplayout.yml", "extra_extensions": "jpg,jpeg,png", "timezone": "Europe/Berlin"}' \ +/// "config_path": "/etc/ffplayout/ffplayout.yml", "extra_extensions": "jpg,jpeg,png"}' \ /// -H "Authorization: Bearer " /// ``` #[patch("/channel/{id}")] @@ -291,7 +291,7 @@ async fn patch_channel( /// curl -X POST http://127.0.0.1:8787/api/channel/ -H "Content-Type: application/json" \ /// -d '{ "name": "Channel 2", "preview_url": "http://localhost/live/channel2.m3u8", \ /// "config_path": "/etc/ffplayout/channel2.yml", "extra_extensions": "jpg,jpeg,png", -/// "timezone": "Europe/Berlin", "service": "ffplayout@channel2.service" }' \ +/// "service": "ffplayout@channel2.service" }' \ /// -H "Authorization: Bearer " /// ``` #[post("/channel/")]