@Raey

Typeorm. Как осуществить данный запрос?

Имеется проект на nest.js и база на postgreSQL.
Весь код можно посмотреть тут: https://github.com/Fblfbl/backend-movies/
Есть 3 сущности - юзеры, фильмы и статусы фильма для юзера (status далее).
Юзеры создавать фильмы не могут, те есть просто база фильмов, которые юзеры могут добавлять в избранное, в список просмотров на будущее и в историю.
Сущности имеют данный вид:

User
@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;

  @Column()
  password: string;

  @Column()
  login: string;

  @OneToMany((type) => UserDetail, (userDetail) => userDetail.user)
  userDetails: UserDetail[];
}


Movie
@Entity()
export class Movie {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column()
  genre: string;

  @OneToOne((type) => UserDetail, (userDetail) => userDetail.movie)
  userDetails: UserDetail;
}


UserDetail(Status)
@Entity()
export class UserDetail {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ default: false })
  isFavorite: boolean;

  @Column({ default: false })
  isWatched: boolean;

  @Column({ default: false })
  isInWatchlist: boolean;

  @Column({ default: null })
  watchingDate: Date | null;

  @ManyToOne((type) => User, (user) => user.userDetails)
  user: User;
  @Column()
  userId: number;

  @ManyToOne((type) => Movie, (movie) => movie.userDetails)
  movie: Movie;
  @Column()
  movieId: number;

  @BeforeUpdate()
  updateDate() {
    if (this.isWatched && !this.watchingDate) {
      this.watchingDate = new Date();
    } else if (!this.isWatched) {
      this.watchingDate = null;
    }
  }
  @BeforeInsert()
  createDate() {
    this.updateDate();
  }
}


Изначально сущность status не существует ни для фильма, ни для юзера. Она создается только тогда, когда юзер обновляет статус фильма.

Есть 2 роута:
'movies/all' возвращает просто все фильмы без статусов (для ситуации если пользователь не авторизован)
'movies' должен возвращать все фильмы для юзера с их статусами и без, если их еще нет для этого юзера.

Собственно вопрос. Как для юзера получить все фильмы со статусом и остальные без статусов? Примеры ниже.

Те, допустим я залогинился и получаю список фильмов (Для примера всего их 3, 1 фильм я добавил в избранное). Мне должно вернуть что-то такое:

Пример выдачи фильмов с залогиненным юзером
[
    {
        "id": 1,
        "title": "test1",
        "genre": "test1",
        "userDetails": {
            "id": 1,
            "isFavorite": true,
            "isWatched": false,
            "isInWatchlist": false,
            "watchingDate": null,
            "userId": 1,
            "movieId": 1
        }
    },
    {
        "id": 2,
        "title": "test2",
        "genre": "test2",
    },
    {
        "id": 3,
        "title": "test3",
        "genre": "test3",
    }
]


Для незалогиненного юзера должно вернуть вот это:

Пример выдачи фильмов без логина
[
    {
        "id": 1,
        "title": "test1",
        "genre": "test1",
    },
    {
        "id": 2,
        "title": "test2",
        "genre": "test2",
    },
    {
        "id": 3,
        "title": "test3",
        "genre": "test3",
    }
]
  • Вопрос задан
  • 675 просмотров
Пригласить эксперта
Ответы на вопрос 1
В чем проблема сделать это через leftJoin ?

this.lfMovieER.createQueryBuilder('m')
  .setParameter('userID', 82)
  .leftJoin(
    LfUserDetailEntity,
    'uD',
    'm.id = uD.movie_id AND uD.user_id = :userID'
  )
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы