147 lines
3.4 KiB
Go
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")
|
|
}
|
|
}
|