/
main.go
142 lines (122 loc) · 4.35 KB
/
main.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
139
140
141
142
//go:generate go run gen/main.go
package main
import (
"context"
"fmt"
"github.com/goadesign/goa"
"github.com/goadesign/goa/middleware"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
goup "github.com/ufoscout/go-up"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"github.com/cms-orbits/cms-sao/app"
"github.com/cms-orbits/cms-sao/storage"
)
func main() {
appCtx, appCtxCancel := context.WithCancel(context.Background())
defer appCtxCancel()
// Resolve configurations
var up goup.GoUp
{
up, _ = goup.NewGoUp().
// Read default config file if any
AddFile("./config.properties", true).
// Read environment variables with prefix SAO_
AddReader(goup.NewEnvReader("SAO_", true, true)).
Build()
}
// Create service
service := goa.New("SAO v1")
// Mount middleware
service.Use(middleware.RequestID())
service.Use(middleware.LogRequest(up.GetBoolOrDefault("server.log.request", false)))
service.Use(middleware.ErrorHandler(service, up.GetBoolOrDefault("server.response.tracedump", false)))
service.Use(middleware.Recover())
var dbConn *sqlx.DB
{
dbhost := up.GetStringOrDefault("cms.datasource.host", "localhost")
dbport := up.GetStringOrDefault("cms.datasource.port", "5432")
dbname := up.GetStringOrDefault("cms.datasource.name", "cmsdb")
dbuser := up.GetStringOrDefault("cms.datasource.username", "cmsuser")
dbpassword := up.GetStringOrDefault("cms.datasource.password", "")
dbsslmode := up.GetStringOrDefault("cms.datasource.sslmode", "require")
var err error
dbConn, err = sqlx.Connect("postgres",
fmt.Sprintf("user=%s password=%s dbname=%s host=%s port=%s sslmode=%s",
dbuser,
dbpassword,
dbname,
dbhost,
dbport,
dbsslmode,
),
)
if err != nil {
service.LogError("startup", "err", err)
return
}
}
var mongoDB *mongo.Database
{
dbhost := up.GetStringOrDefault("documentsource.host", "localhost")
dbport := up.GetIntOrDefault("documentsource.port", 27017)
dbname := up.GetStringOrDefault("documentsource.name", "cmsdb")
dbuser := up.GetStringOrDefault("documentsource.username", "cmsuser")
dbpassword := up.GetStringOrDefault("documentsource.password", "")
mongoClient, err := mongo.Connect(appCtx,
options.Client().ApplyURI(fmt.Sprintf("mongodb://%s:%s@%s:%d/%s",
dbuser,
dbpassword,
dbhost,
dbport,
dbname,
)),
)
if err != nil {
service.LogError("startup", "err", err)
return
}
if err = mongoClient.Ping(appCtx, nil); err != nil {
service.LogError("startup", "err", err)
return
}
mongoDB = mongoClient.Database(dbname)
}
// Create resource repositories
entryRepository := storage.NewEntryRepository(dbConn)
resultRepository := storage.NewResultRepository(dbConn)
draftRepository := storage.NewEntryDraftRepository(dbConn)
draftresultRepository := storage.NewDraftResultRepository(dbConn)
entrySubmitTrxRepository := storage.NewEntrySubmitTrxRepository(mongoDB)
draftSubmitTrxRepository := storage.NewDraftSubmitTrxRepository(mongoDB)
// Create Neso queue "repository"
nesoQueueName := up.GetStringOrDefault("neso.queue.name", "neso_queue")
nesoQueue := storage.NewQueueWriter(mongoDB, nesoQueueName)
// Mount "actions" controller
c := NewActionsController(service, entrySubmitTrxRepository, draftSubmitTrxRepository, nesoQueue)
app.MountActionsController(service, c)
// Mount "draft" controller
c2 := NewDraftController(service, draftRepository)
app.MountDraftController(service, c2)
// Mount "draft-result" controller
c3 := NewDraftResultController(service, draftresultRepository)
app.MountDraftresultController(service, c3)
// Mount "entry" controller
c4 := NewEntryController(service, entryRepository)
app.MountEntryController(service, c4)
// Mount "result" controller
c5 := NewResultController(service, resultRepository)
app.MountResultController(service, c5)
// Mount "submit entry transaction" controller
c6 := NewEntrySubmitTrxController(service, entrySubmitTrxRepository)
app.MountEntrySubmitTrxController(service, c6)
// Mount "submit entry draft transaction" controller
c7 := NewDraftSubmitTrxController(service, draftSubmitTrxRepository)
app.MountDraftSubmitTrxController(service, c7)
// Start service
serverAddr := fmt.Sprintf("%s:%s", "", up.GetStringOrDefault("server.port", "8000"))
if err := service.ListenAndServe(serverAddr); err != nil {
service.LogError("startup", "err", err)
}
}