Mirror of https://github.com/roostorg/osprey
github.com/roostorg/osprey
1import invariant from 'invariant';
2import { sum } from 'lodash';
3
4import useEntityStore from '../stores/EntityStore';
5import { KeyedLabels, Label, LabelMutation, LabelMutationResult } from '../types/LabelTypes';
6import { BaseQueryRequest, EventCountsByFeatureForEntityQuery } from '../types/QueryTypes';
7import HTTPUtils, { HTTPResponse } from '../utils/HTTPUtils';
8import { getBaseRequest } from './EventActions';
9
10function transformLabels(labels: KeyedLabels): Label[] {
11 return Object.keys(labels).map((labelName) => ({ ...labels[labelName], name: labelName }));
12}
13
14export async function getLabelsForEntity(entityId: string, entityType: string): Promise<Label[]> {
15 const response: HTTPResponse = await HTTPUtils.get(`entities/labels`, {
16 params: {
17 entity_id: entityId,
18 entity_type: entityType,
19 },
20 });
21
22 if (response.ok && response.data != null) {
23 return transformLabels(response.data.labels);
24 }
25
26 return [];
27}
28
29export async function getEventCountsByFeatureForEntityQuery(
30 query: BaseQueryRequest,
31 aggregationDimensions: string[]
32): Promise<EventCountsByFeatureForEntityQuery> {
33 const { entity, ...requestData } = getBaseRequest(query);
34 invariant(entity != null, 'Event counts can only be fetched for entities');
35
36 const response: HTTPResponse = await HTTPUtils.post(
37 `entities/event-count-by-feature`,
38 {
39 ...requestData,
40 granularity: 'all',
41 aggregation_dimensions: aggregationDimensions /* eslint-disable-line */,
42 entity,
43 },
44 {
45 params: {
46 entity_id: entity.id,
47 entity_type: entity.type,
48 },
49 }
50 );
51
52 if (!response.ok) {
53 return {};
54 }
55
56 useEntityStore.setState({ eventCountByFeature: response.data, totalEventCount: sum(Object.values(response.data)) });
57 return response.data;
58}
59
60export async function updateLabelsForEntity(
61 entityId: string,
62 entityType: string,
63 labels: LabelMutation[]
64): Promise<LabelMutationResult> {
65 const response: HTTPResponse = await HTTPUtils.post(
66 `entities/labels`,
67 {
68 mutations: labels,
69 },
70 {
71 params: {
72 entity_id: entityId,
73 entity_type: entityType,
74 },
75 }
76 );
77
78 if (!response.ok) {
79 throw new Error('Label update request failed');
80 }
81
82 return { ...response.data, labels: transformLabels(response.data.labels) };
83}