# Solid Interop Diagrams
### Data Grant (Source)
```mermaid
classDiagram
class DataGrant {
shapeTree
dataOwner
accessMode
scopeOfGrant
}
class AllInstancesGrant {
hasDataRegistration
^inheritsFromGrant
}
class SelectedInstancesGrant {
hasDataInstance
^inheritsFromGrant
}
class InheritInstancesGrant {
hasDataRegistration
inheritsFromGrant
}
DataGrant <|-- AllInstancesGrant
DataGrant <|-- SelectedInstancesGrant
DataGrant <|-- InheritInstancesGrant
```
```mermaid
erDiagram
AllInstancesGrant }o--|| DataRegistration : hasDataRegistration
DataRegistration ||--o{ DataInstance : contains
SelectedInstancesGrant }o--|{ DataInstance : hasDataInstance
DataInstance |o--o{ DataInstance : "ShapePathMagicâ„¢"
InheritInstancesGrant }o--|| AllInstancesGrant : inheritsFromGrant
InheritInstancesGrant }o--|| SelectedInstancesGrant : inheritsFromGrant
InheritInstancesGrant }o--|| DataRegistration : hasDataRegistration
```
* Data Grant (source) always leads to Data Instances
* Selected Instances Grant links directly to Data Instances (`interop:hasDataInstance`)
* All Instances Grant links in-directly to Data Instances via Data Registration (`interop:hasDataRegistration`)
* Data Registration links directly to Data Instances (`ldp:contains`)
* Inherit Instances Grant has all data instances from the same Data Registration.
* Data Registration for Inherit Instances Grant has to be in the same storage as Data Registration for the grant it inherits from.
* Inherit Instances Grant and the grant it inherits from have to link to one another (`interop:inheritsFromGrant` plus used in reverse)
* All Instances Grant and Inherit Instances Grant support creating new Data Instances, they are created Data Registration referenced with (`interop:hasDataRegistration`)
### Remote Data Grant (Delegated)
```mermaid
classDiagram
class RemoteDataGrant {
shapeTree
accessMode
scopeOfGrant
}
class SelectedRemoteGrant {
hasDataGrant
^inheritsFromRemoteGrant
}
class AllRemoteFromAgentGrant {
hasRemoteAgentDataRegistration
^inheritsFromRemoteGrant
}
class AllRemoteGrant {
hasRemoteDataRegistration
^inheritsFromRemoteGrant
}
class InheritRemoteInstancesGrant {
inheritsFromRemoteGrant
}
RemoteDataGrant <|-- SelectedRemoteGrant
RemoteDataGrant <|-- AllRemoteFromAgentGrant
RemoteDataGrant <|-- AllRemoteGrant
RemoteDataGrant <|-- InheritRemoteInstancesGrant
```
```mermaid
erDiagram
SelectedRemoteGrant }o--|{ DataGrant : hasDataGrant
AllRemoteFromAgentGrant }o--|| RemoteAgentDataRegistration : hasRemoteAgentDataRegistration
RemoteAgentDataRegistration }o--|{ DataGrant : satisfiesDataGrant
RemoteDataRegistration ||--o{ RemoteAgentDataRegistration : hasRemoteAgentDataRegistration
AllRemoteGrant }o--|| RemoteDataRegistration : hasRemoteDataRegistration
InheritRemoteInstancesGrant }o--|| SelectedRemoteGrant : inheritsFromGrant
InheritRemoteInstancesGrant }o--|| AllRemoteFromAgentGrant : inheritsFromGrant
InheritRemoteInstancesGrant }o--|| AllRemoteGrant : inheritsFromGrant
```
* Remote Data Grant always leads to Data Grant, in a way represents delegation to that source grant / those source grants
### Data Instance
This includes mostly implementation specific relations
Reverse of `inhertisFromGrant` is internally named `hasInheritingGrant[]`
```mermaid
erDiagram
DataInstance }o--|{ InheritableGrant : "*dataGrant"
InheritableGrant }|--o{ InheritInstancesGrant : inheritsFromGrant
InheritableGrant }|--o{ InheritableRemoteGrant : "*viaRemoteDataGrant"
InheritableRemoteGrant }|--o{ InheritRemoteInstancesGrant : inheritsFromGrant
InheritInstancesGrant }|--o{ InheritRemoteInstancesGrant : "*viaRemoteDataGrant"
DataInstance }o--|{ InheritInstancesGrant : "*dataGrant"
```
Parent data instance can create child data instances (for given *shape tree*).
When it does it, source data grant to be associated with child data instance can be found:
```
(parent) Data Instance - dataGrant
-> Inheritable Data Grant - hasInheritingDataGrant[shape tree]
-> Inherit Instances Grant
```
For InheritInstancesGrant (which has specific shape three), `viaRemoteDataGrant` can be found:
```
InehritInstancesGrant - inheritsFromGrant
-> Inheritable Data Grant - viaRemoteDataGrant
-> InheritableRemoteDataGrant - hasInheritingDataGrant[shape tree]
-> Inherit Remote Instances Grant
```
### Renaming ideas
* `:hasDataRegistration` --> `:forDataRegistration`
* `:hasDataInstance` --> `:forDataInstance`
* Remote* --> Delegated
* _* --> Source
* Data Registrastion --> Data Repository (has Data Instances) | Data Collection
* Remote Data Registration --> Data Registration (links to Data Grants) | Data Reference
## Major changes ideas
* Broader data structure for User Consent - AllRemote, AllRemoteFromAgent
* Narrower Remote Data Grants (delegated), always having specific source data grant - SelectedRemote (just one)
* folowing closer ZCAP-LD [`parentCapability`](https://w3c-ccg.github.io/zcap-ld/#terminology)
* Specific subclass for each scope, which would remove `scopeOfGrant`
# ZCAP-LD inspired delegation
```mermaid
erDiagram
DataInstance }o--|{ SourceInheritableGrant : "*accessGrantedIn"
SourceInheritableGrant }|--o{ SourceInheritInstancesGrant : inheritsFromGrant
SourceInheritableGrant }|--o{ DelegatedInheritableGrant : delegationOfGrant
DelegatedInheritableGrant }|--o{ DelegatedInheritInstancesGrant : inheritsFromDelegatedGrant
SourceInheritInstancesGrant }|--o{ DelegatedInheritInstancesGrant : delegationOfGrant
DataInstance }o--|{ SourceInheritInstancesGrant : "*accessGrantedIn"
```
```mermaid
erDiagram
SocialAgent ||--o{ Storage : "owner"
SourceDataGrant }o--|| SocialAgent : "dataOwner"
SourceDataGrant }o--|| Agent : "grantSubject"
DelegatedDataGrant }o--|| SourceDataGrant : "delegationOfGrant"
DelegatedDataGrant }o--|| SoftwareAgent : "grantSubject"
Storage ||--|| DataRegistration : "somePropertyChain"
DataRegistration ||--o{ SourceDataGrant : "hasDataRegistration"
```
* *Delegated Data Grant* always has explicit reference to one *Source Data Grant* using `interop:delegationOfGrant`.
* *Delegated Data Grant* doesn't need scope, it just delegates to *Source Data Grant* which has specific scope.
* Application (*Software Agent*) doesn't even know how User expressed the consent, it only knows what data it can access.
* Possibility: we could just reference *Source Data Grant* from *Delegated Data Grant* without giving subject access to it,
*Delegated Data Grant* would include copy of all the information from *Source Data Grant* that subject needs. This
would also allow for more granular control if we want to narrow down what can be accessed during delegation.
```mermaid
erDiagram
AgentRegistry ||--o{ SocialAgentRegistration : "hasRegistration"
SocialAgentRegistration ||--|| SocialAgentRegistration : "reciprocalRegistration"
AgentRegistry ||--o{ ApplicationRegistration : "hasRegistration"
SocialAgentRegistration ||--|| AccessGrant : "hasAccessGrant"
ApplicationRegistration ||--|| AccessGrant : "hasAccessGrant"
AccessGrant ||--|{ DataGrant : "hasDataGrant"
```
```mermaid
erDiagram
AccessConsentRegistry ||--o{ AccessConsent : "hasAccessConsent"
AccessConsent ||--|{ DataConsent : "hasDataConsent"
```
## Access Consent -> Access Grant (former Access Receipt)
NOTE: code uses Access Receipt but will change to Access Grant
Authorization Agent displays the consent screen using it's UI.
Since consent is given for the application, application can't
show the screen to give consent to itself.
1. User confirms consent on the consent screen
2. AA creates access consent with data consents
3. AA creates access grant based on access consent
* for each data consent creates data grants
```mermaid
classDiagram
class ReadableResource {
iri
factory
fetchData()
getObject()
getObjectsArray()
}
class CRUDResource {
draft
update()
delete()
}
ReadableResource <|-- CRUDResource
class Container {
newContained()
}
class ImmutableResource {
}
```