2022-07-28 15:00:43 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2022-08-11 20:32:10 +00:00
|
|
|
"fmt"
|
2022-09-15 13:53:55 +00:00
|
|
|
"github.com/Pena-Co-Ltd/amocrm_templategen_back/amo"
|
|
|
|
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal"
|
|
|
|
GDisk "github.com/Pena-Co-Ltd/amocrm_templategen_back/gdisk"
|
|
|
|
"github.com/Pena-Co-Ltd/amocrm_templategen_back/handlers"
|
|
|
|
"github.com/Pena-Co-Ltd/amocrm_templategen_back/middleware"
|
|
|
|
YaDisk "github.com/Pena-Co-Ltd/amocrm_templategen_back/yadisk"
|
2022-07-28 15:00:43 +00:00
|
|
|
"github.com/gorilla/mux"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"go.uber.org/zap/zapcore"
|
|
|
|
"log"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
"os/signal"
|
|
|
|
"syscall"
|
|
|
|
)
|
|
|
|
|
2022-08-11 20:32:10 +00:00
|
|
|
type Env struct {
|
|
|
|
Domain string `env:"DOMAIN" default:"solweb.site"`
|
|
|
|
LogFile string `env:"LOG_FILE" default:"./tmp/logs.log"`
|
|
|
|
MongoUrl string `env:"MONGO_URL" default:"mongodb+srv://user_1:cEDxC8ptLMMeoA5m@cluster0.aomle.mongodb.net/templategen"`
|
|
|
|
DbName string `env:"DB_NAME" default:"templategen"`
|
|
|
|
YaDiskClientID string `env:"YADISK_CLIENT_ID" default:"94482c181e5148c096ae6ad3b2a981ea"`
|
|
|
|
YaDiskClientSecret string `env:"YADISK_CLIENT_SECRET" default:"7dc4f541c3f64f4a9078e59d7494d222"`
|
|
|
|
GDiskCredentials string `env:"GDISK_CREDENTIALS" default:"./static/gdisk-credentials.json"`
|
|
|
|
AmoClientID string `env:"AMO_CLIENT_ID" default:"2fc35b41-f446-4ebb-95cb-b00c55d2f810"`
|
2022-11-21 18:32:00 +00:00
|
|
|
AmoClientSecret string `env:"AMO_CLIENT_SECRET" default:"fya5ET2UJRZF3hG4bugUGz3tRmdvFfWYzJIDwBXl2xx4rLbkPdPXvo03e5BUPwJp"`
|
2022-10-21 20:38:31 +00:00
|
|
|
AmoRedirectUrn string `env:"AMO_REDIRECT_URN" default:"/settings/widgets/aspqi3rpwdesqqg5lzdrluwtuwlnzslve629xdpu/"`
|
2022-08-11 20:32:10 +00:00
|
|
|
}
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
func main() {
|
2022-09-15 13:53:55 +00:00
|
|
|
opts := GetOpts()
|
2022-08-11 20:32:10 +00:00
|
|
|
fmt.Printf("OPTIONS: %+v \r\n", opts)
|
2022-07-28 15:00:43 +00:00
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
|
|
|
|
// Logger
|
|
|
|
cfgLogger := zap.NewDevelopmentConfig()
|
|
|
|
cfgLogger.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
|
2022-08-10 13:53:34 +00:00
|
|
|
cfgLogger.EncoderConfig.ConsoleSeparator = " "
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
logger, err := cfgLogger.Build()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Start Data Access Layer
|
|
|
|
|
2022-08-11 20:32:10 +00:00
|
|
|
mongoDal, err := dal.InitMongoDAL(ctx, opts.MongoUrl, opts.DbName, logger)
|
2022-07-28 15:00:43 +00:00
|
|
|
defer mongoDal.Disconnect()
|
|
|
|
if err != nil {
|
|
|
|
logger.Fatal("ErrorConnectToDAL", zap.Error(err))
|
|
|
|
}
|
|
|
|
|
|
|
|
// Yandex Disk
|
2022-08-11 20:32:10 +00:00
|
|
|
yaDisk := YaDisk.NewClientApp(
|
|
|
|
opts.YaDiskClientID,
|
|
|
|
opts.YaDiskClientSecret,
|
2022-09-15 13:53:55 +00:00
|
|
|
fmt.Sprintf("https://%v/yadisk", opts.Domain),
|
|
|
|
fmt.Sprintf("https://%v", opts.Domain),
|
|
|
|
)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
2022-08-11 20:32:10 +00:00
|
|
|
// Google Drive
|
|
|
|
gDisk, err := GDisk.NewClientApp(opts.GDiskCredentials)
|
2022-07-28 15:00:43 +00:00
|
|
|
if err != nil {
|
|
|
|
log.Fatal("ErrorCreateGoogleDriveClientApp:", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Amo
|
|
|
|
amoApp := amo.NewClientApp(
|
2022-08-11 20:32:10 +00:00
|
|
|
opts.AmoClientID,
|
2022-09-15 13:53:55 +00:00
|
|
|
opts.AmoClientSecret,
|
2022-08-11 20:32:10 +00:00
|
|
|
fmt.Sprintf("https://%v/amo", opts.Domain))
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
// Handlers
|
|
|
|
h := handlers.NewHandlers(mongoDal, yaDisk, gDisk, amoApp, logger)
|
|
|
|
|
|
|
|
r := mux.NewRouter()
|
|
|
|
// Add Assets
|
|
|
|
fs := http.FileServer(http.Dir("assets"))
|
|
|
|
|
|
|
|
r.PathPrefix("/assets/").Handler(http.StripPrefix("/assets/", fs))
|
2022-09-15 13:53:55 +00:00
|
|
|
r.PathPrefix("/tmp/generated/").Handler(http.StripPrefix("/tmp/generated/",
|
|
|
|
http.FileServer(http.Dir("tmp/generated"))))
|
2022-07-28 15:00:43 +00:00
|
|
|
r.PathPrefix("/.well-known/pki-validation/").Handler(http.StripPrefix("/.well-known/pki-validation/", http.FileServer(http.Dir(".well-known/pki-validation"))))
|
2022-08-10 13:53:34 +00:00
|
|
|
r.PathPrefix("/.well-known/acme-challenge/").Handler(http.StripPrefix("/.well-known/acme-challenge/",
|
|
|
|
http.FileServer(http.Dir(".well-known/acme-challenge"))))
|
2022-07-28 15:00:43 +00:00
|
|
|
|
2022-08-11 20:32:10 +00:00
|
|
|
//# region ====== HANDLERS ======
|
2022-07-28 15:00:43 +00:00
|
|
|
r.NotFoundHandler = http.HandlerFunc(h.PageNotFound)
|
|
|
|
|
2022-08-10 13:53:34 +00:00
|
|
|
r.HandleFunc("/amo", h.AmoSaveToken)
|
2022-10-21 20:38:31 +00:00
|
|
|
r.HandleFunc("/amo/state", func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
h.AmoState(w, r, opts.AmoRedirectUrn)
|
|
|
|
})
|
2022-08-22 04:23:47 +00:00
|
|
|
r.HandleFunc("/amo/access_rules", h.AmoAccessRules)
|
|
|
|
|
2022-11-19 13:24:30 +00:00
|
|
|
//r.HandleFunc("/amo/webhook", h.GeneratorByAmoWebhook)
|
|
|
|
//r.HandleFunc("/amo/generateDoc", h.GeneratorByAmoLead)
|
|
|
|
|
2022-08-22 04:23:47 +00:00
|
|
|
// Set rules for Amo end-points
|
|
|
|
amoAccess := map[string]string{
|
|
|
|
"/amo/webhook": "visibility",
|
|
|
|
"/amo/generateDoc": "creation",
|
|
|
|
}
|
2022-07-28 15:00:43 +00:00
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
r.HandleFunc("/yadisk", h.YaDiskSaveToken)
|
|
|
|
r.HandleFunc("/yadisk/setSettings", h.YaDiskSetSettings)
|
2022-09-15 13:53:55 +00:00
|
|
|
r.HandleFunc("/yadisk/getList", h.YaDiskGetList)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
r.HandleFunc("/yadisk/resources/get", h.YaDiskGetResources)
|
|
|
|
r.HandleFunc("/yadisk/resources/put", h.YaDiskPutResources)
|
|
|
|
r.HandleFunc("/yadisk/resources/delete", h.YaDiskDeleteResources)
|
|
|
|
|
2022-11-12 10:24:48 +00:00
|
|
|
r.HandleFunc("/gdisk/getTemplateDir", h.GDiskGetDirTemplate) // устарело?
|
2022-10-11 10:07:29 +00:00
|
|
|
r.HandleFunc("/gdisk", h.GDiskSaveToken)
|
|
|
|
r.HandleFunc("/gdisk/setSettings", h.GDiskSetSettings)
|
2022-09-15 14:39:16 +00:00
|
|
|
r.HandleFunc("/gdisk/getList", h.GDiskGetList)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
r.HandleFunc("/gdisk/resources/get", h.GDiskGetResources)
|
|
|
|
r.HandleFunc("/gdisk/resources/put", h.GDiskPutResources)
|
|
|
|
r.HandleFunc("/gdisk/resources/delete", h.GDiskDeleteResources)
|
|
|
|
|
2022-11-12 10:24:48 +00:00
|
|
|
r.HandleFunc("/template/set", h.TemplateSet)
|
|
|
|
r.HandleFunc("/template/get", h.TemplateGet)
|
2022-07-28 15:00:43 +00:00
|
|
|
r.HandleFunc("/template/getListByUser", h.TemplateGetListByUser)
|
2022-11-12 10:24:48 +00:00
|
|
|
r.HandleFunc("/template/getListByGroup", h.TemplateGetListByGroup)
|
2022-07-28 15:00:43 +00:00
|
|
|
r.HandleFunc("/template/update", h.TemplateUpdate)
|
|
|
|
r.HandleFunc("/template/delete", h.TemplateDelete)
|
2022-11-19 13:24:30 +00:00
|
|
|
r.HandleFunc("/template/init", h.TemplateInit) // устарело
|
2022-07-28 15:00:43 +00:00
|
|
|
|
2022-11-12 10:24:48 +00:00
|
|
|
r.HandleFunc("/group/create", h.TemplateGroupCreate)
|
|
|
|
r.HandleFunc("/group/getList", h.TemplateGroupGetList)
|
|
|
|
r.HandleFunc("/group/edit", h.TemplateGroupEdit)
|
|
|
|
r.HandleFunc("/group/put", h.TemplateGroupPut)
|
|
|
|
r.HandleFunc("/group/remove", h.TemplateGroupRemove)
|
|
|
|
r.HandleFunc("/group/delete", h.TemplateGroupDelete)
|
|
|
|
r.HandleFunc("/group/{id}", h.TemplateGroupGet)
|
|
|
|
|
|
|
|
r.HandleFunc("/generator/byAmoLead", h.GeneratorByAmoLead)
|
|
|
|
r.HandleFunc("/generator/byData", h.GeneratorByData)
|
|
|
|
r.HandleFunc("/generator/byTemplate", h.GeneratorByData)
|
|
|
|
r.HandleFunc("/generator/byAmoWebhook", h.GeneratorByAmoWebhook)
|
|
|
|
|
2022-08-11 20:32:10 +00:00
|
|
|
//#endregion
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
// Middlewares
|
2022-08-22 04:23:47 +00:00
|
|
|
mw := middleware.InitMiddleware(mongoDal, amoApp, logger, amoAccess)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
r.Use(
|
2022-08-10 13:53:34 +00:00
|
|
|
mw.MiddlewareHeaders,
|
|
|
|
mw.MiddlewareCors,
|
2022-10-11 10:07:29 +00:00
|
|
|
// mw.MiddlewareJwt, TODO: Переделать под Пеновский сервис авторизации
|
2022-08-10 13:53:34 +00:00
|
|
|
mw.MiddlewareAmoJwt,
|
2022-11-12 10:24:48 +00:00
|
|
|
mw.MiddlewareAmoPlug,
|
2022-07-28 15:00:43 +00:00
|
|
|
mw.Logger,
|
|
|
|
)
|
|
|
|
|
|
|
|
r.NotFoundHandler = r.NewRoute().HandlerFunc(h.PageNotFound).GetHandler()
|
|
|
|
|
|
|
|
srv := http.Server{
|
|
|
|
Handler: r,
|
|
|
|
}
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
err := srv.ListenAndServe()
|
|
|
|
if err != nil {
|
|
|
|
logger.Fatal("CanNotServe", zap.Error(err))
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
2022-08-10 13:53:34 +00:00
|
|
|
// TLS
|
|
|
|
|
2022-08-22 04:23:47 +00:00
|
|
|
fullCert := fmt.Sprintf("./static/cert/%v/fullchain.pem", opts.Domain)
|
|
|
|
privCert := fmt.Sprintf("./static/cert/%v/privkey.pem", opts.Domain)
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
go func() {
|
2022-08-22 04:23:47 +00:00
|
|
|
err := srv.ListenAndServeTLS(fullCert, privCert)
|
2022-07-28 15:00:43 +00:00
|
|
|
if err != nil {
|
|
|
|
logger.Fatal("CanNotServe", zap.Error(err))
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
// Graceful Shutdown
|
|
|
|
interrupt := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM)
|
|
|
|
killSignal := <-interrupt
|
|
|
|
switch killSignal {
|
|
|
|
case os.Interrupt:
|
|
|
|
logger.Fatal("AppInterrupted")
|
|
|
|
case syscall.SIGTERM:
|
|
|
|
logger.Fatal("AppTerminated")
|
|
|
|
}
|
|
|
|
|
|
|
|
defer cancel()
|
|
|
|
}
|
2022-09-15 13:53:55 +00:00
|
|
|
|
|
|
|
func GetOpts() Env {
|
|
|
|
return getEnv(Env{})
|
|
|
|
}
|