mirror of https://github.com/telemt/telemt.git
Merge pull request #588 from amirotin/feat/active-ips-endpoint
feat(api): add GET /v1/stats/users/active-ips endpoint
This commit is contained in:
commit
fbee4631d6
|
|
@ -42,6 +42,7 @@ use events::ApiEventStore;
|
||||||
use http_utils::{error_response, read_json, read_optional_json, success_response};
|
use http_utils::{error_response, read_json, read_optional_json, success_response};
|
||||||
use model::{
|
use model::{
|
||||||
ApiFailure, CreateUserRequest, HealthData, PatchUserRequest, RotateSecretRequest, SummaryData,
|
ApiFailure, CreateUserRequest, HealthData, PatchUserRequest, RotateSecretRequest, SummaryData,
|
||||||
|
UserActiveIps,
|
||||||
};
|
};
|
||||||
use runtime_edge::{
|
use runtime_edge::{
|
||||||
EdgeConnectionsCacheEntry, build_runtime_connections_summary_data,
|
EdgeConnectionsCacheEntry, build_runtime_connections_summary_data,
|
||||||
|
|
@ -362,6 +363,18 @@ async fn handle(
|
||||||
);
|
);
|
||||||
Ok(success_response(StatusCode::OK, data, revision))
|
Ok(success_response(StatusCode::OK, data, revision))
|
||||||
}
|
}
|
||||||
|
("GET", "/v1/stats/users/active-ips") => {
|
||||||
|
let revision = current_revision(&shared.config_path).await?;
|
||||||
|
let usernames: Vec<_> = cfg.access.users.keys().cloned().collect();
|
||||||
|
let active_ips_map = shared.ip_tracker.get_active_ips_for_users(&usernames).await;
|
||||||
|
let mut data: Vec<UserActiveIps> = active_ips_map
|
||||||
|
.into_iter()
|
||||||
|
.filter(|(_, ips)| !ips.is_empty())
|
||||||
|
.map(|(username, active_ips)| UserActiveIps { username, active_ips })
|
||||||
|
.collect();
|
||||||
|
data.sort_by(|a, b| a.username.cmp(&b.username));
|
||||||
|
Ok(success_response(StatusCode::OK, data, revision))
|
||||||
|
}
|
||||||
("GET", "/v1/stats/users") | ("GET", "/v1/users") => {
|
("GET", "/v1/stats/users") | ("GET", "/v1/users") => {
|
||||||
let revision = current_revision(&shared.config_path).await?;
|
let revision = current_revision(&shared.config_path).await?;
|
||||||
let (detected_ip_v4, detected_ip_v6) = shared.detected_link_ips();
|
let (detected_ip_v4, detected_ip_v6) = shared.detected_link_ips();
|
||||||
|
|
|
||||||
|
|
@ -442,6 +442,12 @@ pub(super) struct UserInfo {
|
||||||
pub(super) links: UserLinks,
|
pub(super) links: UserLinks,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
pub(super) struct UserActiveIps {
|
||||||
|
pub(super) username: String,
|
||||||
|
pub(super) active_ips: Vec<IpAddr>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
pub(super) struct CreateUserResponse {
|
pub(super) struct CreateUserResponse {
|
||||||
pub(super) user: UserInfo,
|
pub(super) user: UserInfo,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue