nestjsx / crud

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

allow mapping uuid to id field #807

Open zetti-caletti opened 1 year ago

zetti-caletti commented 1 year ago

Feature Request

Map exposed primary key to another one internally.

Is your feature request related to a problem? Please describe.

I took this example from https://github.com/shinework/nest-crud-nested-controller and modified it to add a uuid field. The problem is if I have the uuid as the Slug-Parameter and Autor and Article are links with the id field. Then I can't reference that in the params-Parameter of the Crud-Decorator. I want to map the uuid-Slug to the id field. Hope it's clear enough.

@Entity()
export class Author {
  @PrimaryGeneratedColumn()
  id: number

  @Column()
  @Generated("uuid")
  uuid: string;

  @Column()
  username: string

  @ApiProperty({ type: () => Article })
  @OneToMany(
    () => Article,
    article => article.author,
  )
  articles: Article[]
}

@Entity()
export class Article {
  @PrimaryGeneratedColumn()
  id: number

  @Column()
  @Generated("uuid")
  uuid: string;

  @Column('text')
  content: string

  @ApiProperty({ type: () => Author })
  @ManyToOne(
    () => Author,
    author => author.articles,
  )
  author: Author

  @Column()
  authorId: number
}

@Crud({
  model: {
    type: Article,
  },
  params: {
    authorId: {
      // authorId is the uuid of the author, but I want to map it to the id of the author
      // because in the database I use integers for primary and foreign keys
      field: 'authorId',
      type: 'uuid',
    },
  },
})
@ApiTags('articles')
@Controller('/authors/:authorId/articles')
export class ArticleController implements CrudController<Article> {
  constructor(public service: ArticleService) {}
}

Describe the solution you'd like

@Crud({
  model: {
    type: Article,
  },
  params: {
    authorId: {
      field: 'author.uuid', // new feature to map the uuid 'authorId' to the uuid field of author (to fetch the author by uuid instead of id)
      type: 'uuid',
    },
  },
})
@ApiTags('articles')
@Controller('/authors/:authorId/articles')
export class ArticleController implements CrudController<Article> {
  constructor(public service: ArticleService) {}
}

Teachability, Documentation, Adoption, Migration Strategy

What is the motivation / use case for changing the behavior?

For the API I want to expose the uuid as the primary key but internally I want to use integers as primary and foreign keys.