-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
195 changed files
with
8,342 additions
and
4,122 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
{ | ||
"overrides": [ | ||
{ | ||
"files": "*.html", | ||
"options": { | ||
"parser": "html" | ||
} | ||
}, | ||
{ | ||
"files": "*.component.html", | ||
"options": { | ||
"parser": "angular" | ||
} | ||
} | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
# Entities & Entity Schema | ||
----- | ||
For us, an "Entity" is an object in the database (and a representation of something in the user's real world, e.g. a "Child" or "School"). | ||
Entities are at the core of the Aam Digital platform and the primary way to customize the system is to adapt and add new entity types. | ||
|
||
The Entity Schema defines the data structure as well as how it is displayed in the UI. | ||
Entity instances also have some generic functionality inherited from the `Entity` base class. | ||
|
||
------ | ||
_see the sub-pages here for details of the various concepts related to the Entity system_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
# Archive / Anonymize Entities | ||
----- | ||
Any entity can be archived (i.e. marked as inactive and hidden from UI by default) or anonymized (i.e. discarding most data and keeping a few selected properties for statistical reports). | ||
This is often preferable to deleting a record completely. Deleting data also affects statistical reports, even for previous time periods. | ||
By anonymizing records, all personal identifiable data can be removed and the remaining stub record can be stored indefinitely, as it is not subject to data protection regulations like GDPR anymore. | ||
|
||
Anonymization is configured as part of the entity schema. | ||
Data of fields that are not explicitly marked to be retained during anonymization is always deleted (anonymization by default). | ||
|
||
To keep some data even after the user "anonymized" a record, configure the `anonymize` property of the `@DatabaseField` decorator: | ||
- `anonymize: "retain"` will keep this field unchanged and prevent it from being deleted | ||
- `anonymize: "retain-anonymized"` will trigger a special "partial" deletion that depends on the dataType (e.g. date types will be changed to 1st July of the given year, thereby largely removing details but keeping data to calculate a rough age) | ||
|
||
|
||
## Cascading anonymization / deletion | ||
Relationships between entities are automatically handled when the user anonymizes or deletes an entity. | ||
Any related entities that reference the anonymized/deleted entity are checked | ||
and - depending on their configured role - may be updated or anonymized as well. | ||
|
||
The logic follows the scenarios shown below: | ||
![](../../images/cascading-delete.png) | ||
|
||
|
||
## Data Protection & GDPR regarding anonymization / pseudonomyzation | ||
The "anonymize" function is implemented specifically for data protection rules requiring to delete personal data. | ||
According to the EU's "General Data Protection Regulation" (GDPR) "anonymous" data does not fall under its regulations: | ||
|
||
- GDPR is not applicable to anonymous data: "The principles of data protection should therefore not apply to [...] personal data rendered anonymous in such a manner that the data subject is not or no longer identifiable." [<sup>GDPR Recital 26</sup>](https://gdpr-info.eu/recitals/no-26/) | ||
- "To determine whether a natural person is identifiable, account should be taken of all the means reasonably likely to be used, such as singling out, either by the controller or by another person to identify the natural person directly or indirectly." | ||
- "To ascertain whether means are reasonably likely to be used to identify the natural person, account should be taken of all objective factors, such as the costs of and the amount of time required for identification, taking into consideration the available technology at the time of the processing and technological developments." | ||
- "Pseudonymisation enables the personal data to become unidentifiable unless more information is available whereas anonymization allows the processing of personal data to irreversibly prevent re-identification." [<sup>source</sup>](https://www.privacycompany.eu/blogpost-en/what-are-the-differences-between-anonymisation-and-pseudonymisation) | ||
- _also see this [good overview of anonymization misunderstandings and considerations](https://edps.europa.eu/system/files/2021-04/21-04-27_aepd-edps_anonymisation_en_5.pdf)_ | ||
|
||
In the case of records being retained "anonymized" in Aam Digital, we provide a context that makes re-identification even harder: | ||
- only authorized users of the system can access even the anonymized record (where only a few properties have been retained). Unless the organisation actively shares the data, it remains as securely protected as the personal data managed in Aam Digital. | ||
- those authorized users with access to the anonymized records (and therefor a theoretical chance to attempt re-identification) are team members of an organization. They have been screened to be responsible persons and are usually legally bound to keep information confidential. | ||
- by default only a few, explicitly selected properties in anonymized records are retained (data minimization by default). As such, both re-identification likelihood and the impact in case of re-identification are reduced as far as possible. | ||
|
||
--> If our anonymization process is configured thoughfully on a case by case basis to only retain a few data fields that are not easy indirect identifiers, it seems reasonably unlikely that the person can be identified after the anonymization process. Therefore, GDPR should not apply to these records and it is legitimate to retain these for statistical reporting. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
46 changes: 46 additions & 0 deletions
46
doc/compodoc_sources/how-to-guides/create-entity-details-panel.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
# How to create an Entity Details Panel Component | ||
Aam Digital as a platform takes care of loading the relevant entity and configs for an "Entity Details View", | ||
which displays the information about a single entity (e.g. one specific student). | ||
The `EntityDetailsComponent` handles this initialization from the route. | ||
To display some details in a customized way, you can create "panel components" that receive a reference to the current entity and their config parameters as `@Input()` automatically. | ||
|
||
![](../../images/entity-details-panels.png) | ||
The tabs (in the config called "panels") within the Entity Details view can display one or more "panel components", as shown above. | ||
|
||
To make these components as re-usable and simple as possible, we do not load config from the route here. | ||
Instead, the components are initialized from config by the `DynamicComponentDirective`. | ||
This automatically sets `@Input()` properties to the value with the same name in the config object. | ||
|
||
Those background details aside, what that means for your implementation is: | ||
|
||
## Implementing a new Panel Component | ||
|
||
1. Create a new component class | ||
2. Add an `@Input() entity: Entity;`. This will always contain the entity object, whose Details View is currently being displayed. You should not load this yourself from the database. | ||
3. (If needed) Add more inputs for aspects that should be configurable about your component. | ||
(e.g. `@Input() showDescription: boolean;`, which you can use in your template or code to adapt the component.) | ||
These values are automatically set to whatever value is specified in the config object for your component at runtime in the database. | ||
4. Register the new component in its parent module, so that it can be loaded under its name through the config. | ||
|
||
An example config for the above: | ||
```json | ||
{ | ||
"component": "MySubView", | ||
"config": { "showDescription": true } | ||
} | ||
``` | ||
|
||
Use the `ComponentRegistry` to register your component, | ||
e.g. in its Module: | ||
```javascript | ||
export class MyModule { | ||
constructor(components: ComponentRegistry) { | ||
components.addAll([ | ||
[ | ||
"MySubView", // this is the name to use in the config document | ||
() => import("./my-sub-view/my-sub-view.component").then((c) => c.MySubViewComponent), | ||
], | ||
]); | ||
} | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.