src/libs/apiService.ts (901 lines of code) (raw):
import { CliConfig } from '../utils/fileUtils/interface.js';
import * as $OpenApi from '@alicloud/openapi-client';
import FormData from 'form-data';
import fetch from 'node-fetch';
import {
GetRoutineUserInfoRes,
ListRoutineCanaryAreasRes,
PublishRoutineCodeVersionReq,
GetMatchSiteReq,
GetMatchSiteRes,
DeleteRoutineReq,
DeleteRoutineRes,
DeleteRoutineCodeVersionRes,
DeleteRoutineCodeVersionReq,
CreateRoutineRelatedRouteReq,
CreateRoutineRelatedRouteRes,
DeleteRoutineRelatedRouteReq,
DeleteRoutineRelatedRouteRes,
ListSitesReq,
ListSitesRes,
GetRoutineStagingEnvIpRes,
GetRoutineRes,
GetRoutineReq,
EdgeRoutineProps,
CreateRoutineReq,
CreateRoutineRes,
CommitRoutineStagingCodeReq,
CommitRoutineStagingCodeRes,
CreateRoutineRelatedRecordReq,
CreateRoutineRelatedRecordRes,
DeleteRoutineRelatedRecordReq,
DeleteRoutineRelatedRecordRes,
PublishRoutineCodeVersionRes,
Environment,
ListRoutineOptionalSpecsRes
} from './interface.js';
import { getApiConfig } from '../utils/fileUtils/index.js';
import chain from 'lodash';
import { IOssConfig } from './interface.js';
import t from '../i18n/index.js';
export class ApiService {
private static instance: ApiService | null = null;
private client: $OpenApi.default;
constructor(cliConfig: CliConfig) {
let apiConfig = new $OpenApi.Config({
accessKeyId: cliConfig.auth?.accessKeyId,
accessKeySecret: cliConfig.auth?.accessKeySecret,
endpoint: cliConfig.endpoint
});
this.client = new $OpenApi.default.default(apiConfig);
}
public static async getInstance() {
if (!ApiService.instance) {
const config = getApiConfig();
ApiService.instance = new ApiService(config);
}
return ApiService.instance;
}
public updateConfig(newConfig: CliConfig) {
let apiConfig = new $OpenApi.Config({
accessKeyId: newConfig.auth?.accessKeyId,
accessKeySecret: newConfig.auth?.accessKeySecret,
endpoint: newConfig.endpoint
});
this.client = new $OpenApi.default.default(apiConfig);
}
/**
* Checks if the user is logged in.
* @returns A promise that resolves to an object with the following properties:
* - success: A boolean indicating if the login check was successful.
* - message: (Optional) A string providing additional information in case of failure.
*/
async checkLogin(
isShowError = true
): Promise<{ success: boolean; message?: string }> {
try {
let params = {
action: 'GetErService',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {}
});
let runtime = {
toMap: function () {
return this;
}
};
const response = await this.client.callApi(params, request, runtime);
if (response.statusCode === 200) {
return { success: true };
} else if (response.statusCode === 403) {
return {
success: false,
message: t('login_permission_denied').d(
'Permission denied: Access key or secret is incorrect, or does not have the necessary permissions.'
)
};
} else {
return {
success: false,
message: `${t('common_error_occurred').d('An error occurred')}: ${response.statusCode}`
};
}
} catch (error) {
isShowError && console.log(error);
return {
success: false,
message: t('login_failed').d(
'An error occurred while trying to log in.'
)
};
}
}
async quickDeployRoutine(edgeRoutine: EdgeRoutineProps) {
try {
// 上传代码到unstable版本
const stagingRes =
await this.getRoutineStagingCodeUploadInfo(edgeRoutine);
if (stagingRes) {
// 生产版本
const commitRes = await this.commitRoutineStagingCode({
Name: edgeRoutine.name,
CodeDescription: edgeRoutine.description
});
// 发布到生产环境
if (commitRes) {
const deployRes = await this.publishRoutineCodeVersion({
Name: edgeRoutine.name,
CodeVersion: commitRes.data.CodeVersion,
Env: Environment.Production
});
return deployRes && Number(deployRes.code) === 200;
}
}
return false;
} catch (error) {
console.log(error);
}
return false;
}
async publishRoutineCodeVersion(
requestParams: PublishRoutineCodeVersionReq
): Promise<PublishRoutineCodeVersionRes | null> {
try {
let params = {
action: 'PublishRoutineCodeVersion',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
const CanaryAreaList = requestParams.CanaryAreaList ?? [];
const CanaryAreaListString = JSON.stringify(CanaryAreaList);
let request = new $OpenApi.OpenApiRequest({
query: {
Env: requestParams.Env,
Name: requestParams.Name,
CodeVersion: requestParams.CodeVersion,
CanaryCodeVersion: requestParams.CanaryCodeVersion,
CanaryAreaList: CanaryAreaListString
}
});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: PublishRoutineCodeVersionRes = {
code: res.statusCode,
data: {
CodeVersion: res.body.CodeVersion,
RequestId: res.body.RequestId
}
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async getMatchSite(
requestParams: GetMatchSiteReq
): Promise<GetMatchSiteRes | null> {
try {
let params = {
action: 'GetMatchSite',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {
RecordName: requestParams.RecordName
}
});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: GetMatchSiteRes = {
code: res.statusCode,
data: {
SiteId: res.body.SiteId,
SiteName: res.body.SiteName
}
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async listRoutineCanaryAreas(): Promise<ListRoutineCanaryAreasRes | null> {
try {
let params = {
action: 'ListRoutineCanaryAreas',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest();
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: ListRoutineCanaryAreasRes = {
CanaryAreas: res.body.CanaryAreas
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async getRoutineUserInfo(): Promise<GetRoutineUserInfoRes | null> {
try {
let params = {
action: 'GetRoutineUserInfo',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest();
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: GetRoutineUserInfoRes = {
Subdomains: res.body.RoutineName,
Routines: res.body.Routines
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async deleteRoutine(requestParams: DeleteRoutineReq) {
try {
let params = {
action: 'DeleteRoutine',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {
Name: requestParams.Name
}
});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: DeleteRoutineRes = {
Status: res.body.Status
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async deleteRoutineCodeVersion(
requestParams: DeleteRoutineCodeVersionReq
): Promise<DeleteRoutineCodeVersionRes | null> {
try {
let params = {
action: 'DeleteRoutineCodeVersion',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {
Name: requestParams.Name,
CodeVersion: requestParams.CodeVersion
}
});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: DeleteRoutineCodeVersionRes = {
Status: res.body.Status
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async createRoutineRelatedRoute(
requestParams: CreateRoutineRelatedRouteReq
): Promise<CreateRoutineRelatedRouteRes | null> {
try {
let params = {
action: 'CreateRoutineRelatedRoute',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {
Route: requestParams.Route,
SiteId: requestParams.SiteId,
SiteName: requestParams.SiteName,
Name: requestParams.Name
}
});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: CreateRoutineRelatedRouteRes = {
code: res.statusCode,
data: {
RequestId: res.body.RequestId,
Status: res.body.Status
}
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async deleteRoutineRelatedRoute(
requestParams: DeleteRoutineRelatedRouteReq
): Promise<DeleteRoutineRelatedRouteRes | null> {
try {
let params = {
action: 'DeleteRoutineRelatedRoute',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {
Route: requestParams.Route,
RouteId: requestParams.RouteId,
SiteId: requestParams.SiteId,
SiteName: requestParams.SiteName,
Name: requestParams.Name
}
});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: DeleteRoutineRelatedRouteRes = {
code: res.statusCode,
data: {
RequestId: res.body.RequestId,
Status: res.body.Status
}
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async listSites(requestParams: ListSitesReq): Promise<ListSitesRes | null> {
try {
let params = {
action: 'ListSites',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: requestParams
});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200) {
const response = {
code: res.statusCode,
data: {
TotalCount: res.body.TotalCount,
RequestId: res.body.RequestId,
PageSize: res.body.PageSize,
PageNumber: res.body.PageNumber,
Sites: res.body.Sites
}
};
return response;
}
} catch (error) {
console.log(error);
}
return null;
}
async getRoutineStagingEnvIp(): Promise<GetRoutineStagingEnvIpRes | null> {
try {
let params = {
action: 'GetRoutineStagingEnvIp',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200) {
const response: GetRoutineStagingEnvIpRes = {
code: res.statusCode,
data: {
IPV4: res.body.IPV4,
RequestId: res.body.RequestId
}
};
return response;
}
} catch (error) {
console.log(error);
}
return null;
}
async getRoutine(
requestParams: GetRoutineReq,
isShowError = true
): Promise<GetRoutineRes | null> {
try {
let params = {
action: 'GetRoutine',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {
Name: requestParams.Name
}
});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const routineResponse: GetRoutineRes = {
code: res.statusCode,
data: {
RequestId: res.body?.RequestId,
CodeVersions: res.body?.CodeVersions || [],
RelatedRecords: res.body?.RelatedRecords || [],
Envs: res.body?.Envs || [],
CreateTime: res.body?.CreateTime,
Description: res.body?.Description,
RelatedRoutes: res.body?.RelatedRoutes || [],
DefaultRelatedRecord: res.body?.DefaultRelatedRecord
}
};
return routineResponse;
}
} catch (error) {
if (isShowError) {
console.log(error);
}
}
return null;
}
async createRoutine(
edgeRoutine: CreateRoutineReq
): Promise<CreateRoutineRes | null> {
let params = {
action: 'CreateRoutine',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {
Name: edgeRoutine.name,
Description: edgeRoutine.description,
SpecName: edgeRoutine.specName
}
});
let runtime = {
toMap: function () {
return this;
}
};
try {
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: CreateRoutineRes = {
code: res.statusCode,
data: {
RequestId: res.body.RequestId,
Status: res.body.Status
}
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async getRoutineStagingCodeUploadInfo(
edgeRoutine: EdgeRoutineProps
): Promise<boolean> {
try {
let params = {
action: 'GetRoutineStagingCodeUploadInfo',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {
Name: edgeRoutine.name
}
});
let runtime = {
toMap: function () {
return this;
}
};
const uploadResult = await this.client.callApi(params, request, runtime);
const ossConfig = chain(uploadResult).get('body.OssPostConfig');
if (uploadResult.statusCode !== 200 || !ossConfig) {
return false;
}
const {
OSSAccessKeyId,
Signature,
callback,
Url,
key,
policy
}: IOssConfig = ossConfig;
const formData = new FormData();
formData.append('OSSAccessKeyId', OSSAccessKeyId);
formData.append('Signature', Signature);
formData.append('callback', callback);
formData.append('x:codeDescription', ossConfig['x:codeDescription']);
formData.append('policy', policy);
formData.append('key', key);
formData.append('file', edgeRoutine.code);
// TODO: 检查oss结果;
const ossRes = await fetch(Url, {
method: 'POST',
body: formData,
headers: formData.getHeaders()
});
if (ossRes && ossRes.status === 200) {
return true;
}
return false;
} catch (error) {
console.log(error);
return false;
}
}
async commitRoutineStagingCode(
requestParams: CommitRoutineStagingCodeReq
): Promise<CommitRoutineStagingCodeRes | null> {
try {
let params = {
action: 'CommitRoutineStagingCode',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {
Name: requestParams.Name,
CodeDescription: requestParams.CodeDescription
}
});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: CommitRoutineStagingCodeRes = {
code: res.statusCode,
data: {
RequestId: res.body.RequestId,
CodeVersion: res.body.CodeVersion
}
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async ListRoutineOptionalSpecs(): Promise<ListRoutineOptionalSpecsRes | null> {
try {
let params = {
action: 'ListRoutineOptionalSpecs',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest();
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: ListRoutineOptionalSpecsRes = {
code: res.statusCode,
data: {
RequestId: res.body.RequestId,
Specs: res.body.Specs
}
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async createRoutineRelatedRecord(
requestParams: CreateRoutineRelatedRecordReq
): Promise<CreateRoutineRelatedRecordRes | null> {
try {
let params = {
action: 'CreateRoutineRelatedRecord',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {
RecordName: requestParams.RecordName,
SiteId: requestParams.SiteId,
SiteName: requestParams.SiteName,
Name: requestParams.Name
}
});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: CreateRoutineRelatedRecordRes = {
code: res.statusCode,
data: {
Status: res.body.Status,
RequestId: res.body.RequestId
}
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
async deleteRoutineRelatedRecord(
requestParams: DeleteRoutineRelatedRecordReq
): Promise<DeleteRoutineRelatedRecordRes | null> {
try {
let params = {
action: 'DeleteRoutineRelatedRecord',
version: '2024-09-10',
protocol: 'https',
method: 'GET',
authType: 'AK',
bodyType: 'json',
reqBodyType: 'json',
style: 'RPC',
pathname: '/',
toMap: function () {
return this;
}
};
let request = new $OpenApi.OpenApiRequest({
query: {
RecordName: requestParams.RecordName,
SiteId: requestParams.SiteId,
SiteName: requestParams.SiteName,
Name: requestParams.Name,
RecordId: requestParams.RecordId
}
});
let runtime = {
toMap: function () {
return this;
}
};
const res = await this.client.callApi(params, request, runtime);
if (res.statusCode === 200 && res.body) {
const ret: DeleteRoutineRelatedRecordRes = {
code: res.statusCode,
data: {
Status: res.body.Status,
RequestId: res.body.RequestId
}
};
return ret;
}
} catch (error) {
console.log(error);
}
return null;
}
}