Before reading this article, make sure you have set up an AdminJS instance using one of the supported .
Additionally, you should have installed @adminjs/prisma as described in section.
This guide will assume you have set up Prisma using it's or .
There are small differences in how you connect Prisma to Nest.js vs other plugins, so the guide will be split into two sections accordingly.
Example Prisma schema:
prisma.schema
datasource db {
provider = "mysql"
url = env("MYSQL_DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model Publisher {
id Int @id @default(autoincrement())
email String @unique
name String?
}
Standard
The configuration for non-Nest.js plugins is basically the same for each one of them:
You must instantiate a Prisma Client before creating AdminJS instance
You must import AdminJSPrisma adapter and register it
You must import the entities you want to use and pass them to AdminJS resources options
app.ts
// ... other imports
import { Database, Resource, getModelByName } from '@adminjs/prisma'
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
AdminJS.registerAdapter({ Database, Resource })
// ... other code
const start = async () => {
const adminOptions = {
resources: [{
resource: { model: getModelByName('Post'), client: prisma },
options: {},
}, {
resource: { model: getModelByName('Profile'), client: prisma },
options: {},
}, {
resource: { model: getModelByName('Publisher'), client: prisma },
options: {},
}],
}
// Please note that some plugins don't need you to create AdminJS instance manually,
// instead you would just pass `adminOptions` into the plugin directly,
// an example would be "@adminjs/hapi"
const admin = new AdminJS(adminOptions)
// ... other code
}
start()
Nest.js
Your app.module.ts should have imports option which contains:
AdminModule.createAdminAsync({ ... }
In your app.module.ts add these imports at the top of the file:
app.module.ts
import { Database, Resource, getModelByName } from '@adminjs/prisma'
import AdminJS from 'adminjs'
import { PrismaService } from './prisma.service.js' // PrismaService from Nest.js documentation
Following this, register AdminJSPrisma adapter somewhere after your imports:
app.module.ts
AdminJS.registerAdapter({ Database, Resource })
This will allow you to pass Prisma models for AdminJS to load. If we use the Publisher entity that we used as en example earlier, you should import it into app.module.ts and pass it into resources in your adminJsOptions:
app.module.ts
// ... other imports
import { Category } from './category.entity.js'
// ... other code
AdminModule.createAdminAsync({
useFactory: () => {
// Note: Feel free to contribute to this documentation if you find a Nest-way of
// injecting PrismaService into AdminJS module
const prisma = new PrismaService()
return {
adminJsOptions: {
rootPath: '/admin',
resources: [{
resource: { model: getModelByName('Post'), client: prisma },
options: {},
}],
},
}
}
}),
// ... other code
Custom client module
In case your generated client is not under the default path, you can pass clientModule to each resource's configuration:
// other imports
// your custom prisma module
import PrismaModule from '../prisma/client-prisma/index.js';
// ...
const prisma = new PrismaModule.PrismaClient();
// ...
// Notice `clientModule` per resource
const admin = new AdminJS({
resources: [{
resource: {
model: getModelByName('Post', PrismaModule),
client: prisma,
clientModule: PrismaModule,
},
}],
});
Make sure you have followed the tutorial for the framework you are using in the section.
Make sure you have set up your app.module.ts according to and you have followed as well.