@@ -2,6 +2,7 @@ package repo
2
2
3
3
import (
4
4
"context"
5
+ "errors"
5
6
"go.mongodb.org/mongo-driver/bson"
6
7
"go.mongodb.org/mongo-driver/mongo"
7
8
"issue-tracker/model"
@@ -21,24 +22,78 @@ func NewMongoTicketRepository(client *mongo.Client) TicketRepository {
21
22
}
22
23
}
23
24
24
- func (r * MongoTicketRepository ) FindByID (ID string ) ( model.Ticket , error ) {
25
+ func (r * MongoTicketRepository ) FindByID (ID string ) model.Ticket {
25
26
var result model.Ticket
26
27
err := r .collection .FindOne (context .TODO (), bson.D {{"id" , ID }}).Decode (& result )
27
28
if err != nil {
28
29
log .Printf ("Unable to retrieve ticket with ID: '%s', error: %s\n " , ID , err )
29
- return model.Ticket {}, err
30
+ return model.Ticket {}
30
31
}
31
- return result , nil
32
+ return result
32
33
}
33
34
34
- func (r * MongoTicketRepository ) FindAllByStatus (status model.Status ) ([]model.Ticket , error ) {
35
- panic ("implement me" )
35
+ func (r * MongoTicketRepository ) findMany (filter bson.D ) []model.Ticket {
36
+ var results []model.Ticket
37
+
38
+ cur , err := r .collection .Find (context .TODO (), filter , nil )
39
+ if err != nil {
40
+ log .Printf ("Unable to retrieve all tickets, error: %s\n " , err )
41
+ return []model.Ticket {}
42
+ }
43
+
44
+ for cur .Next (context .TODO ()) {
45
+ var elem model.Ticket
46
+ err := cur .Decode (& elem )
47
+ if err != nil {
48
+ log .Printf ("Unable to decode ticket, error: %s\n " , err )
49
+ }
50
+ results = append (results , elem )
51
+ }
52
+
53
+ if err := cur .Err (); err != nil {
54
+ log .Printf ("Something unexpected went wrong while retreaving all tickets, error: %s\n " , err )
55
+ }
56
+ if err := cur .Close (context .TODO ()); err != nil {
57
+ log .Printf ("Unable to close cursor while retreaving all tickets, error: %s\n " , err )
58
+ }
59
+
60
+ return results
61
+ }
62
+
63
+ func (r * MongoTicketRepository ) FindAll () []model.Ticket {
64
+ return r .findMany (bson.D {{}})
65
+ }
66
+
67
+ func (r * MongoTicketRepository ) FindAllByStatus (status model.Status ) []model.Ticket {
68
+ return r .findMany (bson.D {{"status" , status }})
36
69
}
37
70
38
71
func (r * MongoTicketRepository ) Add (ticket model.Ticket ) error {
39
- panic ("implement me" )
72
+ _ , err := r .collection .InsertOne (context .TODO (), ticket )
73
+ return err
40
74
}
41
75
42
- func (r * MongoTicketRepository ) Remove (ticket model.Ticket ) error {
43
- panic ("implement me" )
76
+ func (r * MongoTicketRepository ) Update (ticket model.Ticket ) error {
77
+ filter := bson.D {{"id" , ticket .ID }}
78
+ update := bson.D {
79
+ {"$set" , bson.D {
80
+ {"title" , ticket .Title },
81
+ {"description" , ticket .Description },
82
+ {"status" , ticket .Status },
83
+ }},
84
+ }
85
+
86
+ updateResult , err := r .collection .UpdateOne (context .TODO (), filter , update )
87
+ if updateResult .MatchedCount == 0 || updateResult .ModifiedCount == 0 {
88
+ return errors .New ("Ticket '" + ticket .ID + "' cannot be updated because it has not been created yet" )
89
+ }
90
+ return err
91
+ }
92
+
93
+ func (r * MongoTicketRepository ) Delete (ID string ) error {
94
+ deleteResult , err := r .collection .DeleteOne (context .TODO (), bson.D {{"id" , ID }}, nil )
95
+ if deleteResult .DeletedCount == 0 {
96
+ return errors .New ("Ticket '" + ID + "' cannot be deleted because it does not exist" )
97
+ }
98
+ return err
44
99
}
0 commit comments