package handler import ( "net/http" "strconv" "github.com/labstack/echo" "github.com/labstack/echo/cookbook/twitter/model" mgo "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" ) func (h *Handler) CreatePost(c echo.Context) (err error) { u := &model.User{ ID: bson.ObjectIdHex(userIDFromToken(c)), } p := &model.Post{ ID: bson.NewObjectId(), From: u.ID.Hex(), } if err = c.Bind(p); err != nil { return } // Validation if p.To == "" || p.Message == "" { return &echo.HTTPError{Code: http.StatusBadRequest, Message: "invalid to or message fields"} } // Find user from database db := h.DB.Clone() defer db.Close() if err = db.DB("twitter").C("users").FindId(u.ID).One(u); err != nil { if err == mgo.ErrNotFound { return echo.ErrNotFound } return } // Save post in database if err = db.DB("twitter").C("posts").Insert(p); err != nil { return } return c.JSON(http.StatusCreated, p) } func (h *Handler) FetchPost(c echo.Context) (err error) { userID := userIDFromToken(c) page, _ := strconv.Atoi(c.QueryParam("page")) limit, _ := strconv.Atoi(c.QueryParam("limit")) // Defaults if page == 0 { page = 1 } if limit == 0 { limit = 100 } // Retrieve posts from database posts := []*model.Post{} db := h.DB.Clone() if err = db.DB("twitter").C("posts"). Find(bson.M{"to": userID}). Skip((page - 1) * limit). Limit(limit). All(&posts); err != nil { return } defer db.Close() return c.JSON(http.StatusOK, posts) }