124 lines
2.3 KiB
Go
124 lines
2.3 KiB
Go
package server
|
|
|
|
import (
|
|
//"io/ioutil"
|
|
"os"
|
|
"os/signal"
|
|
"os/user"
|
|
//"os/user"
|
|
//"path/filepath"
|
|
//"strconv"
|
|
//"sync"
|
|
"syscall"
|
|
//"time"
|
|
|
|
"mstore/app/database"
|
|
"mstore/app/handler"
|
|
"mstore/app/logger"
|
|
"mstore/app/operator"
|
|
"mstore/app/service"
|
|
)
|
|
|
|
type Server struct {
|
|
oper *operator.Operator
|
|
svc *service.Service
|
|
db *database.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")
|
|
return err
|
|
}
|
|
|
|
func (srv *Server) Build() error {
|
|
var err error
|
|
srv.logg.Infof("Server build")
|
|
// Database create
|
|
databaseParams := &database.DatabaseParams{}
|
|
srv.db, err = database.NewDatabase(databaseParams)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// Operator create
|
|
operatorParams := &operator.OperatorParams{
|
|
Database: srv.db,
|
|
}
|
|
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
|
|
}
|