@@ -315,12 +315,10 @@ impl MessageCreate {
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct ActorCreateParams {
|
||||
pub context_id: u32,
|
||||
pub actor: ActorCreate,
|
||||
}
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct ActorLoadParams {
|
||||
pub context_id: u32,
|
||||
pub id: u32,
|
||||
}
|
||||
|
||||
@@ -397,7 +395,7 @@ pub fn build_module(state: Arc<AppState>) -> RpcModule<()> {
|
||||
let actor = p.actor.into_domain().map_err(invalid_params_err)?;
|
||||
let actor = state
|
||||
.service
|
||||
.create_actor(p.context_id, actor)
|
||||
.create_actor(actor)
|
||||
.await
|
||||
.map_err(storage_err)?;
|
||||
Ok::<_, ErrorObjectOwned>(actor)
|
||||
@@ -414,7 +412,7 @@ pub fn build_module(state: Arc<AppState>) -> RpcModule<()> {
|
||||
let p: ActorLoadParams = params.parse().map_err(invalid_params_err)?;
|
||||
let actor = state
|
||||
.service
|
||||
.load_actor(p.context_id, p.id)
|
||||
.load_actor(p.id)
|
||||
.await
|
||||
.map_err(storage_err)?;
|
||||
Ok::<_, ErrorObjectOwned>(actor)
|
||||
|
@@ -157,7 +157,7 @@ fn validate_context(ctx: &Context) -> Result<(), BoxError> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn validate_actor(_context_id: u32, actor: &Actor) -> Result<(), BoxError> {
|
||||
fn validate_actor(actor: &Actor) -> Result<(), BoxError> {
|
||||
let v = as_json(actor)?;
|
||||
let id = json_get_u32(&v, "id")?;
|
||||
if id == 0 {
|
||||
@@ -344,17 +344,17 @@ impl AppService {
|
||||
// -----------------------------
|
||||
// Actor
|
||||
// -----------------------------
|
||||
pub async fn create_actor(&self, context_id: u32, actor: Actor) -> Result<Actor, BoxError> {
|
||||
validate_actor(context_id, &actor)?;
|
||||
pub async fn create_actor(&self, actor: Actor) -> Result<Actor, BoxError> {
|
||||
validate_actor(&actor)?;
|
||||
let v = as_json(&actor)?;
|
||||
let id = json_get_u32(&v, "id")?;
|
||||
self.ensure_actor_not_exists(context_id, id).await?;
|
||||
self.redis.save_actor(context_id, &actor).await?;
|
||||
self.ensure_actor_not_exists_global(id).await?;
|
||||
self.redis.save_actor_global(&actor).await?;
|
||||
Ok(actor)
|
||||
}
|
||||
|
||||
pub async fn load_actor(&self, context_id: u32, id: u32) -> Result<Actor, BoxError> {
|
||||
let actor = self.redis.load_actor(context_id, id).await?;
|
||||
pub async fn load_actor(&self, id: u32) -> Result<Actor, BoxError> {
|
||||
let actor = self.redis.load_actor_global(id).await?;
|
||||
Ok(actor)
|
||||
}
|
||||
|
||||
@@ -1023,8 +1023,8 @@ impl AppService {
|
||||
}
|
||||
}
|
||||
|
||||
async fn ensure_actor_not_exists(&self, db: u32, id: u32) -> Result<(), BoxError> {
|
||||
match self.redis.load_actor(db, id).await {
|
||||
async fn ensure_actor_not_exists_global(&self, id: u32) -> Result<(), BoxError> {
|
||||
match self.redis.load_actor_global(id).await {
|
||||
Ok(_) => Err(Box::new(AlreadyExistsError {
|
||||
key: format!("actor:{}", id),
|
||||
})),
|
||||
|
@@ -196,6 +196,22 @@ impl RedisDriver {
|
||||
let key = Self::actor_key(id);
|
||||
self.hget_model(db, &key).await
|
||||
}
|
||||
/// Save an Actor globally in DB 0 (Actor is context-independent)
|
||||
pub async fn save_actor_global(&self, actor: &Actor) -> Result<()> {
|
||||
let json = serde_json::to_value(actor)?;
|
||||
let id = json
|
||||
.get("id")
|
||||
.and_then(|v| v.as_u64())
|
||||
.ok_or("Actor.id missing or not a number")? as u32;
|
||||
let key = Self::actor_key(id);
|
||||
self.hset_model(0, &key, actor).await
|
||||
}
|
||||
|
||||
/// Load an Actor globally from DB 0 by id
|
||||
pub async fn load_actor_global(&self, id: u32) -> Result<Actor> {
|
||||
let key = Self::actor_key(id);
|
||||
self.hget_model(0, &key).await
|
||||
}
|
||||
|
||||
// -----------------------------
|
||||
// Runner
|
||||
|
Reference in New Issue
Block a user