1
0
mirror of https://github.com/muety/wakapi.git synced 2023-08-10 21:12:56 +03:00
wakapi/main.go

110 lines
2.8 KiB
Go
Raw Normal View History

2019-05-05 23:36:49 +03:00
package main
import (
2019-05-06 01:58:01 +03:00
"log"
2019-05-05 23:36:49 +03:00
"net/http"
"os"
"strconv"
"time"
2019-05-06 00:23:54 +03:00
"github.com/codegangsta/negroni"
"github.com/gorilla/mux"
2019-05-11 18:49:56 +03:00
"github.com/jinzhu/gorm"
2019-05-06 01:58:01 +03:00
"github.com/joho/godotenv"
2019-05-06 00:23:54 +03:00
2019-05-06 01:40:41 +03:00
"github.com/n1try/wakapi/middlewares"
2019-05-05 23:36:49 +03:00
"github.com/n1try/wakapi/models"
2019-05-06 01:40:41 +03:00
"github.com/n1try/wakapi/routes"
2019-05-05 23:36:49 +03:00
"github.com/n1try/wakapi/services"
2019-05-11 18:49:56 +03:00
"github.com/n1try/wakapi/utils"
_ "github.com/jinzhu/gorm/dialects/mysql"
2019-05-05 23:36:49 +03:00
)
2019-05-06 01:47:38 +03:00
func readConfig() models.Config {
2019-05-11 18:57:58 +03:00
if err := godotenv.Load(); err != nil {
2019-05-06 01:58:01 +03:00
log.Fatal(err)
}
2019-05-06 08:33:46 +03:00
port, err := strconv.Atoi(os.Getenv("WAKAPI_PORT"))
2019-05-06 01:58:01 +03:00
dbUser, valid := os.LookupEnv("WAKAPI_DB_USER")
dbPassword, valid := os.LookupEnv("WAKAPI_DB_PASSWORD")
dbHost, valid := os.LookupEnv("WAKAPI_DB_HOST")
dbName, valid := os.LookupEnv("WAKAPI_DB_NAME")
2019-05-06 01:47:38 +03:00
2019-05-06 01:58:01 +03:00
if err != nil {
log.Fatal(err)
}
if !valid {
log.Fatal("Config parameters missing.")
}
2019-05-06 01:47:38 +03:00
2019-05-05 23:36:49 +03:00
return models.Config{
2019-05-06 08:33:46 +03:00
Port: port,
2019-05-06 01:58:01 +03:00
DbHost: dbHost,
DbUser: dbUser,
DbPassword: dbPassword,
DbName: dbName,
2019-05-11 18:49:56 +03:00
DbDialect: "mysql",
2019-05-05 23:36:49 +03:00
}
}
func main() {
// Read Config
2019-05-06 01:47:38 +03:00
config := readConfig()
2019-05-05 23:36:49 +03:00
2019-05-11 18:49:56 +03:00
// Connect to database
db, err := gorm.Open(config.DbDialect, utils.MakeConnectionString(&config))
2019-05-05 23:36:49 +03:00
if err != nil {
2019-05-11 18:49:56 +03:00
// log.Fatal("Could not connect to database.")
log.Fatal(err)
2019-05-05 23:36:49 +03:00
}
2019-05-11 18:49:56 +03:00
defer db.Close()
// Migrate database schema
db.AutoMigrate(&models.User{})
db.AutoMigrate(&models.Heartbeat{}).AddForeignKey("user_id", "users(id)", "RESTRICT", "RESTRICT")
2019-05-11 21:07:58 +03:00
db.AutoMigrate(&models.Aggregation{}).AddForeignKey("user_id", "users(id)", "RESTRICT", "RESTRICT")
db.AutoMigrate(&models.AggregationItem{}).AddForeignKey("aggregation_id", "aggregations(id)", "RESTRICT", "RESTRICT")
2019-05-05 23:36:49 +03:00
2019-05-06 01:40:41 +03:00
// Services
heartbeatSrvc := &services.HeartbeatService{db}
userSrvc := &services.UserService{db}
aggregationSrvc := &services.AggregationService{db, heartbeatSrvc}
2019-05-06 01:40:41 +03:00
// Handlers
heartbeatHandler := &routes.HeartbeatHandler{HeartbeatSrvc: heartbeatSrvc}
aggregationHandler := &routes.AggregationHandler{AggregationSrvc: aggregationSrvc}
2019-05-06 01:40:41 +03:00
// Middlewares
authenticate := &middlewares.AuthenticateMiddleware{UserSrvc: userSrvc}
2019-05-05 23:36:49 +03:00
2019-05-06 00:23:54 +03:00
// Setup Routing
router := mux.NewRouter()
apiRouter := mux.NewRouter().PathPrefix("/api").Subrouter()
// API Routes
heartbeats := apiRouter.Path("/heartbeat").Subrouter()
2019-05-06 01:40:41 +03:00
heartbeats.Methods("POST").HandlerFunc(heartbeatHandler.Post)
2019-05-06 00:23:54 +03:00
aggreagations := apiRouter.Path("/aggregation").Subrouter()
aggreagations.Methods("GET").HandlerFunc(aggregationHandler.Get)
2019-05-06 00:23:54 +03:00
// Sub-Routes Setup
router.PathPrefix("/api").Handler(negroni.Classic().With(
2019-05-06 01:40:41 +03:00
negroni.HandlerFunc(authenticate.Handle),
2019-05-06 00:23:54 +03:00
negroni.Wrap(apiRouter),
))
2019-05-05 23:36:49 +03:00
// Listen HTTP
portString := ":" + strconv.Itoa(config.Port)
s := &http.Server{
2019-05-06 00:23:54 +03:00
Handler: router,
2019-05-05 23:36:49 +03:00
Addr: portString,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
}
2019-05-06 01:58:01 +03:00
log.Printf("Listening on %+s\n", portString)
2019-05-05 23:36:49 +03:00
s.ListenAndServe()
}