-
Notifications
You must be signed in to change notification settings - Fork 0
/
river.go
131 lines (126 loc) · 3.67 KB
/
river.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package database
import (
"context"
"log"
"time"
"github.com/AwespireTech/RiverCare-Backend/config"
"github.com/AwespireTech/RiverCare-Backend/models"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo/options"
)
func ascending(isAscending bool) int {
if isAscending {
return 1
}
return -1
}
func GetAllRivers(param models.RiversParams) ([]models.River, error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
collection := client.Database(config.DATABASE_NAME).Collection("river")
var rivers []models.River
findOptions := options.Find().SetSort(bson.D{{Key: param.SortBy, Value: ascending(param.Ascending)}})
cursor, err := collection.Find(ctx, bson.D{}, findOptions)
if err != nil {
return nil, err
}
defer cursor.Close(ctx)
for cursor.Next(ctx) {
var river models.River
err := cursor.Decode(&river)
if err != nil {
return nil, err
}
rivers = append(rivers, river)
}
if err := cursor.Err(); err != nil {
return nil, err
}
for i, river := range rivers {
rivers[i] = fillEventAndProposalData(river)
}
return rivers, nil
}
func GetRiverById(id string) (models.River, error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
collection := client.Database(config.DATABASE_NAME).Collection("river")
var river models.River
filter := models.RiverFilter{
ID: id,
}
err := collection.FindOne(ctx, filter).Decode(&river)
river = fillEventAndProposalData(river)
return river, err
}
func GetEventById(id string) (models.Event, error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
collection := client.Database(config.DATABASE_NAME).Collection("event")
var event models.Event
filter := models.EventFilter{
ID: id,
}
err := collection.FindOne(ctx, filter).Decode(&event)
return event, err
}
func GetProposalById(id string) (models.Proposal, error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
collection := client.Database(config.DATABASE_NAME).Collection("proposal")
var proposal models.Proposal
filter := models.ProposalFilter{
ID: id,
}
err := collection.FindOne(ctx, filter).Decode(&proposal)
return proposal, err
}
func fillEventAndProposalData(river models.River) models.River {
var events []models.Event
for _, eventID := range river.Events {
event, err := GetEventById(eventID)
if err != nil {
continue
}
events = append(events, event)
}
river.EventData = events
var proposals []models.Proposal
for _, proposalID := range river.Proposals {
proposal, err := GetProposalById(proposalID)
if err != nil {
log.Println("Proposal:" + proposalID + " error:" + err.Error())
continue
}
proposals = append(proposals, proposal)
}
river.ProposalData = proposals
return river
}
func SaveEventAndProposalData(river models.River) (models.River, error) {
var eventIDs []string
for _, event := range river.EventData {
eventIDs = append(eventIDs, event.ID)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
collection := client.Database(config.DATABASE_NAME).Collection("event")
_, err := collection.InsertOne(ctx, event)
if err != nil {
return river, err
}
}
river.Events = eventIDs
var proposalIDs []string
for _, proposal := range river.ProposalData {
proposalIDs = append(proposalIDs, proposal.ID)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
collection := client.Database(config.DATABASE_NAME).Collection("proposal")
_, err := collection.InsertOne(ctx, proposal)
if err != nil {
return river, err
}
}
river.Proposals = proposalIDs
return river, nil
}