nestjsx / crud

NestJs CRUD for RESTful APIs
https://github.com/nestjsx/crud/wiki
MIT License
4.04k stars 533 forks source link

Error on many-to-many relationship #744

Open Morbakos opened 2 years ago

Morbakos commented 2 years ago

Hi,

I have an issue while trying to load many-to-many relation. Here's my controller:

import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { TicketService } from './ticket.service';
import { CreateTicketDto } from './dto/create-ticket.dto';
import { UpdateTicketDto } from './dto/update-ticket.dto';
import { Crud } from '@nestjsx/crud';
import { User } from 'src/user/entities/user.entity';
import { Ticket } from './entities/ticket.entity';

@Crud({
    model: {
        type: Ticket,
    },
    query: {
        join: {
            createdBy: {
                eager: true
            },
            'createdBy.user': {
                eager: true,
                required: true,
                allow: ['id', 'name']
            },
            'updatedBy.user': {
                eager: true,
                required: false,
                exclude: ['password'],
            },
            'assignedTo': {
                eager: true,
                required: false,
                exclude: ['password'],
            },
            labels: {
                eager: true
            }
        },
    },
    routes: {
    },
})

@Controller('ticket')
export class TicketController {
    constructor(public service: TicketService) { }
}

My ticket entity:

import { Label } from "src/label/entities/label.entity";
import { User } from "src/user/entities/user.entity";
import { BeforeInsert, BeforeUpdate, Column, CreateDateColumn, Entity, Index, JoinColumn, JoinTable, ManyToMany, ManyToOne, OneToMany, OneToOne, PrimaryColumn, PrimaryGeneratedColumn, UpdateDateColumn } from "typeorm";
import { TicketStatusEnum } from "./ticket-status.enum";
import { TicketTypeEnum } from "./ticket-type.enum";

@Entity()
export class Ticket {
    @PrimaryColumn({length: 10})
    @Index({unique: true})
    id: string;

    @Column()
    title: string;

    @Column({
        type: "enum",
        enum: TicketTypeEnum,
        default: TicketTypeEnum.Bug
    })
    type: TicketTypeEnum;

    @Column({
        type: "enum",
        enum: TicketStatusEnum,
        default: TicketStatusEnum.TODO
    })
    status: TicketStatusEnum

    @Column({
        type: "text",
        nullable: false
    })
    content: string;

    @ManyToMany(type => Label, (label) => label.tickets, {nullable: true})
    labels: Label[];

    @Column({ default: () => 'CURRENT_TIMESTAMP' })
    createdDate: Date;

    @ManyToOne(type => User, user => user, {nullable: false})
    createdBy: User;

    @Column({ nullable: true, default: null })
    updatedDate: Date;

    @OneToOne(() => User, { nullable: true })
    @JoinColumn()
    updatedBy: User;

    @ManyToMany(() => User, (user) => user.tickets)
    @JoinTable()
    assignedTo: User[];

    @BeforeInsert()
    async randomId() {
        this.id = Math.random().toString(36).substring(2,12); // Random 10 chars, excluding the starting "x."
    }

    @BeforeUpdate()
    async currentTimestamp() {
        this.updatedDate = new Date();
    }
}

The error looks like this: image

If you need, full project is available here: https://github.com/Morbakos/kerisland_trello/tree/main/api

sskhokhar commented 2 years ago

@Morbakos Have you generated and ran migration? Seems like the many-many relation table is missing from DB

Morbakos commented 2 years ago

Honestly, I though I did it, but I don't remember. I'll check this out

ionuts1704 commented 2 years ago

Try to add an alias to createdBy.user and updatedBy.user