1+ import { sortBy } from 'lodash'
2+
13import { Res } from 'common/types/responses'
24import { Req } from 'common/types/requests'
35import { service } from 'common/service'
6+ import transformCorePaging from 'common/transformCorePaging'
47import Utils from 'common/utils/utils'
58import { CustomMetadataField } from 'common/types/metadata-field'
69import {
710 Environment ,
11+ Metadata ,
812 MetadataField ,
9- MetadataModelField ,
1013 PagedResponse ,
1114 ProjectFlag ,
1215 Segment ,
1316} from 'common/types/responses'
14- import { mergeMetadataFields } from 'common/utils/mergeMetadataFields'
1517
1618type EntityType = 'feature' | 'segment' | 'environment'
1719
@@ -25,13 +27,13 @@ type EntityMetadataParams = {
2527
2628type EntityData = ProjectFlag | Segment | Environment
2729
30+ type EntityWithMetadata = {
31+ metadata ?: Metadata [ ]
32+ }
33+
2834function getEntityUrl ( params : EntityMetadataParams ) : string | null {
2935 const { entityId, entityType, projectId } = params
3036
31- if ( ! entityId ) {
32- return null
33- }
34-
3537 switch ( entityType ) {
3638 case 'feature' :
3739 return `projects/${ projectId } /features/${ entityId } /`
@@ -87,13 +89,12 @@ export const metadataService = service
8789 // Build queries to run in parallel
8890 const queries : Promise < { data ?: unknown ; error ?: unknown } > [ ] = [
8991 baseQuery ( {
90- url : `metadata/fields/?${ Utils . toParam ( {
91- organisation : arg . organisationId ,
92+ url : `projects/${ arg . projectId } /metadata/fields/?${ Utils . toParam ( {
93+ entity : arg . entityType ,
94+ include_organisation : true ,
95+ page_size : 100 ,
9296 } ) } `,
9397 } ) ,
94- baseQuery ( {
95- url : `organisations/${ arg . organisationId } /metadata-model-fields/` ,
96- } ) ,
9798 ]
9899
99100 // Only fetch entity data if we have an entityId
@@ -104,30 +105,54 @@ export const metadataService = service
104105 // Fetch all in parallel
105106 const results = await Promise . all ( queries )
106107
107- const [ fieldsRes , modelFieldsRes , entityRes ] = results
108+ const [ fieldsRes , entityRes ] = results
108109
109110 // Handle errors
110111 if ( fieldsRes . error ) {
111112 return { error : fieldsRes . error as Res [ 'metadataList' ] }
112113 }
113- if ( modelFieldsRes . error ) {
114- return {
115- error : modelFieldsRes . error as Res [ 'metadataModelFieldList' ] ,
116- }
117- }
114+
118115 if ( entityRes ?. error ) {
119116 return { error : entityRes . error as EntityData }
120117 }
121118
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- )
119+ const fieldList = fieldsRes . data as PagedResponse < MetadataField >
120+ const entityData = ( entityRes ?. data ??
121+ null ) as EntityWithMetadata | null
122+
123+ // Map fields to custom metadata fields with required status
124+ const fieldsForContentType : CustomMetadataField [ ] =
125+ fieldList . results . map ( ( meta ) => {
126+ const matchingModelField = meta . model_fields . find (
127+ ( mf ) => mf . content_type === arg . entityContentType ,
128+ )
129+ return {
130+ ...meta ,
131+ isRequiredFor : ! ! matchingModelField ?. is_required_for . length ,
132+ metadataModelFieldId : matchingModelField
133+ ? matchingModelField . id
134+ : null ,
135+ }
136+ } )
137+
138+ // Get existing values from the entity
139+ const existingValues : Metadata [ ] = entityData ?. metadata ?? [ ]
140+
141+ // Merge field definitions with existing values
142+ const mergedMetadata = fieldsForContentType . map ( ( field ) => {
143+ const existingValue = existingValues . find (
144+ ( v ) => v . model_field === field . metadataModelFieldId ,
145+ )
146+ return {
147+ ...field ,
148+ field_value : existingValue ?. field_value ?? '' ,
149+ hasValue : ! ! existingValue ,
150+ }
151+ } )
129152
130- return { data : mergedMetadata }
153+ return {
154+ data : sortBy ( mergedMetadata , ( m ) => ( m . isRequiredFor ? - 1 : 1 ) ) ,
155+ }
131156 } ,
132157 } ) ,
133158 getMetadataField : builder . query <
@@ -147,6 +172,25 @@ export const metadataService = service
147172 query : ( query : Req [ 'getMetadataList' ] ) => ( {
148173 url : `metadata/fields/?${ Utils . toParam ( query ) } ` ,
149174 } ) ,
175+ transformResponse : ( res : Res [ 'metadataList' ] , _ , req ) =>
176+ transformCorePaging ( req , res ) ,
177+ } ) ,
178+ getProjectMetadataFieldList : builder . query <
179+ Res [ 'projectMetadataFieldList' ] ,
180+ Req [ 'getProjectMetadataFieldList' ]
181+ > ( {
182+ providesTags : [ { id : 'LIST' , type : 'Metadata' } ] ,
183+ query : ( query : Req [ 'getProjectMetadataFieldList' ] ) => ( {
184+ url : `projects/${ query . project_id } /metadata/fields/?${ Utils . toParam ( {
185+ ...( query . include_organisation
186+ ? { include_organisation : true }
187+ : { } ) ,
188+ page : query . page ,
189+ page_size : query . page_size ,
190+ } ) } `,
191+ } ) ,
192+ transformResponse : ( res : Res [ 'projectMetadataFieldList' ] , _ , req ) =>
193+ transformCorePaging ( req , res ) ,
150194 } ) ,
151195 updateMetadataField : builder . mutation <
152196 Res [ 'metadataField' ] ,
@@ -229,6 +273,20 @@ export async function getEntityMetadataFields(
229273 metadataService . endpoints . getEntityMetadataFields . initiate ( data , options ) ,
230274 )
231275}
276+ export async function getProjectMetadataFieldList (
277+ store : any ,
278+ data : Req [ 'getProjectMetadataFieldList' ] ,
279+ options ?: Parameters <
280+ typeof metadataService . endpoints . getProjectMetadataFieldList . initiate
281+ > [ 1 ] ,
282+ ) {
283+ return store . dispatch (
284+ metadataService . endpoints . getProjectMetadataFieldList . initiate (
285+ data ,
286+ options ,
287+ ) ,
288+ )
289+ }
232290// END OF FUNCTION_EXPORTS
233291
234292export const {
@@ -237,6 +295,7 @@ export const {
237295 useGetEntityMetadataFieldsQuery,
238296 useGetMetadataFieldListQuery,
239297 useGetMetadataFieldQuery,
298+ useGetProjectMetadataFieldListQuery,
240299 useUpdateMetadataFieldMutation,
241300 // END OF EXPORTS
242301} = metadataService
0 commit comments