Имеется guard на nestjs, который должен проверять, является ли юзер автором поста.
@Injectable()
export class IsAuthor implements CanActivate {
constructor(private usersService: UsersService, private postsService: PostsService) { }
canActivate(context: ExecutionContext): Observable<boolean> {
const request = context.switchToHttp().getRequest()
return this.usersService.findOneById(request.user.id).pipe(
switchMap((user: User) => this.postsService.findOneById(request.params.id).pipe(
map((postEntry: Post) => {
let hasPermission = false
if (user.id === postEntry.author.id) {
hasPermission = true
}
return user && hasPermission
})
))
)
}
}
Связи таблиц :
@Table
export class User extends Model<User, UserCreationAttribute> {
@Column({
type: DataType.INTEGER,
unique: true,
autoIncrement: true,
primaryKey: true,
})
id: number;
@Column({
type: DataType.STRING,
unique: true,
allowNull: false,
})
email: string;
@Column({
type: DataType.STRING,
allowNull: false,
})
password: string;
@HasMany(() => Post)
posts: Post[];
}
@Table
export class Post extends Model<Post, PostCreationAttrs>{
@Column({ type: DataType.INTEGER, unique: true, autoIncrement: true, primaryKey: true })
id: number;
@Column({ type: DataType.STRING, unique: true, allowNull: false })
title: string;
@Column({ type: DataType.STRING, allowNull: false })
content: string;
@Column({ type: DataType.STRING })
image: string;
@ForeignKey(() => User)
@Column({ type: DataType.INTEGER })
userId: number;
@BelongsTo(() => User)
author: User
}
Сервис поста:
findOneById(id:number):Observable<Post>{
return from(this.postsRepository.findOne({where:{id:id}})).pipe(
map((post:Post)=>{
return post
})
)
}
async update(id: number, updatePostDto: UpdatePostDto) {
await this.postsRepository.update({
...updatePostDto
}, {where:{id}})
const updated = await this.postsRepository.findByPk(id)
return updated
}
Сервис юзера:
findOneById(id: number):Observable<User> {
return from(this.usersRepository.findByPk(id, {include:[{model:Post}]})).pipe(
map((user:User)=>{
if (!user) {
throw new HttpException('User not found!', HttpStatus.NOT_FOUND);
}
return user;
})
)
}
Контроллер поста:
@UseGuards(JwtAuthGuard, IsAuthor )
@Patch(':id')
update(@Param('id') id: number, @Body() updatePostDto: UpdatePostDto) {
return this.postsService.update(id, updatePostDto);
}
@UseGuards(JwtAuthGuard, IsAuthor )
@Delete(':id')
remove(@Param('id') id: string) {
return this.postsService.remove(+id);
}
Я не уверен где у меня может быть ошибка, но при попытке пропатчить или удалить юзера я получаю 404 ошибку User not Found. Буду признателен любой подсказке.