spacedrive/core/crates/sync
Brendan Allan b7c3eb6f5c
sd-core-sync documentation (#2511)
* sd-core-sync api documentation

* use spaces
2024-05-29 03:30:24 +00:00
..
src Make sync ingest setting public (#2485) 2024-05-14 08:38:00 +00:00
tests Fix CI (#2461) 2024-05-08 05:04:25 +00:00
Cargo.toml Sync settings page (#2460) 2024-05-07 07:39:22 +00:00
README.md sd-core-sync documentation (#2511) 2024-05-29 03:30:24 +00:00

sd-core-sync

Spacedrive's sync system. Consumes types and helpers from sd-sync.

Using Sync

Creating Records

Prepare a sync id by creating or obtaining its value, and then wrapping it in the model's SyncId struct, available at prisma_sync::{model}::SyncId.

Next, prepare the sync operations using some varaints of the sync_entry macros. sync_entry and option_sync_entry take the value first, and then the path to the field's prisma module. sync_db_entry and option_sync_db_entry take the same inputs, but additionally produce a prisma operation in a tuple with the sync operation, intended to be put into a Vec and unzipped.

Finally, use sync.shared/relation_create depending on if you're creating a standalone record or a relation between two records, and then write it to the database with write_ops.

let (sync_params, db_params): (Vec<_>, Vec<_>) = [
  sync_db_entry!(self.name, tag::name),
  sync_db_entry!(self.color, tag::color),
  sync_db_entry!(false, tag::is_hidden),
  sync_db_entry!(date_created, tag::date_created),
]
.into_iter()
.unzip();

sync.write_ops(
  db,
  (
    sync.shared_create(
      prisma_sync::tag::SyncId { pub_id },
      sync_params,
    ),
    db.tag().create(pub_id, db_params),
  ),
)

Updating Records

This follows a similar process to creation, but with sync.shared/relation_create.

let (sync_params, db_params): (Vec<_>, Vec<_>) = [
  sync_db_entry!(name, tag::name),
  sync_db_entry!(color, tag::color),
]
.into_iter()
.unzip();

sync.write_ops(
  db,
  (
    sync.shared_update(prisma_sync::tag::SyncId { pub_id }, k, v),
    db.tag().update(tag::id::equals(id), db_params);
  )
)

Deleting Records

This only requires a sync ID.

sync.write_op(
  db,
  sync.shared_delete(prisma_sync::tag::SyncId { pub_id }),
  db.tag().delete(tag::id::equals(id));
)

Relation Records

Relations require sync IDs for both the item and the group being related together. Apart from that they're basically the same as shared operations.

let (sync_params, db_params): (Vec<_>, Vec<_>) = [
  sync_db_entry!(date_created, tag_on_object::date_created)
]
.into_iter()
.unzip();

sync.write_ops(
  db,
  (
    sync.relation_create(
      prisma_sync::tag_on_object::SyncId {
        tag: prisma_sync::tag::SyncId { pub_id: tag_pub_id },
        object: prisma_sync::object::SyncId { pub_id: object_pub_id },
      },
      sync_params
    ),
    db.tag_on_object().create(
        object::id::equals(object_id),
        tag::id::equals(tag_id),
        db_params
    )
  )
)