Skip to content

Commit 374dc77

Browse files
committed
Add CatalogProvider
1 parent cd6b881 commit 374dc77

File tree

3 files changed

+63
-30
lines changed

3 files changed

+63
-30
lines changed

lib/Models/Catalog/CatalogProvider.ts

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import TerriaError from "../../Core/TerriaError";
2+
import ReferenceMixin from "../../ModelMixins/ReferenceMixin";
3+
4+
/**
5+
* @experimental This interface is not stable and likely to change without preserving backwards
6+
* compatibility in following patch versions of TerriaJS.
7+
*
8+
* A CatalogProvider can provide extra functionality where many members in the catalog
9+
* are backed by a service with additional capabilities other than producing Terria catalog JSON
10+
*
11+
* This may include: login, search, ability to track members when they are moved, loading cached dynamic strata
12+
*
13+
*
14+
*/
15+
export default interface CatalogProvider {
16+
createLoadError(reference: ReferenceMixin.Instance): TerriaError;
17+
isProviderFor(reference: ReferenceMixin.Instance): boolean;
18+
}

lib/Models/Catalog/CatalogReferences/MagdaReference.ts

+9
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,15 @@ export default class MagdaReference extends AccessControlMixin(
202202
return target;
203203
}
204204

205+
if (
206+
this.recordId === undefined &&
207+
this.terria.catalogProvider?.isProviderFor(this)
208+
) {
209+
// Occurs if record is no longer found inside containing group
210+
// (i.e moved, deleted or user no longer has access, including if not logged in)
211+
throw this.terria.catalogProvider.createLoadError(this);
212+
}
213+
205214
const record = await this.loadMagdaRecord({
206215
id: this.recordId,
207216
optionalAspects: [

lib/Models/Terria.ts

+36-30
Original file line numberDiff line numberDiff line change
@@ -2,61 +2,61 @@ import i18next from "i18next";
22
import {
33
action,
44
computed,
5+
makeObservable,
56
observable,
67
runInAction,
78
toJS,
8-
when,
9-
makeObservable
9+
when
1010
} from "mobx";
1111
import { createTransformer } from "mobx-utils";
12-
import buildModuleUrl from "terriajs-cesium/Source/Core/buildModuleUrl";
1312
import Clock from "terriajs-cesium/Source/Core/Clock";
14-
import defaultValue from "terriajs-cesium/Source/Core/defaultValue";
15-
import defined from "terriajs-cesium/Source/Core/defined";
1613
import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError";
1714
import CesiumEvent from "terriajs-cesium/Source/Core/Event";
18-
import queryToObject from "terriajs-cesium/Source/Core/queryToObject";
1915
import RequestScheduler from "terriajs-cesium/Source/Core/RequestScheduler";
2016
import RuntimeError from "terriajs-cesium/Source/Core/RuntimeError";
2117
import TerrainProvider from "terriajs-cesium/Source/Core/TerrainProvider";
18+
import buildModuleUrl from "terriajs-cesium/Source/Core/buildModuleUrl";
19+
import defaultValue from "terriajs-cesium/Source/Core/defaultValue";
20+
import defined from "terriajs-cesium/Source/Core/defined";
21+
import queryToObject from "terriajs-cesium/Source/Core/queryToObject";
2222
import Entity from "terriajs-cesium/Source/DataSources/Entity";
2323
import SplitDirection from "terriajs-cesium/Source/Scene/SplitDirection";
2424
import URI from "urijs";
2525
import {
2626
Category,
27-
LaunchAction,
28-
DataSourceAction
27+
DataSourceAction,
28+
LaunchAction
2929
} from "../Core/AnalyticEvents/analyticEvents";
3030
import AsyncLoader from "../Core/AsyncLoader";
3131
import Class from "../Core/Class";
3232
import ConsoleAnalytics from "../Core/ConsoleAnalytics";
3333
import CorsProxy from "../Core/CorsProxy";
34-
import ensureSuffix from "../Core/ensureSuffix";
35-
import filterOutUndefined from "../Core/filterOutUndefined";
36-
import getDereferencedIfExists from "../Core/getDereferencedIfExists";
37-
import getPath from "../Core/getPath";
3834
import GoogleAnalytics from "../Core/GoogleAnalytics";
39-
import hashEntity from "../Core/hashEntity";
40-
import instanceOf from "../Core/instanceOf";
41-
import isDefined from "../Core/isDefined";
4235
import {
36+
JsonArray,
37+
JsonObject,
4338
isJsonBoolean,
4439
isJsonNumber,
4540
isJsonObject,
46-
isJsonString,
47-
JsonArray,
48-
JsonObject
41+
isJsonString
4942
} from "../Core/Json";
5043
import { isLatLonHeight } from "../Core/LatLonHeight";
51-
import loadJson from "../Core/loadJson";
52-
import loadJson5 from "../Core/loadJson5";
5344
import Result from "../Core/Result";
5445
import ServerConfig from "../Core/ServerConfig";
5546
import TerriaError, {
5647
TerriaErrorOverrides,
5748
TerriaErrorSeverity
5849
} from "../Core/TerriaError";
5950
import { Complete } from "../Core/TypeModifiers";
51+
import ensureSuffix from "../Core/ensureSuffix";
52+
import filterOutUndefined from "../Core/filterOutUndefined";
53+
import getDereferencedIfExists from "../Core/getDereferencedIfExists";
54+
import getPath from "../Core/getPath";
55+
import hashEntity from "../Core/hashEntity";
56+
import instanceOf from "../Core/instanceOf";
57+
import isDefined from "../Core/isDefined";
58+
import loadJson from "../Core/loadJson";
59+
import loadJson5 from "../Core/loadJson5";
6060
import { getUriWithoutPath } from "../Core/uriHelpers";
6161
import PickedFeatures, {
6262
featureBelongsToCatalogItem,
@@ -67,12 +67,14 @@ import GroupMixin from "../ModelMixins/GroupMixin";
6767
import MappableMixin, { isDataSource } from "../ModelMixins/MappableMixin";
6868
import ReferenceMixin from "../ModelMixins/ReferenceMixin";
6969
import TimeVarying from "../ModelMixins/TimeVarying";
70-
import { HelpContentItem } from "../ReactViewModels/defaultHelpContent";
71-
import { defaultTerms, Term } from "../ReactViewModels/defaultTerms";
7270
import NotificationState from "../ReactViewModels/NotificationState";
71+
import { HelpContentItem } from "../ReactViewModels/defaultHelpContent";
72+
import { Term, defaultTerms } from "../ReactViewModels/defaultTerms";
7373
import { ICredit } from "../ReactViews/Map/BottomBar/Credits";
7474
import { SHARE_VERSION } from "../ReactViews/Map/Panels/SharePanel/BuildShareLink";
7575
import { shareConvertNotification } from "../ReactViews/Notification/shareConvertNotification";
76+
import { SearchBarTraits } from "../Traits/SearchProviders/SearchBarTraits";
77+
import SearchProviderTraits from "../Traits/SearchProviders/SearchProviderTraits";
7678
import MappableTraits from "../Traits/TraitsClasses/MappableTraits";
7779
import MapNavigationModel from "../ViewModels/MapNavigation/MapNavigationModel";
7880
import TerriaViewer from "../ViewModels/TerriaViewer";
@@ -81,13 +83,15 @@ import CameraView from "./CameraView";
8183
import Catalog from "./Catalog/Catalog";
8284
import CatalogGroup from "./Catalog/CatalogGroup";
8385
import CatalogMemberFactory from "./Catalog/CatalogMemberFactory";
86+
import CatalogProvider from "./Catalog/CatalogProvider";
8487
import MagdaReference, {
8588
MagdaReferenceHeaders
8689
} from "./Catalog/CatalogReferences/MagdaReference";
8790
import SplitItemReference from "./Catalog/CatalogReferences/SplitItemReference";
8891
import CommonStrata from "./Definition/CommonStrata";
89-
import hasTraits from "./Definition/hasTraits";
9092
import { BaseModel } from "./Definition/Model";
93+
import ModelPropertiesFromTraits from "./Definition/ModelPropertiesFromTraits";
94+
import hasTraits from "./Definition/hasTraits";
9195
import updateModelFromJson from "./Definition/updateModelFromJson";
9296
import upsertModelFromJson from "./Definition/upsertModelFromJson";
9397
import {
@@ -102,20 +106,20 @@ import IElementConfig from "./IElementConfig";
102106
import InitSource, {
103107
InitSourceData,
104108
InitSourceFromData,
109+
ShareInitSourceData,
110+
StoryData,
105111
isInitFromData,
106112
isInitFromDataPromise,
107113
isInitFromOptions,
108-
isInitFromUrl,
109-
ShareInitSourceData,
110-
StoryData
114+
isInitFromUrl
111115
} from "./InitSource";
112116
import Internationalization, {
113117
I18nStartOptions,
114118
LanguageConfiguration
115119
} from "./Internationalization";
116120
import MapInteractionMode from "./MapInteractionMode";
117121
import NoViewer from "./NoViewer";
118-
import { defaultRelatedMaps, RelatedMap } from "./RelatedMaps";
122+
import { RelatedMap, defaultRelatedMaps } from "./RelatedMaps";
119123
import CatalogIndex from "./SearchProviders/CatalogIndex";
120124
import { SearchBarModel } from "./SearchProviders/SearchBarModel";
121125
import ShareDataService from "./ShareDataService";
@@ -124,9 +128,6 @@ import TimelineStack from "./TimelineStack";
124128
import { isViewerMode, setViewerMode } from "./ViewerMode";
125129
import Workbench from "./Workbench";
126130
import SelectableDimensionWorkflow from "./Workflows/SelectableDimensionWorkflow";
127-
import { SearchBarTraits } from "../Traits/SearchProviders/SearchBarTraits";
128-
import ModelPropertiesFromTraits from "./Definition/ModelPropertiesFromTraits";
129-
import SearchProviderTraits from "../Traits/SearchProviders/SearchProviderTraits";
130131

131132
// import overrides from "../Overrides/defaults.jsx";
132133

@@ -682,6 +683,11 @@ export default class Terria {
682683
*/
683684
errorService: ErrorServiceProvider = new StubErrorServiceProvider();
684685

686+
/**
687+
* @experimental
688+
*/
689+
catalogProvider?: CatalogProvider;
690+
685691
constructor(options: TerriaOptions = {}) {
686692
makeObservable(this);
687693
if (options.appBaseHref) {

0 commit comments

Comments
 (0)