|
@@ -9,20 +9,11 @@ import (
|
|
cache "git.dmitriygnatenko.ru/dima/go-common/cache/ttl_memory_cache"
|
|
cache "git.dmitriygnatenko.ru/dima/go-common/cache/ttl_memory_cache"
|
|
"git.dmitriygnatenko.ru/dima/go-common/db"
|
|
"git.dmitriygnatenko.ru/dima/go-common/db"
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/gofiber/fiber/v2"
|
|
- "github.com/gofiber/fiber/v2/middleware/basicauth"
|
|
|
|
- "github.com/gofiber/fiber/v2/middleware/cors"
|
|
|
|
- "github.com/gofiber/fiber/v2/middleware/limiter"
|
|
|
|
- "github.com/gofiber/fiber/v2/middleware/monitor"
|
|
|
|
- "github.com/gofiber/fiber/v2/middleware/recover"
|
|
|
|
- jwt "github.com/gofiber/jwt/v3"
|
|
|
|
"github.com/gofiber/template/html/v2"
|
|
"github.com/gofiber/template/html/v2"
|
|
|
|
|
|
- "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/middleware/language"
|
|
|
|
"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/repositories"
|
|
"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/repositories"
|
|
"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/auth"
|
|
"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/auth"
|
|
"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/config"
|
|
"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/config"
|
|
- "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/handler"
|
|
|
|
- adminHandler "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/handler/admin"
|
|
|
|
"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/i18n"
|
|
"git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/i18n"
|
|
)
|
|
)
|
|
|
|
|
|
@@ -47,145 +38,15 @@ type ServiceProvider interface {
|
|
func Init(sp ServiceProvider) (*fiber.App, error) {
|
|
func Init(sp ServiceProvider) (*fiber.App, error) {
|
|
fiberApp := fiber.New(getConfig(sp))
|
|
fiberApp := fiber.New(getConfig(sp))
|
|
|
|
|
|
- // Configure web root
|
|
|
|
- fiberApp.Static("/", staticPath)
|
|
|
|
|
|
+ initStatic(fiberApp)
|
|
|
|
|
|
- // Configure CORS middleware
|
|
|
|
- fiberApp.Use(cors.New(getCORSConfig(sp)))
|
|
|
|
|
|
+ initMiddleware(fiberApp, sp)
|
|
|
|
|
|
- // Configure recover middleware
|
|
|
|
- fiberApp.Use(recover.New())
|
|
|
|
|
|
+ initMetrics(fiberApp, sp)
|
|
|
|
|
|
- // Configure language middleware
|
|
|
|
- fiberApp.Use(language.New())
|
|
|
|
|
|
+ initPublicHandlers(fiberApp, sp)
|
|
|
|
|
|
- // Configure JWT auth
|
|
|
|
- jwtAuth := jwt.New(getJWTConfig(sp))
|
|
|
|
-
|
|
|
|
- // Configure Basic auth
|
|
|
|
- basicAuth := basicauth.New(basicauth.Config{
|
|
|
|
- Users: map[string]string{
|
|
|
|
- sp.ConfigService().BasicAuthUser(): sp.ConfigService().BasicAuthPassword(),
|
|
|
|
- },
|
|
|
|
- })
|
|
|
|
-
|
|
|
|
- // Metrics
|
|
|
|
- fiberApp.Get(metricsURI, basicAuth, monitor.New(getMetricsConfig()))
|
|
|
|
-
|
|
|
|
- // Public handlers
|
|
|
|
- fiberApp.Get(
|
|
|
|
- "/",
|
|
|
|
- handler.MainPageHandler(
|
|
|
|
- sp.CacheService(),
|
|
|
|
- sp.ArticleRepository(),
|
|
|
|
- ),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- fiberApp.Get(
|
|
|
|
- "/tag/:tag", handler.TagHandler(
|
|
|
|
- sp.CacheService(),
|
|
|
|
- sp.ArticleRepository(),
|
|
|
|
- sp.TagRepository(),
|
|
|
|
- ),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- fiberApp.Get(
|
|
|
|
- "/article/:article",
|
|
|
|
- handler.ArticleHandler(
|
|
|
|
- sp.CacheService(),
|
|
|
|
- sp.ArticleRepository(),
|
|
|
|
- sp.TagRepository(),
|
|
|
|
- ),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- // Protected handlers
|
|
|
|
- admin := fiberApp.Group("/admin", jwtAuth)
|
|
|
|
-
|
|
|
|
- admin.Get(
|
|
|
|
- "/",
|
|
|
|
- adminHandler.ArticleHandler(sp.ArticleRepository()),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- admin.All("/login", limiter.New(limiter.Config{
|
|
|
|
- Max: int(sp.ConfigService().LoginRateLimiterMaxRequests()),
|
|
|
|
- Expiration: sp.ConfigService().LoginRateLimiterExpiration(),
|
|
|
|
- }), adminHandler.LoginHandler(
|
|
|
|
- sp.ConfigService(),
|
|
|
|
- sp.AuthService(),
|
|
|
|
- sp.UserRepository(),
|
|
|
|
- ))
|
|
|
|
-
|
|
|
|
- admin.All(
|
|
|
|
- "/logout",
|
|
|
|
- adminHandler.LogoutHandler(sp.ConfigService()),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- admin.All(
|
|
|
|
- "/user/change-password",
|
|
|
|
- adminHandler.ChangePassword(
|
|
|
|
- sp.AuthService(),
|
|
|
|
- sp.UserRepository(),
|
|
|
|
- ),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- admin.All(
|
|
|
|
- "/article/add",
|
|
|
|
- adminHandler.AddArticleHandler(
|
|
|
|
- sp.TransactionManager(),
|
|
|
|
- sp.ArticleRepository(),
|
|
|
|
- sp.TagRepository(),
|
|
|
|
- sp.ArticleTagRepository(),
|
|
|
|
- ),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- admin.All(
|
|
|
|
- "/article/edit/:id<int>",
|
|
|
|
- adminHandler.EditArticleHandler(
|
|
|
|
- sp.TransactionManager(),
|
|
|
|
- sp.ArticleRepository(),
|
|
|
|
- sp.TagRepository(),
|
|
|
|
- sp.ArticleTagRepository(),
|
|
|
|
- sp.CacheService(),
|
|
|
|
- ),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- admin.All(
|
|
|
|
- "/article/delete/:id<int>",
|
|
|
|
- adminHandler.DeleteArticleHandler(
|
|
|
|
- sp.TransactionManager(),
|
|
|
|
- sp.ArticleRepository(),
|
|
|
|
- sp.ArticleTagRepository(),
|
|
|
|
- sp.CacheService(),
|
|
|
|
- ),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- admin.Get(
|
|
|
|
- "/tag",
|
|
|
|
- adminHandler.TagHandler(sp.TagRepository()),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- admin.All(
|
|
|
|
- "/tag/add",
|
|
|
|
- adminHandler.AddTagHandler(
|
|
|
|
- sp.TagRepository(),
|
|
|
|
- ),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- admin.All(
|
|
|
|
- "/tag/edit/:id<int>",
|
|
|
|
- adminHandler.EditTagHandler(
|
|
|
|
- sp.TagRepository(),
|
|
|
|
- sp.CacheService(),
|
|
|
|
- ),
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- admin.All(
|
|
|
|
- "/tag/delete/:id<int>",
|
|
|
|
- adminHandler.DeleteTagHandler(
|
|
|
|
- sp.TagRepository(),
|
|
|
|
- sp.CacheService(),
|
|
|
|
- ),
|
|
|
|
- )
|
|
|
|
|
|
+ initAdminHandlers(fiberApp, sp)
|
|
|
|
|
|
return fiberApp, nil
|
|
return fiberApp, nil
|
|
}
|
|
}
|
|
@@ -199,45 +60,6 @@ func getConfig(sp ServiceProvider) fiber.Config {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-// nolint
|
|
|
|
-func getJWTConfig(sp ServiceProvider) jwt.Config {
|
|
|
|
- return jwt.Config{
|
|
|
|
- SigningKey: []byte(sp.ConfigService().JWTSecretKey()),
|
|
|
|
- TokenLookup: "cookie:" + sp.ConfigService().JWTCookie(),
|
|
|
|
- ErrorHandler: func(fctx *fiber.Ctx, err error) error {
|
|
|
|
- return fctx.Redirect("/admin/login")
|
|
|
|
- },
|
|
|
|
- Filter: func(fctx *fiber.Ctx) bool {
|
|
|
|
- method := fctx.Method()
|
|
|
|
- path := fctx.Path()
|
|
|
|
-
|
|
|
|
- if method != fiber.MethodGet && method != fiber.MethodPost &&
|
|
|
|
- method != fiber.MethodPut && method != fiber.MethodDelete {
|
|
|
|
- return true
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if path == "/admin/login" {
|
|
|
|
- return true
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return false
|
|
|
|
- },
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-func getMetricsConfig() monitor.Config {
|
|
|
|
- return monitor.Config{
|
|
|
|
- Title: "dmitriygnatenko.ru metrics",
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-func getCORSConfig(sp ServiceProvider) cors.Config {
|
|
|
|
- return cors.Config{
|
|
|
|
- AllowOrigins: sp.ConfigService().CORSAllowOrigins(),
|
|
|
|
- AllowMethods: sp.ConfigService().CORSAllowMethods(),
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
func getViewsEngine(sp ServiceProvider) *html.Engine {
|
|
func getViewsEngine(sp ServiceProvider) *html.Engine {
|
|
engine := html.New(templatesPath, ".html")
|
|
engine := html.New(templatesPath, ".html")
|
|
|
|
|