heruvym/app/app.go

245 lines
5.6 KiB
Go
Raw Normal View History

2021-04-10 18:46:51 +00:00
package app
import (
"context"
"errors"
"fmt"
2021-09-05 15:24:13 +00:00
"heruvym/dal/minio"
"heruvym/dal/mongo"
"heruvym/middleware"
"heruvym/router"
"heruvym/service"
"heruvym/tools"
2021-04-10 18:46:51 +00:00
"net/http"
2022-12-13 10:07:15 +00:00
"time"
2022-11-02 18:52:02 +00:00
rAL "bitbucket.org/skeris/profile/dal"
"github.com/skeris/appInit"
2022-12-13 10:07:15 +00:00
tb "gopkg.in/tucnak/telebot.v2"
2021-04-10 18:46:51 +00:00
"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 {
2022-03-03 18:04:01 +00:00
MongoURI string `env:"BB_MONGO_URI" default:"mongodb://localhost:27017"`
2021-05-01 17:50:03 +00:00
NumberPortLocal string `env:"BB_PORT" default:"1488"`
LoggerDevMode bool `env:"BB_IS_PROD" default:"false"`
2022-03-03 18:04:01 +00:00
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"`
2022-02-27 15:27:44 +00:00
MinioToken string `env:"BB_MINIO_TOKEN" default:""`
2021-05-01 17:50:03 +00:00
MongoDbTable string `env:"DATABASE_TABLE" default:"profile"`
MongoCollections string `env:"COLLECTION_NAME" default:"profile,role"`
2021-04-10 18:46:51 +00:00
}
var (
errInvalidOptions = errors.New("invalid options")
)
var _ appInit.CommonApp = (*App)(nil)
type InfoSvcStarted struct{}
type InfoSvcReady struct{}
2021-05-01 17:50:03 +00:00
type InfoSvcShutdown struct {
2021-04-10 18:46:51 +00:00
Signal string
}
2021-05-01 17:50:03 +00:00
type ErrorStoring struct {
2021-04-10 18:46:51 +00:00
Err error
Uri string
}
2021-05-01 17:50:03 +00:00
type ErrorCanNotServe struct {
2021-04-10 18:46:51 +00:00
Err error
}
var zapOptions = []zap.Option{
zap.AddCaller(),
zap.AddCallerSkip(2),
zap.AddStacktrace(zap.ErrorLevel),
}
2022-12-13 10:07:15 +00:00
func New(ctx context.Context, opts interface{}, ver appInit.Version) (appInit.CommonApp, error) {
2021-04-10 18:46:51 +00:00
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 {
2022-02-27 15:27:44 +00:00
zapLogger, err = zap.NewProduction(zapOptions...)
2021-04-10 18:46:51 +00:00
if err != nil {
return nil, err
}
} else {
2022-02-27 15:27:44 +00:00
zapLogger, err = zap.NewDevelopment(zapOptions...)
2021-04-10 18:46:51 +00:00
if err != nil {
return nil, err
}
}
zapLogger = zapLogger.With(
2022-12-13 10:07:15 +00:00
zap.String("SvcCommit", ver.Commit),
zap.String("SvcVersion", ver.Release),
zap.String("SvcBuildTime", ver.BuildTime),
2021-04-10 18:46:51 +00:00
)
2022-11-02 18:52:02 +00:00
fmt.Println("logger")
2021-05-01 17:50:03 +00:00
logger := hlog.New(zapLogger)
2021-04-10 18:46:51 +00:00
logger.Emit(InfoSvcStarted{})
2021-09-05 15:24:13 +00:00
database, err := mongo.New(
2021-04-11 09:48:15 +00:00
ctx,
options.MongoURI,
"support",
logger,
2021-05-01 17:50:03 +00:00
)
2021-04-11 09:48:15 +00:00
if err != nil {
return nil, err
}
2022-11-02 18:52:02 +00:00
fmt.Println("mongoconnnnnnn")
2021-04-11 09:48:15 +00:00
2021-05-01 17:50:03 +00:00
connRoles, err := rAL.ConnectToDb(ctx, logger, rAL.MongoDbOptions{
2021-09-05 15:24:13 +00:00
DalName: "MongoDB",
URI: options.MongoURI,
DbTable: options.MongoDbTable,
2021-05-02 22:25:12 +00:00
Collections: options.MongoCollections,
2021-05-01 17:50:03 +00:00
})
2022-11-02 18:52:02 +00:00
fmt.Println("mongod")
2021-09-05 15:24:13 +00:00
blobStore, err := minio.New(
ctx,
logger,
options.MinioEndpoint,
options.MinioAccessKey,
options.MinioSecretKey,
options.MinioToken,
2022-02-27 15:27:44 +00:00
false)
2021-09-05 15:24:13 +00:00
if err != nil {
2022-02-27 15:27:44 +00:00
fmt.Println("MINIO store", err)
2021-09-05 15:24:13 +00:00
return nil, err
}
2022-11-02 18:52:02 +00:00
fmt.Println("miniod")
2022-12-13 10:07:15 +00:00
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)
2021-04-10 18:46:51 +00:00
2021-05-15 14:03:10 +00:00
mux := router.NewRouter(map[string]http.HandlerFunc{
2022-02-27 15:27:44 +00:00
"/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,
2022-02-27 15:27:44 +00:00
"/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),
2021-05-15 14:03:10 +00:00
})
mw := middleware.NewMiddleware(
logger,
nil,
"*",
nil,
)
mux.Use(
2021-09-05 15:24:13 +00:00
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)
})
},
2021-05-15 14:03:10 +00:00
mw.MiddlewareLogger,
mw.MiddlewareOriginAccess,
mw.MiddlewareRecovery,
mw.MiddlewareJwt,
mw.MiddlewareGetJwt,
//mw.MiddlewareJwtPlug,
//mw.MiddlewareRoleAccess,
)
2022-11-02 18:52:02 +00:00
fmt.Println("mux")
2021-04-10 18:46:51 +00:00
server := &http.Server{
2021-05-15 14:03:10 +00:00
Handler: mux,
2021-04-10 18:46:51 +00:00
Addr: fmt.Sprintf(":%s", options.NumberPortLocal),
}
go func() {
2022-11-02 18:52:02 +00:00
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
}
2021-04-10 18:46:51 +00:00
}
}()
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
}