mirror of
https://gitlab.com/fabinfra/fabaccess/bffh.git
synced 2025-06-11 02:43:20 +02:00
Add user search impl
This commit is contained in:
@ -1,18 +1,15 @@
|
||||
use crate::capnp::user::User;
|
||||
use crate::resources::modules::fabaccess::{ArchivedStatus, Status};
|
||||
use crate::resources::Resource;
|
||||
use crate::session::SessionHandle;
|
||||
use api::machine_capnp::machine::{
|
||||
self,
|
||||
admin, admin::Server as AdminServer, check, check::Server as CheckServer, in_use as inuse,
|
||||
in_use::Server as InUseServer, info, info::Server as InfoServer, manage,
|
||||
manage::Server as ManageServer, use_, use_::Server as UseServer,
|
||||
|
||||
MachineState,
|
||||
};
|
||||
use api::general_capnp::optional;
|
||||
use api::machine_capnp::machine::{
|
||||
self, admin, admin::Server as AdminServer, check, check::Server as CheckServer,
|
||||
in_use as inuse, in_use::Server as InUseServer, info, info::Server as InfoServer, manage,
|
||||
manage::Server as ManageServer, use_, use_::Server as UseServer, MachineState,
|
||||
};
|
||||
use capnp::capability::Promise;
|
||||
use capnp_rpc::pry;
|
||||
use crate::capnp::user::User;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Machine {
|
||||
@ -37,18 +34,23 @@ impl Machine {
|
||||
if let Some(ref category) = self.resource.get_description().category {
|
||||
builder.set_category(category);
|
||||
}
|
||||
builder.set_urn(&format!("urn:fabaccess:resource:{}", self.resource.get_id()));
|
||||
builder.set_urn(&format!(
|
||||
"urn:fabaccess:resource:{}",
|
||||
self.resource.get_id()
|
||||
));
|
||||
|
||||
{
|
||||
let user = self.session.get_user_ref();
|
||||
let state = self.resource.get_state_ref();
|
||||
let state = state.as_ref();
|
||||
|
||||
if self.session.has_write(&self.resource) && match &state.inner.state {
|
||||
ArchivedStatus::Free => true,
|
||||
ArchivedStatus::Reserved(reserver) if reserver == &user => true,
|
||||
_ => false,
|
||||
} {
|
||||
if self.session.has_write(&self.resource)
|
||||
&& match &state.inner.state {
|
||||
ArchivedStatus::Free => true,
|
||||
ArchivedStatus::Reserved(reserver) if reserver == &user => true,
|
||||
_ => false,
|
||||
}
|
||||
{
|
||||
builder.set_use(capnp_rpc::new_client(self.clone()));
|
||||
}
|
||||
|
||||
@ -67,7 +69,7 @@ impl Machine {
|
||||
builder.set_inuse(capnp_rpc::new_client(self.clone()));
|
||||
}
|
||||
MachineState::InUse
|
||||
},
|
||||
}
|
||||
ArchivedStatus::Reserved(_) => MachineState::Reserved,
|
||||
ArchivedStatus::ToCheck(_) => MachineState::ToCheck,
|
||||
};
|
||||
@ -85,7 +87,11 @@ impl Machine {
|
||||
this.build_into(builder)
|
||||
}
|
||||
|
||||
pub fn optional_build(session: SessionHandle, resource: Resource, builder: optional::Builder<machine::Owned>) {
|
||||
pub fn optional_build(
|
||||
session: SessionHandle,
|
||||
resource: Resource,
|
||||
builder: optional::Builder<machine::Owned>,
|
||||
) {
|
||||
let this = Self::new(session.clone(), resource.clone());
|
||||
if this.resource.visible(&session) || session.has_read(&resource) {
|
||||
let builder = builder.init_just();
|
||||
@ -135,9 +141,7 @@ impl UseServer for Machine {
|
||||
let session = self.session.clone();
|
||||
Promise::from_future(async move {
|
||||
let user = session.get_user_ref();
|
||||
resource
|
||||
.try_update(session, Status::Reserved(user))
|
||||
.await;
|
||||
resource.try_update(session, Status::Reserved(user)).await;
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
@ -208,8 +212,16 @@ impl ManageServer for Machine {
|
||||
) -> Promise<(), ::capnp::Error> {
|
||||
let mut builder = result.get();
|
||||
let user = User::new_self(self.session.clone());
|
||||
user.build_optional(self.resource.get_current_user(), builder.reborrow().init_current_user());
|
||||
user.build_optional(self.resource.get_previous_user(), builder.init_last_user());
|
||||
User::build_optional(
|
||||
&self.session,
|
||||
self.resource.get_current_user(),
|
||||
builder.reborrow().init_current_user(),
|
||||
);
|
||||
User::build_optional(
|
||||
&self.session,
|
||||
self.resource.get_previous_user(),
|
||||
builder.init_last_user(),
|
||||
);
|
||||
Promise::ok(())
|
||||
}
|
||||
fn set_property(
|
||||
@ -310,9 +322,11 @@ impl AdminServer for Machine {
|
||||
APIMState::InUse => Status::InUse(user),
|
||||
APIMState::Reserved => Status::Reserved(user),
|
||||
APIMState::ToCheck => Status::ToCheck(user),
|
||||
APIMState::Totakeover => return Promise::err(::capnp::Error::unimplemented(
|
||||
APIMState::Totakeover => {
|
||||
return Promise::err(::capnp::Error::unimplemented(
|
||||
"totakeover not implemented".to_string(),
|
||||
)),
|
||||
))
|
||||
}
|
||||
};
|
||||
let resource = self.resource.clone();
|
||||
Promise::from_future(async move {
|
||||
|
@ -22,10 +22,10 @@ impl User {
|
||||
Self::new(session, user)
|
||||
}
|
||||
|
||||
pub fn build_optional(&self, user: Option<UserRef>, builder: optional::Builder<user::Owned>) {
|
||||
if let Some(user) = user.and_then(|u| self.session.users.get_user(u.get_username())) {
|
||||
pub fn build_optional(session: &SessionHandle, user: Option<UserRef>, builder: optional::Builder<user::Owned>) {
|
||||
if let Some(user) = user.and_then(|u| session.users.get_user(u.get_username())) {
|
||||
let builder = builder.init_just();
|
||||
Self::fill(&self.session, user, builder);
|
||||
Self::fill(&session, user, builder);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
use capnp::capability::Promise;
|
||||
use capnp_rpc::pry;
|
||||
use api::usersystem_capnp::user_system::{
|
||||
info, manage,
|
||||
info, manage, search
|
||||
};
|
||||
|
||||
use crate::capnp::user::User;
|
||||
|
||||
use crate::session::SessionHandle;
|
||||
use crate::users::db;
|
||||
use crate::users::{db, UserRef};
|
||||
|
||||
|
||||
#[derive(Clone)]
|
||||
@ -93,3 +93,16 @@ impl manage::Server for Users {
|
||||
Promise::ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl search::Server for Users {
|
||||
fn get_user_by_name(
|
||||
&mut self,
|
||||
params: search::GetUserByNameParams,
|
||||
mut result: search::GetUserByNameResults,
|
||||
) -> Promise<(), ::capnp::Error> {
|
||||
let username: &str = pry!(pry!(params.get()).get_username());
|
||||
let userref = UserRef::new(username.to_string());
|
||||
User::build_optional(&self.session, Some(userref), result.get());
|
||||
Promise::ok(())
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user