Skip to content

Commit 01992fc

Browse files
authored
Merge pull request #5773 from cloudforet-io/feature-integration-project-detail
feat(project): merge to develop for release QA
2 parents b80b9a7 + 1be7088 commit 01992fc

File tree

305 files changed

+6536
-4215
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

305 files changed

+6536
-4215
lines changed

Diff for: .cursor/rules/generate-new-api-clients.mdc

+140
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
---
2+
description:
3+
globs:
4+
alwaysApply: false
5+
---
6+
7+
8+
## Directory Structure
9+
```
10+
api-clients/
11+
├── _common/
12+
│ ├── composables/
13+
│ │ └── use-api-query-key.ts
14+
│ └── schema/
15+
│ ├── api-verbs/
16+
│ └── model.ts
17+
└── {service-name}/
18+
├── {resource}/
19+
│ ├── composables/
20+
│ │ └── use-{resource}-api.ts
21+
│ └── schema/
22+
│ ├── api-verbs/
23+
│ │ ├── {verb}.ts
24+
│ └── model.ts
25+
└── index.ts
26+
```
27+
28+
## API Client Composable Template
29+
```typescript
30+
// use-{resource}-api.ts template
31+
import { SpaceConnector } from '@cloudforet/core-lib/space-connector';
32+
33+
import { useAPIQueryKey } from '@/api-clients/_common/composables/use-api-query-key';
34+
import type { ListResponse } from '@/api-clients/_common/schema/api-verbs/list';
35+
import type { {Resource}CreateParameters } from '@/api-clients/{service}/{resource}/schema/api-verbs/create';
36+
import type { {Resource}Model } from '@/api-clients/{service}/{resource}/schema/model';
37+
38+
export const use{Resource}Api = () => {
39+
// Define API actions
40+
const actions = {
41+
create: SpaceConnector.clientV2.{service}.{resource}.create<{Resource}CreateParameters, {Resource}Model>,
42+
list: SpaceConnector.clientV2.{service}.{resource}.list<{Resource}ListParameters, ListResponse<{Resource}Model>>,
43+
// ... other actions
44+
};
45+
46+
return {
47+
{resource}QueryKey,
48+
{resource}ListQueryKey,
49+
{resource}API: actions,
50+
};
51+
};
52+
```
53+
54+
## Schema Templates
55+
56+
### Model Definition
57+
```typescript
58+
// model.ts template
59+
export interface {Resource}Model {
60+
// Define resource properties
61+
resource_id: string;
62+
name: string;
63+
// ... other properties
64+
}
65+
```
66+
67+
### API Verb Parameters
68+
```typescript
69+
// create.ts template
70+
export interface {Resource}CreateParameters {
71+
// Define create operation parameters
72+
name: string;
73+
// ... other parameters
74+
}
75+
76+
// list.ts template
77+
export interface {Resource}ListParameters {
78+
query?: {
79+
filter?: Array<{
80+
k: string;
81+
v: any;
82+
o: string;
83+
}>;
84+
// ... other query parameters
85+
};
86+
}
87+
```
88+
89+
## Usage Rules
90+
91+
1. **Naming Conventions**
92+
- Use PascalCase for interface names: `{Resource}Model`, `{Resource}{Verb}Parameters`
93+
- Use camelCase for variables and functions: `use{Resource}Api`
94+
- Follow existing naming patterns in the codebase
95+
96+
2. **Type Safety**
97+
- Always define proper TypeScript interfaces for all parameters and responses
98+
- Use generics with SpaceConnector client methods
99+
- Define all possible API parameters in schema files
100+
101+
3. **Query Key Management**
102+
- Use `useAPIQueryKey` for generating consistent query keys
103+
- Create separate query keys for different operations
104+
- Include contextual information in query keys when needed
105+
106+
4. **Code Organization**
107+
- Keep schema definitions separate from API logic
108+
- Group related files in appropriate directories
109+
- Follow the established directory structure
110+
111+
5. **Documentation**
112+
- Add JSDoc comments for public interfaces and functions
113+
- Document any special behaviors or requirements
114+
- Include examples for complex parameter structures
115+
116+
## Example Usage in Components
117+
```typescript
118+
const { {resource}API } = use{Resource}Api();
119+
120+
const { key, params } = useServiceKey(service, resource, verb, {
121+
params: ...
122+
})
123+
124+
// In composables
125+
const query = useScopedQuery({
126+
queryKey: {resource}QueryKey.value,
127+
queryFn: () => {resource}API.{verb}(params.value),
128+
// ... other options
129+
}, ['WORKSPACE', 'ADMIN']);
130+
```
131+
132+
## Notes
133+
- Always check existing API clients for consistent patterns
134+
- Consider reusability and maintainability
135+
- Follow the service's API documentation for accurate parameter definitions
136+
- Use appropriate error handling and loading states
137+
- Consider implementing proper caching strategies
138+
- Add comments only when it is really complex. (English only)
139+
140+

