heruvym/app/app.go

178 lines
3.3 KiB
Go
Raw Normal View History

2021-04-10 18:46:51 +00:00
package app
import (
2021-04-11 09:48:15 +00:00
"bitbucket.org/BlackBroker/heruvym/dal"
"bitbucket.org/BlackBroker/heruvym/middleware"
"bitbucket.org/BlackBroker/heruvym/service"
2021-04-10 18:46:51 +00:00
"bitbucket.org/BlackBroker/heruvym/version"
"context"
"errors"
"fmt"
"github.com/BlackBroker/trashlog/wrappers/zaptg"
"github.com/skeris/appInit"
2021-04-11 09:48:15 +00:00
"github.com/skeris/authService/router"
2021-04-10 18:46:51 +00:00
"go.uber.org/zap/zapcore"
"net/http"
"os"
"os/signal"
"syscall"
"github.com/themakers/hlog"
"go.uber.org/zap"
)
type App struct {
err chan error
logger *zap.Logger
}
const (
ENV = "env"
DEFAULT = "default"
)
type Options struct {
MongoURI string `env:"BB_MONGO_URI" default:"mongodb://localhost:27017"`
NumberPortLocal string `env:"BB_PORT" default:"1488"`
LoggerDevMode bool `env:"BB_IS_PROD" default:"false"`
}
var (
errInvalidOptions = errors.New("invalid options")
)
var _ appInit.CommonApp = (*App)(nil)
type InfoSvcStarted struct{}
type InfoSvcReady struct{}
type InfoSvcShutdown struct{
Signal string
}
type ErrorStoring struct{
Err error
Uri string
}
type ErrorCanNotServe struct{
Err error
}
var zapOptions = []zap.Option{
zap.AddCaller(),
zap.AddCallerSkip(2),
zap.AddStacktrace(zap.ErrorLevel),
}
func New(ctx context.Context, opts interface{}) (appInit.CommonApp, error) {
var (
err error
zapLogger *zap.Logger
errChan = make(chan error)
options Options
ok bool
)
if options, ok = opts.(Options); !ok {
return App{}, errInvalidOptions
}
if options.LoggerDevMode {
zapLogger, err = zap.NewDevelopment(zapOptions...)
if err != nil {
return nil, err
}
} else {
zapLogger, err = zap.NewProduction(zapOptions...)
if err != nil {
return nil, err
}
}
zapLogger = zapLogger.With(
zap.String("SvcCommit", version.Commit),
zap.String("SvcVersion", version.Release),
zap.String("SvcBuildTime", version.BuildTime),
)
tl, err := zaptg.NewCore(
ctx,
zap.ErrorLevel,
"1408111289:AAHfWZRiBQRncb2gl2LtU8OeASjfJi4e8YE",
version.Release,
version.Commit,
0,
-1001230000451,
)
if err != nil {
panic(err)
}
zapLogger = zapLogger.WithOptions(zap.WrapCore(func(core zapcore.Core) zapcore.Core {
return zapcore.NewTee(core, tl)
}))
logger := hlog.New(zapLogger)
logger.Emit(InfoSvcStarted{})
2021-04-11 09:48:15 +00:00
apiMux := router.NewRouter(http.NewServeMux())
database, err := dal.New(
ctx,
options.MongoURI,
"support",
logger,
)
if err != nil {
return nil, err
}
heruvym := service.New(database, logger)
2021-04-10 18:46:51 +00:00
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM)
server := &http.Server{
2021-04-11 09:48:15 +00:00
Handler: http_middleware.Wrap(heruvym.Register(apiMux), zapLogger),
2021-04-10 18:46:51 +00:00
Addr: fmt.Sprintf(":%s", options.NumberPortLocal),
}
go func() {
killSignal := <-interrupt
switch killSignal {
case os.Interrupt:
logger.Emit(InfoSvcShutdown{
Signal: "Interrupt",
})
case syscall.SIGTERM:
logger.Emit(InfoSvcShutdown{
Signal: "Terminate",
})
}
if err := server.Shutdown(ctx); err != nil {
panic(err)
}
}()
logger.Emit(InfoSvcStarted{})
if err := server.ListenAndServe(); err != nil {
logger.Emit(ErrorCanNotServe{
Err: err,
})
return nil, err
}
return &App{
logger: zapLogger,
err: errChan,
}, nil
}
func (a App) GetLogger() *zap.Logger {
return a.logger
}
func (a App) GetErr() chan error {
return a.err
}