separate endpoint for attr overwrites, implement AttributeUpdate
parent
74c8a4f539
commit
cb22756a47
|
@ -156,6 +156,7 @@ fn main() -> Result<()> {
|
||||||
.service(routes::get_query)
|
.service(routes::get_query)
|
||||||
.service(routes::get_object)
|
.service(routes::get_object)
|
||||||
.service(routes::put_object)
|
.service(routes::put_object)
|
||||||
|
.service(routes::put_object_attribute)
|
||||||
.service(routes::delete_object)
|
.service(routes::delete_object)
|
||||||
.service(routes::get_all_attributes)
|
.service(routes::get_all_attributes)
|
||||||
.service(routes::api_refresh)
|
.service(routes::api_refresh)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::addressing::{Address, Addressable};
|
use crate::addressing::{Address, Addressable};
|
||||||
use crate::database::entry::{Entry, InEntry};
|
use crate::database::entry::{Entry, EntryValue, InEntry};
|
||||||
use crate::database::hierarchies::{list_roots, resolve_path, UHierPath};
|
use crate::database::hierarchies::{list_roots, resolve_path, UHierPath};
|
||||||
use crate::database::lang::Query;
|
use crate::database::lang::Query;
|
||||||
use crate::database::UpEndDatabase;
|
use crate::database::UpEndDatabase;
|
||||||
|
@ -273,6 +273,36 @@ pub async fn put_object(
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[put("/api/obj/{address}/{attribute}")]
|
||||||
|
pub async fn put_object_attribute(
|
||||||
|
state: web::Data<State>,
|
||||||
|
web::Path((address, attribute)): web::Path<(Address, String)>,
|
||||||
|
value: web::Json<EntryValue>,
|
||||||
|
) -> Result<HttpResponse, Error> {
|
||||||
|
let connection = state.upend.connection().map_err(ErrorInternalServerError)?;
|
||||||
|
|
||||||
|
let new_address = connection
|
||||||
|
.transaction::<_, anyhow::Error, _>(|| {
|
||||||
|
let existing_attr_entries =
|
||||||
|
connection.query(format!("(matches \"{address}\" \"{attribute}\" ?)").parse()?)?;
|
||||||
|
|
||||||
|
for eae in existing_attr_entries {
|
||||||
|
let _ = connection.remove_object(eae.address()?)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let new_attr_entry = Entry {
|
||||||
|
entity: address,
|
||||||
|
attribute,
|
||||||
|
value: value.into_inner(),
|
||||||
|
};
|
||||||
|
|
||||||
|
connection.insert_entry(new_attr_entry)
|
||||||
|
})
|
||||||
|
.map_err(ErrorInternalServerError)?;
|
||||||
|
|
||||||
|
Ok(HttpResponse::Ok().json(new_address))
|
||||||
|
}
|
||||||
|
|
||||||
#[delete("/api/obj/{address_str}")]
|
#[delete("/api/obj/{address_str}")]
|
||||||
pub async fn delete_object(
|
pub async fn delete_object(
|
||||||
state: web::Data<State>,
|
state: web::Data<State>,
|
||||||
|
|
|
@ -123,16 +123,10 @@
|
||||||
await fetch(`/api/obj/${change.address}`, { method: "DELETE" });
|
await fetch(`/api/obj/${change.address}`, { method: "DELETE" });
|
||||||
break;
|
break;
|
||||||
case "update":
|
case "update":
|
||||||
// TODO
|
await fetch(`/api/obj/${address}/${change.attribute}`, {
|
||||||
await fetch(`/api/obj/${change.address}`, { method: "DELETE" });
|
|
||||||
await fetch(`/api/obj`, {
|
|
||||||
method: "PUT",
|
method: "PUT",
|
||||||
headers: { "Content-Type": "application/json" },
|
headers: { "Content-Type": "application/json" },
|
||||||
body: JSON.stringify({
|
body: JSON.stringify(change.value),
|
||||||
entity: address,
|
|
||||||
attribute: change.attribute,
|
|
||||||
value: change.value,
|
|
||||||
}),
|
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -13,8 +13,7 @@ export interface AttributeCreate {
|
||||||
|
|
||||||
export interface AttributeUpdate {
|
export interface AttributeUpdate {
|
||||||
type: "update";
|
type: "update";
|
||||||
address: string;
|
attribute: string;
|
||||||
attribute: string; // TODO: remove
|
|
||||||
value: IValue;
|
value: IValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue