package v1 import ( "encoding/json" "github.com/gorilla/mux" "net/http" "strconv" ) func RegisterNewsRoutes(r *mux.Router) { r.HandleFunc("/news", resolveNews).Methods("GET", "OPTIONS", "POST") r.HandleFunc("/news/{id:[0-9]+}", resolvePost).Methods("GET", "OPTIONS", "PUT", "DELETE") } func resolveNews(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodGet { q := r.URL.Query() offset, _ := strconv.Atoi(q.Get("offset")) limit, _ := strconv.Atoi(q.Get("limit")) if limit == 0 { limit = 20 } total, err := FetchTotalNews() if err != nil { Error(w, err) return } pagination := map[string]interface{}{ "offset": offset, "limit": limit, "total": total, } news, err := FetchNews(offset, limit) ResponsePagination(w, err, news, pagination) } else if r.Method == http.MethodPost { body, err := ReadBody(r) if err != nil { Error(w, err) return } post := new(Post) err = json.Unmarshal(body, post) if err != nil { Error(w, err) return } uid, err := GetCurrentUserID(r) if err != nil { Error(w, err) return } post.AuthorID = uid createdPost, err := CreatePost(post) Response(w, err, createdPost) } } func resolvePost(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id, _ := strconv.Atoi(vars["id"]) if r.Method == http.MethodGet { post, err := FetchPost(id) Response(w, err, post) } else if r.Method == http.MethodPut { body, err := ReadBody(r) if err != nil { Error(w, err) return } post, err := FetchPost(id) if err != nil { Error(w, err) return } err = json.Unmarshal(body, post) if err != nil { Error(w, err) return } err = UpdatePost(post) if err != nil { Error(w, err) return } w.WriteHeader(http.StatusNoContent) } else if r.Method == http.MethodDelete { err := DeletePost(id) if err != nil { Error(w, err) return } w.WriteHeader(http.StatusNoContent) } }