/
ballot.go
138 lines (115 loc) · 3.66 KB
/
ballot.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
132
133
134
135
136
137
138
package main
import (
"encoding/json"
"log"
"os"
"github.com/joho/godotenv"
"github.com/streadway/amqp"
"github.com/yellyoshua/elections-app/commons/constants"
"github.com/yellyoshua/elections-app/commons/logger"
"github.com/yellyoshua/elections-app/commons/models/ballot_models"
"github.com/yellyoshua/elections-app/commons/repository"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var ballotRepoIndexes = []mongo.IndexModel{
{
Options: options.Index().SetName("institute _id").SetUnique(false).SetDefaultLanguage("en"),
Keys: bson.M{"institute": 1},
},
{
Options: options.Index().SetName("endorsement _id").SetUnique(false).SetDefaultLanguage("en"),
Keys: bson.M{"endorsement": 1},
},
{
Options: options.Index().SetName("suffrage _id").SetUnique(false).SetDefaultLanguage("en"),
Keys: bson.M{"suffrage": 1},
},
}
func ballotRepository() repository.Client {
databaseURI := os.Getenv("BALLOT_MONGODB_URI")
databaseName := os.Getenv("BALLOT_MONGODB_DATABASE")
return repository.New(repository.RepositoryConf{
DatabaseURI: databaseURI,
DatabaseName: databaseName,
}, bootstrapRepository)
}
func bootstrapRepository(db *mongo.Database) error {
return nil
}
func main() {
setupEnvironments()
ballotRepository()
// Define RabbitMQ server URL.
amqpServerURL := os.Getenv("RABBITMQ_URI")
// Create a new RabbitMQ connection.
connectRabbitMQ, err := amqp.Dial(amqpServerURL)
if err != nil {
panic(err)
}
defer connectRabbitMQ.Close()
// Opening a channel to our RabbitMQ instance over
// the connection we have already established.
channelRabbitMQ, err := connectRabbitMQ.Channel()
if err != nil {
logger.Panic("error with rabbitmq channel -> %s", err)
panic(err)
}
defer channelRabbitMQ.Close()
queueSuffrage, errSuffrageQueue := channelRabbitMQ.QueueDeclare(
constants.QueueSuffrageServiceName, // name
false, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
if errSuffrageQueue != nil {
logger.Panic("error declaring suffrage-queue -> %s", errSuffrageQueue)
}
// Subscribing to suffrage_service_queue for getting suffrages.
suffrages, err := channelRabbitMQ.Consume(
queueSuffrage.Name, // queue name
"", // consumer
true, // auto-ack
false, // exclusive
false, // no local
false, // no wait
nil, // arguments
)
if err != nil {
log.Println(err)
}
// Build a welcome message.
log.Println("Successfully connected to RabbitMQ")
log.Println("Waiting for suffrages")
// Make a channel to receive suffrages into infinite loop.
forever := make(chan bool)
go func() {
for suffrage := range suffrages {
var ballot ballot_models.BallotModel
if err := json.Unmarshal(suffrage.Body, &ballot); err == nil {
log.Printf(" > Received message with correct struct!")
}
// For example, show received message in a console.
log.Printf(" > Received message: %s\n", string(suffrage.Body))
}
}()
<-forever
}
// Environments if not exist .env file load system environments or defaults!
func setupEnvironments() {
godotenv.Load(".env")
envs := map[string]bool{
"BALLOT_MONGODB_URI": true,
"BALLOT_MONGODB_DATABASE": true,
"RABBITMQ_URI": true,
}
for name, isRequired := range envs {
value := os.Getenv(name)
if existEnv := len(value) == 0; existEnv && isRequired {
logger.Panic("%v environment variable is required.\n", name)
}
}
}