190 lines
3.8 KiB
Go
190 lines
3.8 KiB
Go
package widget
|
|
|
|
import (
|
|
"context"
|
|
"donat-widget/internal/model"
|
|
"donat-widget/internal/model/api"
|
|
"errors"
|
|
"github.com/labstack/echo/v4"
|
|
"log/slog"
|
|
"net/http"
|
|
)
|
|
|
|
func New(
|
|
widgetRepo model.WidgetRepo,
|
|
authClient model.AuthClient,
|
|
) *ServiceWidget {
|
|
return &ServiceWidget{
|
|
widgetRepo: widgetRepo,
|
|
authClient: authClient,
|
|
}
|
|
}
|
|
|
|
type ServiceWidget struct {
|
|
widgetRepo model.WidgetRepo
|
|
authClient model.AuthClient
|
|
}
|
|
|
|
func (widgetService *ServiceWidget) CreateWidget(
|
|
ctx context.Context,
|
|
streamerID model.StreamerID,
|
|
templateID model.TemplateID,
|
|
duration model.Duration,
|
|
minAmount model.DonatAmount,
|
|
) (model.WidgetID, error) {
|
|
widgetID, err := widgetService.widgetRepo.CreateWidget(
|
|
ctx,
|
|
streamerID,
|
|
templateID,
|
|
duration,
|
|
minAmount,
|
|
)
|
|
if err != nil {
|
|
slog.Error(err.Error())
|
|
return 0, err
|
|
}
|
|
return widgetID, nil
|
|
}
|
|
|
|
func (widgetService *ServiceWidget) GetWidgetHTML(
|
|
ctx context.Context,
|
|
streamerID model.StreamerID,
|
|
) (model.WidgetHTML, error) {
|
|
|
|
widgets, err := widgetService.widgetRepo.GetWidgetByStreamerID(ctx, streamerID)
|
|
if err != nil {
|
|
slog.Error(err.Error())
|
|
return "", err
|
|
}
|
|
|
|
if len(widgets) == 0 {
|
|
return "", errors.New("widget not found")
|
|
}
|
|
widget := widgets[0]
|
|
|
|
var widgetHTML model.WidgetHTML
|
|
if widget.TemplateID == 1 {
|
|
widgetHTML = model.GetTemplate1(
|
|
streamerID,
|
|
widget.BackgroundUrl,
|
|
)
|
|
}
|
|
return widgetHTML, nil
|
|
}
|
|
|
|
func (widgetService *ServiceWidget) GetWidgetByID(
|
|
ctx context.Context,
|
|
widgetID model.WidgetID,
|
|
) ([]*model.Widget, error) {
|
|
|
|
widget, err := widgetService.widgetRepo.GetWidgetByID(ctx, widgetID)
|
|
if err != nil {
|
|
slog.Error(err.Error())
|
|
return nil, err
|
|
}
|
|
|
|
return widget, nil
|
|
}
|
|
|
|
func (widgetService *ServiceWidget) SetMediaFile(
|
|
ctx context.Context,
|
|
mediaType model.MediaType,
|
|
widgetID model.WidgetID,
|
|
file model.UploadFile,
|
|
filename string,
|
|
size int64,
|
|
collection string,
|
|
) error {
|
|
fileID, err := widgetService.widgetRepo.SetMediaFile(
|
|
file,
|
|
filename,
|
|
size,
|
|
collection,
|
|
)
|
|
if err != nil {
|
|
slog.Error(err.Error())
|
|
return err
|
|
}
|
|
|
|
err = widgetService.SetMediaUrl(
|
|
ctx,
|
|
mediaType,
|
|
widgetID,
|
|
model.MediaUrl(fileID),
|
|
)
|
|
if err != nil {
|
|
slog.Error(err.Error())
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (widgetService *ServiceWidget) GetMediaFile(
|
|
ctx context.Context,
|
|
widgetID model.WidgetID,
|
|
mediaType model.MediaType,
|
|
) (model.DownloadFile, error) {
|
|
fileID, err := widgetService.widgetRepo.GetMediaUrl(
|
|
ctx,
|
|
widgetID,
|
|
mediaType,
|
|
)
|
|
if err != nil {
|
|
slog.Error(err.Error())
|
|
return nil, err
|
|
}
|
|
|
|
file, err := widgetService.widgetRepo.GetMediaFile(
|
|
model.FileID(fileID),
|
|
)
|
|
if err != nil {
|
|
slog.Error(err.Error())
|
|
return nil, err
|
|
}
|
|
return file, nil
|
|
}
|
|
|
|
func (widgetService *ServiceWidget) SetMediaUrl(
|
|
ctx context.Context,
|
|
mediaType model.MediaType,
|
|
widgetID model.WidgetID,
|
|
mediaUrl model.MediaUrl,
|
|
) error {
|
|
err := widgetService.widgetRepo.SetMediaUrl(
|
|
ctx,
|
|
widgetID,
|
|
mediaUrl,
|
|
mediaType,
|
|
)
|
|
if err != nil {
|
|
slog.Error(err.Error())
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (widgetService *ServiceWidget) CheckToken(
|
|
request echo.Context,
|
|
) (api.CheckTokenResponse, error) {
|
|
accessToken := model.Token(request.Request().Header.Get("Authorization"))
|
|
|
|
checkTokenResponse, err := widgetService.authClient.CheckToken(accessToken)
|
|
if err != nil {
|
|
slog.Error("Failed to check token", "error", err.Error())
|
|
return api.CheckTokenResponse{}, echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
|
}
|
|
|
|
if checkTokenResponse.AccountID == 0 {
|
|
slog.Error("Unauthorized account")
|
|
return api.CheckTokenResponse{}, echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized account")
|
|
}
|
|
|
|
if checkTokenResponse.AccountID == -1 {
|
|
slog.Error("Expired token")
|
|
return api.CheckTokenResponse{}, echo.NewHTTPError(http.StatusUnauthorized, "Expired token")
|
|
}
|
|
|
|
return checkTokenResponse, nil
|
|
}
|