Add resource secret epoch metadata
This commit is contained in:
parent
ce260625d6
commit
a05112e6a2
12 changed files with 287 additions and 13 deletions
|
|
@ -382,6 +382,65 @@ impl Store {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn insert_resource_secret(&self, secret: &StoredResourceSecret) -> Result<(), StoreError> {
|
||||
self.conn.execute(
|
||||
r#"INSERT OR REPLACE INTO resource_secrets(
|
||||
secret_id, resource_id, epoch, status, created_at_ms
|
||||
) VALUES (?1, ?2, ?3, ?4, ?5)"#,
|
||||
params![
|
||||
secret.secret_id,
|
||||
secret.resource_id,
|
||||
secret.epoch as i64,
|
||||
secret.status,
|
||||
secret.created_at_ms
|
||||
],
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn list_resource_secrets(&self) -> Result<Vec<StoredResourceSecret>, StoreError> {
|
||||
let mut stmt = self.conn.prepare(
|
||||
r#"SELECT secret_id, resource_id, epoch, status, created_at_ms
|
||||
FROM resource_secrets ORDER BY resource_id, epoch, secret_id"#,
|
||||
)?;
|
||||
let rows = stmt.query_map([], |row| {
|
||||
Ok(StoredResourceSecret {
|
||||
secret_id: row.get(0)?,
|
||||
resource_id: row.get(1)?,
|
||||
epoch: row.get::<_, i64>(2)? as u64,
|
||||
status: row.get(3)?,
|
||||
created_at_ms: row.get(4)?,
|
||||
})
|
||||
})?;
|
||||
rows.collect::<Result<Vec<_>, _>>()
|
||||
.map_err(StoreError::from)
|
||||
}
|
||||
|
||||
pub fn latest_resource_secret(
|
||||
&self,
|
||||
resource_id: &str,
|
||||
) -> Result<Option<StoredResourceSecret>, StoreError> {
|
||||
let mut stmt = self.conn.prepare(
|
||||
r#"SELECT secret_id, resource_id, epoch, status, created_at_ms
|
||||
FROM resource_secrets
|
||||
WHERE resource_id = ?1
|
||||
ORDER BY epoch DESC, created_at_ms DESC, secret_id DESC
|
||||
LIMIT 1"#,
|
||||
)?;
|
||||
let mut rows = stmt.query(params![resource_id])?;
|
||||
if let Some(row) = rows.next()? {
|
||||
Ok(Some(StoredResourceSecret {
|
||||
secret_id: row.get(0)?,
|
||||
resource_id: row.get(1)?,
|
||||
epoch: row.get::<_, i64>(2)? as u64,
|
||||
status: row.get(3)?,
|
||||
created_at_ms: row.get(4)?,
|
||||
}))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn record_cas_object(
|
||||
&self,
|
||||
hash: &str,
|
||||
|
|
@ -753,6 +812,15 @@ pub struct StoredDocumentResource {
|
|||
pub updated_at_ms: i64,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub struct StoredResourceSecret {
|
||||
pub secret_id: String,
|
||||
pub resource_id: String,
|
||||
pub epoch: u64,
|
||||
pub status: String,
|
||||
pub created_at_ms: i64,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub struct CasObject {
|
||||
pub hash: String,
|
||||
|
|
@ -1072,4 +1140,39 @@ mod tests {
|
|||
Some(document)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn resource_secret_epochs_roundtrip() {
|
||||
let store = Store::open_memory().expect("open");
|
||||
let first = StoredResourceSecret {
|
||||
secret_id: "secret:1".to_owned(),
|
||||
resource_id: "resource:kv:prefs".to_owned(),
|
||||
epoch: 1,
|
||||
status: "active".to_owned(),
|
||||
created_at_ms: 1,
|
||||
};
|
||||
let second = StoredResourceSecret {
|
||||
secret_id: "secret:2".to_owned(),
|
||||
resource_id: "resource:kv:prefs".to_owned(),
|
||||
epoch: 2,
|
||||
status: "active".to_owned(),
|
||||
created_at_ms: 2,
|
||||
};
|
||||
|
||||
store.insert_resource_secret(&first).expect("insert first");
|
||||
store
|
||||
.insert_resource_secret(&second)
|
||||
.expect("insert second");
|
||||
|
||||
assert_eq!(
|
||||
store
|
||||
.latest_resource_secret("resource:kv:prefs")
|
||||
.expect("latest"),
|
||||
Some(second.clone())
|
||||
);
|
||||
assert_eq!(
|
||||
store.list_resource_secrets().expect("list"),
|
||||
vec![first, second]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue