@FrontCatBackend

Гуард, который должен проверять, является ли юзер автором поста, возвращает 404 ошибку при попытке достать user.id. Где я допускаю ошибки?

Имеется 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. Буду признателен любой подсказке.
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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