diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 52517dde..2eb279d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -417,8 +417,8 @@ jobs: # Tag and push the architecture specific git ref if [[ "$TARGET_NAME" = *"x86_64"* ]]; then if [[ "$TARGET_NAME" = *"jemalloc"* ]]; then - docker manifest create $IMAGE_NAME:$GITHUB_REF_NAME --amend $IMAGE_NAME:$GITHUB_SHA-jemalloc-$IMAGE_SUFFIX_AMD64 - docker manifest push $IMAGE_NAME:$GITHUB_REF_NAME + docker manifest create $IMAGE_NAME:$GITHUB_REF_NAME --amend $IMAGE_NAME:$GITHUB_SHA-jemalloc-$IMAGE_SUFFIX_AMD64 + docker manifest push $IMAGE_NAME:$GITHUB_REF_NAME else docker manifest create $IMAGE_NAME:$GITHUB_REF_NAME --amend $IMAGE_NAME:$GITHUB_SHA-$IMAGE_SUFFIX_AMD64 docker manifest push $IMAGE_NAME:$GITHUB_REF_NAME diff --git a/src/service/admin/query/account_data.rs b/src/service/admin/query/account_data.rs index 34bba0f6..7e03d794 100644 --- a/src/service/admin/query/account_data.rs +++ b/src/service/admin/query/account_data.rs @@ -9,7 +9,6 @@ use crate::{services, Result}; #[cfg_attr(test, derive(Debug))] #[derive(Subcommand)] /// All the getters and iterators from src/database/key_value/account_data.rs -/// via services() pub(crate) enum AccountData { /// - Returns all changes to the account data that happened after `since`. ChangesSince { @@ -32,7 +31,7 @@ pub(crate) enum AccountData { }, } -/// All the getters and iterators in key_value/account_data.rs via services() +/// All the getters and iterators from src/database/key_value/account_data.rs pub(crate) async fn account_data(subcommand: AccountData) -> Result { match subcommand { AccountData::ChangesSince { diff --git a/src/service/admin/query/appservice.rs b/src/service/admin/query/appservice.rs index 2ab3c1a1..4dfada18 100644 --- a/src/service/admin/query/appservice.rs +++ b/src/service/admin/query/appservice.rs @@ -5,8 +5,7 @@ use crate::{services, Result}; #[cfg_attr(test, derive(Debug))] #[derive(Subcommand)] -/// All the getters and iterators from src/database/key_value/appservice.rs via -/// services() +/// All the getters and iterators from src/database/key_value/appservice.rs pub(crate) enum Appservice { /// - Gets the appservice registration info/details from the ID as a string GetRegistration { @@ -15,7 +14,7 @@ pub(crate) enum Appservice { }, } -/// All the getters and iterators in key_value/appservice.rs via services() +/// All the getters and iterators from src/database/key_value/appservice.rs pub(crate) async fn appservice(subcommand: Appservice) -> Result { match subcommand { Appservice::GetRegistration { diff --git a/src/service/admin/query/globals.rs b/src/service/admin/query/globals.rs new file mode 100644 index 00000000..2e2a38fc --- /dev/null +++ b/src/service/admin/query/globals.rs @@ -0,0 +1,96 @@ +use clap::Subcommand; +use ruma::{events::room::message::RoomMessageEventContent, ServerName}; + +use crate::{services, Result}; + +#[cfg_attr(test, derive(Debug))] +#[derive(Subcommand)] +/// All the getters and iterators from src/database/key_value/globals.rs +pub(crate) enum Globals { + DatabaseVersion, + + CurrentCount, + + LastCheckForUpdatesId, + + LoadKeypair, + + /// - This returns an empty `Ok(BTreeMap<..>)` when there are no keys found + /// for the server. + SigningKeysFor { + origin: Box, + }, +} + +/// All the getters and iterators from src/database/key_value/globals.rs +pub(crate) async fn globals(subcommand: Globals) -> Result { + match subcommand { + Globals::DatabaseVersion => { + let timer = tokio::time::Instant::now(); + let results = services().globals.db.database_version(); + let query_time = timer.elapsed(); + + Ok(RoomMessageEventContent::text_html( + format!("Query completed in {query_time:?}:\n\n```\n{:?}```", results), + format!( + "

