Skip to content

Commit 9bb0f87

Browse files
refactor: separate api clients from services (#304)
1 parent 6308fc2 commit 9bb0f87

27 files changed

+262
-150
lines changed

plugins/02-irocalcApi.ts

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,32 +19,36 @@ import { createFetch } from "ofetch";
1919
import { defineNuxtPlugin } from "#app";
2020
import AWSDataCenterService from "../service/awsDataCenterService";
2121
import CarbonService from "~/service/carbonService";
22-
import CatalogService from "~/service/catalogService";
23-
import AWSInstanceService from "~/service/awsInstanceService";
24-
import AdminService from "~/service/adminService";
22+
import CatalogApiClient from "~/service/api/catalogApiClient";
23+
import AWSInstanceApiClient from "~/service/api/AWSInstanceApiClient";
24+
import AdminApiClient from "~/service/api/adminApiClient";
2525
import { useAuth } from "vue-clerk";
26-
import InfrastructureService from "~/service/infrastructureService";
27-
import CloudServiceProviderSvc from "~/service/CloudServiceProviderService";
28-
import ServiceConfigurationSettingSvc from "~/service/ServiceConfigurationSettingService";
29-
import ComponentService from "~/service/componentService";
26+
import InfrastructureApiClient from "~/service/api/infrastructureApiClient";
27+
import CloudServiceProviderApiClient from "~/service/api/CloudServiceProviderApiClient";
28+
import ServiceConfigurationSettingApiClient from "~/service/api/ServiceConfigurationSettingApiClient";
29+
import ComponentApiClient from "~/service/api/componentApiClient";
3030
import AnalysisService from "~/service/analysisService";
31-
import CurService from "~/service/curService";
31+
import CurApiClient from "~/service/api/curApiClient";
3232
import TokenService from "~/service/tokenService";
3333
import ScanService from "~/service/scanService";
34+
import { AnalysisApiClient } from "~/service/api/analysisApiClient";
35+
import { AWSDataCenterApiClient } from "~/service/api/AWSDataCenterApiClient";
36+
import { IrocalcCarbonApiClient } from "~/service/api/irocalcCarbonApiClient";
37+
import ScanApiClient from "~/service/api/scanApiClient";
3438

3539
/** ApiInstance interface provides us with good typing */
3640
interface IApiInstance {
3741
awsDataCenter: AWSDataCenterService;
3842
carbon: CarbonService;
39-
catalogService: CatalogService;
40-
instanceType: AWSInstanceService;
41-
adminService: AdminService;
42-
infrastructureService: InfrastructureService;
43-
componentService: ComponentService;
44-
cloudServiceProviderService: CloudServiceProviderSvc;
45-
serviceConfigurationSettingSvc: ServiceConfigurationSettingSvc;
43+
catalogService: CatalogApiClient;
44+
instanceType: AWSInstanceApiClient;
45+
adminService: AdminApiClient;
46+
infrastructureService: InfrastructureApiClient;
47+
componentService: ComponentApiClient;
48+
cloudServiceProviderService: CloudServiceProviderApiClient;
49+
serviceConfigurationSettingSvc: ServiceConfigurationSettingApiClient;
4650
analysisService: AnalysisService;
47-
curService: CurService;
51+
curService: CurApiClient;
4852
tokenService: TokenService;
4953
scanService: ScanService;
5054
}
@@ -95,23 +99,30 @@ export default defineNuxtPlugin({
9599
},
96100
});
97101

