Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

CRUD para Posts

18/26
Recursos

Aportes 2

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

En GetPostById hace falta un elemento importante, que es el de validar que el post con ese id exista. Si se deja tal y como está, se devuelve un 200 con un post con valores por defecto, pero esto es incorrecto, ya que la respuesta correcta debería de ser un 404 Not found.

func GetPostByIdHandler(s server.Server) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		params := mux.Vars(r)
		post, err := repository.GetPostById(r.Context(), params["id"])

		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}

		if len(post.Id) == 0 {
			http.Error(w, "post not found", http.StatusNotFound)
			return
		}

		helpers.HttpJsonResponse(w, post)
	}
}

Esto mismo aplica también a los getters de usuario. Hay algunas funciones especiales que las he creado yo para no tener que ir repitiendo todo el rato el mismo código (como añadir el content-type json)

Para reutilizar los métodos de firmar y decodificar tokens cree un struct que tiene estos métodos. Se inyecta como dependencia en los handlers y middlewares. Por ahora solo contemplo el método HS256 y se puede mejorar para que contemple RS256.

package server

import (
	"fmt"
	"github.com/golang-jwt/jwt"
	"go-rest-websockets/1-http-rest-server/models"
	"time"
)

type Authorization struct{}

func NewAuthorization() Authorization {
	return Authorization{}
}

func (a Authorization) SignToken(secretKey string, userId string) (string, error) {
	claims := models.AppClaims{
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: time.Now().Add(time.Hour).Unix(),
		},
		UserId: userId,
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString([]byte(secretKey))
}

func (a Authorization) ParseAndVerifyToken(secretKey string, tokenString string) (*models.AppClaims, error) {
	token, err := jwt.ParseWithClaims(tokenString, &models.AppClaims{}, func(token *jwt.Token) (interface{}, error) {
		return []byte(secretKey), nil
	})
	if err != nil {
		return nil, err
	}
	claims, ok := token.Claims.(*models.AppClaims)

	if !ok || !token.Valid {
		return nil, fmt.Errorf("token is not valid")
	}

	return claims, nil
}