2019-02-21 04:38:45 +00:00
|
|
|
package main
|
|
|
|
|
|
2019-02-22 03:18:08 +00:00
|
|
|
import (
|
2019-02-27 19:05:50 +00:00
|
|
|
"fmt"
|
2019-02-22 03:18:08 +00:00
|
|
|
"log"
|
|
|
|
|
"net/http"
|
2019-03-16 10:17:47 +00:00
|
|
|
"os"
|
2019-02-22 03:18:08 +00:00
|
|
|
|
2019-03-16 10:17:47 +00:00
|
|
|
"github.com/gorilla/mux"
|
|
|
|
|
"github.com/markbates/goth"
|
|
|
|
|
"github.com/markbates/goth/providers/google"
|
2019-02-27 19:05:50 +00:00
|
|
|
"github.com/spf13/viper"
|
2019-03-10 10:20:00 +00:00
|
|
|
"gitlab.com/mobtools/internal-tools-server/api"
|
2019-03-16 10:17:47 +00:00
|
|
|
"gitlab.com/mobtools/internal-tools-server/api/middleware"
|
2019-03-10 10:20:00 +00:00
|
|
|
"gitlab.com/mobtools/internal-tools-server/models"
|
|
|
|
|
"gitlab.com/mobtools/internal-tools-server/storage"
|
|
|
|
|
"gitlab.com/mobtools/internal-tools-server/url"
|
2019-02-22 03:18:08 +00:00
|
|
|
)
|
2019-02-21 04:38:45 +00:00
|
|
|
|
2019-03-16 10:17:47 +00:00
|
|
|
const baseURL = "/"
|
|
|
|
|
const baseAPIURL = "/api"
|
2019-02-27 16:35:03 +00:00
|
|
|
const apiVersion = "/v1"
|
|
|
|
|
|
2019-02-21 04:38:45 +00:00
|
|
|
func main() {
|
2019-02-27 19:05:50 +00:00
|
|
|
|
|
|
|
|
// Read all configurations
|
|
|
|
|
parseConfig()
|
|
|
|
|
|
|
|
|
|
// Initialize the database
|
2019-02-27 19:16:17 +00:00
|
|
|
initializeDatastore()
|
2019-02-22 03:18:08 +00:00
|
|
|
|
2019-02-27 19:16:17 +00:00
|
|
|
// Run any migrations on the datastore
|
2019-02-27 16:35:03 +00:00
|
|
|
runMigrations()
|
|
|
|
|
|
2019-02-27 19:16:17 +00:00
|
|
|
router := intializeServer()
|
|
|
|
|
|
|
|
|
|
host := viper.GetString("server.host")
|
|
|
|
|
port := viper.GetString("server.port")
|
|
|
|
|
log.Fatal(http.ListenAndServe(host+":"+port, router))
|
|
|
|
|
}
|
|
|
|
|
|
2019-03-16 10:17:47 +00:00
|
|
|
func intializeServer() *mux.Router {
|
|
|
|
|
router := mux.NewRouter()
|
|
|
|
|
authProvider := viper.GetString("auth.provider")
|
|
|
|
|
if authProvider == "google" {
|
|
|
|
|
goth.UseProviders(
|
|
|
|
|
google.New(viper.GetString("auth.key"), viper.GetString("auth.secret"), "http://localhost:"+viper.GetString("server.port")+viper.GetString("auth.callbackUrl")),
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Auth Endpoints
|
|
|
|
|
router.HandleFunc(url.LoginURL, middleware.Chain(api.Login, middleware.Method("GET"), middleware.Logging()))
|
|
|
|
|
router.HandleFunc(url.AuthURL, middleware.Chain(api.InitiateAuth, middleware.Method("GET"), middleware.Logging()))
|
|
|
|
|
router.HandleFunc(url.AuthCallbackURL, middleware.Chain(api.AuthCallback, middleware.Method("GET"), middleware.Logging()))
|
|
|
|
|
router.HandleFunc(url.LogoutURL, middleware.Chain(api.Logout, middleware.Method("GET"), middleware.Logging()))
|
|
|
|
|
router.HandleFunc(url.ProfileURL, middleware.Chain(api.GetUserProfile, middleware.Method("GET"), middleware.Logging()))
|
2019-02-22 03:18:08 +00:00
|
|
|
|
2019-02-26 17:06:21 +00:00
|
|
|
// Account CRUD Endpoints
|
|
|
|
|
|
|
|
|
|
// Component CRUD Endpoints
|
2019-03-16 10:17:47 +00:00
|
|
|
router.HandleFunc(baseAPIURL+apiVersion+url.ComponentURL, middleware.Chain(api.GetComponents, middleware.Method("GET"), middleware.Authenticated(), middleware.Logging()))
|
|
|
|
|
router.HandleFunc(baseAPIURL+apiVersion+url.ComponentURL, middleware.Chain(api.CreateComponents, middleware.Method("POST"), middleware.Authenticated(), middleware.Logging()))
|
|
|
|
|
router.HandleFunc(baseAPIURL+apiVersion+url.ComponentURL, middleware.Chain(api.UpdateComponent, middleware.Method("PUT"), middleware.Authenticated(), middleware.Logging()))
|
2019-02-26 17:06:21 +00:00
|
|
|
|
|
|
|
|
// Page CRUD Endpoints
|
|
|
|
|
|
|
|
|
|
// Query CRUD Endpoints
|
2019-03-16 10:17:47 +00:00
|
|
|
router.HandleFunc(baseAPIURL+apiVersion+url.QueryURL+"/execute", middleware.Chain(api.PostQuery, middleware.Method("POST"), middleware.Authenticated(), middleware.Logging()))
|
|
|
|
|
router.HandleFunc(baseAPIURL+apiVersion+url.QueryURL, middleware.Chain(api.CreateQuery, middleware.Method("POST"), middleware.Authenticated(), middleware.Logging()))
|
|
|
|
|
router.HandleFunc(baseAPIURL+apiVersion+url.QueryURL, middleware.Chain(api.UpdateQuery, middleware.Method("PUT"), middleware.Authenticated(), middleware.Logging()))
|
|
|
|
|
|
2019-02-27 19:16:17 +00:00
|
|
|
return router
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func initializeDatastore() {
|
|
|
|
|
var err error
|
|
|
|
|
dialect := viper.GetString("datastore.dialect")
|
|
|
|
|
storage.StorageEngine, err = storage.CreateDatastore(dialect)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(fmt.Errorf("Exception while creating datastore"))
|
|
|
|
|
}
|
2019-02-27 19:05:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func parseConfig() {
|
|
|
|
|
viper.AddConfigPath(".")
|
2019-02-22 03:18:08 +00:00
|
|
|
|
2019-02-27 19:05:50 +00:00
|
|
|
err := viper.ReadInConfig()
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(fmt.Errorf("Fatal error while reading config file: %s", err))
|
|
|
|
|
}
|
2019-03-16 10:17:47 +00:00
|
|
|
if viper.IsSet("auth.sessionSecret") {
|
|
|
|
|
log.Printf("Setting the session secret to %s", viper.GetString("auth.sessionSecret"))
|
|
|
|
|
os.Setenv("SESSION_SECRET", viper.GetString("auth.sessionSecret"))
|
|
|
|
|
} else {
|
|
|
|
|
os.Setenv("SESSION_SECRET", "123abc")
|
|
|
|
|
}
|
2019-02-22 03:18:08 +00:00
|
|
|
}
|
2019-02-27 16:35:03 +00:00
|
|
|
|
|
|
|
|
func runMigrations() {
|
|
|
|
|
storage.StorageEngine.GetDatastore().AutoMigrate(
|
|
|
|
|
&models.Component{},
|
|
|
|
|
&models.Account{},
|
|
|
|
|
&models.User{},
|
|
|
|
|
&models.Role{},
|
|
|
|
|
&models.Page{},
|
2019-02-28 04:11:35 +00:00
|
|
|
&models.Query{},
|
2019-02-27 16:35:03 +00:00
|
|
|
)
|
|
|
|
|
log.Println("Successfully run all migrations")
|
|
|
|
|
}
|