OLD | NEW |
1 // Copyright 2015 The LUCI Authors. All rights reserved. | 1 // Copyright 2015 The LUCI Authors. All rights reserved. |
2 // Use of this source code is governed under the Apache License, Version 2.0 | 2 // Use of this source code is governed under the Apache License, Version 2.0 |
3 // that can be found in the LICENSE file. | 3 // that can be found in the LICENSE file. |
4 | 4 |
5 package mutate | 5 package mutate |
6 | 6 |
7 import ( | 7 import ( |
8 "github.com/luci/gae/service/datastore" | 8 "github.com/luci/gae/service/datastore" |
9 "github.com/luci/luci-go/appengine/cmd/dm/model" | 9 "github.com/luci/luci-go/appengine/cmd/dm/model" |
10 "github.com/luci/luci-go/appengine/tumble" | 10 "github.com/luci/luci-go/appengine/tumble" |
11 "github.com/luci/luci-go/common/logging" | 11 "github.com/luci/luci-go/common/logging" |
12 "golang.org/x/net/context" | 12 "golang.org/x/net/context" |
13 ) | 13 ) |
14 | 14 |
15 // MergeQuest ensures that the given Quest exists and contains the merged | 15 // MergeQuest ensures that the given Quest exists and contains the merged |
16 // set of BuiltBy entries. | 16 // set of BuiltBy entries. |
17 type MergeQuest struct { | 17 type MergeQuest struct { |
18 » Quest *model.Quest | 18 » Quest *model.Quest |
| 19 » AndThen []tumble.Mutation |
19 } | 20 } |
20 | 21 |
21 // Root implements tumble.Mutation. | 22 // Root implements tumble.Mutation. |
22 func (m *MergeQuest) Root(c context.Context) *datastore.Key { | 23 func (m *MergeQuest) Root(c context.Context) *datastore.Key { |
23 » return datastore.Get(c).KeyForObj(m.Quest) | 24 » return model.QuestKeyFromID(c, m.Quest.ID) |
24 } | 25 } |
25 | 26 |
26 // RollForward implements tumble.Mutation. | 27 // RollForward implements tumble.Mutation. |
27 func (m *MergeQuest) RollForward(c context.Context) (muts []tumble.Mutation, err
error) { | 28 func (m *MergeQuest) RollForward(c context.Context) (muts []tumble.Mutation, err
error) { |
28 ds := datastore.Get(c) | 29 ds := datastore.Get(c) |
29 | 30 |
30 » curQuest := &model.Quest{ID: m.Quest.ID} | 31 » curQuest := model.QuestFromID(m.Quest.ID) |
31 | 32 |
32 c = logging.SetField(c, "qid", m.Quest.ID) | 33 c = logging.SetField(c, "qid", m.Quest.ID) |
33 | 34 |
34 reason := "getting quest" | 35 reason := "getting quest" |
35 switch err = ds.Get(curQuest); err { | 36 switch err = ds.Get(curQuest); err { |
36 case nil: | 37 case nil: |
37 prevLen := len(curQuest.BuiltBy) | 38 prevLen := len(curQuest.BuiltBy) |
38 curQuest.BuiltBy.Add(m.Quest.BuiltBy...) | 39 curQuest.BuiltBy.Add(m.Quest.BuiltBy...) |
39 if len(curQuest.BuiltBy) > prevLen { | 40 if len(curQuest.BuiltBy) > prevLen { |
40 reason = "putting merged quest" | 41 reason = "putting merged quest" |
41 err = ds.Put(curQuest) | 42 err = ds.Put(curQuest) |
42 } | 43 } |
43 case datastore.ErrNoSuchEntity: | 44 case datastore.ErrNoSuchEntity: |
44 reason = "putting quest" | 45 reason = "putting quest" |
45 err = ds.Put(m.Quest) | 46 err = ds.Put(m.Quest) |
46 } | 47 } |
47 | 48 |
48 if err != nil { | 49 if err != nil { |
49 logging.WithError(err).Errorf(c, "%s", reason) | 50 logging.WithError(err).Errorf(c, "%s", reason) |
50 } | 51 } |
51 | 52 |
| 53 muts = m.AndThen |
| 54 |
52 return | 55 return |
53 } | 56 } |
54 | 57 |
55 func init() { | 58 func init() { |
56 tumble.Register((*MergeQuest)(nil)) | 59 tumble.Register((*MergeQuest)(nil)) |
57 } | 60 } |
OLD | NEW |