heruvym/app/app.go

268 lines
6.6 KiB
Go
Raw Normal View History

2021-04-10 18:46:51 +00:00
package app
import (
"context"
"errors"
"fmt"
2024-02-21 18:07:40 +00:00
"github.com/go-redis/redis/v8"
2024-02-20 14:23:04 +00:00
"heruvym/dal/minio"
2021-09-05 15:24:13 +00:00
"heruvym/dal/mongo"
2024-09-25 14:22:57 +00:00
"heruvym/internal/utils/middleware"
2021-09-05 15:24:13 +00:00
"heruvym/router"
"heruvym/service"
"heruvym/tools"
2021-04-10 18:46:51 +00:00
"net/http"
2023-05-06 17:20:43 +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"`
AccountAddress string `env:"BB_AccountAddress" default:":8931"`
2021-05-01 17:50:03 +00:00
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"`
2023-04-05 21:10:08 +00:00
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"`
2024-02-13 14:39:01 +00:00
TgToken string `env:"TELEGRAM_TOKEN" default:"5851043588:AAGXhigZAaNV1--n-jfS8eBgM7iZ2IDm668"`
2024-02-21 18:07:40 +00:00
RedisHost string `env:"REDIS_HOST" default:"localhost:6379"`
RedisPassword string `env:"REDIS_PASSWORD" default:""`
RedisDB uint64 `env:"REDIS_DB" default:"0"`
2024-09-25 14:22:57 +00:00
TgChatID uint64 `env:"TELEGRAM_CHAT_ID" default:"1001344671794"`
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
)
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
}
miniostore, err := minio.New(ctx, logger, options.MinioEndpoint, options.MinioAccessKey, options.MinioSecretKey, options.MinioToken, options.MinioRegion, false)
2024-02-20 14:23:04 +00:00
if err != nil {
fmt.Println(err)
return nil, err
}
2024-02-21 18:07:40 +00:00
redisClient := redis.NewClient(&redis.Options{
Addr: options.RedisHost,
Password: options.RedisPassword,
DB: int(options.RedisDB),
})
2022-12-13 20:08:17 +00:00
var newBot *tb.Bot
newBot, err = tb.NewBot(tb.Settings{
2024-02-13 14:39:01 +00:00
Token: options.TgToken,
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
2024-03-03 18:47:49 +00:00
heruvym := service.New(miniostore, database, logger, newBot, -int64(options.TgChatID), redisClient)
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),
"/shown": tools.HandlerWrapper(heruvym.SetShown),
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) {
2023-05-09 11:09:39 +00:00
// w.Header().Set("Access-Control-Allow-Origin", r.Header["Origin"][0])
// w.Header().Set("Access-Control-Allow-Credentials", "true")
// w.Header().Set("Access-Control-Allow-Headers", "content-type")
// w.Header().Set("Access-Control-Expose-Headers", "*")
2021-09-05 15:24:13 +00:00
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,
mw.ExtractHostMiddleware,
2021-05-15 14:03:10 +00:00
)
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),
}
// Account Server
accountService := service.NewAccount(database)
accountServer := NewAccountHTTP(database, zapLogger)
accountServer.Register(accountService.GetRoutes()...)
2021-04-10 18:46:51 +00:00
go func() {
2022-11-02 18:52:02 +00:00
defer func() {
if err := server.Shutdown(ctx); err != nil {
errChan <- err
}
if err := accountServer.Stop(); err != nil {
errChan <- err
}
2022-11-02 18:52:02 +00:00
}()
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
}
go func() {
if err := accountServer.StartTLS(options.AccountAddress, tmplCrt, tmplKey); err != nil {
logger.Emit(ErrorCanNotServe{Err: err})
errChan <- err
}
}()
2022-11-02 18:52:02 +00:00
} 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
}
go func() {
if err := accountServer.Start(options.AccountAddress); err != nil {
logger.Emit(ErrorCanNotServe{Err: err})
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
}