1
1
package main
2
2
3
3
import (
4
+ "errors"
4
5
"flag"
5
6
"os"
6
7
"os/signal"
7
8
"strings"
8
9
"syscall"
10
+ "time"
9
11
12
+ "github.com/myrunes/backend/pkg/ddragon"
13
+ "github.com/myrunes/backend/pkg/lifecycletimer"
14
+
15
+ "github.com/myrunes/backend/internal/assets"
10
16
"github.com/myrunes/backend/internal/caching"
11
17
"github.com/myrunes/backend/internal/config"
12
18
"github.com/myrunes/backend/internal/database"
13
- "github.com/myrunes/backend/internal/ddragon"
14
19
"github.com/myrunes/backend/internal/logger"
15
20
"github.com/myrunes/backend/internal/mailserver"
21
+ "github.com/myrunes/backend/internal/storage"
16
22
"github.com/myrunes/backend/internal/webserver"
17
23
)
18
24
19
25
var (
20
- flagConfig = flag .String ("c" , "config.yml" , "config file location" )
26
+ flagConfig = flag .String ("c" , "config.yml" , "config file location" )
27
+ flagSkipFetch = flag .Bool ("skipFetch" , false , "skip avatar asset fetching" )
21
28
)
22
29
30
+ func initStorage (c * config.Main ) (st storage.Middleware , err error ) {
31
+ var cfg interface {}
32
+
33
+ switch c .Storage .Typ {
34
+ case "file" , "fs" :
35
+ st = new (storage.File )
36
+ cfg = * c .Storage .File
37
+ case "minio" , "s3" :
38
+ st = new (storage.Minio )
39
+ cfg = * c .Storage .Minio
40
+ default :
41
+ return nil , errors .New ("invalid storage type" )
42
+ }
43
+
44
+ if cfg == nil {
45
+ return nil , errors .New ("invalid storage config" )
46
+ }
47
+
48
+ err = st .Init (cfg )
49
+
50
+ return
51
+ }
52
+
53
+ func fetchAssets (a * assets.AvatarHandler ) error {
54
+ if * flagSkipFetch {
55
+ return nil
56
+ }
57
+
58
+ cChamps := make (chan string )
59
+ cError := make (chan error )
60
+
61
+ go a .FetchAll (cChamps , cError )
62
+
63
+ go func () {
64
+ for _ , c := range ddragon .DDragonInstance .Champions {
65
+ cChamps <- c .UID
66
+ }
67
+ close (cChamps )
68
+ }()
69
+
70
+ for err := range cError {
71
+ if err != nil {
72
+ return err
73
+ }
74
+ }
75
+
76
+ return nil
77
+ }
78
+
79
+ func refetch (a * assets.AvatarHandler ) {
80
+ var err error
81
+
82
+ logger .Info ("DDRAGON :: refetch" )
83
+ if ddragon .DDragonInstance , err = ddragon .Fetch ("latest" ); err != nil {
84
+ logger .Error ("DDRAGON :: failed polling data from ddragon: %s" , err .Error ())
85
+ }
86
+
87
+ logger .Info ("ASSETHANDLER :: refetch" )
88
+ if err = fetchAssets (a ); err != nil {
89
+ logger .Fatal ("ASSETHANDLER :: failed fetching assets: %s" , err .Error ())
90
+ }
91
+ }
92
+
23
93
func main () {
24
94
flag .Parse ()
25
95
@@ -79,14 +149,31 @@ func main() {
79
149
db .Close ()
80
150
}()
81
151
82
- logger .Info ("MAILSERVER :: initialization" )
83
- ms ,
err := mailserver . NewMailServer (
cfg . MailServer , "[email protected] " , "myrunes" )
152
+ logger .Info ("STORAGE :: initialization" )
153
+ st , err := initStorage (cfg )
84
154
if err != nil {
85
- logger .Fatal ("MAILSERVER :: failed connecting to mail account: %s" , err .Error ())
155
+ logger .Fatal ("STORAGE :: failed initializing storage: %s" , err .Error ())
156
+ }
157
+
158
+ logger .Info ("ASSETHANDLER :: initialization" )
159
+ avatarAssetsHandler := assets .NewAvatarHandler (st )
160
+ if err = fetchAssets (avatarAssetsHandler ); err != nil {
161
+ logger .Fatal ("ASSETHANDLER :: failed fetching assets: %s" , err .Error ())
162
+ }
163
+
164
+ var ms * mailserver.MailServer
165
+ if cfg .MailServer != nil {
166
+ logger .Info ("MAILSERVER :: initialization" )
167
+ ms ,
err = mailserver .
NewMailServer (
cfg .
MailServer ,
"[email protected] " ,
"myrunes" )
168
+ if err != nil {
169
+ logger .Fatal ("MAILSERVER :: failed connecting to mail account: %s" , err .Error ())
170
+ }
171
+ logger .Info ("MAILSERVER :: started" )
172
+ } else {
173
+ logger .Warning ("MAILSERVER :: mail server is disabled due to missing configuration" )
86
174
}
87
- logger .Info ("MAILSERVER :: started" )
88
175
89
- var cache caching.Middleware
176
+ var cache caching.CacheMiddleware
90
177
if cfg .Redis != nil && cfg .Redis .Enabled {
91
178
cache = caching .NewRedis (cfg .Redis )
92
179
} else {
@@ -95,7 +182,7 @@ func main() {
95
182
cache .SetDatabase (db )
96
183
97
184
logger .Info ("WEBSERVER :: initialization" )
98
- ws , err := webserver .NewWebServer (db , cache , ms , cfg .WebServer )
185
+ ws , err := webserver .NewWebServer (db , cache , ms , avatarAssetsHandler , cfg .WebServer )
99
186
if err != nil {
100
187
logger .Fatal ("WEBSERVER :: failed creating web server: %s" , err .Error ())
101
188
}
@@ -106,17 +193,11 @@ func main() {
106
193
}()
107
194
logger .Info ("WEBSERVER :: started" )
108
195
109
- // Lifecycle Timer was used to clean up expierd
110
- // sessions which is no more necessary after
111
- // implementation of JWT tokens.
112
- // Just keeping this here in case of this may
113
- // be needed some time later.
114
- // lct := lifecycletimer.New(5 * time.Minute).
115
- // Handle(func() {
116
- // }).
117
- // Start()
118
- // defer lct.Stop()
119
- // logger.Info("LIFECYCLETIMER :: started")
196
+ lct := lifecycletimer .New (24 * time .Hour ).
197
+ Handle (func () { refetch (avatarAssetsHandler ) }).
198
+ Start ()
199
+ defer lct .Stop ()
200
+ logger .Info ("LIFECYCLETIMER :: started" )
120
201
121
202
sc := make (chan os.Signal , 1 )
122
203
signal .Notify (sc , syscall .SIGINT , syscall .SIGTERM , os .Interrupt , os .Kill )
0 commit comments