abstraction
This commit is contained in:
68
api/message.go
Normal file
68
api/message.go
Normal file
@@ -0,0 +1,68 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
"github.com/go-chi/render"
|
||||
)
|
||||
|
||||
func MessageCtx(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
var message *Message
|
||||
var err error
|
||||
|
||||
if messageID := chi.URLParam(r, "messageID"); messageID != "" {
|
||||
message, err = dbGetMessage(messageID)
|
||||
} else {
|
||||
render.Render(w, r, ErrNotFound)
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
render.Render(w, r, ErrNotFound)
|
||||
return
|
||||
}
|
||||
|
||||
ctx := context.WithValue(r.Context(), messageKey{}, message)
|
||||
next.ServeHTTP(w, r.WithContext(ctx))
|
||||
})
|
||||
}
|
||||
func GetMessage(w http.ResponseWriter, r *http.Request) {
|
||||
message, ok := r.Context().Value(messageKey{}).(*Message)
|
||||
if !ok || message == nil {
|
||||
render.Render(w, r, ErrNotFound)
|
||||
return
|
||||
}
|
||||
|
||||
if err := render.Render(w, r, NewMessageResponse(message)); err != nil {
|
||||
render.Render(w, r, ErrRender(err))
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
type messageKey struct{}
|
||||
|
||||
type Message struct {
|
||||
ID string `json:"id"`
|
||||
UserID int64 `json:"user_id"`
|
||||
Body string `json:"body"`
|
||||
Timestamp int64 `json:"timestamp"`
|
||||
}
|
||||
|
||||
type MessageRequest struct {
|
||||
*Message
|
||||
|
||||
User *UserPayload `json:"user"`
|
||||
|
||||
ProtectedID string `json:"id"`
|
||||
}
|
||||
|
||||
type MessageResponse struct {
|
||||
*Message
|
||||
|
||||
User *UserPayload `json:"user,omitempty"`
|
||||
|
||||
Elapsed int64 `json:"elapsed"`
|
||||
}
|
Reference in New Issue
Block a user