heruvym/app/app.go

245 lines
5.6 KiB
Go

package app
import (
"context"
"errors"
"fmt"
"heruvym/dal/minio"
"heruvym/dal/mongo"
"heruvym/middleware"
"heruvym/router"
"heruvym/service"
"heruvym/tools"
"net/http"
"time"
rAL "bitbucket.org/skeris/profile/dal"
"github.com/skeris/appInit"
tb "gopkg.in/tucnak/telebot.v2"
"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"`
MinioEndpoint string `env:"BB_MINIO_EP" default:"minio:9001"`
MinioAccessKey string `env:"BB_MINIO_AK" default:"minio"`
MinioSecretKey string `env:"BB_MINIO_SK" default:"miniostorage"`
MinioToken string `env:"BB_MINIO_TOKEN" default:""`
MongoDbTable string `env:"DATABASE_TABLE" default:"profile"`
MongoCollections string `env:"COLLECTION_NAME" default:"profile,role"`
}
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{}, ver appInit.Version) (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.NewProduction(zapOptions...)
if err != nil {
return nil, err
}
} else {
zapLogger, err = zap.NewDevelopment(zapOptions...)
if err != nil {
return nil, err
}
}
zapLogger = zapLogger.With(
zap.String("SvcCommit", ver.Commit),
zap.String("SvcVersion", ver.Release),
zap.String("SvcBuildTime", ver.BuildTime),
)
fmt.Println("logger")
logger := hlog.New(zapLogger)
logger.Emit(InfoSvcStarted{})
database, err := mongo.New(
ctx,
options.MongoURI,
"support",
logger,
)
if err != nil {
return nil, err
}
fmt.Println("mongoconnnnnnn")
connRoles, err := rAL.ConnectToDb(ctx, logger, rAL.MongoDbOptions{
DalName: "MongoDB",
URI: options.MongoURI,
DbTable: options.MongoDbTable,
Collections: options.MongoCollections,
})
fmt.Println("mongod")
blobStore, err := minio.New(
ctx,
logger,
options.MinioEndpoint,
options.MinioAccessKey,
options.MinioSecretKey,
options.MinioToken,
false)
if err != nil {
fmt.Println("MINIO store", err)
return nil, err
}
fmt.Println("miniod")
newBot, err := tb.NewBot(tb.Settings{
Token: "5240336345:AAG6ZXm6IYqsIZn7SoJTltJWviOXhVa4D0c",
Verbose: false,
ParseMode: tb.ModeHTML,
Poller: &tb.LongPoller{
Timeout: time.Second,
},
})
if err != nil {
//logger.Emit(json.Token(err))
return nil, err
}
heruvym := service.New(blobStore, database, connRoles, logger, newBot)
mux := router.NewRouter(map[string]http.HandlerFunc{
"/support/create": heruvym.CreateTicket,
"/support/subscribe": tools.SseWrapper(heruvym.GetList),
"/support/ticket": tools.SseWrapper(heruvym.Subscribe),
"/support/send": tools.HandlerWrapper(heruvym.PutMessage),
"/support/requestScreenshot": tools.HandlerWrapper(heruvym.RequestScreenshot),
"/support/sendFiles": heruvym.PutFile,
"/support/sendSC": heruvym.PutSC,
"/support/getTickets": tools.HandlerWrapper(heruvym.GetTickets),
"/support/getMessages": tools.HandlerWrapper(heruvym.GetMessages),
"/support/pick": tools.HandlerWrapper(heruvym.Pick),
"/support/delegate": tools.HandlerWrapper(heruvym.Delegate),
"/support/vote": tools.HandlerWrapper(heruvym.Vote),
"/support/close": tools.HandlerWrapper(heruvym.CloseTicket),
})
mw := middleware.NewMiddleware(
logger,
nil,
"*",
nil,
)
mux.Use(
func(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Credentials", "true")
w.Header().Set("Access-Control-Allow-Headers", "*")
w.Header().Set("Access-Control-Expose-Headers", "*")
if r.Method == http.MethodOptions {
return
}
handler.ServeHTTP(w, r)
})
},
mw.MiddlewareLogger,
mw.MiddlewareOriginAccess,
mw.MiddlewareRecovery,
mw.MiddlewareJwt,
mw.MiddlewareGetJwt,
//mw.MiddlewareJwtPlug,
//mw.MiddlewareRoleAccess,
)
fmt.Println("mux")
server := &http.Server{
Handler: mux,
Addr: fmt.Sprintf(":%s", options.NumberPortLocal),
}
go func() {
defer func() {
if err := server.Shutdown(ctx); err != nil {
errChan <- err
}
}()
logger.Emit(InfoSvcStarted{})
tmplKey := "%s.key"
tmplCrt := "%s.crt"
tmplCrt = fmt.Sprintf(tmplCrt, "prod")
tmplKey = fmt.Sprintf(tmplKey, "prod")
fmt.Println("ISPROd", options.LoggerDevMode)
if options.LoggerDevMode {
if err := server.ListenAndServeTLS(tmplCrt, tmplKey); err != nil {
logger.Emit(ErrorCanNotServe{
Err: err,
})
errChan <- err
}
} else {
fmt.Println("startserver")
if err := server.ListenAndServe(); err != nil {
errChan <- 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
}