/
remove.go
93 lines (75 loc) · 2.13 KB
/
remove.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package db
import (
"context"
"sync"
"github.com/kletskovg/accounting/packages/logger"
"github.com/kletskovg/packages/common"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
)
type RemoveTransactionArgs struct {
RemoveLast bool
Count int
IDs []string
}
func RemoveTransaction(args RemoveTransactionArgs) {
if args.RemoveLast {
logger.Info("Try to remove last transaction")
var findOpts = options.FindOneAndDeleteOptions{
Sort: bson.D{{Key: "timestamp", Value: -1}},
}
Collection.FindOneAndDelete(context.Background(), bson.D{}, &findOpts)
return
}
var wg sync.WaitGroup
if args.Count > 0 {
logger.Info("Try to remove ", args.Count, " transactions")
var findOpts = options.Find()
findOpts.SetLimit(int64(args.Count))
findOpts.SetSort(bson.D{{Key: "timestamp", Value: -1}})
var cursor, err = Collection.Find(context.Background(), bson.D{}, findOpts)
if err != nil {
logger.Error("Cant find documents from DB", err)
}
var transactions []common.Transaction
if err = cursor.All(context.Background(), &transactions); err != nil {
logger.Error("Cant process transactions from DB: \n", err)
}
for _, transaction := range transactions {
wg.Add(1)
go func(deleteTransaction common.Transaction) {
defer wg.Done()
logger.Info("Deleting...", deleteTransaction)
var transactionID, err = primitive.ObjectIDFromHex(deleteTransaction.ID)
if err == nil {
Collection.DeleteOne(context.Background(), bson.D{{Key: "_id", Value: transactionID}})
} else {
logger.Error("Cant create ObjectID, ", err, deleteTransaction)
}
}(transaction)
}
wg.Wait()
return
}
if len(args.IDs) > 0 {
for _, id := range args.IDs {
wg.Add(1)
var objectID, err = primitive.ObjectIDFromHex(id)
if err != nil {
logger.Info("Cant process ", id, "not a valid object id")
continue
}
go func(docId primitive.ObjectID) {
defer wg.Done()
Collection.FindOneAndDelete(
context.Background(),
bson.D{{
Key: "_id", Value: docId,
}},
)
}(objectID)
}
wg.Wait()
}
}