102+
const infrastructureApiClient = new InfrastructureApiClient(apiFetcher);
103+
98104
/** an object containing all repositories we need to expose */
99105
const modules: IApiInstance = {
100-
carbon: new CarbonService(apiFetcher),
101-
awsDataCenter: new AWSDataCenterService(apiFetcher),
102-
catalogService: new CatalogService(apiFetcher),
103-
instanceType: new AWSInstanceService(apiFetcher),
104-
adminService: new AdminService(apiFetcher),
105-
infrastructureService: new InfrastructureService(apiFetcher),
106-
componentService: new ComponentService(apiFetcher),
107-
cloudServiceProviderService: new CloudServiceProviderSvc(apiFetcher),
108-
serviceConfigurationSettingSvc: new ServiceConfigurationSettingSvc(
106+
carbon: new CarbonService(new IrocalcCarbonApiClient(apiFetcher)),
107+
awsDataCenter: new AWSDataCenterService(
108+
infrastructureApiClient,
109+
new AWSDataCenterApiClient(apiFetcher),
110+
),
111+
catalogService: new CatalogApiClient(apiFetcher),
112+
instanceType: new AWSInstanceApiClient(apiFetcher),
113+
adminService: new AdminApiClient(apiFetcher),
114+
infrastructureService: infrastructureApiClient,
115+
componentService: new ComponentApiClient(apiFetcher),
116+
cloudServiceProviderService: new CloudServiceProviderApiClient(
117+
apiFetcher,
118+
),
119+
serviceConfigurationSettingSvc: new ServiceConfigurationSettingApiClient(
109120
apiFetcher,
110121
),
111-
analysisService: new AnalysisService(apiFetcher),
112-
curService: new CurService(apiFetcher),
122+
analysisService: new AnalysisService(new AnalysisApiClient(apiFetcher)),
123+
curService: new CurApiClient(apiFetcher),
113124
tokenService: new TokenService(apiFetcher),
114-
scanService: new ScanService(apiFetcher),
125+
scanService: new ScanService(new ScanApiClient(apiFetcher)),
115126
};
116127

117128
return {

service/analysisService.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,30 @@
1616
* SPDX-License-Identifier: Apache-2.0
1717
*/
1818

19-
import HttpFactory from "./factory/httpFactory";
2019
import type { ReportStatus } from "~/type/ReportStatus";
2120
import type { Payload } from "~/type/Payload";
21+
import type { AnalysisApiClient } from "~/service/api/analysisApiClient";
2222

23-
type Analysis = {
23+
export type Analysis = {
2424
status: ReportStatus;
2525
id: string;
2626
dateCreation: string;
2727
co2Gr: number;
2828
};
2929

30-
type AnalysisDetails = Analysis & {
30+
export type AnalysisDetails = Analysis & {
3131
payloads: Payload[];
3232
};
3333

34-
class AnalysisService extends HttpFactory {
35-
private readonly RESOURCE = "/api/analysis";
34+
class AnalysisService {
35+
private readonly analysisApiClient: AnalysisApiClient;
36+
37+
constructor(analysisApiClient: AnalysisApiClient) {
38+
this.analysisApiClient = analysisApiClient;
39+
}
3640

3741
async getAllAnalyses() {
38-
const analyses = await this.getCall<Analysis[]>(this.RESOURCE);
42+
const analyses = await this.analysisApiClient.getAllAnalyses();
3943
return analyses.map((analysis) => ({
4044
...analysis,
4145
co2Converted: convertEstimateToBestMassUnit(analysis.co2Gr),
@@ -44,7 +48,7 @@ class AnalysisService extends HttpFactory {
4448

4549
async getAnalysisById(analysisId: string) {
4650
const estimated = (
47-
await this.getCall<AnalysisDetails>(`${this.RESOURCE}/${analysisId}`)
51+
await this.analysisApiClient.getAnalysisById(analysisId)
4852
).payloads.map((p) => ({
4953
label: p.name,
5054
co2Gr: p.carbonGramFootprint,
@@ -59,7 +63,7 @@ class AnalysisService extends HttpFactory {
5963
}
6064

6165
async deleteAnalysis(analysisId: string): Promise<void> {
62-
return await this.deleteCall(`${this.RESOURCE}/${analysisId}`);
66+
return await this.analysisApiClient.deleteAnalysis(analysisId);
6367
}
6468
}
6569

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import ApiClient from "~/service/api/apiClient";
2+
import type { Region } from "~/type/Region";
3+
4+
export class AWSDataCenterApiClient extends ApiClient {
5+
private readonly RESOURCE = "/api/cloud-service-providers";
6+
7+
async getAllAWSDataCenter(cspId: string): Promise<Region[]> {
8+
return await this.getCall<Region[]>(`${this.RESOURCE}/${cspId}/regions`);
9+
}
10+
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
*
1616
* SPDX-License-Identifier: Apache-2.0
1717
*/
18-
import HttpFactory from "./factory/httpFactory";
18+
import ApiClient from "./apiClient";
1919
import type { EC2InstanceType } from "~/type/ec2InstanceType";
2020

21-
class AWSInstanceService extends HttpFactory {
21+
class AWSInstanceApiClient extends ApiClient {
2222
private readonly RESOURCE = "/api/awsInstanceType";
2323

2424
async getAllInstanceByType(
@@ -28,4 +28,4 @@ class AWSInstanceService extends HttpFactory {
2828
}
2929
}
3030

31-
export default AWSInstanceService;
31+
export default AWSInstanceApiClient;

service/CloudServiceProviderService.ts renamed to service/api/CloudServiceProviderApiClient.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
*
1616
* SPDX-License-Identifier: Apache-2.0
1717
*/
18-
import HttpFactory from "./factory/httpFactory";
18+
import ApiClient from "./apiClient";
1919
import type { CloudServiceProvider } from "~/type/infrastructure/CloudServiceProvider";
2020
import type { CloudServiceProviderService } from "~/type/infrastructure/CloudServiceProviderService";
2121

22-
class CloudServiceProviderSvc extends HttpFactory {
22+
class CloudServiceProviderApiClient extends ApiClient {
2323
private readonly RESOURCE = "/api/cloud-service-providers";
2424

2525
async getCloudServiceProviders(): Promise<CloudServiceProvider[]> {
@@ -35,4 +35,4 @@ class CloudServiceProviderSvc extends HttpFactory {
3535
}
3636
}
3737

38-
export default CloudServiceProviderSvc;
38+
export default CloudServiceProviderApiClient;

service/ServiceConfigurationSettingService.ts renamed to service/api/ServiceConfigurationSettingApiClient.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
*
1616
* SPDX-License-Identifier: Apache-2.0
1717
*/
18-
import HttpFactory from "./factory/httpFactory";
18+
import ApiClient from "./apiClient";
1919
import type { ServiceConfigurationSetting } from "~/type/infrastructure/ServiceConfigurationSetting";
2020

21-
class ServiceConfigurationSettingSvc extends HttpFactory {
21+
class ServiceConfigurationSettingApiClient extends ApiClient {
2222
private readonly RESOURCE = "/api/service-configuration-settings";
2323

2424
async findAllConfigurationSettingsByServiceId(
@@ -30,4 +30,4 @@ class ServiceConfigurationSettingSvc extends HttpFactory {
3030
}
3131
}
3232

33-
export default ServiceConfigurationSettingSvc;
33+
export default ServiceConfigurationSettingApiClient;
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
*
1616
* SPDX-License-Identifier: Apache-2.0
1717
*/
18-
import HttpFactory from "./factory/httpFactory";
18+
import ApiClient from "./apiClient";
1919

20-
class AdminService extends HttpFactory {
20+
class AdminApiClient extends ApiClient {
2121
async evictRegionCache(): Promise<void> {
2222
return this.deleteCall(`/actuator/caches/regions`);
2323
}
2424
}
2525

26-
export default AdminService;
26+
export default AdminApiClient;

service/api/analysisApiClient.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import ApiClient from "~/service/api/apiClient";
2+
import type { Analysis } from "../analysisService";
3+
import type { AnalysisDetails } from "~/service/analysisService";
4+
5+
export class AnalysisApiClient extends ApiClient {
6+
private readonly RESOURCE = "/api/analysis";
7+
8+
async getAllAnalyses(): Promise<Analysis[]> {
9+
return await this.getCall<Analysis[]>(this.RESOURCE);
10+
}
11+
12+
async getAnalysisById(analysisId: string): Promise<AnalysisDetails> {
13+
return await this.getCall<AnalysisDetails>(
14+
`${this.RESOURCE}/${analysisId}`,
15+
);
16+
}
17+
18+
async deleteAnalysis(analysisId: string): Promise<void> {
19+
return await this.deleteCall(`${this.RESOURCE}/${analysisId}`);
20+
}
21+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*/
1818
import type { ofetch } from "ofetch";
1919

20-
class HttpFactory {
20+
class ApiClient {
2121
private readonly $fetch: typeof ofetch;
2222

2323
constructor(fetcher: typeof ofetch) {
@@ -86,4 +86,4 @@ class HttpFactory {
8686
}
8787
}
8888

89-
export default HttpFactory;
89+
export default ApiClient;
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
*
1616
* SPDX-License-Identifier: Apache-2.0
1717
*/
18-
import HttpFactory from "~/service/factory/httpFactory";
1918
import { Availability } from "~/type/Availability";
2019
import type { ServiceCatalog } from "~/type/ServiceCatalog";
2120
import type { ServiceDescription } from "~/type/ServiceDescription";
21+
import ApiClient from "~/service/api/apiClient";
2222

23-
class CatalogService extends HttpFactory {
23+
class CatalogApiClient extends ApiClient {
2424
private readonly RESOURCE = "/api/public/v2/catalog";
2525

2626
async getAllServices(): Promise<ServiceCatalog[]> {
@@ -39,4 +39,4 @@ class CatalogService extends HttpFactory {
3939
}
4040
}
4141

42-
export default CatalogService;
42+
export default CatalogApiClient;

0 commit comments

Comments
 (0)