Saltearse al contenido

Integrar MongoDB Atlas con FireCMS

Esta guía detalla los pasos necesarios para integrar MongoDB Atlas como sistema de autenticación y base de datos primaria para tu aplicación FireCMS. Mongo Atlas no soporta almacenamiento de archivos, por lo que opcionalmente puedes usar Firebase para este propósito, o cualquier otro proveedor de almacenamiento.

Comienza generando un nuevo proyecto usando el template starter de FireCMS PRO.

npx create-firecms-app --pro

o

yarn create firecms-app --pro

Comienza configurando tu proyecto de MongoDB Atlas y obteniendo los parámetros de configuración requeridos. Estos parámetros incluyen appId, appUrl, baseUrl, clientApiBaseUrl, dataApiBaseUrl, dataExplorerLink, y dataSourceName.

const atlasConfig = {
appId: "your-app-id",
appUrl: "https://services.cloud.mongodb.com/groups/your-group-id/apps/your-app-id",
baseUrl: "https://services.cloud.mongodb.com",
clientApiBaseUrl: "https://your-region.gcp.services.cloud.mongodb.com",
dataApiBaseUrl: "https://your-region.gcp.data.mongodb-api.com",
dataExplorerLink: "https://cloud.mongodb.com/links/your-group-id/explorer/Cluster0/database/collection/find",
dataSourceName: "mongodb-atlas"
};

Si deseas usar Firebase para almacenamiento de archivos, configura Firebase de la siguiente manera:

const firebaseConfig = {
apiKey: "your-api-key",
authDomain: "your-auth-domain",
databaseURL: "your-database-url",
projectId: "your-project-id",
storageBucket: "your-storage-bucket",
messagingSenderId: "your-messaging-sender-id",
appId: "your-app-id"
};

Creemos un nuevo componente MongoDBApp que integre MongoDB Atlas (y opcionalmente Firebase).

Inicializa Firebase y MongoDB dentro de tu componente:

import React from "react";
import {
AppBar,
CircularProgressCenter,
FireCMS,
ModeControllerProvider,
NavigationRoutes,
Scaffold,
SideDialogs,
SnackbarProvider,
useBuildLocalConfigurationPersistence,
useBuildModeController,
useBuildNavigationController,
useValidateAuthenticator
} from "@firecms/core";
import {
useFirebaseStorageSource,
useInitialiseFirebase,
} from "@firecms/firebase";
import { productsCollection } from "./collections/products_collection";
import { CenteredView } from "@firecms/ui";
import {
MongoAuthController,
MongoLoginView,
useInitRealmMongodb,
useMongoDBAuthController,
useMongoDBDelegate
} from "@firecms/mongodb";
const MongoDBApp = () => {
const name = "My FireCMS App";
// Inicializar Firebase
const { firebaseApp, firebaseConfigLoading, configError } = useInitialiseFirebase({ firebaseConfig });
// Inicializar MongoDB
const { app } = useInitRealmMongodb(atlasConfig);
// ...
};
export default MongoDBApp;

A continuación, configura el controlador de modo, la persistencia de configuración de usuario y el controlador de autenticación de MongoDB.

const modeController = useBuildModeController();
const userConfigPersistence = useBuildLocalConfigurationPersistence();
const authController: MongoAuthController = useMongoDBAuthController({ app });
const mongoDataSourceDelegate = useMongoDBDelegate({
app,
cluster: "mongodb-atlas",
database: "todo"
});

Si planeas usar Firebase para almacenamiento de archivos, inicializa storageSource.

const storageSource = useFirebaseStorageSource({ firebaseApp });

Define la lógica de validación para tu autenticador.

const { authLoading, canAccessMainView, notAllowedError } = useValidateAuthenticator({
authController,
authenticator: () => true, // Reemplaza con tu lógica
dataSourceDelegate: mongoDataSourceDelegate,
storageSource
});

Configura el controlador de navegación con tus colecciones.

const navigationController = useBuildNavigationController({
collections: [productsCollection],
authController,
dataSourceDelegate: mongoDataSourceDelegate
});

Finalmente, conecta todo dentro del return de tu componente.

const MongoDBApp = () => {
const name = "My FireCMS App";
const { firebaseApp, firebaseConfigLoading, configError } = useInitialiseFirebase({ firebaseConfig });
const { app } = useInitRealmMongodb(atlasConfig);
const modeController = useBuildModeController();
const userConfigPersistence = useBuildLocalConfigurationPersistence();
const authController: MongoAuthController = useMongoDBAuthController({ app });
const mongoDataSourceDelegate = useMongoDBDelegate({
app,
cluster: "mongodb-atlas",
database: "todo"
});
const storageSource = useFirebaseStorageSource({ firebaseApp });
const { authLoading, canAccessMainView, notAllowedError } = useValidateAuthenticator({
authController,
authenticator: () => true, // Reemplaza con tu lógica
dataSourceDelegate: mongoDataSourceDelegate,
storageSource
});
const navigationController = useBuildNavigationController({
collections: [productsCollection],
authController,
dataSourceDelegate: mongoDataSourceDelegate
});
if (firebaseConfigLoading || !firebaseApp) {
return <CircularProgressCenter />;
}
if (configError) {
return <CenteredView>{configError}</CenteredView>;
}
return (
<SnackbarProvider>
<ModeControllerProvider value={modeController}>
<FireCMS
navigationController={navigationController}
authController={authController}
userConfigPersistence={userConfigPersistence}
dataSourceDelegate={mongoDataSourceDelegate}
storageSource={storageSource}
>
{({ context, loading }) => {
if (loading || authLoading) {
return <CircularProgressCenter size="large" />;
}
if (!canAccessMainView) {
return (
<MongoLoginView
allowSkipLogin={false}
authController={authController}
registrationEnabled={true}
notAllowedError={notAllowedError}
/>
);
}
return (
<Scaffold autoOpenDrawer={false}>
<AppBar title={name} />
<Drawer />
<NavigationRoutes />
<SideDialogs />
</Scaffold>
);
}}
</FireCMS>
</ModeControllerProvider>
</SnackbarProvider>
);
};
export default MongoDBApp;