Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F3370535
D8442.id28988.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
4 KB
Referenced Files
None
Subscribers
None
D8442.id28988.diff
View Options
diff --git a/services/blob/src/database/mod.rs b/services/blob/src/database/mod.rs
--- a/services/blob/src/database/mod.rs
+++ b/services/blob/src/database/mod.rs
@@ -1,2 +1,3 @@
pub mod errors;
pub mod old;
+pub mod types;
diff --git a/services/blob/src/database/types.rs b/services/blob/src/database/types.rs
new file mode 100644
--- /dev/null
+++ b/services/blob/src/database/types.rs
@@ -0,0 +1,160 @@
+use aws_sdk_dynamodb::types::AttributeValue;
+use chrono::{DateTime, Utc};
+use derive_more::Constructor;
+use std::collections::HashMap;
+
+use crate::{
+ constants::{db::*, BLOB_S3_BUCKET_NAME},
+ s3::S3Path,
+};
+
+use super::errors::Error as DBError;
+
+/// Represents a database row in the DynamoDB SDK format
+pub(super) type RawAttributes = HashMap<String, AttributeValue>;
+/// A convenience Result type for database operations
+pub(super) type DBResult<T> = Result<T, DBError>;
+
+/// Represents a type-safe version of a DynamoDB blob table item.
+/// Each row can be either a blob item or a holder assignment.
+///
+/// It implements the `TryFrom` trait to convert from raw DynamoDB
+/// `AttributeValue`s to the type-safe version.
+pub enum DBRow {
+ BlobItem(BlobItemRow),
+ HolderAssignment(HolderAssignmentRow),
+}
+
+impl TryFrom<RawAttributes> for DBRow {
+ type Error = DBError;
+
+ #[allow(unused)]
+ fn try_from(attributes: RawAttributes) -> Result<Self, Self::Error> {
+ todo!()
+ }
+}
+
+/// Represents an input payload for inserting a blob item into the database.
+/// This contains only the business logic related attributes
+#[derive(Debug)]
+pub struct BlobItemInput {
+ pub blob_hash: String,
+ pub s3_path: S3Path,
+}
+
+impl BlobItemInput {
+ pub fn new(blob_hash: impl Into<String>) -> Self {
+ let blob_hash: String = blob_hash.into();
+ BlobItemInput {
+ blob_hash: blob_hash.clone(),
+ s3_path: S3Path {
+ bucket_name: BLOB_S3_BUCKET_NAME.into(),
+ object_name: blob_hash,
+ },
+ }
+ }
+}
+
+/// A struct representing a blob item row in the table in a type-safe way
+///
+/// It implements the `TryFrom` trait to convert from raw DynamoDB
+/// `AttributeValue`s to the type-safe version.
+#[derive(Debug)]
+pub struct BlobItemRow {
+ pub blob_hash: String,
+ pub s3_path: S3Path,
+ pub unchecked: bool,
+ pub created_at: DateTime<Utc>,
+ pub last_modified: DateTime<Utc>,
+}
+
+impl TryFrom<RawAttributes> for BlobItemRow {
+ type Error = DBError;
+
+ #[allow(unused)]
+ fn try_from(mut attributes: RawAttributes) -> Result<Self, Self::Error> {
+ todo!()
+ }
+}
+
+/// A struct representing a holder assignment table row in a type-safe way
+///
+/// It implements the `TryFrom` trait to convert from raw DynamoDB
+/// `AttributeValue`s to the type-safe version.
+#[derive(Debug)]
+pub struct HolderAssignmentRow {
+ pub blob_hash: String,
+ pub holder: String,
+ pub unchecked: bool,
+ pub created_at: DateTime<Utc>,
+ pub last_modified: DateTime<Utc>,
+}
+
+impl TryFrom<RawAttributes> for HolderAssignmentRow {
+ type Error = DBError;
+
+ #[allow(unused)]
+ fn try_from(mut attributes: RawAttributes) -> Result<Self, Self::Error> {
+ todo!()
+ }
+}
+
+/// Represents a composite primary key for a DynamoDB table row
+///
+/// It implements `TryFrom` and `Into` traits to conveniently use it
+/// in DynamoDB queries
+#[derive(Clone, Constructor, Debug)]
+pub struct PrimaryKey {
+ pub blob_hash: String,
+ pub holder: String,
+}
+
+impl PrimaryKey {
+ /// Creates a primary key for a row containing a blob item data
+ /// Rows queried by primary keys created by this function will
+ /// be of type `BlobItemRow`
+ pub fn for_blob_item(blob_hash: impl Into<String>) -> Self {
+ PrimaryKey {
+ blob_hash: blob_hash.into(),
+ holder: BLOB_ITEM_ROW_HOLDER_VALUE.to_string(),
+ }
+ }
+}
+
+impl TryFrom<RawAttributes> for PrimaryKey {
+ type Error = DBError;
+
+ #[allow(unused)]
+ fn try_from(mut attributes: RawAttributes) -> Result<Self, Self::Error> {
+ todo!()
+ }
+}
+
+// useful for convenient calls:
+// ddb.get_item().set_key(Some(partition_key.into()))
+impl Into<RawAttributes> for PrimaryKey {
+ fn into(self) -> RawAttributes {
+ todo!()
+ }
+}
+
+/// Represents possible values for the `unchecked` attribute value
+pub enum UncheckedKind {
+ Blob,
+ Holder,
+}
+
+impl UncheckedKind {
+ pub fn str_value(&self) -> &'static str {
+ match self {
+ UncheckedKind::Blob => "blob",
+ UncheckedKind::Holder => "holder",
+ }
+ }
+}
+
+impl Into<AttributeValue> for UncheckedKind {
+ fn into(self) -> AttributeValue {
+ AttributeValue::S(self.str_value().to_string())
+ }
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Nov 27, 3:12 AM (20 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2585222
Default Alt Text
D8442.id28988.diff (4 KB)
Attached To
Mode
D8442: [blob-service] Introduce database types
Attached
Detach File
Event Timeline
Log In to Comment