#holochain #crud #entry #pattern #chained #zomes #ceps

hc_crud_ceps

A CRUD library for Holochain zomes that implement the CEPS pattern (Chained, Entry, Permalink, State-based)

33 releases (breaking)

0.80.0 Jul 20, 2023
0.78.0 Jun 12, 2023
0.76.0 Mar 22, 2023
0.72.0 Dec 21, 2022
0.6.1 Nov 23, 2021

#6 in #chained

Download history 17/week @ 2024-09-22 60/week @ 2024-12-08

60 downloads per month

CAL-1.0 and AGPL-3.0 WITH mif-exception

32KB
405 lines

Holochain CRUD Library (CEPS pattern)

A CRUD library for Holochain zomes that implement the CEPS pattern (Chained, Entry, Permalink, State-based)

Holochain Version Map

For information on which versions of this package work for each Holochain release, see docs/Holochain_Version_Map.md

Overview

Install

Example of adding to Cargo.toml

[dependencies]
hc_crud_ceps = "0.3.0"

Example of common imports

use hc_crud::{
    now,
    create_entity, get_entity, get_entities, update_entity, delete_entity,
    Entity, EntryModel, EntityType,
};

Basic Usage

CRUD Operations

These imports and structs are assumed for all examples

use hdk::prelude::*;
use hc_crud::{
    now,
    create_entity, get_entity, get_entities, update_entity, delete_entity,
    Entity, EntryModel, EntityType,
};

#[hdk_entry_helper]
#[derive(Clone)]
pub struct PostEntry {
    pub title: String,
    pub message: String,
    pub published_at: Option<u64>,
    pub last_updated: Option<u64>,
}

#[hdk_entry_defs]
#[unit_enum(UnitEntryTypes)]
pub enum EntryTypes {
    #[entry_def]
    Post(PostEntry),
}

impl EntryModel<EntryTypes> for PostEntry {
    fn name() -> &'static str { "Post" }
    fn get_type(&self) -> EntityType {
        EntityType::new( "post", "entry" )
    }
    fn to_input(&self) -> EntryTypes {
        EntryTypes::Post(self.clone())
    }
}

Create an entry

Example

let input = PostEntry {
    title: String::from("Greeting"),
    message: String::from("Hello world!"),
    published_at: Some(1633108520744),
    last_updated: None,
};

let post_entity = create_entity( &input )?;

[Read] Get an entry

Example

let post_entity = get_entity( &entity.id )?;

Update an entry

Example

let post_entity = update_entity( &entity.address, |mut previous: PostEntry, _| {
    previous.message = String::from("Hello, world!");
    previous.last_updated = Some( now()? );
    Ok(previous)
})?;

Delete an entry

Example

delete_entity::<PostEntry,EntryTypes>( &entity.id )?;

Example of CRUD for relationships

Create a 1-to-many relationship for post entries to have comment entries.

The following examples use this additional struct

#[hdk_entry_helper]
#[derive(Clone)]
pub struct CommentEntry {
    pub message: String,
    pub published_at: Option<u64>,
    pub last_updated: Option<u64>,
}

impl EntryModel<EntryTypes> for CommentEntry {
    fn name() -> &'static str { "Comment" }
    fn get_type(&self) -> EntityType {
        EntityType::new( "comment", "entry" )
    }
    fn to_input(&self) -> EntryTypes {
        EntryTypes::Comment(self.clone())
    }
}

Add CommentEntry to EntryTypes enum

 #[hdk_entry_defs]
 #[unit_enum(UnitEntryTypes)]
 pub enum EntryTypes {
     #[entry_def]
     Post(PostEntry),
+    #[entry_def]
+    Comment(CommentEntry),
 }

Create a CommentEntry and link it to the PostEntry

#[hdk_link_types]
pub enum LinkTypes {
    Post,
    Comment,
}

let input = CommentEntry {
    message: String::from("Where is the sun?"),
    published_at: Some( now()? ),
    last_updated: None,
};

let comment_entity = create_entity( &input )?;

comment_entity.link_from( &post_entity.id, LinkTypes::Comment, None )?;

Get a Collection for a specific base and tag

let collection : Vec<Entity<CommentEntry>> = get_entities( &post_entity.id, LinkTypes::Comment, None )?;

API Reference

See docs.rs/hc_crud_ceps

Contributing

See CONTRIBUTING.md

Dependencies

~17–28MB
~440K SLoC