@kontent-ai/model-generator
Version:
This utility generates strongly-typed models for Delivery JS SDK, Migration toolkit or just general scripting to improve the experience when referencing Kontent.ai related objects.
192 lines (184 loc) • 7.02 kB
text/typescript
import type {
AssetFolderModels,
CollectionModels,
ContentItemModels,
ContentTypeModels,
ContentTypeSnippetModels,
CustomAppModels,
EnvironmentModels,
LanguageModels,
PreviewModels,
RoleModels,
SpaceModels,
TaxonomyModels,
WebhookModels,
WorkflowModels,
} from "@kontent-ai/management-sdk";
import { createManagementClient } from "@kontent-ai/management-sdk";
import chalk from "chalk";
import { HttpService } from "coreSdkLegacy";
import { coreConfig } from "../config.js";
import { toSafeComment } from "../core/comment.utils.js";
import type { GeneratorManagementClient } from "../core/core.models.js";
import { extractErrorData } from "../core/error.utils.js";
export type ManagementKontentFetcher = {
getEnvironmentInfoAsync(): Promise<Readonly<EnvironmentModels.EnvironmentInformationModel>>;
getItemsAsync(): Promise<readonly Readonly<ContentItemModels.ContentItem>[]>;
getWorkflowsAsync(): Promise<readonly Readonly<WorkflowModels.Workflow>[]>;
getRolesAsync(): Promise<readonly Readonly<RoleModels.Role>[]>;
getAssetFoldersAsync(): Promise<readonly Readonly<AssetFolderModels.AssetFolder>[]>;
getCollectionsAsync(): Promise<readonly Readonly<CollectionModels.Collection>[]>;
getWebhooksAsync(): Promise<readonly Readonly<WebhookModels.Webhook>[]>;
getLanguagesAsync(): Promise<readonly Readonly<LanguageModels.LanguageModel>[]>;
getTypesAsync(): Promise<readonly Readonly<ContentTypeModels.ContentType>[]>;
getSnippetsAsync(): Promise<readonly Readonly<ContentTypeSnippetModels.ContentTypeSnippet>[]>;
getTaxonomiesAsync(): Promise<readonly Readonly<TaxonomyModels.Taxonomy>[]>;
getCustomApps(): Promise<readonly Readonly<CustomAppModels.CustomApp>[]>;
getSpaces(): Promise<readonly Readonly<SpaceModels.Space>[]>;
getPreviewUrlConfiguration(): Promise<Readonly<PreviewModels.PreviewConfiguration>>;
};
export function getManagementKontentFetcher(config: {
readonly environmentId: string;
readonly managementApiKey: string;
readonly baseUrl?: string;
}): ManagementKontentFetcher {
const client: GeneratorManagementClient = createManagementClient({
environmentId: config.environmentId,
apiKey: config.managementApiKey,
baseUrl: config.baseUrl,
httpService: new HttpService({ logErrorsToConsole: false }),
headers: [{ header: coreConfig.kontentTrackingHeaderName, value: coreConfig.kontentTrackingHeaderValue }],
});
return {
async getEnvironmentInfoAsync(): Promise<Readonly<EnvironmentModels.EnvironmentInformationModel>> {
const projectInformation = (await client.environmentInformation().toPromise()).data;
console.log(`Project '${chalk.cyan(toSafeComment(projectInformation.project.name))}'`);
console.log(`Environment '${chalk.cyan(toSafeComment(projectInformation.project.environment))}'\n`);
return projectInformation.project;
},
async getItemsAsync(): Promise<readonly Readonly<ContentItemModels.ContentItem>[]> {
return await fetchItemsAsync({
fetch: async () =>
(
await client
.listContentItems()
.withListQueryConfig({
responseFetched: (response) => {
console.log(`Fetched '${chalk.yellow(response.data.items.length.toString())}' content items`);
},
})
.toAllPromise()
).data.items,
itemType: "total content items",
});
},
async getWorkflowsAsync(): Promise<readonly Readonly<WorkflowModels.Workflow>[]> {
return await fetchItemsAsync({
fetch: async () => (await client.listWorkflows().toPromise()).data,
itemType: "workflows",
});
},
async getRolesAsync(): Promise<readonly Readonly<RoleModels.Role>[]> {
return await fetchItemsAsync({
fetch: async () => (await client.listRoles().toPromise()).data.roles,
itemType: "roles",
// roles are available only for enterprise subscriptions
returnEmptyArrayOnMapiError: true,
});
},
async getAssetFoldersAsync(): Promise<readonly Readonly<AssetFolderModels.AssetFolder>[]> {
return await fetchItemsAsync({
fetch: async () => (await client.listAssetFolders().toPromise()).data.items,
itemType: "asset folders",
});
},
async getCollectionsAsync(): Promise<readonly Readonly<CollectionModels.Collection>[]> {
return await fetchItemsAsync({
fetch: async () => (await client.listCollections().toPromise()).data.collections,
itemType: "collections",
});
},
async getWebhooksAsync(): Promise<readonly Readonly<WebhookModels.Webhook>[]> {
return await fetchItemsAsync({
fetch: async () => (await client.listWebhooks().toPromise()).data.webhooks,
itemType: "webhooks",
});
},
async getLanguagesAsync(): Promise<readonly Readonly<LanguageModels.LanguageModel>[]> {
return await fetchItemsAsync({
fetch: async () => (await client.listLanguages().toAllPromise()).data.items,
itemType: "languages",
});
},
async getTypesAsync(): Promise<readonly Readonly<ContentTypeModels.ContentType>[]> {
return await fetchItemsAsync({
fetch: async () => (await client.listContentTypes().toAllPromise()).data.items,
itemType: "types",
});
},
async getSnippetsAsync(): Promise<readonly Readonly<ContentTypeSnippetModels.ContentTypeSnippet>[]> {
return await fetchItemsAsync({
fetch: async () => (await client.listContentTypeSnippets().toAllPromise()).data.items,
itemType: "snippets",
});
},
async getTaxonomiesAsync(): Promise<readonly Readonly<TaxonomyModels.Taxonomy>[]> {
return await fetchItemsAsync({
fetch: async () => (await client.listTaxonomies().toAllPromise()).data.items,
itemType: "taxonomies",
});
},
async getCustomApps(): Promise<readonly Readonly<CustomAppModels.CustomApp>[]> {
return await fetchItemsAsync({
fetch: async () => (await client.listCustomApps().toPromise()).data.items,
itemType: "custom apps",
});
},
async getSpaces(): Promise<readonly Readonly<SpaceModels.Space>[]> {
return await fetchItemsAsync({
fetch: async () => (await client.listSpaces().toPromise()).data,
itemType: "spaces",
});
},
async getPreviewUrlConfiguration(): Promise<Readonly<PreviewModels.PreviewConfiguration>> {
return (await client.getPreviewConfiguration().toPromise()).data;
},
};
}
async function fetchItemsAsync<T>({
fetch,
itemType,
returnEmptyArrayOnMapiError,
}: {
readonly fetch: () => Promise<T[]>;
readonly returnEmptyArrayOnMapiError?: boolean;
readonly itemType:
| "taxonomies"
| "types"
| "snippets"
| "languages"
| "spaces"
| "webhooks"
| "collections"
| "custom apps"
| "roles"
| "asset folders"
| "workflows"
| "total content items";
}): Promise<T[]> {
try {
const data = await fetch();
console.log(`Fetched '${chalk.yellow(data.length.toString())}' ${itemType}`);
return data;
} catch (error) {
if (!returnEmptyArrayOnMapiError) {
throw error;
}
const errorData = extractErrorData(error);
if (errorData.isMapiError) {
console.warn(`${chalk.red(`Skip fetching ${itemType}`)}: ${errorData.message}`);
return [];
}
throw error;
}
}