| // Copyright 2015 Google Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package helloworld |
| |
| import ( |
| "log" |
| "time" |
| |
| "github.com/GoogleCloudPlatform/go-endpoints/endpoints" |
| "golang.org/x/net/context" |
| "google.golang.org/appengine/datastore" |
| ) |
| |
| // Greeting is a datastore entity that represents a single greeting. |
| // It also serves as (a part of) a response of GreetingService. |
| type Greeting struct { |
| Key *datastore.Key `json:"id" datastore:"-"` |
| Author string `json:"author"` |
| Content string `json:"content" datastore:",noindex"` |
| Date time.Time `json:"date"` |
| } |
| |
| // GretingAddReq is the request type for GreetingService.Add. |
| type GreetingAddReq struct { |
| Author string `json:"author"` |
| Content string `json:"content" endpoints:"req"` |
| } |
| |
| // GreetingListReq is the request type for GreetingService.List. |
| type GreetingsListReq struct { |
| Limit int `json:"limit" endpoints:"d=10"` |
| } |
| |
| // GreetingsList is the response type for GreetingService.List. |
| type GreetingsList struct { |
| Items []*Greeting `json:"items"` |
| } |
| |
| // GreetingService offers operations to add and list greetings. |
| type GreetingService struct{} |
| |
| // List responds with a list of all greetings ordered by Date field. |
| // Most recent greets come first. |
| func (gs *GreetingService) List(c context.Context, r *GreetingsListReq) (*GreetingsList, error) { |
| q := datastore.NewQuery("Greeting").Order("-Date").Limit(r.Limit) |
| greets := make([]*Greeting, 0, r.Limit) |
| keys, err := q.GetAll(c, &greets) |
| if err != nil { |
| return nil, err |
| } |
| |
| for i, k := range keys { |
| greets[i].Key = k |
| } |
| return &GreetingsList{greets}, nil |
| } |
| |
| // Add adds a greeting. |
| func (gs *GreetingService) Add(c context.Context, r *GreetingAddReq) error { |
| k := datastore.NewIncompleteKey(c, "Greeting", nil) |
| g := &Greeting{ |
| Author: r.Author, |
| Content: r.Content, |
| Date: time.Now(), |
| } |
| _, err := datastore.Put(c, k, g) |
| return err |
| } |
| |
| func init() { |
| api, err := endpoints.RegisterService(&GreetingService{}, |
| "greetings", "v1", "Greetings API", true) |
| if err != nil { |
| log.Fatalf("Register service: %v", err) |
| } |
| |
| list := api.MethodByName("List").Info() |
| list.HTTPMethod = "GET" |
| list.Path = "greetings" |
| list.Name = "list" |
| list.Desc = "List most recent greetings." |
| |
| add := api.MethodByName("Add").Info() |
| add.HTTPMethod = "PUT" |
| add.Path = "greetings" |
| add.Name = "add" |
| add.Desc = "Add a greeting." |
| |
| endpoints.HandleHTTP() |
| } |