1
0
mirror of https://gitlab.com/comunic/comunicapiv3 synced 2024-11-25 23:09:22 +00:00

Add banner

This commit is contained in:
Pierre HUBERT 2021-12-29 19:10:47 +01:00
parent 80d8961160
commit bbe8252f9d
3 changed files with 79 additions and 1 deletions

View File

@ -76,6 +76,26 @@ rtc-relay:
# Admin URL # Admin URL
admin-url: http://localhost:3001 admin-url: http://localhost:3001
# Global banner. It can be used to notify about an upcoming maintenance operation for example
banner:
# Specify whether the banner should be shown or not
enabled: true
# Optional expiration time for the banner. Set to 0 to show the message forever
expire: 1641801081
# Nature of the banner. It can be either "information", "warning", "success"
nature: warning
# The message of the banner, available in different languages
message:
fr: Une maintenance planifiée va provoquer une interruption de service de quelques minutes.
en: A planned maintenance will provoke a short unavailability of the service.
# Optional URL to "learn more" about the message. Leave an empty value to disable
link: https://about.communiquons.org/
# List of #Forez groups # List of #Forez groups
# #
# This option allows to enable some extra features for these groups # This option allows to enable some extra features for these groups

View File

@ -7,7 +7,7 @@ use crate::constants::{conservation_policy, MIN_SUPPORTED_MOBILE_VERSION, passwo
use crate::constants::accounts_info_policy::{MAX_FIRST_NAME_LENGTH, MAX_LAST_NAME_LENGTH, MAX_LOCATION_LENGTH, MIN_FIRST_NAME_LENGTH, MIN_LAST_NAME_LENGTH}; use crate::constants::accounts_info_policy::{MAX_FIRST_NAME_LENGTH, MAX_LAST_NAME_LENGTH, MAX_LOCATION_LENGTH, MIN_FIRST_NAME_LENGTH, MIN_LAST_NAME_LENGTH};
use crate::constants::conversations::{ALLOWED_CONVERSATION_FILES_TYPES, CONVERSATION_FILES_MAX_SIZE, CONVERSATION_WRITING_EVENT_INTERVAL, CONVERSATION_WRITING_EVENT_LIFETIME, MAX_CONV_IMAGE_MESSAGE_WIDTH, MAX_CONV_LOGO_HEIGHT, MAX_CONV_LOGO_WIDTH, MAX_CONV_MESSAGE_THUMBNAIL_HEIGHT, MAX_CONV_MESSAGE_THUMBNAIL_WIDTH, MAX_CONVERSATION_MESSAGE_LENGTH, MAX_CONVERSATION_NAME_LENGTH, MIN_CONVERSATION_MESSAGE_LENGTH}; use crate::constants::conversations::{ALLOWED_CONVERSATION_FILES_TYPES, CONVERSATION_FILES_MAX_SIZE, CONVERSATION_WRITING_EVENT_INTERVAL, CONVERSATION_WRITING_EVENT_LIFETIME, MAX_CONV_IMAGE_MESSAGE_WIDTH, MAX_CONV_LOGO_HEIGHT, MAX_CONV_LOGO_WIDTH, MAX_CONV_MESSAGE_THUMBNAIL_HEIGHT, MAX_CONV_MESSAGE_THUMBNAIL_WIDTH, MAX_CONVERSATION_MESSAGE_LENGTH, MAX_CONVERSATION_NAME_LENGTH, MIN_CONVERSATION_MESSAGE_LENGTH};
use crate::data::api_client::APIClient; use crate::data::api_client::APIClient;
use crate::data::config::conf; use crate::data::config::{Banner, conf};
#[derive(Serialize)] #[derive(Serialize)]
struct NotificationsConfig { struct NotificationsConfig {
@ -72,6 +72,7 @@ pub struct ServerConfig {
play_store_url: &'static str, play_store_url: &'static str,
android_direct_download_url: String, android_direct_download_url: String,
banner: Option<&'static Banner>,
push_notifications: NotificationsConfig, push_notifications: NotificationsConfig,
password_policy: PasswordPolicy, password_policy: PasswordPolicy,
data_conservation_policy: DataConservationPolicy, data_conservation_policy: DataConservationPolicy,
@ -89,6 +90,11 @@ impl ServerConfig {
play_store_url: &conf().play_store_url, play_store_url: &conf().play_store_url,
android_direct_download_url: conf().android_direct_download_url.clone(), android_direct_download_url: conf().android_direct_download_url.clone(),
banner: match conf().banner.as_ref().map(|b| b.is_visible()).unwrap_or(false) {
true => conf().banner.as_ref(),
false => None,
},
push_notifications: NotificationsConfig { push_notifications: NotificationsConfig {
has_firebase: c.is_firebase_available(), has_firebase: c.is_firebase_available(),
has_independent: conf().is_independent_push_notifications_service_enabled(), has_independent: conf().is_independent_push_notifications_service_enabled(),

View File

@ -1,8 +1,10 @@
use std::collections::HashMap;
use std::error::Error; use std::error::Error;
use yaml_rust::{Yaml, YamlLoader}; use yaml_rust::{Yaml, YamlLoader};
use crate::data::group_id::GroupID; use crate::data::group_id::GroupID;
use crate::utils::date_utils::time;
/// Server configuration /// Server configuration
/// ///
@ -35,6 +37,31 @@ pub struct IndependentPushService {
pub public_url: String, pub public_url: String,
} }
#[derive(Debug, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum BannerNature {
Information,
Warning,
Success,
}
#[derive(Debug, serde::Serialize)]
pub struct Banner {
pub enabled: bool,
pub expire: Option<u64>,
pub nature: BannerNature,
pub message: HashMap<String, String>,
pub link: Option<String>,
}
impl Banner {
pub fn is_visible(&self) -> bool {
self.enabled &&
self.expire.map(|v| v < 1 || v > time()).unwrap_or(true)
}
}
#[derive(Debug)] #[derive(Debug)]
pub struct Config { pub struct Config {
pub port: u64, pub port: u64,
@ -54,6 +81,7 @@ pub struct Config {
pub database: DatabaseConfig, pub database: DatabaseConfig,
pub rtc_relay: Option<RtcRelayConfig>, pub rtc_relay: Option<RtcRelayConfig>,
pub admin_url: String, pub admin_url: String,
pub banner: Option<Banner>,
pub forez_groups: Vec<GroupID>, pub forez_groups: Vec<GroupID>,
} }
@ -140,6 +168,28 @@ impl Config {
}) })
}; };
let parsed_banner = &parsed["banner"];
let banner = match parsed_banner.is_badvalue() {
true => None,
false => Some(Banner {
enabled: Self::yaml_bool(parsed_banner, "enabled"),
expire: match Self::yaml_u64(parsed_banner, "expire") {
0 => None,
v => Some(v)
},
nature: match Self::yaml_str(parsed_banner, "nature").as_str() {
"information" => BannerNature::Information,
"warning" => BannerNature::Warning,
"success" => BannerNature::Success,
v => panic!("Invalid banner nature: {} !", v)
},
message: parsed_banner["message"].as_hash().unwrap().iter()
.map(|(k, v)| (k.as_str().unwrap().to_string(), v.as_str().unwrap().to_string()))
.collect(),
link: parsed_banner["link"].as_str().map(|s| s.to_string()),
})
};
let forez_groups = match &parsed["forez_groups"] { let forez_groups = match &parsed["forez_groups"] {
Yaml::BadValue => vec![], Yaml::BadValue => vec![],
_ => { _ => {
@ -183,6 +233,8 @@ impl Config {
admin_url: Self::yaml_str(parsed, "admin-url"), admin_url: Self::yaml_str(parsed, "admin-url"),
banner,
forez_groups, forez_groups,
}; };