split recently viewed by resource type

This commit is contained in:
mbecker20
2024-05-15 19:15:03 -07:00
parent 8b33647620
commit 68659630fc
3 changed files with 72 additions and 17 deletions

View File

@@ -11,6 +11,7 @@ use monitor_client::{
},
entities::{
monitor_timestamp,
update::ResourceTarget,
user::{User, UserConfig},
},
};
@@ -25,7 +26,7 @@ use crate::{
state::{db_client, State},
};
const RECENTLY_VIEWED_MAX: usize = 10;
const RECENTLY_VIEWED_MAX: usize = 5;
#[async_trait]
impl Resolve<PushRecentlyViewed, User> for State {
@@ -35,29 +36,43 @@ impl Resolve<PushRecentlyViewed, User> for State {
PushRecentlyViewed { resource }: PushRecentlyViewed,
user: User,
) -> anyhow::Result<PushRecentlyViewedResponse> {
let mut recently_viewed = get_user(&user.id)
.await?
.recently_viewed
let user = get_user(&user.id).await?;
let (recents, id, field) = match resource {
ResourceTarget::Server(id) => {
(user.recent_servers, id, "recent_servers")
}
ResourceTarget::Deployment(id) => {
(user.recent_deployments, id, "recent_deployments")
}
ResourceTarget::Build(id) => {
(user.recent_builds, id, "recent_builds")
}
ResourceTarget::Repo(id) => {
(user.recent_repos, id, "recent_repos")
}
ResourceTarget::Procedure(id) => {
(user.recent_procedures, id, "recent_procedures")
}
_ => return Ok(PushRecentlyViewedResponse {}),
};
let mut recents = recents
.into_iter()
.filter(|r| !resource.eq(r))
.filter(|_id| !id.eq(_id))
.take(RECENTLY_VIEWED_MAX - 1)
.collect::<VecDeque<_>>();
recently_viewed.push_front(resource);
let recently_viewed = to_bson(&recently_viewed)
.context("failed to convert recently views to bson")?;
recents.push_front(id);
let update = doc! { field: to_bson(&recents)? };
update_one_by_id(
&db_client().await.users,
&user.id,
mungos::update::Update::Set(doc! {
"recently_viewed": recently_viewed
}),
mungos::update::Update::Set(update),
None,
)
.await
.context("context")?;
.with_context(|| format!("failed to update {field}"))?;
Ok(PushRecentlyViewedResponse {})
}
@@ -112,7 +127,11 @@ impl Resolve<CreateServiceUser, User> for State {
create_server_permissions: false,
create_build_permissions: false,
last_update_view: 0,
recently_viewed: Vec::new(),
recent_servers: Vec::new(),
recent_deployments: Vec::new(),
recent_builds: Vec::new(),
recent_repos: Vec::new(),
recent_procedures: Vec::new(),
updated_at: monitor_timestamp(),
};
user.id = db_client()

View File

@@ -7,7 +7,7 @@ use mungos::mongodb::bson::{
use serde::{Deserialize, Serialize};
use typeshare::typeshare;
use crate::entities::{update::ResourceTarget, MongoId, I64};
use crate::entities::{MongoId, I64};
#[typeshare]
#[derive(
@@ -28,29 +28,53 @@ pub struct User {
)]
pub id: MongoId,
/// The globally unique username for the user.
#[unique_index]
pub username: String,
/// Whether user is enabled / able to access the api.
#[index]
#[serde(default)]
pub enabled: bool,
/// Whether the user has global admin permissions.
#[serde(default)]
pub admin: bool,
/// Whether the user has permission to create servers.
#[serde(default)]
pub create_server_permissions: bool,
/// Whether the user has permission to create builds
#[serde(default)]
pub create_build_permissions: bool,
/// The user-type specific config.
pub config: UserConfig,
/// When the user last opened updates dropdown.
#[serde(default)]
pub last_update_view: I64,
/// Recently viewed server ids
#[serde(default)]
pub recently_viewed: Vec<ResourceTarget>,
pub recent_servers: Vec<String>,
/// Recently viewed deployment ids
#[serde(default)]
pub recent_deployments: Vec<String>,
/// Recently viewed build ids
#[serde(default)]
pub recent_builds: Vec<String>,
/// Recently viewed repo ids
#[serde(default)]
pub recent_repos: Vec<String>,
/// Recently viewed procedure ids
#[serde(default)]
pub recent_procedures: Vec<String>,
#[serde(default)]
pub updated_at: I64,

View File

@@ -0,0 +1,12 @@
import { OpenAlerts } from "@components/alert";
import { Page } from "@components/layouts";
import { AllUpdates } from "@components/updates/resource";
export const Dashboard = () => {
return (
<Page title="">
<OpenAlerts />
<AllUpdates />
</Page>
);
}