Имеется проект на 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",
}
]