Skip to content

Instantly share code, notes, and snippets.

@Moddus
Last active December 17, 2015 07:59
Show Gist options
  • Save Moddus/5576957 to your computer and use it in GitHub Desktop.
Save Moddus/5576957 to your computer and use it in GitHub Desktop.
Example: Appengine and go-restful
package api
import (
"appengine"
"github.com/Moddus/go-restful"
)
type Basic struct {
Version string
Message string
}
func init() {
ws := new(restful.WebService)
ws.Path("/").Consumes(restful.MIME_JSON, restful.MIME_XML).Produces(restful.MIME_JSON, restful.MIME_XML)
ws.Route(ws.GET("/").To(root))
restful.Add(ws)
}
func root(request *restful.Request, response *restful.Response) {
ctx := appengine.NewContext(request.Request)
response.WriteEntity(Basic{appengine.VersionID(ctx), "Android API"})
}
package api
import (
"appengine"
"github.com/Moddus/go-restful"
"net/http"
)
type HttpUser struct {
Id string
Devices []Device `json,omitempty`
RegDate int64
AndroidVersion string
}
func (self *HttpUser) ToModel() (*User, []Device) {
user := new(User)
user.Id = self.Id
user.RegDate = self.RegDate
device := make([]Device, len(self.Devices))
for i, d := range self.Devices {
device[i] = d
}
return user, device
}
func init() {
ws := new(restful.WebService)
ws.Path("/users").Consumes(restful.MIME_JSON, restful.MIME_XML).Produces(restful.MIME_JSON, restful.MIME_XML)
ws.Route(ws.PUT("/").To(addUser))
ws.Route(ws.DELETE("/").To(deleteUser))
restful.Add(ws)
}
func deleteUser(request *restful.Request, response *restful.Response) {
ctx := appengine.NewContext(request.Request)
user := new(HttpUser)
err := request.ReadEntity(&user)
if err != nil {
ctx.Errorf("Error delete User: %s", err)
response.InternalServerError()
} else if !valid(user) {
response.WriteStatus(http.StatusBadRequest)
} else {
modelUser, devices := (*user).ToModel()
sync := NewStorageSync(ctx, modelUser, devices)
err = sync.DeleteUser()
if err != nil {
ctx.Errorf("Error delete User: %s", err)
response.InternalServerError()
} else {
response.WriteStatus(http.StatusNoContent)
}
}
}
func addUser(request *restful.Request, response *restful.Response) {
ctx := appengine.NewContext(request.Request)
user := new(HttpUser)
err := request.ReadEntity(&user)
if err != nil {
ctx.Errorf("Error create User: %s", err)
response.InternalServerError()
} else if !valid(user) {
response.WriteStatus(http.StatusBadRequest)
} else {
modelUser, devices := (*user).ToModel()
sync := NewStorageSync(ctx, modelUser, devices)
err = sync.RegisterNewUser()
if err != nil {
ctx.Errorf("Error add User sync stores: %s", err)
response.InternalServerError()
} else {
response.WriteStatus(http.StatusCreated)
}
}
}
func valid(user *HttpUser) bool {
return len(user.Id) > 0 && len(user.Devices) > 0 && user.RegDate > 0 && len(user.AndroidVersion) > 0
}
@greivinlopez
Copy link

Hey! Really appreciate this. Thank you! :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment