@@ -2,6 +2,47 @@ import { Res } from 'common/types/responses'
22import { Req } from 'common/types/requests'
33import { service } from 'common/service'
44import Utils from 'common/utils/utils'
5+ import { CustomMetadataField } from 'common/types/metadata-field'
6+ import {
7+ Environment ,
8+ MetadataField ,
9+ MetadataModelField ,
10+ PagedResponse ,
11+ ProjectFlag ,
12+ Segment ,
13+ } from 'common/types/responses'
14+ import { mergeMetadataFields } from 'common/utils/mergeMetadataFields'
15+
16+ type EntityType = 'feature' | 'segment' | 'environment'
17+
18+ type EntityMetadataParams = {
19+ organisationId : number
20+ projectId : number
21+ entityContentType : number
22+ entityType : EntityType
23+ entityId ?: number
24+ }
25+
26+ type EntityData = ProjectFlag | Segment | Environment
27+
28+ function getEntityUrl ( params : EntityMetadataParams ) : string | null {
29+ const { entityId, entityType, projectId } = params
30+
31+ if ( ! entityId ) {
32+ return null
33+ }
34+
35+ switch ( entityType ) {
36+ case 'feature' :
37+ return `projects/${ projectId } /features/${ entityId } /`
38+ case 'segment' :
39+ return `projects/${ projectId } /segments/${ entityId } /`
40+ case 'environment' :
41+ return `environments/${ entityId } /`
42+ default :
43+ return null
44+ }
45+ }
546
647export const metadataService = service
748 . enhanceEndpoints ( { addTagTypes : [ 'Metadata' ] } )
@@ -11,7 +52,7 @@ export const metadataService = service
1152 Res [ 'metadataField' ] ,
1253 Req [ 'createMetadataField' ]
1354 > ( {
14- invalidatesTags : [ { id : 'LIST' , type : 'Metadata' } ] ,
55+ invalidatesTags : [ { type : 'Metadata' } ] ,
1556 query : ( query : Req [ 'createMetadataField' ] ) => ( {
1657 body : query . body ,
1758 method : 'POST' ,
@@ -22,12 +63,73 @@ export const metadataService = service
2263 Res [ 'metadataField' ] ,
2364 Req [ 'deleteMetadataField' ]
2465 > ( {
25- invalidatesTags : [ { id : 'LIST' , type : 'Metadata' } ] ,
66+ invalidatesTags : [ { type : 'Metadata' } ] ,
2667 query : ( query : Req [ 'deleteMetadataField' ] ) => ( {
2768 method : 'DELETE' ,
2869 url : `metadata/fields/${ query . id } /` ,
2970 } ) ,
3071 } ) ,
72+ getEntityMetadataFields : builder . query <
73+ CustomMetadataField [ ] ,
74+ EntityMetadataParams
75+ > ( {
76+ providesTags : ( _res , _err , arg ) => [
77+ {
78+ id : `${ arg . entityType } -${ arg . entityId ?? 'new' } -${
79+ arg . entityContentType
80+ } `,
81+ type : 'Metadata' ,
82+ } ,
83+ ] ,
84+ queryFn : async ( arg , _api , _extraOptions , baseQuery ) => {
85+ const entityUrl = getEntityUrl ( arg )
86+
87+ // Build queries to run in parallel
88+ const queries : Promise < { data ?: unknown ; error ?: unknown } > [ ] = [
89+ baseQuery ( {
90+ url : `metadata/fields/?${ Utils . toParam ( {
91+ organisation : arg . organisationId ,
92+ } ) } `,
93+ } ) ,
94+ baseQuery ( {
95+ url : `organisations/${ arg . organisationId } /metadata-model-fields/` ,
96+ } ) ,
97+ ]
98+
99+ // Only fetch entity data if we have an entityId
100+ if ( arg . entityId && entityUrl ) {
101+ queries . push ( baseQuery ( { url : entityUrl } ) )
102+ }
103+
104+ // Fetch all in parallel
105+ const results = await Promise . all ( queries )
106+
107+ const [ fieldsRes , modelFieldsRes , entityRes ] = results
108+
109+ // Handle errors
110+ if ( fieldsRes . error ) {
111+ return { error : fieldsRes . error as Res [ 'metadataList' ] }
112+ }
113+ if ( modelFieldsRes . error ) {
114+ return {
115+ error : modelFieldsRes . error as Res [ 'metadataModelFieldList' ] ,
116+ }
117+ }
118+ if ( entityRes ?. error ) {
119+ return { error : entityRes . error as EntityData }
120+ }
121+
122+ // Merge and return
123+ const mergedMetadata = mergeMetadataFields (
124+ fieldsRes . data as PagedResponse < MetadataField > ,
125+ modelFieldsRes . data as PagedResponse < MetadataModelField > ,
126+ entityRes ?. data as EntityData | null ,
127+ arg . entityContentType ,
128+ )
129+
130+ return { data : mergedMetadata }
131+ } ,
132+ } ) ,
31133 getMetadataField : builder . query <
32134 Res [ 'metadataField' ] ,
33135 Req [ 'getMetadataField' ]
@@ -50,10 +152,7 @@ export const metadataService = service
50152 Res [ 'metadataField' ] ,
51153 Req [ 'updateMetadataField' ]
52154 > ( {
53- invalidatesTags : ( res ) => [
54- { id : 'LIST' , type : 'Metadata' } ,
55- { id : res ?. id , type : 'Metadata' } ,
56- ] ,
155+ invalidatesTags : [ { type : 'Metadata' } ] ,
57156 query : ( query : Req [ 'updateMetadataField' ] ) => ( {
58157 body : query . body ,
59158 method : 'PUT' ,
@@ -119,11 +218,23 @@ export async function updateMetadata(
119218 metadataService . endpoints . updateMetadataField . initiate ( data , options ) ,
120219 )
121220}
221+ export async function getEntityMetadataFields (
222+ store : any ,
223+ data : EntityMetadataParams ,
224+ options ?: Parameters <
225+ typeof metadataService . endpoints . getEntityMetadataFields . initiate
226+ > [ 1 ] ,
227+ ) {
228+ return store . dispatch (
229+ metadataService . endpoints . getEntityMetadataFields . initiate ( data , options ) ,
230+ )
231+ }
122232// END OF FUNCTION_EXPORTS
123233
124234export const {
125235 useCreateMetadataFieldMutation,
126236 useDeleteMetadataFieldMutation,
237+ useGetEntityMetadataFieldsQuery,
127238 useGetMetadataFieldListQuery,
128239 useGetMetadataFieldQuery,
129240 useUpdateMetadataFieldMutation,
0 commit comments