heruvym/app/app.go

242 lines
5.4 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
"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"`
MinioRegion string `env:"S3_REGION" default:""`
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
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,
options.MinioRegion,
2023-03-04 18:26:11 +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
2022-12-13 20:08:17 +00:00
var newBot *tb.Bot
if options.LoggerDevMode {
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
}
2022-12-13 10:07:15 +00:00
}
2023-03-01 17:38:03 +00:00
heruvym := service.New(blobStore, database, 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{
2023-03-06 10:43:04 +00:00
"/create": heruvym.CreateTicket,
"/subscribe": tools.SseWrapper(heruvym.GetList),
"/ticket": tools.SseWrapper(heruvym.Subscribe),
"/send": tools.HandlerWrapper(heruvym.PutMessage),
"/requestScreenshot": tools.HandlerWrapper(heruvym.RequestScreenshot),
"/sendFiles": heruvym.PutFile,
"/sendSC": heruvym.PutSC,
"/getTickets": tools.HandlerWrapper(heruvym.GetTickets),
"/getMessages": tools.HandlerWrapper(heruvym.GetMessages),
"/pick": tools.HandlerWrapper(heruvym.Pick),
"/delegate": tools.HandlerWrapper(heruvym.Delegate),
"/vote": tools.HandlerWrapper(heruvym.Vote),
"/close": tools.HandlerWrapper(heruvym.CloseTicket),
2021-05-15 14:03:10 +00:00
})
mw := middleware.NewMiddleware(
logger,
"*",
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,
2023-03-01 17:38:03 +00:00
//mw.MiddlewareOriginAccess,
2021-05-15 14:03:10 +00:00
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 {
2022-12-13 20:08:17 +00:00
fmt.Println("startserver" + options.NumberPortLocal)
2022-11-02 18:52:02 +00:00
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
}