Diff for: .gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ node_modules.nosync/
1313
*.swp
1414
*.bak
1515

16+
## Cursor rules : Ignore all files in .cursor directory except specific file (rules)
17+
.cursor/*
18+
!.cursor/generate-new-api-clients.mdc
19+
1620
# Turborepo
1721
.turbo
1822
out/

Diff for: apps/web/src/api-clients/_common/constants/api-doc-constant.ts

+5
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,11 @@ export const API_DOC = {
376376
'list',
377377
],
378378
},
379+
inventory: {
380+
'metric-data': [
381+
'analyze',
382+
],
383+
},
379384
opsflow: {
380385
comment: [
381386
'create',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { SpaceConnector } from '@cloudforet/core-lib/space-connector';
2+
3+
import type { ListResponse } from '@/api-clients/_common/schema/api-verbs/list';
4+
import type { CostReportConfigListParameters } from '@/api-clients/cost-analysis/cost-report-config/schema/api-verbs/list';
5+
import type { CostReportConfigUpdateParameters } from '@/api-clients/cost-analysis/cost-report-config/schema/api-verbs/update';
6+
import type { CostReportConfigModel } from '@/api-clients/cost-analysis/cost-report-config/schema/model';
7+
8+
9+
interface UseCostReportConfigApiReturn {
10+
costReportConfigAPI: {
11+
update: (params: CostReportConfigUpdateParameters) => Promise<CostReportConfigModel>;
12+
list: (params: CostReportConfigListParameters) => Promise<ListResponse<CostReportConfigModel>>;
13+
}
14+
}
15+
16+
export const useCostReportConfigApi = (): UseCostReportConfigApiReturn => {
17+
const actions = {
18+
async update(params: CostReportConfigUpdateParameters) {
19+
return SpaceConnector.clientV2.costAnalysis.costReportConfig.update<CostReportConfigUpdateParameters, CostReportConfigModel>(params);
20+
},
21+
async list(params: CostReportConfigListParameters) {
22+
return SpaceConnector.clientV2.costAnalysis.costReportConfig.list<CostReportConfigListParameters, ListResponse<CostReportConfigModel>>(params);
23+
},
24+
};
25+
26+
return {
27+
costReportConfigAPI: actions,
28+
};
29+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { SpaceConnector } from '@cloudforet/core-lib/space-connector';
2+
3+
import type { ListResponse } from '@/api-clients/_common/schema/api-verbs/list';
4+
import type { CostDataSourceGetParameters } from '@/api-clients/cost-analysis/data-source/schema/api-verbs/get';
5+
import type { CostDataSourceListParameters } from '@/api-clients/cost-analysis/data-source/schema/api-verbs/list';
6+
import type { CostDataSourceSyncParameters } from '@/api-clients/cost-analysis/data-source/schema/api-verbs/sync';
7+
import type { CostDataSourceUpdatePermissionsParameters } from '@/api-clients/cost-analysis/data-source/schema/api-verbs/update-permissions';
8+
import type { CostDataSourceModel } from '@/api-clients/cost-analysis/data-source/schema/model';
9+
10+
interface UseDataSourceApiReturn {
11+
dataSourceAPI: {
12+
get: (params: CostDataSourceGetParameters) => Promise<CostDataSourceModel>;
13+
list: (params: CostDataSourceListParameters) => Promise<ListResponse<CostDataSourceModel>>;
14+
sync: (params: CostDataSourceSyncParameters) => Promise<void>;
15+
updatePermissions: (params: CostDataSourceUpdatePermissionsParameters) => Promise<CostDataSourceModel>;
16+
}
17+
}
18+
19+
export const useDataSourceApi = (): UseDataSourceApiReturn => {
20+
const actions = {
21+
async get(params: CostDataSourceGetParameters) {
22+
return SpaceConnector.clientV2.costAnalysis.dataSource.get<CostDataSourceGetParameters, CostDataSourceModel>(params);
23+
},
24+
async list(params: CostDataSourceListParameters) {
25+
return SpaceConnector.clientV2.costAnalysis.dataSource.list<CostDataSourceListParameters, ListResponse<CostDataSourceModel>>(params);
26+
},
27+
async sync(params: CostDataSourceSyncParameters) {
28+
return SpaceConnector.clientV2.costAnalysis.dataSource.sync<CostDataSourceSyncParameters>(params);
29+
},
30+
async updatePermissions(params: CostDataSourceUpdatePermissionsParameters) {
31+
return SpaceConnector.clientV2.costAnalysis.dataSource.updatePermissions<CostDataSourceUpdatePermissionsParameters, CostDataSourceModel>(params);
32+
},
33+
};
34+
35+
return {
36+
dataSourceAPI: actions,
37+
};
38+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { SpaceConnector } from '@cloudforet/core-lib/space-connector';
2+
3+
import type { AnalyzeResponse } from '@/api-clients/_common/schema/api-verbs/analyze';
4+
import type { ListResponse } from '@/api-clients/_common/schema/api-verbs/list';
5+
import type { UnifiedCostAnalyzeParameters } from '@/api-clients/cost-analysis/unified-cost/schema/api-verbs/analyze';
6+
import type { UnifiedCostListParameters } from '@/api-clients/cost-analysis/unified-cost/schema/api-verbs/list';
7+
import type { UnifiedCostStatParameters } from '@/api-clients/cost-analysis/unified-cost/schema/api-verbs/stat';
8+
import type { UnifiedCostModel } from '@/api-clients/cost-analysis/unified-cost/schema/model';
9+
10+
export const useUnifiedCostApi = () => {
11+
const actions = {
12+
analyze: SpaceConnector.clientV2.costAnalysis.unifiedCost.analyze<UnifiedCostAnalyzeParameters, AnalyzeResponse<any>>,
13+
list: SpaceConnector.clientV2.costAnalysis.unifiedCost.list<UnifiedCostListParameters, ListResponse<UnifiedCostModel>>,
14+
stat: SpaceConnector.clientV2.costAnalysis.unifiedCost.stat<UnifiedCostStatParameters, any>,
15+
};
16+
17+
return {
18+
unifiedCostAPI: actions,
19+
};
20+
};

Diff for: apps/web/src/api-clients/dashboard/_types/dashboard-global-variable-type.ts

-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
// Base Model
2-
import type { GLOBAL_VARIABLE_FILTER_TYPE_MAP } from '@/services/dashboards/constants/dashboard-global-variable';
3-
42
interface DashboardGlobalVariableBase {
53
key: string; // new_variable
64
name: string; // New Variable
@@ -79,4 +77,3 @@ export type DashboardGlobalVariable =
7977

8078

8179

82-
export type GlobalVariableFilterType = keyof typeof GLOBAL_VARIABLE_FILTER_TYPE_MAP;

Diff for: apps/web/src/api-clients/dashboard/_types/dashboard-type.ts

+4
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,27 @@ import type { PrivateDashboardGetParameters } from '@/api-clients/dashboard/priv
1313
import type { PrivateDashboardListParameters } from '@/api-clients/dashboard/private-dashboard/schema/api-verbs/list';
1414
import type { PrivateDashboardUpdateParameters } from '@/api-clients/dashboard/private-dashboard/schema/api-verbs/update';
1515
import type { PrivateDashboardModel } from '@/api-clients/dashboard/private-dashboard/schema/model';
16+
import type { PrivateFolderModel } from '@/api-clients/dashboard/private-folder/schema/model';
1617
import type { PublicDashboardChangeFolderParameters } from '@/api-clients/dashboard/public-dashboard/schema/api-verbs/change-folder';
1718
import type { PublicDashboardCreateParameters } from '@/api-clients/dashboard/public-dashboard/schema/api-verbs/create';
1819
import type { PublicDashboardDeleteParameters } from '@/api-clients/dashboard/public-dashboard/schema/api-verbs/delete';
1920
import type { PublicDashboardGetParameters } from '@/api-clients/dashboard/public-dashboard/schema/api-verbs/get';
2021
import type { PublicDashboardListParameters } from '@/api-clients/dashboard/public-dashboard/schema/api-verbs/list';
2122
import type { PublicDashboardUpdateParameters } from '@/api-clients/dashboard/public-dashboard/schema/api-verbs/update';
2223
import type { PublicDashboardModel } from '@/api-clients/dashboard/public-dashboard/schema/model';
24+
import type { PublicFolderModel } from '@/api-clients/dashboard/public-folder/schema/model';
2325

2426
import type { VariableModelType } from '@/lib/variable-models';
2527
import type { Value } from '@/lib/variable-models/_base/types';
2628

29+
2730
export type DashboardType = typeof DASHBOARD_TYPE[keyof typeof DASHBOARD_TYPE];
2831
export type DashboardFolderType = 'PUBLIC'|'PRIVATE';
2932

3033
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
3134
// @ts-ignore
3235
export type DashboardModel = PublicDashboardModel | PrivateDashboardModel;
36+
export type DashboardFolderModel = PublicFolderModel | PrivateFolderModel;
3337
export type DashboardCreateParams = PublicDashboardCreateParameters | PrivateDashboardCreateParameters;
3438
export type DashboardChangeFolderParams = PublicDashboardChangeFolderParameters | PrivateDashboardChangeFolderParameters;
3539
export type DashboardListParams = PublicDashboardListParameters | PrivateDashboardListParameters;

Diff for: apps/web/src/api-clients/dashboard/private-dashboard/composables/use-private-dashboard-api.ts

+7-29
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,15 @@ import type { PrivateDashboardListParameters } from '@/api-clients/dashboard/pri
99
import type { PrivateDashboardUpdateParameters } from '@/api-clients/dashboard/private-dashboard/schema/api-verbs/update';
1010
import type { PrivateDashboardModel } from '@/api-clients/dashboard/private-dashboard/schema/model';
1111

12-
interface UsePrivateDashboardApiReturn {
13-
privateDashboardAPI: {
14-
create: (params: PrivateDashboardCreateParameters) => Promise<PrivateDashboardModel>;
15-
update: (params: PrivateDashboardUpdateParameters) => Promise<PrivateDashboardModel>;
16-
changeFolder: (params: PrivateDashboardChangeFolderParameters) => Promise<PrivateDashboardModel>;
17-
delete: (params: PrivateDashboardDeleteParameters) => Promise<void>;
18-
get: (params: PrivateDashboardGetParameters) => Promise<PrivateDashboardModel>;
19-
list: (params: PrivateDashboardListParameters) => Promise<ListResponse<PrivateDashboardModel>>;
20-
}
21-
}
2212

23-
export const usePrivateDashboardApi = (): UsePrivateDashboardApiReturn => {
13+
export const usePrivateDashboardApi = () => {
2414
const actions = {
25-
async create(params: PrivateDashboardCreateParameters) {
26-
return SpaceConnector.clientV2.dashboard.privateDashboard.create<PrivateDashboardCreateParameters, PrivateDashboardModel>(params);
27-
},
28-
async update(params: PrivateDashboardUpdateParameters) {
29-
return SpaceConnector.clientV2.dashboard.privateDashboard.update<PrivateDashboardUpdateParameters, PrivateDashboardModel>(params);
30-
},
31-
async changeFolder(params: PrivateDashboardChangeFolderParameters) {
32-
return SpaceConnector.clientV2.dashboard.privateDashboard.changeFolder<PrivateDashboardChangeFolderParameters, PrivateDashboardModel>(params);
33-
},
34-
async delete(params: PrivateDashboardDeleteParameters) {
35-
return SpaceConnector.clientV2.dashboard.privateDashboard.delete<PrivateDashboardDeleteParameters>(params);
36-
},
37-
async get(params: PrivateDashboardGetParameters) {
38-
return SpaceConnector.clientV2.dashboard.privateDashboard.get<PrivateDashboardGetParameters, PrivateDashboardModel>(params);
39-
},
40-
async list(params: PrivateDashboardListParameters) {
41-
return SpaceConnector.clientV2.dashboard.privateDashboard.list<PrivateDashboardListParameters, ListResponse<PrivateDashboardModel>>(params);
42-
},
15+
create: SpaceConnector.clientV2.dashboard.privateDashboard.create<PrivateDashboardCreateParameters, PrivateDashboardModel>,
16+
update: SpaceConnector.clientV2.dashboard.privateDashboard.update<PrivateDashboardUpdateParameters, PrivateDashboardModel>,
17+
changeFolder: SpaceConnector.clientV2.dashboard.privateDashboard.changeFolder<PrivateDashboardChangeFolderParameters, PrivateDashboardModel>,
18+
delete: SpaceConnector.clientV2.dashboard.privateDashboard.delete<PrivateDashboardDeleteParameters>,
19+
get: SpaceConnector.clientV2.dashboard.privateDashboard.get<PrivateDashboardGetParameters, PrivateDashboardModel>,
20+
list: SpaceConnector.clientV2.dashboard.privateDashboard.list<PrivateDashboardListParameters, ListResponse<PrivateDashboardModel>>,
4321
};
4422

4523
return {

Diff for: apps/web/src/api-clients/dashboard/private-dashboard/schema/api-verbs/list.ts

+1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ export interface PrivateDashboardListParameters {
55
query?: Query;
66
dashboard_id?: string;
77
name?: string;
8+
folder_id?: string;
89
}

Diff for: apps/web/src/api-clients/dashboard/private-data-table/composables/use-private-data-table-api.ts

+8-34
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,15 @@ import type { DataTableLoadParameters } from '@/api-clients/dashboard/public-dat
1111
import type { DataTableTransformParameters } from '@/api-clients/dashboard/public-data-table/schema/api-verbs/transform';
1212
import type { DataTableUpdateParameters } from '@/api-clients/dashboard/public-data-table/schema/api-verbs/update';
1313

14-
interface UsePrivateDataTableApiReturn {
15-
privateDataTableAPI: {
16-
add: (params: DataTableAddParameters) => Promise<PrivateDataTableModel>;
17-
transform: (params: DataTableTransformParameters) => Promise<PrivateDataTableModel>;
18-
update: (params: DataTableUpdateParameters) => Promise<PrivateDataTableModel>;
19-
delete: (params: DataTableDeleteParameters) => Promise<void>;
20-
load: (params: DataTableLoadParameters) => Promise<DataTableLoadResponse>;
21-
get: (params: DataTableGetParameters) => Promise<PrivateDataTableModel>;
22-
list: (params: DataTableListParameters) => Promise<ListResponse<PrivateDataTableModel>>;
23-
}
24-
}
25-
26-
export const usePrivateDataTableApi = (): UsePrivateDataTableApiReturn => {
14+
export const usePrivateDataTableApi = () => {
2715
const action = {
28-
async add(params: DataTableAddParameters) {
29-
return SpaceConnector.clientV2.dashboard.privateDataTable.add<DataTableAddParameters, PrivateDataTableModel>(params);
30-
},
31-
async transform(params: DataTableTransformParameters) {
32-
return SpaceConnector.clientV2.dashboard.privateDataTable.transform<DataTableTransformParameters, PrivateDataTableModel>(params);
33-
},
34-
async update(params: DataTableUpdateParameters) {
35-
return SpaceConnector.clientV2.dashboard.privateDataTable.update<DataTableUpdateParameters, PrivateDataTableModel>(params);
36-
},
37-
async delete(params: DataTableDeleteParameters) {
38-
return SpaceConnector.clientV2.dashboard.privateDataTable.delete<DataTableDeleteParameters>(params);
39-
},
40-
async load(params: DataTableLoadParameters) {
41-
return SpaceConnector.clientV2.dashboard.privateDataTable.load<DataTableLoadParameters, DataTableLoadResponse>(params);
42-
},
43-
async get(params: DataTableGetParameters) {
44-
return SpaceConnector.clientV2.dashboard.privateDataTable.get<DataTableGetParameters, PrivateDataTableModel>(params);
45-
},
46-
async list(params: DataTableListParameters) {
47-
return SpaceConnector.clientV2.dashboard.privateDataTable.list<DataTableListParameters, ListResponse<PrivateDataTableModel>>(params);
48-
},
16+
add: SpaceConnector.clientV2.dashboard.privateDataTable.add<DataTableAddParameters, PrivateDataTableModel>,
17+
transform: SpaceConnector.clientV2.dashboard.privateDataTable.transform<DataTableTransformParameters, PrivateDataTableModel>,
18+
update: SpaceConnector.clientV2.dashboard.privateDataTable.update<DataTableUpdateParameters, PrivateDataTableModel>,
19+
delete: SpaceConnector.clientV2.dashboard.privateDataTable.delete<DataTableDeleteParameters>,
20+
load: SpaceConnector.clientV2.dashboard.privateDataTable.load<DataTableLoadParameters, DataTableLoadResponse>,
21+
get: SpaceConnector.clientV2.dashboard.privateDataTable.get<DataTableGetParameters, PrivateDataTableModel>,
22+
list: SpaceConnector.clientV2.dashboard.privateDataTable.list<DataTableListParameters, ListResponse<PrivateDataTableModel>>,
4923
};
5024

5125
return {

0 commit comments

Comments
 (0)