2
respostas

Erro ao curtir mais de uma vez

Ola Prf! Estou pegando um erro quando clico em curtir mais de uma vez.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

animais.service.ts

import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable, of, throwError } from 'rxjs'; import { catchError, mapTo } from 'rxjs/operators'; import { environment } from 'src/environments/environment'; import { TokenService } from '../autenticacao/token.service'; import { Animais, Animal } from './animais';

const API= environment.apiUrl; const NOT_MODIFIED = '304';

@Injectable({ providedIn: 'root' }) export class AnimaisService {

constructor(private http:HttpClient, private tokenService: TokenService) { }

listaDoUsuario(nomeDoUsuario:string): Observable { return this.http.get(${API}/${nomeDoUsuario}/photos); }

buscaPorId(id:number): Observable{ return this.http.get(${API}/photos/${id}); }

excluiAnimal(id:number): Observable{ return this.http.delete(${API}/photos/${id}); }

curtirAnimal(id:number): Observable{ return this.http.post(${API}/photos/${id}/like, {}, {observe:'response'}) .pipe(mapTo(true), catchError((error) => { return error.status === NOT_MODIFIED ? of(false) : throwError(error); })); } }

Por favor poderia avaliar o que possa ser? Obg!

2 respostas

O servidor está retornado essa responsta de forma intencional. Fui dar uma olhad no código do server e vi o seguinte:

api.like = async (req, res) => {
    const { photoId } = req.params;
    const dao = new PhotoDao(req.db);
    const liked = await dao.likeById(photoId, req.user.id);
    if(liked) {
        console.log(`User ${req.user.name} liked photo ${photoId}`);
        return res.status(201).end();
    }
    return res.status(304).end();
};

e dentro do photoDao tem:

    likeById(photoId, userId) {

        return new Promise((resolve, reject) => this._db.run(
            `
            INSERT OR IGNORE INTO like 
                (photo_id, user_id) 
            VALUES 
                (?, ?) 
            `,
            [photoId, userId],
            function(err) {
                if (err) {
                    console.log(err);
                    return reject('Cant like photo');
                }
                resolve(!!this.changes);
            }
        ));

    }

O outro passo seria olhar as regras de restrição do banco de dados, mas quem aposta comigo que existe uma restrição do tipo um usuário só pode curtir uma vez cada foto?

Ola Evandro, Bom dia! O que eu fiz por hora foi deixar desta forma a api no caso do like. Eliminei o erro que estourava intencionalmente (304), mas não achei ainda onde soma os likes (rs). Vou encontrar e respondo aqui. Abç!

api.like = async(req, res) => {
    const { photoId } = req.params;
    const dao = new PhotoDao(req.db);
    const liked = await dao.likeById(photoId, req.user.id);

    console.log(`User ${req.user.name} liked photo ${photoId}`);
    return res.status(201).end();

};