packagehandlerimport("net/http""time""github.com/golang-jwt/jwt""github.com/labstack/echo/v4""github.com/labstack/echox/cookbook/twitter/model""gopkg.in/mgo.v2""gopkg.in/mgo.v2/bson")func(h*Handler)Signup(cecho.Context)(errerror){// Bind
u:=&model.User{ID:bson.NewObjectId()}iferr=c.Bind(u);err!=nil{return}// Validate
ifu.Email==""||u.Password==""{return&echo.HTTPError{Code:http.StatusBadRequest,Message:"invalid email or password"}}// Save user
db:=h.DB.Clone()deferdb.Close()iferr=db.DB("twitter").C("users").Insert(u);err!=nil{return}returnc.JSON(http.StatusCreated,u)}func(h*Handler)Login(cecho.Context)(errerror){// Bind
u:=new(model.User)iferr=c.Bind(u);err!=nil{return}// Find user
db:=h.DB.Clone()deferdb.Close()iferr=db.DB("twitter").C("users").Find(bson.M{"email":u.Email,"password":u.Password}).One(u);err!=nil{iferr==mgo.ErrNotFound{return&echo.HTTPError{Code:http.StatusUnauthorized,Message:"invalid email or password"}}return}//-----
// JWT
//-----
// Create token
token:=jwt.New(jwt.SigningMethodHS256)// Set claims
claims:=token.Claims.(jwt.MapClaims)claims["id"]=u.IDclaims["exp"]=time.Now().Add(time.Hour*72).Unix()// Generate encoded token and send it as response
u.Token,err=token.SignedString([]byte(Key))iferr!=nil{returnerr}u.Password=""// Don't send password
returnc.JSON(http.StatusOK,u)}func(h*Handler)Follow(cecho.Context)(errerror){userID:=userIDFromToken(c)id:=c.Param("id")// Add a follower to user
db:=h.DB.Clone()deferdb.Close()iferr=db.DB("twitter").C("users").UpdateId(bson.ObjectIdHex(id),bson.M{"$addToSet":bson.M{"followers":userID}});err!=nil{iferr==mgo.ErrNotFound{returnecho.ErrNotFound}}return}funcuserIDFromToken(cecho.Context)string{user:=c.Get("user").(*jwt.Token)claims:=user.Claims.(jwt.MapClaims)returnclaims["id"].(string)}
packagehandlerimport("net/http""strconv""github.com/labstack/echo/v4""github.com/labstack/echox/cookbook/twitter/model""gopkg.in/mgo.v2""gopkg.in/mgo.v2/bson")func(h*Handler)CreatePost(cecho.Context)(errerror){u:=&model.User{ID:bson.ObjectIdHex(userIDFromToken(c)),}p:=&model.Post{ID:bson.NewObjectId(),From:u.ID.Hex(),}iferr=c.Bind(p);err!=nil{return}// Validation
ifp.To==""||p.Message==""{return&echo.HTTPError{Code:http.StatusBadRequest,Message:"invalid to or message fields"}}// Find user from database
db:=h.DB.Clone()deferdb.Close()iferr=db.DB("twitter").C("users").FindId(u.ID).One(u);err!=nil{iferr==mgo.ErrNotFound{returnecho.ErrNotFound}return}// Save post in database
iferr=db.DB("twitter").C("posts").Insert(p);err!=nil{return}returnc.JSON(http.StatusCreated,p)}func(h*Handler)FetchPost(cecho.Context)(errerror){userID:=userIDFromToken(c)page,_:=strconv.Atoi(c.QueryParam("page"))limit,_:=strconv.Atoi(c.QueryParam("limit"))// Defaults
ifpage==0{page=1}iflimit==0{limit=100}// Retrieve posts from database
posts:=[]*model.Post{}db:=h.DB.Clone()iferr=db.DB("twitter").C("posts").Find(bson.M{"to":userID}).Skip((page-1)*limit).Limit(limit).All(&posts);err!=nil{return}deferdb.Close()returnc.JSON(http.StatusOK,posts)}