Files
mstore/app/server/server.go
T
2026-01-26 18:36:30 +02:00

143 lines
2.5 KiB
Go

package server
import (
//"io/ioutil"
"os"
"os/signal"
"os/user"
//"os/user"
//"path/filepath"
//"strconv"
//"sync"
"syscall"
//"time"
"mstore/app/config"
"mstore/app/handler"
"mstore/app/logger"
"mstore/app/maindb"
"mstore/app/operator"
"mstore/app/service"
)
type Server struct {
conf *config.Config
oper *operator.Operator
svc *service.Service
maindb *maindb.Database
hand *handler.Handler
logg *logger.Logger
}
func NewServer() (*Server, error) {
var err error
srv := &Server{}
srv.logg = logger.NewLogger("server")
return srv, err
}
func (srv *Server) Handler() *handler.Handler {
return srv.hand
}
func (srv *Server) Configure() error {
var err error
srv.logg.Infof("Server configure")
srv.conf, err = config.NewConfig()
if err != nil {
return err
}
return err
}
func (srv *Server) Build() error {
var err error
srv.logg.Infof("Server build")
// Database create
dbdir := srv.conf.Database.Basepath
err = os.MkdirAll(srv.conf.Database.Basepath, 0750)
if err != nil {
return err
}
maindb := maindb.NewDatabase(dbdir)
err = maindb.OpenDatabase()
if err != nil {
return err
}
err = maindb.InitDatabase()
if err != nil {
return err
}
// Operator create
operatorParams := &operator.OperatorParams{
MainDB: srv.maindb,
}
srv.oper, err = operator.NewOperator(operatorParams)
if err != nil {
return err
}
// Handler create
handlerParams := &handler.HandlerParams{
Operator: srv.oper,
}
srv.hand, err = handler.NewHandler(handlerParams)
if err != nil {
return err
}
// Service create
serviceParams := &service.ServiceParams{
Handler: srv.hand,
}
srv.svc, err = service.NewService(serviceParams)
if err != nil {
return err
}
// Service build
err = srv.svc.Build()
if err != nil {
return err
}
return err
}
func (srv *Server) Run() error {
var err error
currUser, err := user.Current()
if err != nil {
return err
}
srv.logg.Infof("Server run as user %s", currUser.Username)
sigs := make(chan os.Signal, 1)
svcDone := make(chan error, 1)
// Service run
startService := func(svc *service.Service, done chan error) {
err = svc.Run()
if err != nil {
srv.logg.Errorf("Service error: %v", err)
done <- err
}
}
go startService(srv.svc, svcDone)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
var signal os.Signal
select {
case signal = <-sigs:
srv.logg.Infof("Services stopped by signal: %v", signal)
srv.svc.Stop()
case err = <-svcDone:
srv.logg.Infof("Service stopped by service error: %v", err)
srv.svc.Stop()
}
return err
}