Del Struct
package models
import "time"
type Post struct {
Id string `json:"id"`
PostContent string `json:"post_content"`
CreatedAt time.Time `json:"created_at"`
UserId string `json:"user_id"`
}
Introducción
Introducción al curso
¿Qué estaremos construyendo?
HTTP y REST
CRUD
REST
Inicialización de módulo e instalación de dependencias
Struct Server
Nuestro primer endpoint
Definiendo el modelo de usuarios
Patrón repository
Registro de usuarios
Implementando el registro
Probando los registros
Autenticación de usuarios
Probando el login
Middleware de validación de autenticación
Implementando el middleware
Modelo Posts
CRUD para Posts
Paginación para Posts
WebSockets
Websockets
Upgrader y Endpoint para Websocket
Struct de Hub para conexiones
Implementando el Broadcast
Cierre
Ejemplo de implementación frontend
Docker file para producción
Siguientes pasos y mejoras
Aún no tienes acceso a esta clase
Crea una cuenta y continúa viendo este curso
Aportes 2
Preguntas 0
Del Struct
package models
import "time"
type Post struct {
Id string `json:"id"`
PostContent string `json:"post_content"`
CreatedAt time.Time `json:"created_at"`
UserId string `json:"user_id"`
}
El código del Handler
type InsertPostRequest struct {
PostContent string `json:"post_content"`
}
type PostResponse struct {
Id string `json:"id"`
PostContent string `json:"post_content"`
}
func InsertPostHandler(s server.Server) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
tokenString := strings.TrimSpace(r.Header.Get("Authorization"))
token, err := jwt.ParseWithClaims(tokenString, &models.AppClaims{}, func(token *jwt.Token) (interface{}, error) {
return []byte(s.Config().JWTSecret), nil
})
if err != nil {
http.Error(w, err.Error(), http.StatusUnauthorized)
return
}
if claims, ok := token.Claims.(*models.AppClaims); ok && token.Valid {
var postRequest = InsertPostRequest{}
if err := json.NewDecoder(r.Body).Decode(&postRequest); err != nil {
return
}
id, err := ksuid.NewRandom()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
post := models.Post{
Id: id.String(),
PostContent: postRequest.PostContent,
// Remember to use claims.UserId, not claims.Id
UserId: claims.UserId,
}
err = repository.InsertPost(r.Context(), &post)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(PostResponse{Id: post.Id, PostContent: post.PostContent})
} else {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
}
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.