UNPKG

terriajs

Version:

Geospatial data visualization platform.

301 lines (184 loc) 13 kB
# 5. Root group IDs, `shareKeys` and share link compatibility Date: 2020-12-03 Version: 3 ## Status Accepted ## Context ### Glossary - **v7 JSON catalog**: An old v7 catalog that lives in a JSON file, typically specified in a TerriaMap's config.json. - **v8 JSON catalog**: Like an old v7 catalog, but v8. - **v8 JSON catalog loaded from Magda (Magda v8 JSON)**: A v8 json catalog sitting in the map-config record for that map in Magda. - **Magda catalog**: Each catalog item and group is a magda record. - **Root group**: The group that contains all catalog members - it is essentially the Data Catalog. ### Autogenerated IDs (autoIDs) Most maps (v7 and v8) use autogenerated `id` for catalog members - these are used if catalog members don't have an `id` explicitly defined. The root group `id` is very important for autoIDs. By default v8 uses `"/"` and v7 uses `"Root Group"` - v7 ID has format `Root Group/$someContainerId/$someLowerContainerId/$catalogName` - v8 ID has format `//$someContainerId/$someLowerContainerId/$catalogName` Using autoIDs solidifies catalog - you can't move items around without changing IDs, which will break share links. ### Catalog converter Currently, catalog converter will transfer `id` (only if explicitly defined - i.e. **not autogenerated**) from v7 to v8, and it doesn't write anything to `shareKeys`. There is a PR - https://github.com/TerriaJS/catalog-converter/pull/28 - to add optional random ID generation. #### Share conversion (using catalog-converter) When we convert v7 share JSON to v8 - if shared models are using v7 autoIDs (they don't have an `id` defined) we convert v7 autoIDs to v8 autoIDs ([see `catalong-converter` share assumptions ADR](https://github.com/TerriaJS/catalog-converter/blob/master/architecture/0001-share-conversion-assumptions.md)) ## v8 Map deployment types - ID handling - v8 JSON catalog maps (TerriaMap) - Magda map-config (v8 JSON) - Magda map-config (Magda catalog) ### v8 JSON catalog maps (TerriaMap) If `ids` aren't defined for catalog members, `terriajs` will use autoIDs outlined above. ### Magda map-config Previously, if a map used a Magda config, the root group ID was `"$magda-config-record-id"`. As a quick fix, we forced this Magda root group ID to be `"/"` instead of `$magda-config-record-id`. This fixed sharing for Magda JSON/initURL based maps, but broke sharing for Magda catalog maps (not JSON based) - eg digital twins. #### Magda v8 JSON Magda map-config maps can still use static v8 JSON catalogs (similar to TerriaMap). autoIDs are used in the same way. But, if we are using `"$magda-config-record-id"` root group ID, we would see **all** autoIDs change: - `//$someContainerId/$someLowerContainerId/$catalogName` will become - `$magda-config-record-id/$someContainerId/$someLowerContainerId/$catalogName` Thus, breaking share links. #### Magda catalog maps (not v8 JSON) Magda records for each catalog member will always have an explicit ID - for example `41f21ec3-95f8-429a-a62b-44a6183034aa`. Therefore, the changes in autoID outlined above don't apply. ### ShareKeys Any change in catalog member IDs across Terria maps will break share links. To overcome this we have `shareKeys`, which acts as a string Map from previous IDs to the current ID. For example (using Magda v8 JSON): - If `//$someContainerId/$someLowerContainerId/$catalogName` ID is now - `$magda-config-record-id/$someContainerId/$someLowerContainerId/$catalogName` We must set set `shareKeys` to: - `shareKeys=["//$someContainerId/$someLowerContainerId/$catalogName"]` **AND** we must also set `shareKeys` for all parent items... - `$magda-config-record-id/$someContainerId/$someLowerContainerId` - `shareKeys=["//$someContainerId/$someLowerContainerId"]` - `$magda-config-record-id/$someContainerId` - `shareKeys=["//$someContainerId"]` - `$magda-config-record-id` - `shareKeys=["/"]` ### Up/Downgrading maps It is common to move maps between deployment types: - v7 JSON catalog - v8 JSON catalog - Magda v7-v8 converted JSON-based catalog`*` - Magda v8 JSON-based catalog`*` - Magda v8 catalog `*` indicates on-the-fly conversion - i.e. catalog JSON file is untouched. These are possible transformations: - v7 JSON catalog -> v8 JSON catalog - v7 JSON catalog -> Magda v7-v8 converted JSON-based catalog - v8 JSON catalog -> Magda v8 JSON-based catalog - v8 JSON catalog -> Magda v8 catalog - Magda v8 catalog -> v8 JSON catalog #### v7 JSON catalog -> v8 JSON catalog Approaches: 1. Catalog converter with autoIDs (no IDs are written to catalog JSON) - Share links converted on the fly using v7 autoIDs -> v8 autoIDs - `shareKeys` not required unless catalog structure changes (which would change v8 autoIDs) 2. Catalog converter with new random IDs for each item - `shareKeys` must contain v7 autoID to preserve share links - Can't re-run catalog converter, as you will get new random IDs - Can change catalog structure without breaking share links #### v7 JSON catalog -> Magda v7-v8 converted JSON-based catalog This deployment uses a v7 JSON catalog, but converts it to v8 on-the-fly (in `terria-js`). The approach is similar to "v7 JSON catalog -> v8 JSON catalog". #### v8 JSON catalog -> Magda v8 JSON-based catalog Depends on Magda Reference root group ID. - If we keep it as `/`, then the catalog will behave the same as a v8 JSON catalog - If Magda Reference root group ID is reverted to `$magda-config-record-id`, autoIDs will change for every catalog member, therefore `shareKeys` will have to be added to every catalog member to preserve shares (for v8 and/or v7 autoIDs). #### v8 JSON catalog -> Magda v8 catalog When converting to a "Magda catalog", each catalog member is given a new magda record with a new random ID. Therefore, all members will need `shareKeys` with v8 autoIDs (or previous catalog IDs if they were defined) **AND** v7 autoIDs (if applicable). Changes in Magda Reference root group ID have no effect. #### Magda v8 catalog -> v8 JSON catalog If magda record IDs are copied into v8 catalog, then share links should work. #### Notes on combining transformations A common scenario will be v7 JSON catalog -> Magda v7-v8 converted JSON-based catalog -> v8 JSON catalog -> Magda v8 JSON-based catalog -> Magda v8 catalog If we use `$magda-config-record-id`, then we may have 3 `shareKeys` for each catalog item to deal with, as will have to add `shareKeys` for the following transformations: - v8 JSON catalog -> Magda v8 JSON-based catalog - v8 autoIDs - v7 autoIDs - Magda v8 JSON-based catalog -> Magda v8 catalog - v8 autoIDs with `$magda-config-record-id` root group ID If we use `/`, then we will only need to deal with adding `shareKeys` for: - Magda v8 JSON-based catalog -> Magda v8 catalog - v8 autoIDs - v7 autoIDs ## Decision 1: Magda Reference root group ID We have two options: - Keeping magda root group as `/` - Reverting to `$magda-config-record-id` ### Reverting Magda forced group ID #### Sharekeys for catalog members `shareKeys` will need to be added for the following transformations: - v8 JSON catalog -> Magda v8 JSON-based catalog - v8 JSON catalog -> Magda v8 catalog This is because iff we revert this, then **ALL** autoIDs for catalog items will change: - `//$someContainerId/$someLowerContainerId/$catalogName` will become - `$magda-config-record-id/$someContainerId/$someLowerContainerId/$catalogName` This also means that if we chain transformations - for example: - v7 JSON catalog - -> Magda v7-v8 converted JSON-based catalog - -> v8 JSON catalog - -> Magda v8 JSON-based catalog - -> Magda v8 catalog We will have 3 `shareKeys` to maintain: - v7 autoIDs: `Root Group/$someContainerId/$someLowerContainerId/$catalogName` - Old magda JSON based autoIDs: `$magda-config-record-id/$someContainerId/$someLowerContainerId/$catalogName` Also, if we ever change the `$magda-config-record-id` - this will result in a whole new set of IDs that need to be added to `shareKeys` (for Magda JSON-based maps). In PR - **Unmerged** - https://github.com/TerriaJS/terriajs/pull/5042 #### Catalog-converter We must then: - Stop converting autoIDs to v8 in sharelinks - we will keep them as v7 autoIDs. - Add `shareKeys` with v7 autoIDs. #### Add `shareKeys` for Magda `map-config` root group We will have to handle share links which have been generated since the magda root group was changed to `/`. To do so, we must add `"shareKeys": ["/"]` to the root group: This can be added in the `terria` aspect of the Magda map config record: ```json { "aspects": { "terria": { "id": "map-config-de-australia", "shareKeys": [ "/" ], "type": "group" }, ... }, "id": "map-config-de-australia", ... } ``` In PR - **Unmerged** - https://github.com/TerriaJS/terriajs/pull/5042 ### Leaving magda root group ID as `/` Why do we need `$magda-config-record-id` as the root group ID? #### Catalog-converter Leaving `"/"` is very convenient - it means we don't need `shareKeys` with our current approach of converting share links (converting v7 autoIDs to v8). #### Sharekeys for catalog members No `shareKeys` are needed except for v8 JSON catalog -> Magda v8 catalog transformation #### Add `shareKeys` for Magda `map-config` root group To fix sharelinks which used `$magda-config-record-id` - we need to add `shareKeys=["$magda-config-record-id"]` in the `terria` aspect of the magda map config record (similar to above). ## Decision 2: Catalog converter ID handling ### Sharekeys Regardless of previous decision, should we still write v7 autoID into `shareKeys`? This would ensure old v7 share-links continue to work if catalog structure changes. ### Random ID generation default Should we default to writing random IDs to encourage ID usage in catalogs? If we do, we must also add `shareKeys` for v7 autoIDs. The whole automatic ID generation thing is painful. ## Decisions Summary ### Decision 1: Magda Reference root group ID | option | pros | cons | | -------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | Revert to `$magda-map-config-id` | Can identify map-config from sharelinks.<br/> Support multiple root groups? | Need to add `shareKeys` for Magda autoIDs (with `$magda-map-config-id` root group ID).<br/> Have to deal with magda map config IDs changing | | Leave as `/` | All JSON based catalogs are treated the same.<br/>Don't need to add `shareKeys` until we move into Magda catalog | Reliance on converting v7 autoIDs to v8 is a little opaque (this can be overcome by adding random `id` when converting catalog) | Option 2 is a go! ### Decision 2: Catalog converter ID handling | option | pros | cons | | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | | Write v7 autoID `shareKeys` | Can change catalog structure and preserve old v7 share links.<br/>Can remove opaque autoID conversion in share link conversion | Makes catalog JSON less readable, may be confusing to some users. | | Create random IDs by default for all catalog members | Encourages usage of proper IDs. <br/>Can remove autoID conversion.<br/>Prevents changing IDs with `$magda-map-config-id` root group ID. | Makes catalog JSON less readable.<br/>Requires v7 autoID `shareKeys` | Option 1: yes + yes for default Option 2: yes + give warning to users to not change IDs ## Consequences - We will have to add a `shareKey` for the root group of Magda catalog maps - to translate `$magda-map-config-id` to `/`. - No longer able to identify maps from `$magda-map-config-id` root group ID. - Users may misunderstand importance of keeping IDs stable when converting catalog - `shareKeys` (and `ids`) may clutter JSON catalog - v7-v8 share link conversion will only work if v8 catalog has `shareKeys` - The v7-v8 sharelink autoID conversion is going to be removed - There will be more unseen consequences to come...