Skip to content

Commit

Permalink
ui/ux improvements notifications, type filters
Browse files Browse the repository at this point in the history
  • Loading branch information
LeosPrograms committed May 6, 2024
1 parent e6ae7cd commit 7a08cf8
Show file tree
Hide file tree
Showing 17 changed files with 915 additions and 180 deletions.
1 change: 1 addition & 0 deletions dnas/whosin/zomes/coordinator/coordinator/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
pub mod viewed;
pub mod coordination_to_spam_reporters;
pub mod coordination_to_sponsors;
pub mod viewer_to_coordinations;
Expand Down
109 changes: 109 additions & 0 deletions dnas/whosin/zomes/coordinator/coordinator/src/viewed.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
use hdk::prelude::*;
use coordinator_integrity::*;
#[hdk_extern]
pub fn create_viewed(viewed: Viewed) -> ExternResult<Record> {
let viewed_hash = create_entry(&EntryTypes::Viewed(viewed.clone()))?;
let record = get(viewed_hash.clone(), GetOptions::default())?
.ok_or(
wasm_error!(
WasmErrorInner::Guest(String::from("Could not find the newly created Viewed"))
),
)?;
Ok(record)
}
#[hdk_extern]
pub fn get_viewed(viewed_hash: ActionHash) -> ExternResult<Option<Record>> {
let Some(details) = get_details(viewed_hash, GetOptions::default())? else {
return Ok(None);
};
match details {
Details::Record(details) => Ok(Some(details.record)),
_ => {
Err(
wasm_error!(
WasmErrorInner::Guest(String::from("Malformed get details response"))
),
)
}
}
}

#[hdk_extern]
pub fn get_all_viewed() -> ExternResult<Vec<Viewed>> {
emit_signal("viewed below")?;

let viewed_entry_type: EntryType = UnitEntryTypes::Viewed.try_into()?;
let filter = ChainQueryFilter::new()
.entry_type(viewed_entry_type)
.include_entries(true);
let all_records = query(filter)?;

emit_signal(all_records.clone())?;

let all_viewed: Vec<Viewed> = all_records
.into_iter()
.map(|record| {
let viewed: Viewed = record
.entry
.clone()
.into_option()
.ok_or(
wasm_error!(WasmErrorInner::Guest(
String::from("Could not find the Viewed entry")
)),
)?
.try_into()?;
Ok(viewed)
})
.collect::<ExternResult<Vec<Viewed>>>()?;

Ok(all_viewed)
}

