From 35455be41413b773f1b1f39fa4525d347dabee22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 22 Nov 2022 11:30:35 +0100 Subject: [PATCH] shave down the api report, some final fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/loud-rockets-reply.md | 4 +- .../incremental-ingestion-backend/README.md | 145 +++++++-------- .../api-report.md | 169 +----------------- .../migrations/20221116073152_init.js | 2 +- .../package.json | 13 +- .../IncrementalIngestionDatabaseManager.ts | 1 - .../src/database/tables.ts | 3 +- .../src/engine/IncrementalIngestionEngine.ts | 1 - .../src/index.ts | 13 +- .../src/router/routes.ts | 4 +- .../src/service/IncrementalCatalogBuilder.ts | 6 +- .../src/types.ts | 21 +-- yarn.lock | 2 + 13 files changed, 113 insertions(+), 271 deletions(-) diff --git a/.changeset/loud-rockets-reply.md b/.changeset/loud-rockets-reply.md index 1262e439b4..803521c97b 100644 --- a/.changeset/loud-rockets-reply.md +++ b/.changeset/loud-rockets-reply.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-incremental-ingestion-backend': patch +'@backstage/plugin-incremental-ingestion-backend': minor --- -This change introduces incremental entity providers, which are used for streaming very large data sources into the catalog. +Introduces incremental entity providers, which are used for streaming very large data sources into the catalog. diff --git a/plugins/incremental-ingestion-backend/README.md b/plugins/incremental-ingestion-backend/README.md index 0e0a4e56e6..5df35684d5 100644 --- a/plugins/incremental-ingestion-backend/README.md +++ b/plugins/incremental-ingestion-backend/README.md @@ -1,4 +1,4 @@ -# backend-incremental-ingestion +# `@backstage/plugin-incremental-ingestion-backend` The Incremental Ingestion Backend plugin provides an Incremental Entity Provider that can be used to ingest data from sources using delta mutations, while retaining the orphan prevention mechanism provided by full mutations. @@ -45,63 +45,66 @@ The Incremental Entity Provider backend is designed for data sources that provid 1. Install `@backstage/plugin-incremental-ingestion-backend` with `yarn workspace backend add @backstage/plugin-incremental-ingestion-backend` 2. Import `IncrementalCatalogBuilder` from `@backstage/plugin-incremental-ingestion-backend` and instantiate it with `await IncrementalCatalogBuilder.create(env, builder)`. You have to pass `builder` into `IncrementalCatalogBuilder.create` function because `IncrementalCatalogBuilder` will convert an `IncrementalEntityProvider` into an `EntityProvider` and call `builder.addEntityProvider`. -```ts -const builder = CatalogBuilder.create(env); -// incremental builder receives builder because it'll register -// incremental entity providers with the builder -const incrementalBuilder = await IncrementalCatalogBuilder.create(env, builder); -``` + ```ts + const builder = CatalogBuilder.create(env); + // incremental builder receives builder because it'll register + // incremental entity providers with the builder + const incrementalBuilder = await IncrementalCatalogBuilder.create( + env, + builder, + ); + ``` -3. Last step, add `await incrementBuilder.build()` after `await builder.build()` to ensure that all `CatalogBuider` migration run before running `incrementBuilder.build()` migrations. +3. Last step, add `await incrementBuilder.build()` after `await builder.build()` to ensure that all `CatalogBuilder` migration run before running `incrementBuilder.build()` migrations. -```ts -const { processingEngine, router } = await builder.build(); + ```ts + const { processingEngine, router } = await builder.build(); -// this has to run after `await builder.build()` to ensure that catalog migrations are completed -// before incremental builder migrations are executed -await incrementalBuilder.build(); -``` + // this has to run after `await builder.build()` to ensure that catalog migrations are completed + // before incremental builder migrations are executed + await incrementalBuilder.build(); + ``` -The result should look something like this, + The result should look something like this, -```ts -import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; -import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; -import { IncrementalCatalogBuilder } from '@backstage/plugin-incremental-ingestion-backend'; -import { Router } from 'express'; -import { Duration } from 'luxon'; -import { PluginEnvironment } from '../types'; + ```ts + import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; + import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; + import { IncrementalCatalogBuilder } from '@backstage/plugin-incremental-ingestion-backend'; + import { Router } from 'express'; + import { Duration } from 'luxon'; + import { PluginEnvironment } from '../types'; -export default async function createPlugin( - env: PluginEnvironment, -): Promise { - const builder = CatalogBuilder.create(env); - // incremental builder receives builder because it'll register - // incremental entity providers with the builder - const incrementalBuilder = await IncrementalCatalogBuilder.create( - env, - builder, - ); + export default async function createPlugin( + env: PluginEnvironment, + ): Promise { + const builder = CatalogBuilder.create(env); + // incremental builder receives builder because it'll register + // incremental entity providers with the builder + const incrementalBuilder = await IncrementalCatalogBuilder.create( + env, + builder, + ); - builder.addProcessor(new ScaffolderEntitiesProcessor()); + builder.addProcessor(new ScaffolderEntitiesProcessor()); - const { processingEngine, router } = await builder.build(); + const { processingEngine, router } = await builder.build(); - // this has to run after `await builder.build()` so ensure that catalog migrations are completed - // before incremental builder migrations are executed - const { incrementalAdminRouter } = await incrementalBuilder.build(); + // this has to run after `await builder.build()` so ensure that catalog migrations are completed + // before incremental builder migrations are executed + const { incrementalAdminRouter } = await incrementalBuilder.build(); - router.use('/incremental', incrementalAdminRouter); + router.use('/incremental', incrementalAdminRouter); - await processingEngine.start(); + await processingEngine.start(); - return router; -} -``` + return router; + } + ``` ## Writing an Incremental Entity Provider -To create an Incremental Entity Provider, you need to know how to retrieve a single page of the data that you wish to ingest into the Backstage catalog. If the API has pagination and you know how to make a paginated request to that API, you'll be able to implement an Incremental Entity Provider for this API. For more information about compatibility, checkout Compatible data sources section on this page. +To create an Incremental Entity Provider, you need to know how to retrieve a single page of the data that you wish to ingest into the Backstage catalog. If the API has pagination and you know how to make a paginated request to that API, you'll be able to implement an Incremental Entity Provider for this API. For more information about compatibility, checkout Compatible data sources section on this page. Here is the type definition for an Incremental Entity Provider. @@ -127,7 +130,7 @@ interface IncrementalEntityProvider { * ingestion. * * @param context - anything needed in order to fetch a single page. - * @param cursor - a uniqiue value identifying the page to ingest. + * @param cursor - a unique value identifying the page to ingest. * @returns the entities to be ingested, as well as the cursor of * the the next page after this one. */ @@ -230,7 +233,7 @@ export class MyIncrementalEntityProvider The last step is to implement the actual `next` method that will accept the cursor, call the API, process the result and return the result. ```ts -export class MyIncrementalEntityProvider implements IncrementalEntityProvider { +export class MyIncrementalEntityProvider implements IncrementalEntityProvider { token: string; @@ -250,7 +253,7 @@ export class MyIncrementalEntityProvider implements IncrementalEntityProvider> { + async next(context: MyContext, cursor?: MyApiCursor = { page: 1 }): Promise> { const { apiClient } = context; // call your API with the current cursor @@ -299,36 +302,36 @@ Now that you have your new Incremental Entity Provider, we can connect it to the ## Adding an Incremental Entity Provider to the catalog -We'll assume you followed the Installation instructions. After you create your `incrementalBuilder`, you can instantiate your Entity Provider and pass it to the `addIncrementalEntityProvider` method. +We'll assume you followed the Installation instructions. After you create your `incrementalBuilder`, you can instantiate your Entity Provider and pass it to the `addIncrementalEntityProvider` method. ```ts - const incrementalBuilder = await IncrementalCatalogBuilder.create(env, builder); +const incrementalBuilder = await IncrementalCatalogBuilder.create(env, builder); - // I'm assuming you're going to get your token from config - const token = config.getString('myApiClient.token'); +// I'm assuming you're going to get your token from config +const token = config.getString('myApiClient.token'); - const myEntityProvider = new MyIncrementalEntityProvider(token) +const myEntityProvider = new MyIncrementalEntityProvider(token) - incrementalBuilder.addIncrementalEntityProvider( - myEntityProvider, - { - // how long should it attempt to read pages from the API - // keep this short. Incremental Entity Provider will attempt to - // read as many pages as it can in this time - burstLength: Duration.fromObject({ seconds: 3 }), - // how long should it wait between bursts? - burstInterval: Duration.fromObject({ seconds: 3 }), - // how long should it rest before re-ingesting again? - restLength: Duration.fromObject({ day: 1 }) - // optional back-off configuration - how long should it wait to retry? - backoff: [ - Duration.fromObject({ seconds: 5 }), - Duration.fromObject({ seconds: 30 }), - Duration.fromObject({ minutes: 10 }), - Duration.fromObject({ hours: 3 }) - ] - } - ) +incrementalBuilder.addIncrementalEntityProvider( + myEntityProvider, + { + // how long should it attempt to read pages from the API + // keep this short. Incremental Entity Provider will attempt to + // read as many pages as it can in this time + burstLength: Duration.fromObject({ seconds: 3 }), + // how long should it wait between bursts? + burstInterval: Duration.fromObject({ seconds: 3 }), + // how long should it rest before re-ingesting again? + restLength: Duration.fromObject({ day: 1 }) + // optional back-off configuration - how long should it wait to retry? + backoff: [ + Duration.fromObject({ seconds: 5 }), + Duration.fromObject({ seconds: 30 }), + Duration.fromObject({ minutes: 10 }), + Duration.fromObject({ hours: 3 }) + ] + } +) ``` That's it!!! diff --git a/plugins/incremental-ingestion-backend/api-report.md b/plugins/incremental-ingestion-backend/api-report.md index 5d2f66ac19..ff635871aa 100644 --- a/plugins/incremental-ingestion-backend/api-report.md +++ b/plugins/incremental-ingestion-backend/api-report.md @@ -8,11 +8,9 @@ import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; import type { Config } from '@backstage/config'; import type { DeferredEntity } from '@backstage/plugin-catalog-backend'; -import { Duration } from 'luxon'; import type { DurationObjectUnits } from 'luxon'; -import { Knex } from 'knex'; import type { Logger } from 'winston'; -import type { PermissionAuthorizer } from '@backstage/plugin-permission-common'; +import type { PermissionEvaluator } from '@backstage/plugin-permission-common'; import type { PluginDatabaseManager } from '@backstage/backend-common'; import type { PluginTaskScheduler } from '@backstage/backend-tasks'; import { Router } from 'express'; @@ -38,14 +36,13 @@ export const INCREMENTAL_ENTITY_PROVIDER_ANNOTATION = // @public (undocumented) export class IncrementalCatalogBuilder { // (undocumented) - addIncrementalEntityProvider( - provider: IncrementalEntityProvider, + addIncrementalEntityProvider( + provider: IncrementalEntityProvider, options: IncrementalEntityProviderOptions, ): void; // (undocumented) build(): Promise<{ incrementalAdminRouter: Router; - manager: IncrementalIngestionDatabaseManager; }>; static create( env: PluginEnvironment, @@ -71,162 +68,6 @@ export interface IncrementalEntityProviderOptions { restLength: DurationObjectUnits; } -// @public (undocumented) -export class IncrementalIngestionDatabaseManager { - constructor(options: { client: Knex }); - cleanupProviders(): Promise<{ - ingestionsDeleted: void; - ingestionMarksDeleted: void; - markEntitiesDeleted: void; - }>; - clearDuplicateIngestions( - ingestionId: string, - provider: string, - ): Promise; - clearFinishedIngestions(provider: string): Promise<{ - deletions: { - markEntitiesDeleted: number; - marksDeleted: number; - ingestionsDeleted: number; - }; - }>; - computeRemoved( - provider: string, - ingestionId: string, - ): Promise< - { - entity: any; - }[] - >; - createMark(options: MarkRecordInsert): Promise; - createMarkEntities(markId: string, entities: DeferredEntity[]): Promise; - createProviderIngestionRecord(provider: string): Promise< - | { - ingestionId: string; - nextAction: string; - attempts: number; - nextActionAt: number; - } - | undefined - >; - // (undocumented) - getAllMarks(ingestionId: string): Promise; - getCurrentIngestionRecord( - provider: string, - ): Promise; - getLastMark(ingestionId: string): Promise; - healthcheck(): Promise< - Pick< - { - id: string; - provider_name: string; - }, - 'id' | 'provider_name' - >[] - >; - insertIngestionRecord(record: IngestionUpsertIFace): Promise; - listProviders(): Promise; - purgeAndResetProvider(provider: string): Promise<{ - provider: string; - ingestionsDeleted: number; - marksDeleted: number; - markEntitiesDeleted: number; - }>; - purgeTable(table: string): Promise; - setProviderBackoff( - ingestionId: string, - attempts: number, - error: Error, - backoffLength: number, - ): Promise; - setProviderBursting(ingestionId: string): Promise; - setProviderCanceled(ingestionId: string): Promise; - setProviderCanceling(ingestionId: string, message?: string): Promise; - setProviderComplete(ingestionId: string): Promise; - setProviderIngesting(ingestionId: string): Promise; - setProviderInterstitial(ingestionId: string): Promise; - setProviderResting(ingestionId: string, restLength: Duration): Promise; - triggerNextProviderAction(provider: string): Promise; - // (undocumented) - updateByName( - provider: string, - update: Partial, - ): Promise; - updateIngestionRecordById(options: IngestionRecordUpdate): Promise; - updateIngestionRecordByProvider( - provider: string, - update: Partial, - ): Promise; -} - -// @public -export interface IngestionRecord extends IngestionUpsertIFace { - created_at: string; - // (undocumented) - id: string; - // (undocumented) - next_action_at: Date; -} - -// @public -export interface IngestionRecordUpdate { - // (undocumented) - ingestionId: string; - // (undocumented) - update: Partial; -} - -// @public -export interface IngestionUpsertIFace { - attempts?: number; - completion_ticket: string; - id?: string; - ingestion_completed_at?: Date | string | null; - last_error?: string | null; - next_action: - | 'rest' - | 'ingest' - | 'backoff' - | 'cancel' - | 'nothing (done)' - | 'nothing (canceled)'; - next_action_at?: Date; - provider_name: string; - rest_completed_at?: Date | string | null; - status: - | 'complete' - | 'bursting' - | 'resting' - | 'canceling' - | 'interstitial' - | 'backing off'; -} - -// @public -export interface MarkRecord { - // (undocumented) - created_at: string; - // (undocumented) - cursor: string; - // (undocumented) - id: string; - // (undocumented) - ingestion_id: string; - // (undocumented) - sequence: number; -} - -// @public -export interface MarkRecordInsert { - // (undocumented) - record: { - id: string; - ingestion_id: string; - cursor: unknown; - sequence: number; - }; -} - // @public (undocumented) export type PluginEnvironment = { logger: Logger; @@ -234,8 +75,6 @@ export type PluginEnvironment = { scheduler: PluginTaskScheduler; config: Config; reader: UrlReader; - permissions: PermissionAuthorizer; + permissions: PermissionEvaluator; }; - -// (No @packageDocumentation comment for this package) ``` diff --git a/plugins/incremental-ingestion-backend/migrations/20221116073152_init.js b/plugins/incremental-ingestion-backend/migrations/20221116073152_init.js index 11357c50fd..dc77e0bc31 100644 --- a/plugins/incremental-ingestion-backend/migrations/20221116073152_init.js +++ b/plugins/incremental-ingestion-backend/migrations/20221116073152_init.js @@ -54,7 +54,7 @@ exports.up = async function up(knex) { table .string('last_error') - .comment('records any error that occured in the previous burst attempt'); + .comment('records any error that occurred in the previous burst attempt'); table .integer('attempts') diff --git a/plugins/incremental-ingestion-backend/package.json b/plugins/incremental-ingestion-backend/package.json index 195adab7ea..8d47121c8d 100644 --- a/plugins/incremental-ingestion-backend/package.json +++ b/plugins/incremental-ingestion-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-incremental-ingestion-backend", "description": "An entity provider for streaming large asset sources into the catalog", - "version": "0.1.0", + "version": "0.0.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -13,6 +13,15 @@ "backstage": { "role": "backend-plugin" }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/incremental-ingestion-backend" + }, + "keywords": [ + "backstage" + ], "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", @@ -24,10 +33,12 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-tasks": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-catalog-backend": "workspace:^", + "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@types/express": "^4.17.6", "@types/luxon": "^3.0.0", diff --git a/plugins/incremental-ingestion-backend/src/database/IncrementalIngestionDatabaseManager.ts b/plugins/incremental-ingestion-backend/src/database/IncrementalIngestionDatabaseManager.ts index 891f94b537..7f4ac4eb7c 100644 --- a/plugins/incremental-ingestion-backend/src/database/IncrementalIngestionDatabaseManager.ts +++ b/plugins/incremental-ingestion-backend/src/database/IncrementalIngestionDatabaseManager.ts @@ -28,7 +28,6 @@ import { MarkRecordInsert, } from '../types'; -/** @public */ export class IncrementalIngestionDatabaseManager { private client: Knex; diff --git a/plugins/incremental-ingestion-backend/src/database/tables.ts b/plugins/incremental-ingestion-backend/src/database/tables.ts index ee6cfe0ade..6eee7e6dc5 100644 --- a/plugins/incremental-ingestion-backend/src/database/tables.ts +++ b/plugins/incremental-ingestion-backend/src/database/tables.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export const DB_MIGRATIONS_TABLE = - 'plugin_incremental_ingestion_backend__knex_migrations'; +export const DB_MIGRATIONS_TABLE = 'incremental_ingestion__knex_migrations'; diff --git a/plugins/incremental-ingestion-backend/src/engine/IncrementalIngestionEngine.ts b/plugins/incremental-ingestion-backend/src/engine/IncrementalIngestionEngine.ts index 9b94c04c72..8510881c25 100644 --- a/plugins/incremental-ingestion-backend/src/engine/IncrementalIngestionEngine.ts +++ b/plugins/incremental-ingestion-backend/src/engine/IncrementalIngestionEngine.ts @@ -27,7 +27,6 @@ import { performance } from 'perf_hooks'; import { Duration, DurationObjectUnits } from 'luxon'; import { v4 } from 'uuid'; -/** @public */ export class IncrementalIngestionEngine implements IterationEngine { restLength: Duration; backoff: DurationObjectUnits[]; diff --git a/plugins/incremental-ingestion-backend/src/index.ts b/plugins/incremental-ingestion-backend/src/index.ts index 142b6ba836..7d661c2b98 100644 --- a/plugins/incremental-ingestion-backend/src/index.ts +++ b/plugins/incremental-ingestion-backend/src/index.ts @@ -13,17 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +/** + * Provides efficient incremental ingestion of entities into the catalog. + * + * @packageDocumentation + */ + export { IncrementalCatalogBuilder } from './service/IncrementalCatalogBuilder'; -export type { IncrementalIngestionDatabaseManager } from './database/IncrementalIngestionDatabaseManager'; export type { EntityIteratorResult, IncrementalEntityProvider, IncrementalEntityProviderOptions, - IngestionRecord, - IngestionRecordUpdate, - IngestionUpsert as IngestionUpsertIFace, - MarkRecord, - MarkRecordInsert, INCREMENTAL_ENTITY_PROVIDER_ANNOTATION, PluginEnvironment, } from './types'; diff --git a/plugins/incremental-ingestion-backend/src/router/routes.ts b/plugins/incremental-ingestion-backend/src/router/routes.ts index d26ace1de3..9f480e879e 100644 --- a/plugins/incremental-ingestion-backend/src/router/routes.ts +++ b/plugins/incremental-ingestion-backend/src/router/routes.ts @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { errorHandler } from '@backstage/backend-common'; import express from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; -import { IncrementalIngestionDatabaseManager } from '..'; +import { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager'; import { PROVIDER_BASE_PATH, PROVIDER_CLEANUP, PROVIDER_HEALTH } from './paths'; -/** @public */ export const createIncrementalProviderRouter = async ( manager: IncrementalIngestionDatabaseManager, logger: Logger, diff --git a/plugins/incremental-ingestion-backend/src/service/IncrementalCatalogBuilder.ts b/plugins/incremental-ingestion-backend/src/service/IncrementalCatalogBuilder.ts index eea2c8c56d..680c76011e 100644 --- a/plugins/incremental-ingestion-backend/src/service/IncrementalCatalogBuilder.ts +++ b/plugins/incremental-ingestion-backend/src/service/IncrementalCatalogBuilder.ts @@ -93,11 +93,11 @@ export class IncrementalCatalogBuilder { routerLogger, ); - return { incrementalAdminRouter, manager: this.manager }; + return { incrementalAdminRouter }; } - addIncrementalEntityProvider( - provider: IncrementalEntityProvider, + addIncrementalEntityProvider( + provider: IncrementalEntityProvider, options: IncrementalEntityProviderOptions, ) { const { burstInterval, burstLength, restLength } = options; diff --git a/plugins/incremental-ingestion-backend/src/types.ts b/plugins/incremental-ingestion-backend/src/types.ts index 90f9a20d46..47314626ed 100644 --- a/plugins/incremental-ingestion-backend/src/types.ts +++ b/plugins/incremental-ingestion-backend/src/types.ts @@ -26,10 +26,11 @@ import type { DeferredEntity, EntityProviderConnection, } from '@backstage/plugin-catalog-backend'; -import type { PermissionAuthorizer } from '@backstage/plugin-permission-common'; +import type { PermissionEvaluator } from '@backstage/plugin-permission-common'; import type { DurationObjectUnits } from 'luxon'; import type { Logger } from 'winston'; -import { IncrementalIngestionDatabaseManager } from './'; +import { IncrementalIngestionDatabaseManager } from './database/IncrementalIngestionDatabaseManager'; + /** * Entity annotation containing the incremental entity provider. * @@ -64,7 +65,7 @@ export interface IncrementalEntityProvider { * ingestion. * * @param context - anything needed in order to fetch a single page. - * @param cursor - a uniqiue value identifying the page to ingest. + * @param cursor - a unique value identifying the page to ingest. * @returns The entities to be ingested, as well as the cursor of * the next page after this one. */ @@ -137,15 +138,13 @@ export type PluginEnvironment = { scheduler: PluginTaskScheduler; config: Config; reader: UrlReader; - permissions: PermissionAuthorizer; + permissions: PermissionEvaluator; }; -/** @public */ export interface IterationEngine { taskFn: TaskFunction; } -/** @public */ export interface IterationEngineOptions { logger: Logger; connection: EntityProviderConnection; @@ -158,8 +157,6 @@ export interface IterationEngineOptions { /** * The shape of data inserted into or updated in the `ingestions` table. - * - * @public */ export interface IngestionUpsert { /** @@ -218,8 +215,6 @@ export interface IngestionUpsert { /** * This interface is for updating an existing ingestion record. - * - * @public */ export interface IngestionRecordUpdate { ingestionId: string; @@ -228,8 +223,6 @@ export interface IngestionRecordUpdate { /** * The expected response from the `ingestion_marks` table. - * - * @public */ export interface MarkRecord { id: string; @@ -241,8 +234,6 @@ export interface MarkRecord { /** * The expected response from the `ingestions` table. - * - * @public */ export interface IngestionRecord extends IngestionUpsert { id: string; @@ -255,8 +246,6 @@ export interface IngestionRecord extends IngestionUpsert { /** * This interface supplies all the values for adding an ingestion mark. - * - * @public */ export interface MarkRecordInsert { record: { diff --git a/yarn.lock b/yarn.lock index 17e002800a..dc41ad39a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6028,11 +6028,13 @@ __metadata: resolution: "@backstage/plugin-incremental-ingestion-backend@workspace:plugins/incremental-ingestion-backend" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-tasks": "workspace:^" "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/plugin-catalog-backend": "workspace:^" + "@backstage/plugin-catalog-node": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@types/express": ^4.17.6 "@types/luxon": ^3.0.0