get username and list updates list item

This commit is contained in:
mbecker20
2023-08-03 01:13:59 -04:00
parent 260fd572bf
commit 796793eefd
7 changed files with 120 additions and 6 deletions
+1
View File
@@ -36,6 +36,7 @@ mod user;
enum ReadRequest {
GetVersion(GetVersion),
GetUser(GetUser),
GetUsername(GetUsername),
// ==== SEARCH ====
FindResources(FindResources),
+34 -2
View File
@@ -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<ListUpdates, RequestUser> 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::<HashMap<_, _>>();
let updates = self
.db
.updates
@@ -62,12 +76,30 @@ impl Resolve<ListUpdates, RequestUser> 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::<Vec<_>>();
let next_page = if updates.len() == UPDATES_PER_PAGE as usize {
Some(page + 1)
} else {
None
};
Ok(ListUpdatesResponse { updates, next_page })
}
}
+25 -1
View File
@@ -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<GetUser, RequestUser> for State {
Ok(user)
}
}
#[async_trait]
impl Resolve<GetUsername, RequestUser> for State {
async fn resolve(
&self,
GetUsername { user_id }: GetUsername,
_: RequestUser,
) -> anyhow::Result<GetUsernameResponse> {
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,
})
}
}
+1
View File
@@ -11,6 +11,7 @@ export type AuthResponses = {
export type ReadResponses = {
GetVersion: Types.GetVersionResponse;
GetUser: Types.User;
GetUsername: Types.GetUsernameResponse;
// ==== SEARCH ====
FindResources: Types.FindResourcesResponse;
+22 -1
View File
@@ -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 }
+15
View File
@@ -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,
}
+22 -2
View File
@@ -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<Update>,
pub updates: Vec<UpdateListItem>,
pub next_page: Option<u32>,
}
#[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,
}