4
4
"container/list"
5
5
"errors"
6
6
"fmt"
7
+ "slices"
7
8
8
9
liberr "github.com/jortel/go-utils/error"
9
10
"github.com/konveyor/tackle2-hub/model"
@@ -97,13 +98,47 @@ func (r *Target) Apply(db *gorm.DB) (err error) {
97
98
seedIds = append (seedIds , target .ID )
98
99
}
99
100
101
+ err = r .deleteUnwanted (db )
102
+ if err != nil {
103
+ return
104
+ }
105
+
100
106
err = r .reorder (db , seedIds )
101
107
if err != nil {
102
108
return
103
109
}
104
110
return
105
111
}
106
112
113
+ // deleteUnwanted deletes targets with a UUID not found
114
+ // in the set of seeded targets.
115
+ func (r * Target ) deleteUnwanted (db * gorm.DB ) (err error ) {
116
+ var found []* model.Target
117
+ err = db .Find (& found ).Error
118
+ if err != nil {
119
+ err = liberr .Wrap (err )
120
+ return
121
+ }
122
+ wanted := make (map [string ]byte )
123
+ for _ , t := range r .targets {
124
+ wanted [t .UUID ] = 0
125
+ }
126
+ for _ , target := range found {
127
+ if target .UUID == nil {
128
+ continue
129
+ }
130
+ if _ , found := wanted [* target .UUID ]; found {
131
+ continue
132
+ }
133
+ err = db .Delete (target ).Error
134
+ if err != nil {
135
+ err = liberr .Wrap (err )
136
+ return
137
+ }
138
+ }
139
+ return
140
+ }
141
+
107
142
// reorder updates the value of the ui.target.order setting
108
143
// to add any missing target ids. (namely, newly added targets.)
109
144
func (r * Target ) reorder (db * gorm.DB , seedIds []uint ) (err error ) {
@@ -126,7 +161,7 @@ func (r *Target) reorder(db *gorm.DB, seedIds []uint) (err error) {
126
161
}
127
162
userOrder := []uint {}
128
163
_ = s .As (& userOrder )
129
- s .Value = merge (userOrder , seedIds , targetIds )
164
+ s .Value = r . merge (userOrder , seedIds , targetIds )
130
165
131
166
result = db .Where ("key" , UITargetOrder ).Updates (s )
132
167
if result .Error != nil {
@@ -142,11 +177,13 @@ func (r *Target) reorder(db *gorm.DB, seedIds []uint) (err error) {
142
177
// userOrder: slice of target IDs in the user's desired order
143
178
// seedOrder: slice of target IDs in seedfile order
144
179
// ids: slice of ids of all the targets in the DB
145
- func merge (userOrder []uint , seedOrder []uint , ids []uint ) (mergedOrder []uint ) {
180
+ func ( r * Target ) merge (userOrder []uint , seedOrder []uint , ids []uint ) (mergedOrder []uint ) {
146
181
ll := list .New ()
147
182
known := make (map [uint ]* list.Element )
148
183
for _ , id := range userOrder {
149
- known [id ] = ll .PushBack (id )
184
+ if slices .Contains (ids , id ) {
185
+ known [id ] = ll .PushBack (id )
186
+ }
150
187
}
151
188
for i , id := range seedOrder {
152
189
if _ , found := known [id ]; found {
0 commit comments