forked from github-starred/komodo
split recently viewed by resource type
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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,
|
||||
|
||||
12
frontend/src/pages/home/dashboard2.tsx
Normal file
12
frontend/src/pages/home/dashboard2.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user