Skip to content

Commit 48460a9

Browse files
committed
WIP: protected feature API
1 parent 4f41593 commit 48460a9

File tree

6 files changed

+68
-2
lines changed

6 files changed

+68
-2
lines changed

backend/backend/app/routers/features.py

+17
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,20 @@ def read_sorted_features(
8181
).order_by(desc("value"))
8282

8383
return paginate(q, page_params)
84+
85+
86+
@router.get(
87+
"/{protector_id}/protected-by",
88+
)
89+
def read_protected_features(
90+
protector_id: int,
91+
db: Session = Depends(get_db)
92+
):
93+
adaptation_options = db.query(
94+
models.AdaptationCostBenefit
95+
).join(
96+
models.Feature
97+
).filter(
98+
models.AdaptationCostBenefit.protector_feature_id == protector_id
99+
).all()
100+
return adaptation_options

backend/backend/app/schemas.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ class ReturnPeriodDamagesVariables(DataVariables):
6969
loss_amax: float
7070

7171

72-
class ReturnPeriodDamage(ReturnPeriodDamagesDimensions, ReturnPeriodDamagesVariables):
72+
class ReturnPeriodDamage(
73+
ReturnPeriodDamagesDimensions,
74+
ReturnPeriodDamagesVariables
75+
):
7376
model_config = ConfigDict(from_attributes=True)
7477

7578

backend/backend/db/models.py

+5
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ class AdaptationCostBenefit(Base):
113113
primary_key=True,
114114
index=True
115115
)
116+
protector_feature_id = Column(
117+
Integer,
118+
primary_key=True,
119+
index=True
120+
)
116121

117122
hazard = Column(String(8), nullable=False, primary_key=True)
118123
rcp = Column(String(8), nullable=False, primary_key=True)

frontend/src/lib/api-client/services/FeaturesService.ts

+22
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,26 @@ export class FeaturesService {
8484
});
8585
}
8686

87+
/**
88+
* Read Protected Features
89+
* @returns any Successful Response
90+
* @throws ApiError
91+
*/
92+
public featuresReadProtectedFeatures({
93+
protectorId,
94+
}: {
95+
protectorId: number,
96+
}): CancelablePromise<any> {
97+
return this.httpRequest.request({
98+
method: 'GET',
99+
url: '/features/{protector_id}/protected-by',
100+
path: {
101+
'protector_id': protectorId,
102+
},
103+
errors: {
104+
422: `Validation Error`,
105+
},
106+
});
107+
}
108+
87109
}

frontend/src/lib/data-map/DataMap.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useMap } from 'react-map-gl/maplibre';
33
import { FC, useRef } from 'react';
44
import { useRecoilValue } from 'recoil';
55

6+
import { protectedFeatureDetails } from 'lib/state/interactions/interaction-state';
67
import { useInteractions } from 'lib/state/interactions/use-interactions';
78
import { useDataLoadTrigger } from 'lib/data-map/use-data-load-trigger';
89
import { InteractionGroupConfig } from 'lib/data-map/types';
@@ -71,6 +72,9 @@ export const DataMap: FC<{
7172
const viewLayersParams = useRecoilValue(viewLayersParamsState);
7273
const saveViewLayers = useSaveViewLayers();
7374

75+
const protectedFeatures = useRecoilValue(protectedFeatureDetails);
76+
console.log({ protectedFeatures });
77+
7478
useTrigger(viewLayers);
7579

7680
const { onHover, onClick, layerFilter, pickingRadius } = useInteractions(

frontend/src/lib/state/interactions/interaction-state.ts

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import forEach from 'lodash/forEach';
22
import { atom, atomFamily, selector, selectorFamily } from 'recoil';
33

4-
import { InteractionLayer } from 'lib/data-map/types';
4+
import { InteractionLayer, VectorTarget } from 'lib/data-map/types';
55
import { isReset } from 'lib/recoil/is-reset';
66
import { ApiClient } from 'lib/api-client';
77

@@ -90,6 +90,21 @@ export const selectedAssetDetails = selectorFamily({
9090
},
9191
});
9292

93+
export const protectedFeatureDetails = selector({
94+
key: 'protectedFeatureDetails',
95+
get: async ({ get }) => {
96+
const selection = get(selectionState('assets'));
97+
const target = selection?.target as VectorTarget;
98+
if (!target?.feature?.id) {
99+
return null;
100+
}
101+
const featureDetails = await apiClient.features.featuresReadProtectedFeatures({
102+
protectorId: target.feature.id,
103+
});
104+
return featureDetails;
105+
},
106+
});
107+
93108
type AllowedGroupLayers = Record<string, string[]>;
94109

95110
const allowedGroupLayersImpl = atom<AllowedGroupLayers>({

0 commit comments

Comments
 (0)