diff options
Diffstat (limited to 'adenosine-pds/src')
| -rw-r--r-- | adenosine-pds/src/db.rs | 26 | ||||
| -rw-r--r-- | adenosine-pds/src/lib.rs | 32 | 
2 files changed, 44 insertions, 14 deletions
| diff --git a/adenosine-pds/src/db.rs b/adenosine-pds/src/db.rs index 051588d..b94689a 100644 --- a/adenosine-pds/src/db.rs +++ b/adenosine-pds/src/db.rs @@ -138,6 +138,32 @@ impl AtpDatabase {          Ok(did_maybe.map(|v| Did::from_str(&v).expect("valid DID in database")))      } +    /// Looks up local account handle associated with a DID +    /// +    /// TODO: remote lookups, and/or local cache of external DIDs +    pub fn resolve_did(&mut self, did: &Did) -> Result<Option<String>> { +        let mut stmt = self +            .conn +            .prepare_cached("SELECT handle FROM account WHERE did = $1")?; +        let handle_maybe: Option<String> = stmt +            .query_row(params!(did.to_string()), |row| row.get(0)) +            .optional()?; +        Ok(handle_maybe) +    } + +    /// Looks up local DID associated with handle +    /// +    /// TODO: remote lookups, and/or local cache of external DIDs +    pub fn resolve_handle(&mut self, handle: &str) -> Result<Option<Did>> { +        let mut stmt = self +            .conn +            .prepare_cached("SELECT did FROM account WHERE handle = $1")?; +        let did_maybe: Option<String> = stmt +            .query_row(params!(handle), |row| row.get(0)) +            .optional()?; +        Ok(did_maybe.map(|v| Did::from_str(&v).expect("valid DID in database"))) +    } +      pub fn delete_session(&mut self, jwt: &str) -> Result<bool> {          let mut stmt = self              .conn diff --git a/adenosine-pds/src/lib.rs b/adenosine-pds/src/lib.rs index 738a061..7b517f2 100644 --- a/adenosine-pds/src/lib.rs +++ b/adenosine-pds/src/lib.rs @@ -383,21 +383,25 @@ fn xrpc_get_handler(              }              Ok(json!({ "records": record_list }))          } -        "com.atproto.repo.describe" => { -            let did = Did::from_str(&xrpc_required_param(request, "user")?)?; -            // TODO: resolve handle? -            let handle = did.to_string(); +        "com.atproto.session.get" => {              let mut srv = srv.lock().expect("service mutex"); -            let did_doc = srv.atp_db.get_did_doc(&did)?; -            let collections: Vec<String> = srv.repo.collections(&did)?; -            let desc = RepoDescribe { -                name: handle, -                did: did.to_string(), -                didDoc: did_doc, -                collections: collections, -                nameIsCorrect: true, -            }; -            Ok(json!(desc)) +            let auth_did = &xrpc_check_auth_header(&mut srv, request, None)?; +            let handle = srv +                .atp_db +                .resolve_did(auth_did)? +                .expect("registered account has handle"); +            Ok(json!({"did": auth_did.to_string(), "handle": handle})) +        } +        "com.atproto.handle.resolve" => { +            let handle = xrpc_required_param(request, "handle")?; +            let mut srv = srv.lock().expect("service mutex"); +            match srv.atp_db.resolve_handle(&handle)? { +                Some(did) => Ok(json!({"did": did.to_string()})), +                None => Err(XrpcError::NotFound(format!( +                    "could not resolve handle internally: {}", +                    handle +                )))?, +            }          }          // =========== app.bsky methods          "app.bsky.actor.getProfile" => { | 
