Files
openaccounting-server/core/server.go

120 lines
3.3 KiB
Go
Raw Normal View History

2018-10-19 15:31:41 -04:00
package main
import (
"fmt"
"log"
"net/http"
"strconv"
2018-10-19 15:31:41 -04:00
"github.com/openaccounting/oa-server/core/api"
"github.com/openaccounting/oa-server/core/auth"
"github.com/openaccounting/oa-server/core/model"
"github.com/openaccounting/oa-server/core/model/types"
"github.com/openaccounting/oa-server/core/repository"
2018-10-19 15:31:41 -04:00
"github.com/openaccounting/oa-server/core/util"
"github.com/openaccounting/oa-server/database"
"github.com/spf13/viper"
2018-10-19 15:31:41 -04:00
)
func main() {
// Initialize Viper configuration
2018-10-19 15:31:41 -04:00
var config types.Config
// Set config file properties
viper.SetConfigName("config")
viper.SetConfigType("json")
viper.AddConfigPath(".")
viper.AddConfigPath("/etc/openaccounting/")
viper.AddConfigPath("$HOME/.openaccounting")
// Enable environment variables
viper.AutomaticEnv()
viper.SetEnvPrefix("OA") // will look for OA_DATABASE_PASSWORD, etc.
// Set default values
viper.SetDefault("Address", "localhost")
viper.SetDefault("Port", 8080)
viper.SetDefault("DatabaseDriver", "sqlite")
viper.SetDefault("DatabaseFile", "./openaccounting.db")
viper.SetDefault("ApiPrefix", "/api/v1")
// Read configuration
err := viper.ReadInConfig()
if err != nil {
log.Printf("Warning: Could not read config file: %v", err)
log.Println("Using environment variables and defaults")
}
// Unmarshal config into struct
err = viper.Unmarshal(&config)
2018-10-19 15:31:41 -04:00
if err != nil {
log.Fatal(fmt.Errorf("failed to unmarshal config: %s", err.Error()))
2018-10-19 15:31:41 -04:00
}
// Parse database address (assuming format host:port for MySQL)
host := config.DatabaseAddress
port := "3306"
if len(config.DatabaseAddress) > 0 {
// If there's a colon, split host and port
if colonIndex := len(config.DatabaseAddress); colonIndex > 0 {
host = config.DatabaseAddress
}
}
2018-10-19 15:31:41 -04:00
// Default to SQLite if no driver specified
driver := config.DatabaseDriver
if driver == "" {
driver = "sqlite"
2018-10-19 15:31:41 -04:00
}
// Initialize GORM database
dbConfig := &database.Config{
Driver: driver,
Host: host,
Port: port,
User: config.User,
Password: config.Password,
DBName: config.Database,
File: config.DatabaseFile,
SSLMode: "disable", // Adjust as needed
}
2018-10-19 15:31:41 -04:00
err = database.Connect(dbConfig)
if err != nil {
log.Fatal(fmt.Errorf("failed to connect to database with: %s", err.Error()))
}
2018-10-19 15:31:41 -04:00
// Run migrations
err = database.AutoMigrate()
if err != nil {
log.Fatal(fmt.Errorf("failed to run migrations: %s", err.Error()))
}
err = database.Migrate()
if err != nil {
log.Fatal(fmt.Errorf("failed to run custom migrations: %s", err.Error()))
}
2018-10-19 15:31:41 -04:00
bc := &util.StandardBcrypt{}
// Create GORM repository and models
gormRepo := repository.NewGormRepository(database.DB)
gormModel := model.NewGormModel(database.DB, bc, config)
auth.NewGormAuthService(gormRepo, bc)
// Set the global model instance
model.Instance = gormModel
2018-10-19 15:31:41 -04:00
2018-11-08 11:35:11 -05:00
app, err := api.Init(config.ApiPrefix)
2018-10-19 15:31:41 -04:00
if err != nil {
log.Fatal(fmt.Errorf("failed to create api instance with: %s", err.Error()))
2018-10-19 15:31:41 -04:00
}
if config.CertFile == "" || config.KeyFile == "" {
err = http.ListenAndServe(config.Address+":"+strconv.Itoa(config.Port), app.MakeHandler())
} else {
err = http.ListenAndServeTLS(config.Address+":"+strconv.Itoa(config.Port), config.CertFile, config.KeyFile, app.MakeHandler())
}
log.Fatal(fmt.Errorf("failed to start server with: %s", err.Error()))
2018-10-19 15:31:41 -04:00
}