Skip to content

Commit 9ea58fa

Browse files
authored
feat: Implements feature healthcare UI (#5043)
1 parent b0d0a80 commit 9ea58fa

15 files changed

+587
-17
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { Res } from 'common/types/responses'
2+
import { Req } from 'common/types/requests'
3+
import { service } from 'common/service'
4+
5+
export const healthService = service
6+
.enhanceEndpoints({ addTagTypes: ['HealthEvents'] })
7+
.injectEndpoints({
8+
endpoints: (builder) => ({
9+
getHealthEvents: builder.query<
10+
Res['healthEvents'],
11+
Req['getHealthEvents']
12+
>({
13+
providesTags: [{ id: 'LIST', type: 'HealthEvents' }],
14+
query: (query: Req['getHealthEvents']) => ({
15+
url: `projects/${query.projectId}/feature-health/events/`,
16+
}),
17+
}),
18+
// END OF ENDPOINTS
19+
}),
20+
})
21+
22+
export async function getHealthEvents(
23+
store: any,
24+
data: Req['getHealthEvents'],
25+
options?: Parameters<
26+
typeof healthService.endpoints.getHealthEvents.initiate
27+
>[1],
28+
) {
29+
return store.dispatch(
30+
healthService.endpoints.getHealthEvents.initiate(data, options),
31+
)
32+
}
33+
34+
// END OF FUNCTION_EXPORTS
35+
36+
export const {
37+
useGetHealthEventsQuery,
38+
// END OF EXPORTS
39+
} = healthService
40+
41+
/* Usage examples:
42+
const { data, isLoading } = useGetHealthEventsQuery({ id: 2 }, {}) //get hook
43+
healthService.endpoints.getHealthEvents.select({id: 2})(store.getState()) //access data from any function
44+
*/
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import { Res } from 'common/types/responses'
2+
import { Req } from 'common/types/requests'
3+
import { service } from 'common/service'
4+
5+
export const healthProviderService = service
6+
.enhanceEndpoints({ addTagTypes: ['HealthProviders'] })
7+
.injectEndpoints({
8+
endpoints: (builder) => ({
9+
createHealthProvider: builder.mutation<
10+
Res['healthProvider'],
11+
Req['createHealthProvider']
12+
>({
13+
invalidatesTags: [{ id: 'LIST', type: 'HealthProviders' }],
14+
query: (query: Req['createHealthProvider']) => ({
15+
body: { name: query.name },
16+
method: 'POST',
17+
url: `projects/${query.projectId}/feature-health/providers/`,
18+
}),
19+
}),
20+
deleteHealthProvider: builder.mutation<void, Req['deleteHealthProvider']>(
21+
{
22+
invalidatesTags: [{ id: 'LIST', type: 'HealthProviders' }],
23+
query: (query: Req['deleteHealthProvider']) => ({
24+
method: 'DELETE',
25+
url: `projects/${query.projectId}/feature-health/providers/${query.providerId}/`,
26+
}),
27+
},
28+
),
29+
getHealthProviders: builder.query<
30+
Res['healthProviders'],
31+
Req['getHealthProviders']
32+
>({
33+
providesTags: [{ id: 'LIST', type: 'HealthProviders' }],
34+
query: (query: Req['getHealthProviders']) => ({
35+
url: `projects/${query.projectId}/feature-health/providers/`,
36+
}),
37+
}),
38+
// END OF ENDPOINTS
39+
}),
40+
})
41+
42+
export async function getHealthProviders(
43+
store: any,
44+
data: Req['getHealthProviders'],
45+
options?: Parameters<
46+
typeof healthProviderService.endpoints.getHealthProviders.initiate
47+
>[1],
48+
) {
49+
return store.dispatch(
50+
healthProviderService.endpoints.getHealthProviders.initiate(data, options),
51+
)
52+
}
53+
54+
export async function createHealthProvider(
55+
store: any,
56+
data: Req['createHealthProvider'],
57+
options?: Parameters<
58+
typeof healthProviderService.endpoints.createHealthProvider.initiate
59+
>[1],
60+
) {
61+
return store.dispatch(
62+
healthProviderService.endpoints.createHealthProvider.initiate(
63+
data,
64+
options,
65+
),
66+
)
67+
}
68+
69+
export async function deleteHealthProvider(
70+
store: any,
71+
data: Req['deleteHealthProvider'],
72+
options?: Parameters<
73+
typeof healthProviderService.endpoints.deleteHealthProvider.initiate
74+
>[1],
75+
) {
76+
return store.dispatch(
77+
healthProviderService.endpoints.deleteHealthProvider.initiate(
78+
data,
79+
options,
80+
),
81+
)
82+
}
83+
// END OF FUNCTION_EXPORTS
84+
85+
export const {
86+
useCreateHealthProviderMutation,
87+
useDeleteHealthProviderMutation,
88+
useGetHealthProvidersQuery,
89+
// END OF EXPORTS
90+
} = healthProviderService
91+
92+
/* Usage examples:
93+
const { data, isLoading } = useGetHealthProvidersQuery({ id: 2 }, {}) //get hook
94+
healthProviderService.endpoints.getHealthProviders.select({id: 2})(store.getState()) //access data from any function
95+
*/

frontend/common/services/useTag.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ export async function getTags(
6868
data: Req['getTags'],
6969
options?: Parameters<typeof tagService.endpoints.getTags.initiate>[1],
7070
) {
71-
store.dispatch(tagService.endpoints.getTags.initiate(data, options))
72-
return Promise.all(store.dispatch(tagService.util.getRunningQueriesThunk()))
71+
return store.dispatch(tagService.endpoints.getTags.initiate(data, options))
7372
}
7473
export async function createTag(
7574
store: any,

frontend/common/types/requests.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ export type Req = {
114114
getPermission: { id: string; level: PermissionLevel }
115115
getAvailablePermissions: { level: PermissionLevel }
116116
getTag: { id: string }
117+
getHealthEvents: { projectId: number | string }
118+
getHealthProviders: { projectId: number }
119+
createHealthProvider: { projectId: number; name: string }
120+
deleteHealthProvider: { projectId: number; providerId: number }
117121
updateTag: { projectId: string; tag: Tag }
118122
deleteTag: {
119123
id: number

frontend/common/types/responses.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ export type Tag = {
352352
label: string
353353
is_system_tag: boolean
354354
is_permanent: boolean
355-
type: 'STALE' | 'NONE'
355+
type: 'STALE' | 'UNHEALTHY' | 'NONE'
356356
}
357357

358358
export type MultivariateFeatureStateValue = {
@@ -637,6 +637,23 @@ export type SAMLAttributeMapping = {
637637
idp_attribute_name: string
638638
}
639639

640+
export type HealthEvent = {
641+
created_at: string
642+
environment: number
643+
feature: number
644+
provider_name: string
645+
reason: string
646+
type: 'HEALTHY' | 'UNHEALTHY'
647+
}
648+
649+
export type HealthProvider = {
650+
id: number
651+
created_by: string
652+
name: string
653+
project: number
654+
webhook_url: number
655+
}
656+
640657
export type Res = {
641658
segments: PagedResponse<Segment>
642659
segment: Segment
@@ -671,6 +688,9 @@ export type Res = {
671688
availablePermissions: AvailablePermission[]
672689
tag: Tag
673690
tags: Tag[]
691+
healthEvents: HealthEvent[]
692+
healthProvider: HealthProvider
693+
healthProviders: HealthProvider[]
674694
account: Account
675695
userEmail: {}
676696
groupAdmin: { id: string }

0 commit comments

Comments
 (0)