.. _UC28:

Use Case 28 - Derived Product Original Change Notification
----------------------------------------------------------

.. index:: Use Case 28, UC28, notification, object change, update, delete

Revisions
  View document revision history_.

Goal
  Relationships/Versioning - Derived products should be linked to source
  objects so that notifications can be made to users of derived products when
  source products change.

Summary 
  Although content in DataONE is immutable, there are situations where the
  original content can be updated, and in these cases a new copy of the
  content is created for science metadata. The update process for data is
  currently not defined, though for practical reasons it is unlikely to 
  be feasible to preserve *all* copies of data, especially for particularly 
  large data sets.

  The premise is that owners of the derived products will be notified - for 
  this to occur, the relationships between original and derived need to be 
  recorded and discoverable. The mechanism for this requires further design.
  It would be possible to record such relationships in the system metadata, 
  or perhaps it may be necessary for a different class of object to be created
  to specifically to support recordation of relationships between content.
  
Actors
  - Data owners
  - Derived products
  - Original products
  - Member Nodes
  - Coordinating Nodes
  - Notification system

Preconditions 
  - Relationships between objects are recorded and discoverable
  - Derived products are stored in the DataONE infrastructure
  
Triggers
  - An object is updated.
 
Post Conditions
  - Derived product owners are notified of the change.

**Notes**

- Who can assert these relationships? The relevant object owners? Anybody?

- How are relationships removed?

.. 
   @startuml images/28_seq.png
   actor User
   participant "Client" as app_client << Application >>
   User -> app_client
   participant "Authentication API" as c_authenticate << Coordinating Node >>
   app_client -> c_authenticate: login (user, pw)
   app_client <-- c_authenticate: token or failure
   participant "CRUD API" as c_crud << Coordinating Node >>
   app_client -> c_crud: assertRelation (token, IDofSubject, relationship, IDofObject)
   participant "Synchronization API" as c_sync << Coordinating Node >>
   c_sync <-- c_crud: synchronize ()
   c_crud <-- c_sync: ack or fail
   app_client <-- c_crud: status
   @enduml

.. image:: images/28_seq.png

*Figure 1.* Interactions for use case 28. Versioning -- Derived products
should be linked to source objects so that notifications can be made to users
of derived products when source products change

.. _history: https://redmine.dataone.org/projects/d1/repository/changes/documents/Projects/cicore/architecture/api-documentation/source/design/UseCases/28_uc.txt