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
}