Query completed in {query_time:?}:

\n
{:?}\n
", + results + ), + )) + }, + Globals::CurrentCount => { + let timer = tokio::time::Instant::now(); + let results = services().globals.db.current_count(); + let query_time = timer.elapsed(); + + Ok(RoomMessageEventContent::text_html( + format!("Query completed in {query_time:?}:\n\n```\n{:?}```", results), + format!( + "

Query completed in {query_time:?}:

\n
{:?}\n
", + results + ), + )) + }, + Globals::LastCheckForUpdatesId => { + let timer = tokio::time::Instant::now(); + let results = services().globals.db.last_check_for_updates_id(); + let query_time = timer.elapsed(); + + Ok(RoomMessageEventContent::text_html( + format!("Query completed in {query_time:?}:\n\n```\n{:?}```", results), + format!( + "

Query completed in {query_time:?}:

\n
{:?}\n
", + results + ), + )) + }, + Globals::LoadKeypair => { + let timer = tokio::time::Instant::now(); + let results = services().globals.db.load_keypair(); + let query_time = timer.elapsed(); + + Ok(RoomMessageEventContent::text_html( + format!("Query completed in {query_time:?}:\n\n```\n{:?}```", results), + format!( + "

Query completed in {query_time:?}:

\n
{:?}\n
", + results + ), + )) + }, + Globals::SigningKeysFor { + origin, + } => { + let timer = tokio::time::Instant::now(); + let results = services().globals.db.signing_keys_for(&origin); + let query_time = timer.elapsed(); + + Ok(RoomMessageEventContent::text_html( + format!("Query completed in {query_time:?}:\n\n```\n{:?}```", results), + format!( + "

Query completed in {query_time:?}:

\n
{:?}\n
", + results + ), + )) + }, + } +} diff --git a/src/service/admin/query/mod.rs b/src/service/admin/query/mod.rs index 04c98a8d..998bf756 100644 --- a/src/service/admin/query/mod.rs +++ b/src/service/admin/query/mod.rs @@ -3,4 +3,6 @@ pub(crate) mod query; pub(crate) mod account_data; pub(crate) mod appservice; +pub(crate) mod globals; pub(crate) mod presence; +pub(crate) mod room_alias; diff --git a/src/service/admin/query/presence.rs b/src/service/admin/query/presence.rs index 7df4858a..952920c1 100644 --- a/src/service/admin/query/presence.rs +++ b/src/service/admin/query/presence.rs @@ -5,8 +5,7 @@ use crate::{services, Result}; #[cfg_attr(test, derive(Debug))] #[derive(Subcommand)] -/// All the getters and iterators from src/database/key_value/presence.rs via -/// services() +/// All the getters and iterators from src/database/key_value/presence.rs pub(crate) enum Presence { /// - Returns the latest presence event for the given user. GetPresence { @@ -14,15 +13,15 @@ pub(crate) enum Presence { user_id: Box, }, - /// - Returns the most recent presence updates that happened after the event - /// with id `since`. + /// - Iterator of the most recent presence updates that happened after the + /// event with id `since`. PresenceSince { /// UNIX timestamp since (u64) since: u64, }, } -/// All the getters and iterators in key_value/presence.rs via services() +/// All the getters and iterators in key_value/presence.rs pub(crate) async fn presence(subcommand: Presence) -> Result { match subcommand { Presence::GetPresence { diff --git a/src/service/admin/query/query.rs b/src/service/admin/query/query.rs index 6d56eca2..8a979aee 100644 --- a/src/service/admin/query/query.rs +++ b/src/service/admin/query/query.rs @@ -4,7 +4,9 @@ use ruma::events::room::message::RoomMessageEventContent; use super::{ account_data::{account_data, AccountData}, appservice::{appservice, Appservice}, + globals::{globals, Globals}, presence::{presence, Presence}, + room_alias::{room_alias, RoomAlias}, }; use crate::Result; @@ -23,6 +25,14 @@ pub(crate) enum QueryCommand { /// - presence.rs iterators and getters #[command(subcommand)] Presence(Presence), + + /// - rooms/alias.rs iterators and getters + #[command(subcommand)] + RoomAlias(RoomAlias), + + /// - globals.rs iterators and getters + #[command(subcommand)] + Globals(Globals), } /// Processes admin query commands @@ -32,5 +42,7 @@ pub(crate) async fn process(command: QueryCommand, _body: Vec<&str>) -> Result account_data(AccountData).await, QueryCommand::Appservice(Appservice) => appservice(Appservice).await, QueryCommand::Presence(Presence) => presence(Presence).await, + QueryCommand::RoomAlias(RoomAlias) => room_alias(RoomAlias).await, + QueryCommand::Globals(Globals) => globals(Globals).await, } } diff --git a/src/service/admin/query/room_alias.rs b/src/service/admin/query/room_alias.rs new file mode 100644 index 00000000..f5ca4965 --- /dev/null +++ b/src/service/admin/query/room_alias.rs @@ -0,0 +1,76 @@ +use clap::Subcommand; +use ruma::{events::room::message::RoomMessageEventContent, RoomAliasId, RoomId}; + +use crate::{services, Result}; + +#[cfg_attr(test, derive(Debug))] +#[derive(Subcommand)] +/// All the getters and iterators from src/database/key_value/rooms/alias.rs +pub(crate) enum RoomAlias { + ResolveLocalAlias { + /// Full room alias + alias: Box, + }, + + /// - Iterator of all our local room aliases for the room ID + LocalAliasesForRoom { + /// Full room ID + room_id: Box, + }, + + /// - Iterator of all our local aliases in our database with their room IDs + AllLocalAliases, +} + +/// All the getters and iterators in src/database/key_value/rooms/alias.rs +pub(crate) async fn room_alias(subcommand: RoomAlias) -> Result { + match subcommand { + RoomAlias::ResolveLocalAlias { + alias, + } => { + let timer = tokio::time::Instant::now(); + let results = services().rooms.alias.db.resolve_local_alias(&alias); + let query_time = timer.elapsed(); + + Ok(RoomMessageEventContent::text_html( + format!("Query completed in {query_time:?}:\n\n```\n{:?}```", results), + format!( + "

Query completed in {query_time:?}:

\n
{:?}\n
", + results + ), + )) + }, + RoomAlias::LocalAliasesForRoom { + room_id, + } => { + let timer = tokio::time::Instant::now(); + let results = services().rooms.alias.db.local_aliases_for_room(&room_id); + let query_time = timer.elapsed(); + + let aliases: Vec<_> = results.collect(); + + Ok(RoomMessageEventContent::text_html( + format!("Query completed in {query_time:?}:\n\n```\n{:?}```", aliases), + format!( + "

Query completed in {query_time:?}:

\n
{:?}\n
", + aliases + ), + )) + }, + RoomAlias::AllLocalAliases => { + let timer = tokio::time::Instant::now(); + let results = services().rooms.alias.db.all_local_aliases(); + let query_time = timer.elapsed(); + + let aliases: Vec<_> = results.collect(); + + Ok(RoomMessageEventContent::text_html( + format!("Query completed in {query_time:?}:\n\n```\n{:?}```", aliases), + format!( + "

Query completed in {query_time:?}:

\n
{:?}\n
", + aliases + ), + )) + }, + } +} diff --git a/src/service/admin/query/rooms/alias.rs b/src/service/admin/query/rooms/alias.rs deleted file mode 100644 index e69de29b..00000000 diff --git a/src/service/admin/query/rooms/mod.rs b/src/service/admin/query/rooms/mod.rs deleted file mode 100644 index 10d83ca6..00000000 --- a/src/service/admin/query/rooms/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) use alias;