#[hdk_extern]
pub fn delete_viewed(original_viewed_hash: ActionHash) -> ExternResult<ActionHash> {
let details = get_details(original_viewed_hash.clone(), GetOptions::default())?
.ok_or(
wasm_error!(
WasmErrorInner::Guest(String::from("{pascal_entry_def_name} not found"))
),
)?;
let record = match details {
Details::Record(details) => Ok(details.record),
_ => {
Err(
wasm_error!(
WasmErrorInner::Guest(String::from("Malformed get details response"))
),
)
}
}?;
delete_entry(original_viewed_hash)
}
#[hdk_extern]
pub fn get_all_deletes_for_viewed(
original_viewed_hash: ActionHash,
) -> ExternResult<Option<Vec<SignedActionHashed>>> {
let Some(details) = get_details(original_viewed_hash, GetOptions::default())? else {
return Ok(None);
};
match details {
Details::Entry(_) => {
Err(wasm_error!(WasmErrorInner::Guest("Malformed details".into())))
}
Details::Record(record_details) => Ok(Some(record_details.deletes)),
}
}
#[hdk_extern]
pub fn get_oldest_delete_for_viewed(
original_viewed_hash: ActionHash,
) -> ExternResult<Option<SignedActionHashed>> {
let Some(mut deletes) = get_all_deletes_for_viewed(original_viewed_hash)? else {
return Ok(None);
};
deletes
.sort_by(|delete_a, delete_b| {
delete_a.action().timestamp().cmp(&delete_b.action().timestamp())
});
Ok(deletes.first().cloned())
}
63 changes: 63 additions & 0 deletions dnas/whosin/zomes/integrity/coordinator/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
pub mod viewed;
pub use viewed::*;
pub mod coordination_to_spam_reporters;
pub use coordination_to_spam_reporters::*;
pub mod coordination_to_sponsors;
Expand All @@ -20,6 +22,8 @@ use hdi::prelude::*;
pub enum EntryTypes {
Coordination(Coordination),
Coordrole(Coordrole),
#[entry_type(name = "Viewed", visibility = "private")]
Viewed(Viewed),
}
#[derive(Serialize, Deserialize)]
#[hdk_link_types]
Expand Down Expand Up @@ -69,6 +73,12 @@ pub fn validate(op: Op) -> ExternResult<ValidateCallbackResult> {
coordrole,
)
}
EntryTypes::Viewed(viewed) => {
validate_create_viewed(
EntryCreationAction::Create(action),
viewed,
)
}
}
}
OpEntry::UpdateEntry { app_entry, action, .. } => {
Expand All @@ -85,6 +95,12 @@ pub fn validate(op: Op) -> ExternResult<ValidateCallbackResult> {
coordrole,
)
}
EntryTypes::Viewed(viewed) => {
validate_create_viewed(
EntryCreationAction::Update(action),
viewed,
)
}
}
}
_ => Ok(ValidateCallbackResult::Valid),
Expand Down Expand Up @@ -148,6 +164,9 @@ pub fn validate(op: Op) -> ExternResult<ValidateCallbackResult> {
EntryTypes::Coordrole(coordrole) => {
validate_delete_coordrole(action, original_action, coordrole)
}
EntryTypes::Viewed(viewed) => {
validate_delete_viewed(action, original_action, viewed)
}
}
}
_ => Ok(ValidateCallbackResult::Valid),
Expand Down Expand Up @@ -360,6 +379,12 @@ pub fn validate(op: Op) -> ExternResult<ValidateCallbackResult> {
coordrole,
)
}
EntryTypes::Viewed(viewed) => {
validate_create_viewed(
EntryCreationAction::Create(action),
viewed,
)
}
}
}
OpRecord::UpdateEntry {
Expand Down Expand Up @@ -445,6 +470,37 @@ pub fn validate(op: Op) -> ExternResult<ValidateCallbackResult> {
Ok(result)
}
}
EntryTypes::Viewed(viewed) => {
let result = validate_create_viewed(
EntryCreationAction::Update(action.clone()),
viewed.clone(),
)?;
if let ValidateCallbackResult::Valid = result {
let original_viewed: Option<Viewed> = original_record
.entry()
.to_app_option()
.map_err(|e| wasm_error!(e))?;
let original_viewed = match original_viewed {
Some(viewed) => viewed,
None => {
return Ok(
ValidateCallbackResult::Invalid(
"The updated entry type must be the same as the original entry type"
.to_string(),
),
);
}
};
validate_update_viewed(
action,
viewed,
original_action,
original_viewed,
)
} else {
Ok(result)
}
}
}
}
OpRecord::DeleteEntry { original_action_hash, action, .. } => {
Expand Down Expand Up @@ -513,6 +569,13 @@ pub fn validate(op: Op) -> ExternResult<ValidateCallbackResult> {
original_coordrole,
)
}
EntryTypes::Viewed(original_viewed) => {
validate_delete_viewed(
action,
original_action,
original_viewed,
)
}
}
}
OpRecord::CreateLink {
Expand Down
65 changes: 65 additions & 0 deletions dnas/whosin/zomes/integrity/coordinator/src/viewed.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
use hdi::prelude::*;
#[hdk_entry_helper]
#[derive(Clone, PartialEq)]
pub struct Viewed {
pub viewed_hash: ActionHash,
pub viewed_date: Timestamp,
}
pub fn validate_create_viewed(
_action: EntryCreationAction,
_viewed: Viewed,
) -> ExternResult<ValidateCallbackResult> {
Ok(ValidateCallbackResult::Valid)
}
pub fn validate_update_viewed(
_action: Update,
_viewed: Viewed,
_original_action: EntryCreationAction,
_original_viewed: Viewed,
) -> ExternResult<ValidateCallbackResult> {
Ok(ValidateCallbackResult::Invalid(String::from("Vieweds cannot be updated")))
}
pub fn validate_delete_viewed(
_action: Delete,
_original_action: EntryCreationAction,
_original_viewed: Viewed,
) -> ExternResult<ValidateCallbackResult> {
Ok(ValidateCallbackResult::Valid)
}
pub fn validate_create_link_all_viewed(
_action: CreateLink,
_base_address: AnyLinkableHash,
target_address: AnyLinkableHash,
_tag: LinkTag,
) -> ExternResult<ValidateCallbackResult> {
// Check the entry type for the given action hash
let action_hash = target_address
.into_action_hash()
.ok_or(
wasm_error!(
WasmErrorInner::Guest(String::from("No action hash associated with link"))
),
)?;
let record = must_get_valid_record(action_hash)?;
let _viewed: crate::Viewed = record
.entry()
.to_app_option()
.map_err(|e| wasm_error!(e))?
.ok_or(
wasm_error!(
WasmErrorInner::Guest(String::from("Linked action must reference an entry"))
),
)?;
// TODO: add the appropriate validation rules
Ok(ValidateCallbackResult::Valid)
}
pub fn validate_delete_link_all_viewed(
_action: DeleteLink,
_original_action: CreateLink,
_base: AnyLinkableHash,
_target: AnyLinkableHash,
_tag: LinkTag,
) -> ExternResult<ValidateCallbackResult> {
// TODO: add the appropriate validation rules
Ok(ValidateCallbackResult::Valid)
}
Loading

0 comments on commit 7a08cf8

Please sign in to comment.