Apéndice H — Migración de legacy backend (referencia)

Objetivo del apéndice

Cómo pasar del legacy :code:`index.ts` a la New Backend System, con el mapeo uno-a-uno de patrones comunes.

Diferencias clave

Concepto Legacy New Backend System

Punto de entrada

:code:`createPlugin()` + router manual

:code:`createBackendPlugin()` o :code:`createBackendModule()`

Router

:code:`app.use('/api/foo', router)`

:code:`httpRouter.use(await createRouter(…​))`

Config

:code:`Config.getOptionalString(…​)` con lectura directa

:code:`ConfigService` inyectado

Identity

Request headers ad-hoc

:code:`HttpAuthService.credentials()`

DB

:code:`Knex(…​)` instanciado a mano

:code:`DatabaseService` con migraciones

Logging

:code:`winston` o consola

:code:`LoggerService` (pino)

Paso 1 — Reescribir index.ts

// Antes (legacy)
const backend = new Backend({ ... });
backend.add(...);
// muchas líneas de routers
backend.start();

// Después (New Backend System)
const backend = createBackend();
backend.add(import('@backstage/plugin-catalog-backend'));
backend.add(import('@sazon/plugin-sazon-status-backend'));
backend.start();

Paso 2 — Convertir plugins

// Antes (legacy)
export default async function createPlugin({ ... }: PluginEnvironment) {
  const router = Router();
  router.get('/foo', ...);
  return router;
}

// Después (New Backend System)
export const fooPlugin = createBackendPlugin({
  id: 'foo',
  register(env) {
    env.registerInit({
      deps: { httpRouter: coreServices.httpRouter },
      async init({ httpRouter }) {
        httpRouter.use(await createRouter({ ... }));
      },
    });
  },
});

Paso 3 — Servicios

Pasa de singletons globales a deps declarativos:

env.registerInit({
  deps: {
    database: coreServices.database,
    logger: coreServices.logger,
    httpAuth: coreServices.httpAuth,
  },
  async init({ database, logger, httpAuth }) { ... },
});

Paso 4 — Custom services

Si tenías un service factory custom, decláralo con :code:`createServiceFactory`:

export const myCustomService = createServiceFactory({
  service: createServiceRef<MyService>({ id: 'my-custom', scope: 'plugin' }),
  factory: async () => MyServiceImpl,
});

Y lo registras con :code:`backend.add(myCustomService)`.

Compatibilidad

  • La legacy backend system sigue operativa en Backstage 1.x.

  • No puedes mezclar: si arrancas con :code:`createBackend(), todos los plugins deben ser NBS o estar envueltos en un :code:`legacyPlugin() shim.

  • Planifica la migración antes de que tu :code:`index.ts` legacy supere 500 líneas.