2024-09-10 22:37:01 +05:00

147 lines
3.4 KiB
Go

package http
import (
"context"
"github.com/labstack/echo/v4"
"github.com/swaggo/echo-swagger"
"log/slog"
"os"
)
import (
"donat-widget/infrastructure/pg"
"donat-widget/infrastructure/weed"
"donat-widget/internal/config"
"donat-widget/internal/model"
"donat-widget/pkg/validator"
)
import (
widgetHandler "donat-widget/internal/api/http/handlers/widget"
widgetService "donat-widget/internal/service/widget"
mediaHandler "donat-widget/internal/api/http/handlers/widget/media"
mediaService "donat-widget/internal/service/widget/media"
donatHandler "donat-widget/internal/api/http/handlers/widget/donat"
donatService "donat-widget/internal/service/widget/donat"
)
type App struct {
Config *config.Config
}
func NewApp() *echo.Echo {
app := &App{}
_ = app.InitLogger()
app.Config = app.InitConfig()
db := app.initDB()
storage := app.InitStorage()
server := InitHTTPServer()
InitHandlers(server, db, storage)
return server
}
func Run(server *echo.Echo) {
server.Logger.Fatal(server.Start(":8002"))
}
func InitHTTPServer() *echo.Echo {
server := echo.New()
server.Validator = validator.NewValidator()
return server
}
func (a *App) InitConfig() *config.Config {
cfg := config.Init()
return cfg
}
func (a *App) InitLogger() *slog.Logger {
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
slog.SetDefault(logger)
return logger
}
func (a *App) InitStorage() *weed.Weed {
storage, err := weed.NewWeed(
a.Config.Storage.Filer,
a.Config.Storage.Master,
)
if err != nil {
panic(err)
}
return storage
}
func (a *App) initDB() *pg.Postgres {
db := pg.NewPgPool(
context.Background(),
a.Config.Db.Username,
a.Config.Db.Password,
a.Config.Db.Host,
a.Config.Db.Port,
a.Config.Db.DBName,
)
return db
}
func InitHandlers(
server *echo.Echo,
db *pg.Postgres,
storage model.Storage,
) {
PREFIX := "/api/widget"
server.GET(PREFIX+"/docs/*", echoSwagger.WrapHandler)
server.GET(PREFIX+"/table/create", CreateTale(db))
server.GET(PREFIX+"/table/drop", DropTale(db))
widgetSvc := widgetService.New(db)
server.GET(PREFIX+"/create", widgetHandler.CreateWidget(widgetSvc))
server.GET(PREFIX+"/html/:widgetID", widgetHandler.GetWidgetHTML(widgetSvc))
server.GET(PREFIX+"/info/:widgetID", widgetHandler.GetWidgetInfo(widgetSvc))
server.GET(PREFIX+"/duration/update", widgetHandler.UpdateDuration(widgetSvc))
mediaSvc := mediaService.New(db, storage)
server.POST(PREFIX+"/media/:mediaType/upload", mediaHandler.SetMediaFile(mediaSvc))
server.GET(PREFIX+"/media/:mediaType/get/:widgetID", mediaHandler.GetMediaFile(mediaSvc))
server.POST(PREFIX+"/media/:mediaType/set", mediaHandler.SetMediaUrl(mediaSvc))
donatSvc := donatService.New(db)
server.POST(PREFIX+"/donat/set", donatHandler.SetDonat(donatSvc))
server.DELETE(PREFIX+"/donat/delete/:donatID", donatHandler.DeleteDonat(donatSvc))
}
func CreateTale(db *pg.Postgres) echo.HandlerFunc {
return func(request echo.Context) error {
ctx := context.Background()
err := db.CreateTable(ctx)
if err != nil {
slog.Error("db.CreateTable: ", err)
return err
}
slog.Info("Create table ok")
return request.String(200, "Create table ok")
}
}
func DropTale(db *pg.Postgres) echo.HandlerFunc {
return func(request echo.Context) error {
ctx := context.Background()
err := db.DropTable(ctx)
if err != nil {
slog.Error("db.DropTable: ", err)
return err
}
slog.Info("Dropped table ok")
return request.String(200, "Dropped table ok")
}
}