Module

@adminjs/typeorm

Database adapter which integrates TypeORM into adminjs

installation

yarn add @adminjs/typeorm

Usage

The plugin can be registered using standard AdminJS.registerAdapter method.

import { Database, Resource } from '@adminjs/typeorm';
import AdminJS from 'adminjs'

AdminJS.registerAdapter(TypeOrmAdapter);

//...

if you use class-validator you have to inject this to resource:

import { validate } from 'class-validator'

//...
Resource.validate = validate;

Example

Let see the entire working example of one file typeorm application running on express server:

import {
    BaseEntity,
    Entity, PrimaryGeneratedColumn, Column,
    createConnection,
    ManyToOne,
    RelationId
} from 'typeorm';
import * as express from 'express';
import { Database, Resource } from '@adminjs/typeorm';
import { validate } from 'class-validator'

import AdminJS from 'adminjs';
import * as AdminJSExpress from '@adminjs/express'

Resource.validate = validate;
AdminJS.registerAdapter({ Database, Resource });

@Entity()
export class Person extends BaseEntity
{
    @PrimaryGeneratedColumn()
    public id: number;

    @Column({type: 'varchar'})
    public firstName: string;

    @Column({type: 'varchar'})
    public lastName: string;

    @ManyToOne(type => CarDealer, carDealer => carDealer.cars)
    organization: Organization;

    // in order be able to fetch resources in adminjs - we have to have id available
    @RelationId((person: Person) => person.organization)
    organizationId: number;
}

( async () =>
{
    const connection = await createConnection({...});

    // Applying connection to model
    Person.useConnection(connection);

    const adminJs = new AdminJS({
        // databases: [connection],
        resources: [
            { resource: Person, options: { parent: { name: 'foobar' } } }
        ],
        rootPath: '/admin',
    });

    const app = express();
    const router = AdminJSExpress.buildRouter(adminJs);
    app.use(adminJs.options.rootPath, router);
    app.listen(3000);
})();

ManyToOne

Admin supports ManyToOne relationship but you also have to define @RealationId as stated in the example above.

So 2 properties are needed:

@ManyToOne(type => CarDealer, carDealer => carDealer.cars)
organization: Organization;

and, because TypeORM doesn't publish raw IDs of references, the relation id is also needed:

@RelationId((person: Person) => person.organization)
organizationId: number;

in our case external ID was is a number.