7 "github.com/google/uuid"
8 legacy_context "golang.org/x/net/context"
10 "google.golang.org/appengine/datastore"
22 func NewUser(ctx context.Context, email string) (*User, error) {
23 err := datastore.RunInTransaction(ctx, func(ctx legacy_context.Context) error {
24 key := datastore.NewKey(ctx, "User", email, 0, nil)
25 if err := datastore.Get(ctx, key, &dbUser{}); err != datastore.ErrNoSuchEntity {
26 return err // may be nil
29 _, err := datastore.Put(ctx, key, &dbUser{
30 ID: uuid.New().String(),
40 key: datastore.NewKey(ctx, "User", email, 0, nil),
44 func UserByID(ctx context.Context, id string) (*User, error) {
45 q := datastore.NewQuery("User").Filter("ID=", id).KeysOnly()
46 keys, err := q.GetAll(ctx, nil)
48 return nil, fmt.Errorf("datastore.Query.GetAll(): %v", err)
51 return nil, fmt.Errorf("len(keys) = %d, want 1", len(keys))
55 Email: keys[0].StringID(),
60 func (u *User) ID(ctx context.Context) (string, error) {
62 if err := datastore.Get(ctx, u.key, &db); err != nil {
69 func (u *User) Token(ctx context.Context, svc string) (*oauth2.Token, error) {
70 key := datastore.NewKey(ctx, "Token", svc, 0, u.key)
73 if err := datastore.Get(ctx, key, &tok); err != nil {
80 func (u *User) SetToken(ctx context.Context, svc string, tok *oauth2.Token) error {
81 key := datastore.NewKey(ctx, "Token", "Fitbit", 0, u.key)
82 _, err := datastore.Put(ctx, key, tok)