44 "container/list"
55 "errors"
66 "fmt"
7+ "slices"
78
89 liberr "github.com/jortel/go-utils/error"
910 "github.com/konveyor/tackle2-hub/model"
@@ -97,13 +98,47 @@ func (r *Target) Apply(db *gorm.DB) (err error) {
9798 seedIds = append (seedIds , target .ID )
9899 }
99100
101+ err = r .deleteUnwanted (db )
102+ if err != nil {
103+ return
104+ }
105+
100106 err = r .reorder (db , seedIds )
101107 if err != nil {
102108 return
103109 }
104110 return
105111}
106112
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+
107142// reorder updates the value of the ui.target.order setting
108143// to add any missing target ids. (namely, newly added targets.)
109144func (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) {
126161 }
127162 userOrder := []uint {}
128163 _ = s .As (& userOrder )
129- s .Value = merge (userOrder , seedIds , targetIds )
164+ s .Value = r . merge (userOrder , seedIds , targetIds )
130165
131166 result = db .Where ("key" , UITargetOrder ).Updates (s )
132167 if result .Error != nil {
@@ -142,11 +177,13 @@ func (r *Target) reorder(db *gorm.DB, seedIds []uint) (err error) {
142177// userOrder: slice of target IDs in the user's desired order
143178// seedOrder: slice of target IDs in seedfile order
144179// 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 ) {
146181 ll := list .New ()
147182 known := make (map [uint ]* list.Element )
148183 for _ , id := range userOrder {
149- known [id ] = ll .PushBack (id )
184+ if slices .Contains (ids , id ) {
185+ known [id ] = ll .PushBack (id )
186+ }
150187 }
151188 for i , id := range seedOrder {
152189 if _ , found := known [id ]; found {
0 commit comments