From 796793eefd275b54efa460decc3be0a71c193d5a Mon Sep 17 00:00:00 2001 From: mbecker20 Date: Thu, 3 Aug 2023 01:13:59 -0400 Subject: [PATCH] get username and list updates list item --- bin/core/src/requests/read/mod.rs | 1 + bin/core/src/requests/read/update.rs | 36 +++++++++++++++++++++++++-- bin/core/src/requests/read/user.rs | 26 ++++++++++++++++++- client/ts/src/responses.ts | 1 + client/ts/src/types.ts | 23 ++++++++++++++++- lib/types/src/requests/read/mod.rs | 15 +++++++++++ lib/types/src/requests/read/update.rs | 24 ++++++++++++++++-- 7 files changed, 120 insertions(+), 6 deletions(-) diff --git a/bin/core/src/requests/read/mod.rs b/bin/core/src/requests/read/mod.rs index 7dfa3e17c..70e52e2ff 100644 --- a/bin/core/src/requests/read/mod.rs +++ b/bin/core/src/requests/read/mod.rs @@ -36,6 +36,7 @@ mod user; enum ReadRequest { GetVersion(GetVersion), GetUser(GetUser), + GetUsername(GetUsername), // ==== SEARCH ==== FindResources(FindResources), diff --git a/bin/core/src/requests/read/update.rs b/bin/core/src/requests/read/update.rs index 38cf12a1b..6aa57022a 100644 --- a/bin/core/src/requests/read/update.rs +++ b/bin/core/src/requests/read/update.rs @@ -1,10 +1,13 @@ +use std::collections::HashMap; + +use anyhow::Context; use async_trait::async_trait; use monitor_types::{ entities::{ alerter::Alerter, build::Build, builder::Builder, deployment::Deployment, repo::Repo, server::Server, }, - requests::read::{ListUpdates, ListUpdatesResponse}, + requests::read::{ListUpdates, ListUpdatesResponse, UpdateListItem}, }; use mungos::mongodb::{bson::doc, options::FindOptions}; use resolver_api::Resolve; @@ -51,6 +54,17 @@ impl Resolve for State { }); query.into() }; + + let usernames = self + .db + .users + .get_some(None, None) + .await + .context("failed to pull users from db")? + .into_iter() + .map(|u| (u.id, u.username)) + .collect::>(); + let updates = self .db .updates @@ -62,12 +76,30 @@ impl Resolve for State { .limit(UPDATES_PER_PAGE) .build(), ) - .await?; + .await? + .into_iter() + .map(|u| UpdateListItem { + id: u.id, + operation: u.operation, + start_ts: u.start_ts, + success: u.success, + operator: usernames + .get(&u.operator) + .cloned() + .unwrap_or("unknown".to_string()), + operator_id: u.operator, + target: u.target, + status: u.status, + version: u.version, + }) + .collect::>(); + let next_page = if updates.len() == UPDATES_PER_PAGE as usize { Some(page + 1) } else { None }; + Ok(ListUpdatesResponse { updates, next_page }) } } diff --git a/bin/core/src/requests/read/user.rs b/bin/core/src/requests/read/user.rs index e2da98867..0eac097c6 100644 --- a/bin/core/src/requests/read/user.rs +++ b/bin/core/src/requests/read/user.rs @@ -1,6 +1,9 @@ use anyhow::Context; use async_trait::async_trait; -use monitor_types::{entities::user::User, requests::read::GetUser}; +use monitor_types::{ + entities::user::User, + requests::read::{GetUser, GetUsername, GetUsernameResponse}, +}; use resolver_api::Resolve; use crate::{auth::RequestUser, state::State}; @@ -21,3 +24,24 @@ impl Resolve for State { Ok(user) } } + +#[async_trait] +impl Resolve for State { + async fn resolve( + &self, + GetUsername { user_id }: GetUsername, + _: RequestUser, + ) -> anyhow::Result { + let user = self + .db + .users + .find_one_by_id(&user_id) + .await + .context("failed at mongo query")? + .context("no user found with id")?; + + Ok(GetUsernameResponse { + username: user.username, + }) + } +} diff --git a/client/ts/src/responses.ts b/client/ts/src/responses.ts index 510f4a496..5d2f05d56 100644 --- a/client/ts/src/responses.ts +++ b/client/ts/src/responses.ts @@ -11,6 +11,7 @@ export type AuthResponses = { export type ReadResponses = { GetVersion: Types.GetVersionResponse; GetUser: Types.User; + GetUsername: Types.GetUsernameResponse; // ==== SEARCH ==== FindResources: Types.FindResourcesResponse; diff --git a/client/ts/src/types.ts b/client/ts/src/types.ts index 3ee427b5d..e542b0b32 100644 --- a/client/ts/src/types.ts +++ b/client/ts/src/types.ts @@ -885,6 +885,14 @@ export interface GetVersionResponse { export interface GetUser {} +export interface GetUsername { + user_id: string; +} + +export interface GetUsernameResponse { + username: string; +} + export interface GetRepo { id: string; } @@ -1065,8 +1073,20 @@ export interface ListUpdates { page?: number; } +export interface UpdateListItem { + id: string; + operation: Operation; + start_ts: I64; + success: boolean; + operator: string; + operator_id: string; + target: ResourceTarget; + status: UpdateStatus; + version: Version; +} + export interface ListUpdatesResponse { - updates: Update[]; + updates: UpdateListItem[]; next_page?: number; } @@ -1279,6 +1299,7 @@ export type ExecuteRequest = export type ReadRequest = | { type: "GetVersion"; params: GetVersion } | { type: "GetUser"; params: GetUser } + | { type: "GetUsername"; params: GetUsername } | { type: "FindResources"; params: FindResources } | { type: "FindResourcesWithQuery"; params: FindResourcesWithQuery } | { type: "GetServersSummary"; params: GetServersSummary } diff --git a/lib/types/src/requests/read/mod.rs b/lib/types/src/requests/read/mod.rs index 826cc78bb..4caaaae0e 100644 --- a/lib/types/src/requests/read/mod.rs +++ b/lib/types/src/requests/read/mod.rs @@ -43,3 +43,18 @@ pub struct GetVersionResponse { #[derive(Serialize, Deserialize, Debug, Clone, Request)] #[response(User)] pub struct GetUser {} + +// + +#[typeshare] +#[derive(Serialize, Deserialize, Debug, Clone, Request)] +#[response(GetUsernameResponse)] +pub struct GetUsername { + pub user_id: String, +} + +#[typeshare] +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct GetUsernameResponse { + pub username: String, +} diff --git a/lib/types/src/requests/read/update.rs b/lib/types/src/requests/read/update.rs index 51ad0bb4a..0c71cc8f8 100644 --- a/lib/types/src/requests/read/update.rs +++ b/lib/types/src/requests/read/update.rs @@ -2,7 +2,13 @@ use resolver_api::derive::Request; use serde::{Deserialize, Serialize}; use typeshare::typeshare; -use crate::{entities::update::Update, MongoDocument}; +use crate::{ + entities::{ + update::{ResourceTarget, UpdateStatus}, + Operation, Version, + }, + MongoDocument, I64, +}; #[typeshare] #[derive(Serialize, Deserialize, Debug, Clone, Request)] @@ -16,6 +22,20 @@ pub struct ListUpdates { #[typeshare] #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ListUpdatesResponse { - pub updates: Vec, + pub updates: Vec, pub next_page: Option, } + +#[typeshare] +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct UpdateListItem { + pub id: String, + pub operation: Operation, + pub start_ts: I64, + pub success: bool, + pub operator: String, + pub operator_id: String, + pub target: ResourceTarget, + pub status: UpdateStatus, + pub version: Version, +}