From 1a2cbfb6cd17c4b4f627abe667d84b95e23b024d Mon Sep 17 00:00:00 2001 From: mm Date: Tue, 29 Oct 2024 22:07:14 +0500 Subject: [PATCH] dev --- api/http/docs.go | 99 ------------ api/http/swagger.json | 75 --------- api/http/swagger.yaml | 48 ------ cmd/main.go | 4 +- infrastructure/pg/connection.go | 28 +++- internal/api/http/handlers/donat/donat.go | 37 +++-- internal/api/http/handlers/target/target.go | 29 ++-- internal/api/http/handlers/widget/widget.go | 164 ++++++-------------- internal/app/http/app.go | 16 +- internal/model/interfaces.go | 37 +++-- internal/model/sql/query.go | 22 +-- internal/model/widget-templates.go | 36 +++-- internal/repository/donat/donat.go | 34 ++-- internal/repository/target/target.go | 12 +- internal/repository/widget/widget.go | 96 +++++------- internal/service/donat/donat.go | 32 ++-- internal/service/target/target.go | 6 +- internal/service/widget/widget.go | 124 +++------------ pkg/logger/logger.go | 15 ++ 19 files changed, 308 insertions(+), 606 deletions(-) delete mode 100644 api/http/docs.go delete mode 100644 api/http/swagger.json delete mode 100644 api/http/swagger.yaml create mode 100644 pkg/logger/logger.go diff --git a/api/http/docs.go b/api/http/docs.go deleted file mode 100644 index 711e2cd..0000000 --- a/api/http/docs.go +++ /dev/null @@ -1,99 +0,0 @@ -// Package docs Code generated by swaggo/swag. DO NOT EDIT -package http - -import "github.com/swaggo/swag" - -const docTemplate = `{ - "schemes": {{ marshal .Schemes }}, - "swagger": "2.0", - "info": { - "description": "{{escape .Description}}", - "title": "{{.Title}}", - "contact": {}, - "version": "{{.Version}}" - }, - "host": "{{.Host}}", - "basePath": "{{.BasePath}}", - "paths": { - "/api/user/register": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Auth" - ], - "parameters": [ - { - "description": "Register user", - "name": "input", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/register.requestModel" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/register.responseModel" - } - } - } - } - } - }, - "definitions": { - "register.requestModel": { - "type": "object", - "required": [ - "password" - ], - "properties": { - "email": { - "type": "string" - }, - "login": { - "type": "string" - }, - "password": { - "type": "string" - } - } - }, - "register.responseModel": { - "type": "object", - "properties": { - "token": { - "type": "string" - }, - "userId": { - "type": "string" - } - } - } - } -}` - -// SwaggerInfo holds exported Swagger Info so clients can modify it -var SwaggerInfo = &swag.Spec{ - Version: "1.0", - Host: "localhost", - BasePath: "/v2", - Schemes: []string{}, - Title: "Template", - Description: "Описание.", - InfoInstanceName: "swagger", - SwaggerTemplate: docTemplate, - LeftDelim: "{{", - RightDelim: "}}", -} - -func init() { - swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) -} diff --git a/api/http/swagger.json b/api/http/swagger.json deleted file mode 100644 index ee70599..0000000 --- a/api/http/swagger.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Описание.", - "title": "Template", - "contact": {}, - "version": "1.0" - }, - "host": "localhost", - "basePath": "/v2", - "paths": { - "/api/user/register": { - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Auth" - ], - "parameters": [ - { - "description": "Register user", - "name": "input", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/register.requestModel" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/register.responseModel" - } - } - } - } - } - }, - "definitions": { - "register.requestModel": { - "type": "object", - "required": [ - "password" - ], - "properties": { - "email": { - "type": "string" - }, - "login": { - "type": "string" - }, - "password": { - "type": "string" - } - } - }, - "register.responseModel": { - "type": "object", - "properties": { - "token": { - "type": "string" - }, - "userId": { - "type": "string" - } - } - } - } -} \ No newline at end of file diff --git a/api/http/swagger.yaml b/api/http/swagger.yaml deleted file mode 100644 index 19a139b..0000000 --- a/api/http/swagger.yaml +++ /dev/null @@ -1,48 +0,0 @@ -basePath: /v2 -definitions: - register.requestModel: - properties: - email: - type: string - login: - type: string - password: - type: string - required: - - password - type: object - register.responseModel: - properties: - token: - type: string - userId: - type: string - type: object -host: localhost -info: - contact: {} - description: Описание. - title: Template - version: "1.0" -paths: - /api/user/register: - post: - consumes: - - application/json - parameters: - - description: Register user - in: body - name: input - required: true - schema: - $ref: '#/definitions/register.requestModel' - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/register.responseModel' - tags: - - Auth -swagger: "2.0" diff --git a/cmd/main.go b/cmd/main.go index e8aba43..28f8c71 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -4,6 +4,7 @@ import ( "context" "donat-widget/internal/app/http" "donat-widget/internal/config" + "donat-widget/pkg/logger" ) import ( @@ -23,6 +24,7 @@ import ( ) func main() { + logger.New() cfg := config.Init() // INFRASTRUCTURE @@ -39,7 +41,7 @@ func main() { targetRepo := TargetRepo.New(db) // SERVICES - widgetService := WidgetService.New(widgetRepo, donatRepo) + widgetService := WidgetService.New(widgetRepo) donatService := DonatService.New(donatRepo, widgetRepo, paymentClient) targetService := TargetService.New(targetRepo) diff --git a/infrastructure/pg/connection.go b/infrastructure/pg/connection.go index bf89766..7e12140 100644 --- a/infrastructure/pg/connection.go +++ b/infrastructure/pg/connection.go @@ -3,7 +3,6 @@ package pg import ( "context" "github.com/jackc/pgx/v5" - "github.com/jackc/pgx/v5/pgconn" "github.com/jackc/pgx/v5/pgxpool" "sync" ) @@ -33,15 +32,16 @@ func NewPgPool( return pgInstance } -func (pg *Postgres) Exec(ctx context.Context, query string, args ...interface{}) (pgconn.CommandTag, error) { - result, err := pg.db.Exec(ctx, query, args...) +func (pg *Postgres) Insert(ctx context.Context, query string, args ...interface{}) (int64, error) { + var id int64 + err := pg.db.QueryRow(ctx, query, args...).Scan(&id) if err != nil { - return result, err + return 0, err } - return result, nil + return id, nil } -func (pg *Postgres) Query(ctx context.Context, query string, args ...interface{}) (pgx.Rows, error) { +func (pg *Postgres) Select(ctx context.Context, query string, args ...interface{}) (pgx.Rows, error) { result, err := pg.db.Query(ctx, query, args...) if err != nil { return nil, err @@ -49,6 +49,22 @@ func (pg *Postgres) Query(ctx context.Context, query string, args ...interface{} return result, nil } +func (pg *Postgres) Update(ctx context.Context, query string, args ...interface{}) error { + _, err := pg.db.Query(ctx, query, args...) + if err != nil { + return err + } + return nil +} + +func (pg *Postgres) Delete(ctx context.Context, query string, args ...interface{}) error { + _, err := pg.db.Query(ctx, query, args...) + if err != nil { + return err + } + return nil +} + func (pg *Postgres) CreateTable(ctx context.Context, query string) error { _, err := pg.db.Exec(ctx, query) if err != nil { diff --git a/internal/api/http/handlers/donat/donat.go b/internal/api/http/handlers/donat/donat.go index 750fa0c..715208c 100644 --- a/internal/api/http/handlers/donat/donat.go +++ b/internal/api/http/handlers/donat/donat.go @@ -23,11 +23,11 @@ func CreateDonat(donatService model.DonatService) echo.HandlerFunc { var body CreateDonatBody if err := request.Bind(&body); err != nil { slog.Error(err.Error()) - return echo.NewHTTPError(400, err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } if err := request.Validate(&body); err != nil { slog.Error(err.Error()) - return echo.NewHTTPError(400, err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } orderID := model.OrderID(uuid.New().String()) @@ -42,13 +42,32 @@ func CreateDonat(donatService model.DonatService) echo.HandlerFunc { body.DonatUser, ) if err != nil { - return request.JSON(500, "Create donat error") + return request.JSON(http.StatusInternalServerError, err.Error()) } return request.JSON(http.StatusCreated, order) } } +func GetDonat(donatService model.DonatService) echo.HandlerFunc { + return func(request echo.Context) error { + ctx := context.Background() + streamerID, err := strconv.Atoi(request.Param("streamerID")) + if err != nil { + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) + } + donats, err := donatService.GetDonatByStreamerID(ctx, model.StreamerID(streamerID)) + if err != nil { + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) + } + + return request.JSON(http.StatusNotFound, donats) + + } +} + func MarkDonatPaid(donatService model.DonatService) echo.HandlerFunc { type MarkDonatPaidBody struct { OrderID model.OrderID `json:"orderID"` @@ -58,17 +77,17 @@ func MarkDonatPaid(donatService model.DonatService) echo.HandlerFunc { var body MarkDonatPaidBody if err := request.Bind(&body); err != nil { slog.Error(err.Error()) - return echo.NewHTTPError(400, err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } if err := request.Validate(&body); err != nil { slog.Error(err.Error()) - return echo.NewHTTPError(400, err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } err := donatService.MarkDonatPaid(ctx, body.OrderID) if err != nil { - slog.Error("donatService.MarkDonatPaid error: " + err.Error()) - return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } return request.String(200, "Donat paid success") } @@ -80,7 +99,7 @@ func MarkDonatView(donatService model.DonatService) echo.HandlerFunc { donatID, err := strconv.Atoi(request.Param("donatID")) if err != nil { - return echo.NewHTTPError(400, "Path parameter 'donatID' is invalid") + return request.JSON(400, err.Error()) } err = donatService.MarkDonatView( @@ -88,7 +107,7 @@ func MarkDonatView(donatService model.DonatService) echo.HandlerFunc { model.DonatID(donatID), ) if err != nil { - return echo.NewHTTPError(500, "Delete donat error") + return request.JSON(500, err.Error()) } slog.Info("Delete donat success") return request.String(200, "donat view success") diff --git a/internal/api/http/handlers/target/target.go b/internal/api/http/handlers/target/target.go index 2287ac6..2727ece 100644 --- a/internal/api/http/handlers/target/target.go +++ b/internal/api/http/handlers/target/target.go @@ -4,6 +4,7 @@ import ( "context" "donat-widget/internal/model" "github.com/labstack/echo/v4" + "log/slog" "net/http" ) @@ -16,20 +17,23 @@ func CreateTarget(targetService model.TargetService, authClient model.AuthClient ctx := context.Background() var body CreateTargetBody if err := request.Bind(&body); err != nil { - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } if err := request.Validate(&body); err != nil { - - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } authData, err := authClient.CheckToken(request) if err != nil { - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } err = targetService.CreateTarget(ctx, model.StreamerID(authData.StreamerID), body.Amount, body.Text) if err != nil { + slog.Error(err.Error()) return request.JSON(http.StatusInternalServerError, err) } return request.String(http.StatusOK, "Created target successfully") @@ -44,15 +48,17 @@ func GetAllTarget(targetService model.TargetService) echo.HandlerFunc { ctx := context.Background() var body GetAllTargetBody if err := request.Bind(&body); err != nil { - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } if err := request.Validate(&body); err != nil { - - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } targets, err := targetService.GetAllTarget(ctx, body.StreamerID) if err != nil { + slog.Error(err.Error()) return request.JSON(http.StatusInternalServerError, err) } @@ -71,20 +77,23 @@ func AddAmountTarget( ctx := context.Background() var body AddAmountTargetBody if err := request.Bind(&body); err != nil { - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } if err := request.Validate(&body); err != nil { - - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } donat, err := donatService.GetDonatByOrderID(ctx, body.OrderID) if err != nil { + slog.Error(err.Error()) return request.JSON(http.StatusInternalServerError, err) } err = targetService.AddAmountToTarget(ctx, donat.TargetID, donat.Amount) if err != nil { + slog.Error(err.Error()) return request.JSON(http.StatusInternalServerError, err) } return request.JSON(http.StatusOK, "Added target successfully") diff --git a/internal/api/http/handlers/widget/widget.go b/internal/api/http/handlers/widget/widget.go index 3a5f51a..8f5377a 100644 --- a/internal/api/http/handlers/widget/widget.go +++ b/internal/api/http/handlers/widget/widget.go @@ -5,6 +5,7 @@ import ( "donat-widget/internal/model" "github.com/labstack/echo/v4" "log/slog" + "net/http" "strconv" ) @@ -22,15 +23,18 @@ func CreateWidget(widgetService model.WidgetService, authClient model.AuthClient ctx := context.Background() var body Body if err := request.Bind(&body); err != nil { - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } if err := request.Validate(&body); err != nil { - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } authData, err := authClient.CheckToken(request) if err != nil { - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } widgetID, err := widgetService.CreateWidget( @@ -41,7 +45,8 @@ func CreateWidget(widgetService model.WidgetService, authClient model.AuthClient body.MinAmount, ) if err != nil { - return request.JSON(422, "Create widget error") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } response := Response{ @@ -56,18 +61,21 @@ func GetWidgetHTML(widgetService model.WidgetService) echo.HandlerFunc { return func(request echo.Context) error { ctx := context.Background() - widgetID, err := strconv.Atoi(request.Param("widgetID")) + streamerID, err := strconv.Atoi(request.Param("streamerID")) if err != nil { - return echo.NewHTTPError(400, "Path parameter 'widgetID' is invalid") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } widgetHTML, err := widgetService.GetWidgetHTML( ctx, - model.WidgetID(widgetID), + model.StreamerID(streamerID), ) if err != nil { - return request.JSON(500, "Get widget HTML error") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } + slog.Info("Get widget HTML successfully") return request.HTML(200, string(widgetHTML)) } @@ -75,76 +83,29 @@ func GetWidgetHTML(widgetService model.WidgetService) echo.HandlerFunc { func GetWidgetInfo(widgetService model.WidgetService) echo.HandlerFunc { type Response struct { - AudioUrl model.MediaUrl `json:"audioUrl"` - ImageUrl model.MediaUrl `json:"imageUrl"` - Text string `json:"text"` - Amount model.DonatAmount `json:"amount"` - DonatUser string `json:"donatUser"` - Display model.Display `json:"display"` - Duration model.Duration `json:"duration"` - DonatID model.DonatID `json:"donatID"` + AudioUrl model.MediaUrl `json:"audioUrl"` + ImageUrl model.MediaUrl `json:"imageUrl"` + Duration model.Duration `json:"duration"` } return func(request echo.Context) error { ctx := context.Background() widgetID, err := strconv.Atoi(request.Param("widgetID")) if err != nil { - return echo.NewHTTPError(400, "Path parameter 'widgetID' is invalid") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } - donatAndWidget, err := widgetService.GetWidgetInfo(ctx, model.WidgetID(widgetID)) + widget, err := widgetService.GetWidgetByID(ctx, model.WidgetID(widgetID)) if err != nil { - return request.JSON(422, "Get widget info error") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) + } + if len(widget) == 0 { + return request.JSON(http.StatusNotFound, "widget not found") } - if !donatAndWidget.Display { - response := Response{ - Display: donatAndWidget.Display, - } - return request.JSON(200, response) - } - - response := Response{ - AudioUrl: donatAndWidget.Widget.AudioUrl, - ImageUrl: donatAndWidget.Widget.ImageUrl, - Text: donatAndWidget.Donat.Text, - Display: donatAndWidget.Display, - Duration: donatAndWidget.Widget.Duration, - DonatUser: donatAndWidget.Donat.DonatUser, - Amount: donatAndWidget.Donat.Amount, - DonatID: donatAndWidget.Donat.ID, - } - - return request.JSON(200, response) - } -} - -func UpdateDuration(widgetService model.WidgetService) echo.HandlerFunc { - type Body struct { - WidgetID model.WidgetID `json:"widgetID" validate:"required"` - Duration model.Duration `json:"duration" validate:"required"` - } - - return func(request echo.Context) error { - ctx := context.Background() - var body Body - if err := request.Bind(&body); err != nil { - return echo.NewHTTPError(400, err.Error()) - } - if err := request.Validate(&body); err != nil { - return echo.NewHTTPError(400, err.Error()) - } - - err := widgetService.UpdateDuration( - ctx, - body.WidgetID, - body.Duration, - ) - if err != nil { - return request.JSON(422, "Update duration error") - } - - return request.JSON(200, "Update duration successfully") + return request.JSON(200, widget) } } @@ -154,19 +115,22 @@ func SetMediaFile(widgetService model.WidgetService) echo.HandlerFunc { widgetID, err := strconv.Atoi(request.FormValue("widgetID")) if err != nil { - return echo.NewHTTPError(404, "Path parameter 'widgetID' is invalid") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } mediaType := request.Param("mediaType") file, err := request.FormFile("file") if err != nil { - return echo.NewHTTPError(404, "Form parameter 'file' is invalid") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } src, err := file.Open() if err != nil { - return echo.NewHTTPError(500, "File is invalid") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } err = widgetService.SetMediaFile( @@ -179,7 +143,8 @@ func SetMediaFile(widgetService model.WidgetService) echo.HandlerFunc { "", ) if err != nil { - return echo.NewHTTPError(500, "File upload is failed") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } slog.Info("set " + mediaType + " file successfully") return request.String(200, "File successfully uploaded") @@ -194,9 +159,11 @@ func GetMediaFile(widgetService model.WidgetService) echo.HandlerFunc { if mediaType != "background" && mediaType != "image" && mediaType != "audio" { return echo.NewHTTPError(400, "Path parameter 'mediaType' is invalid") } + widgetID, err := strconv.Atoi(request.Param("widgetID")) if err != nil { - return echo.NewHTTPError(400, "Path parameter 'widgetID' is invalid") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } file, err := widgetService.GetMediaFile( @@ -205,52 +172,15 @@ func GetMediaFile(widgetService model.WidgetService) echo.HandlerFunc { model.MediaType(mediaType), ) if err != nil { - return echo.NewHTTPError(500, "Get File is failed") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } + slog.Info("get " + mediaType + " file successfully") return request.Blob(200, "application/octet-stream", file) } } -func UpdateMediaFile(widgetService model.WidgetService) echo.HandlerFunc { - return func(request echo.Context) error { - ctx := context.Background() - - widgetID, err := strconv.Atoi(request.FormValue("widgetID")) - if err != nil { - return echo.NewHTTPError(404, "Path parameter 'widgetID' is invalid") - } - - mediaType := request.Param("mediaType") - - file, err := request.FormFile("file") - if err != nil { - return echo.NewHTTPError(404, "Form parameter 'file' is invalid") - } - - src, err := file.Open() - if err != nil { - return echo.NewHTTPError(500, "File is invalid") - } - - err = widgetService.UpdateMediaFile( - ctx, - model.WidgetID(widgetID), - model.MediaType(mediaType), - &src, - file.Filename, - file.Size, - "", - ) - - if err != nil { - return echo.NewHTTPError(500, "File update is failed") - } - slog.Info("update media file successfully") - return request.String(200, "Media successfully uploaded") - } -} - func SetMediaUrl(widgetService model.WidgetService) echo.HandlerFunc { type Body struct { WidgetID model.WidgetID `json:"widgetID" validate:"required"` @@ -260,11 +190,12 @@ func SetMediaUrl(widgetService model.WidgetService) echo.HandlerFunc { ctx := context.Background() var body Body if err := request.Bind(&body); err != nil { - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } if err := request.Validate(&body); err != nil { - - return echo.NewHTTPError(400, err.Error()) + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } mediaType := request.Param("mediaType") @@ -276,7 +207,8 @@ func SetMediaUrl(widgetService model.WidgetService) echo.HandlerFunc { body.MediaUrl, ) if err != nil { - return echo.NewHTTPError(500, "Set MediaUrl is failed") + slog.Error(err.Error()) + return request.JSON(http.StatusInternalServerError, err.Error()) } return request.String(200, "Media URL successfully set") diff --git a/internal/app/http/app.go b/internal/app/http/app.go index d4d94ef..ed037a7 100644 --- a/internal/app/http/app.go +++ b/internal/app/http/app.go @@ -59,6 +59,9 @@ func IncludeDonatHandlers( donatService model.DonatService, ) { server.POST(PREFIX+"/donat/create", CreateDonat(donatService)) + + server.GET(PREFIX+"/donat/:streamerID", GetDonat(donatService)) + server.POST(PREFIX+"/donat/view/:donatID", MarkDonatView(donatService)) server.POST(PREFIX+"/donat/paid", MarkDonatPaid(donatService)) } @@ -69,13 +72,14 @@ func IncludeWidgetHandlers( authClient model.AuthClient, ) { server.POST(PREFIX+"/create", CreateWidget(widgetService, authClient)) - server.GET(PREFIX+"/html/:widgetID", GetWidgetHTML(widgetService)) - server.GET(PREFIX+"/info/:widgetID", GetWidgetInfo(widgetService)) - server.PATCH(PREFIX+"/duration/update", UpdateDuration(widgetService)) - server.POST(PREFIX+"/media/:mediaType/upload", SetMediaFile(widgetService)) - server.POST(PREFIX+"/media/:mediaType/set", SetMediaUrl(widgetService)) - server.GET(PREFIX+"/media/:mediaType/get/:widgetID", GetMediaFile(widgetService)) + server.GET(PREFIX+"/html/:streamerID", GetWidgetHTML(widgetService)) + server.GET(PREFIX+"/info/:widgetID", GetWidgetInfo(widgetService)) + + server.POST(PREFIX+"/media/:mediaType/file/set", SetMediaFile(widgetService)) + server.GET(PREFIX+"/media/:mediaType/file/get/:widgetID", GetMediaFile(widgetService)) + + server.POST(PREFIX+"/media/:mediaType/url/set", SetMediaUrl(widgetService)) } diff --git a/internal/model/interfaces.go b/internal/model/interfaces.go index 175afc5..9bba5fc 100644 --- a/internal/model/interfaces.go +++ b/internal/model/interfaces.go @@ -5,46 +5,48 @@ import ( "donat-widget/internal/model/api" "github.com/jackc/pgx/v5" "github.com/labstack/echo/v4" - - "github.com/jackc/pgx/v5/pgconn" ) type WidgetService interface { CreateWidget(ctx context.Context, streamerID StreamerID, templateId TemplateID, duration Duration, minAmount DonatAmount) (WidgetID, error) - DeleteWidget(ctx context.Context, widgetID WidgetID) error - UpdateDuration(ctx context.Context, widgetID WidgetID, duration Duration) error - GetWidgetInfo(ctx context.Context, widgetID WidgetID) (*DonatAndWidget, error) - GetWidgetHTML(ctx context.Context, widgetID WidgetID) (WidgetHTML, error) + + GetWidgetByID(ctx context.Context, widgetID WidgetID) ([]*Widget, error) + GetWidgetHTML(ctx context.Context, streamerID StreamerID) (WidgetHTML, error) + GetMediaFile(ctx context.Context, widgetID WidgetID, mediaType MediaType) (DownloadFile, error) + SetMediaFile(ctx context.Context, mediaType MediaType, widgetID WidgetID, file UploadFile, filename string, size int64, collection string) error SetMediaUrl(ctx context.Context, mediaType MediaType, widgetID WidgetID, mediaURL MediaUrl) error - UpdateMediaFile(ctx context.Context, widgetID WidgetID, mediaType MediaType, file UploadFile, filename string, size int64, collection string) error - GetMediaFile(ctx context.Context, widgetID WidgetID, mediaType MediaType) (DownloadFile, error) } type WidgetRepo interface { CreateWidget(ctx context.Context, streamerID StreamerID, templateId TemplateID, duration Duration, minAmount DonatAmount) (WidgetID, error) - DeleteWidget(ctx context.Context, widgetID WidgetID) error - UpdateDuration(ctx context.Context, widgetID WidgetID, duration Duration) error - GetWidget(ctx context.Context, widgetID WidgetID) (*Widget, error) + + GetWidgetByStreamerID(ctx context.Context, streamerID StreamerID) ([]*Widget, error) + GetWidgetByID(ctx context.Context, widgetID WidgetID) ([]*Widget, error) GetAllWidget(ctx context.Context, streamerID StreamerID) ([]*Widget, error) - SetMediaFile(file UploadFile, filename string, size int64, collection string) (FileID, error) GetMediaFile(fileID FileID) (DownloadFile, error) GetMediaUrl(ctx context.Context, widgetID WidgetID, mediaType MediaType) (MediaUrl, error) + + SetMediaFile(file UploadFile, filename string, size int64, collection string) (FileID, error) SetMediaUrl(ctx context.Context, widgetID WidgetID, mediaUrl MediaUrl, mediaType MediaType) error - UpdateMediaFile(ctx context.Context, widgetID WidgetID, file UploadFile, fileID FileID, filename string, size int64, collection string, mediaType MediaType) error } type DonatService interface { CreateDonat(ctx context.Context, streamerID StreamerID, orderID OrderID, targetID TargetID, amount DonatAmount, text string, donatUser string) (api.CreatePaymentResponse, error) + + GetDonatByStreamerID(ctx context.Context, streamerID StreamerID) ([]*Donat, error) GetDonatByOrderID(ctx context.Context, orderID OrderID) (*Donat, error) + MarkDonatPaid(ctx context.Context, orderID OrderID) error MarkDonatView(ctx context.Context, DonatID DonatID) error } type DonatRepo interface { CreateDonat(ctx context.Context, widgetID WidgetID, orderID OrderID, targetID TargetID, amount DonatAmount, text string, donatUser string) error - GetDonat(ctx context.Context, widgetID WidgetID) ([]*Donat, error) + + GetDonatByStreamerID(ctx context.Context, streamerID StreamerID) ([]*Donat, error) GetDonatByOrderID(ctx context.Context, orderID OrderID) (*Donat, error) + MarkDonatPaid(ctx context.Context, orderID OrderID) error MarkDonatView(ctx context.Context, DonatID DonatID) error } @@ -75,8 +77,11 @@ type PaymentClient interface { CreatePayment(streamerID StreamerID, amount DonatAmount, orderID OrderID) (api.CreatePaymentResponse, error) } type Db interface { - Exec(ctx context.Context, query string, args ...interface{}) (pgconn.CommandTag, error) - Query(ctx context.Context, query string, args ...interface{}) (pgx.Rows, error) + Insert(ctx context.Context, query string, args ...interface{}) (int64, error) + Select(ctx context.Context, query string, args ...interface{}) (pgx.Rows, error) + Delete(ctx context.Context, query string, args ...interface{}) error + Update(ctx context.Context, query string, args ...interface{}) error + CreateTable(ctx context.Context, query string) error DropTable(ctx context.Context, query string) error } diff --git a/internal/model/sql/query.go b/internal/model/sql/query.go index 31e33b8..5b5c3b5 100644 --- a/internal/model/sql/query.go +++ b/internal/model/sql/query.go @@ -7,14 +7,14 @@ import ( var CreateWidget = ` INSERT INTO widgets (streamer_id, template_id, duration, min_amount) -VALUES (@streamer_id, @template_id, @duration, @min_amount); +VALUES (@streamer_id, @template_id, @duration, @min_amount) +RETURNING id; ` -var UpdateDuration = ` -UPDATE widgets -SET duration = (@duration) -WHERE id = (@id) +var GetWidgetByStreamerID = ` +SELECT * FROM widgets +WHERE streamer_id = (@streamer_id); ` -var GetWidget = ` +var GetWidgetByID = ` SELECT * FROM widgets WHERE id = (@id); ` @@ -44,7 +44,8 @@ func GetMediaUrl(mediaType model.MediaType) string { var CreateDonat = ` INSERT INTO donats (widget_id, text, amount, donat_user, order_id, target_id) -VALUES (@widget_id, @text, @amount, @donat_user, @order_id, @target_id); +VALUES (@widget_id, @text, @amount, @donat_user, @order_id, @target_id) +RETURNING id; ` var MarkDonatView = ` UPDATE donats @@ -56,9 +57,9 @@ UPDATE donats SET paid = (@paid) WHERE order_id = (@order_id); ` -var GetDonat = ` +var GetDonatByStreamerID = ` SELECT * FROM donats -WHERE widget_id = (@widget_id) AND paid = (@paid) AND view = (@view); +WHERE streamer_id = (@streamer_id) AND paid = (@paid) AND view = (@view); ` var GetDonatByOrderID = ` SELECT * FROM donats @@ -67,7 +68,8 @@ WHERE order_id = (@order_id); var CreateTarget = ` INSERT INTO targets (streamer_id, text, amount) -VALUES (@streamer_id, @text, @amount); +VALUES (@streamer_id, @text, @amount) +RETURNING id; ` var GetAllTarget = ` diff --git a/internal/model/widget-templates.go b/internal/model/widget-templates.go index 38ccff6..c28f8cc 100644 --- a/internal/model/widget-templates.go +++ b/internal/model/widget-templates.go @@ -3,7 +3,7 @@ package model import "fmt" func GetTemplate1( - widgetID WidgetID, + streamerID StreamerID, backgroundUrl MediaUrl, ) WidgetHTML { @@ -41,19 +41,23 @@ func GetTemplate1( `, backgroundUrl) script := fmt.Sprintf(` -let widgetID = '%v' -let baseUrl = 'http://92.118.114.148:8002/api/widget' - function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } -async function getWidgetInfo() { - let response = await fetch(baseUrl + '/info/' + widgetID); +async def getDonatInfo(streamerID) { + let response = await fetch(baseUrl + '/donat/get/' + streamerID); + let donat = await response.json(); +} + +async function getWidgetInfo(widgetID) { + let response = await fetch(baseUrl + '/widget/info/' + widgetID); let widget = await response.json(); return widget } + + function addImage(imageUrl) { img = document.createElement('img'); img.src = imageUrl + '?t=' + new Date().getTime(); @@ -89,23 +93,31 @@ let audio; const contentDiv = document.getElementById('content'); async function widgetView() { + let baseUrl = 'http://92.118.114.148:8002/api' + let streamerID = '%v' + while (true) { - let widget = await getWidgetInfo() - console.log(widget); - if (!widget.display) { + let donat = await getDonatInfo(streamerID); + + if (!donat) { await delay(5 * 1000); continue } + donat = donat[0] + + widgetID = donat.widgwtID + + let widget = await getWidgetInfo(widgetID) addImage(widget.imageUrl) - addText(widget.text + widget.amount) addAudio(widget.audioUrl) + addText(donat.text + donat.amount) await delay(widget.duration * 1000); - await endDonat(widget.donatID) + await endDonat(donat.ID) } } -widgetView()`, widgetID) +widgetView()`, streamerID) template1 := fmt.Sprintf(` diff --git a/internal/repository/donat/donat.go b/internal/repository/donat/donat.go index 5fe6269..6c92f77 100644 --- a/internal/repository/donat/donat.go +++ b/internal/repository/donat/donat.go @@ -37,34 +37,34 @@ func (repoDonat *RepoDonat) CreateDonat( "amount": amount, "donat_user": donatUser, } - _, err := repoDonat.db.Query(ctx, sql.CreateDonat, args) + _, err := repoDonat.db.Insert(ctx, sql.CreateDonat, args) if err != nil { - slog.Error("repoDonat.db.Query: " + err.Error()) + slog.Error(err.Error()) return err } return nil } -func (repoDonat *RepoDonat) GetDonat( +func (repoDonat *RepoDonat) GetDonatByStreamerID( ctx context.Context, - widgetID model.WidgetID, + streamerID model.StreamerID, ) ([]*model.Donat, error) { args := pgx.NamedArgs{ - "widget_id": widgetID, - "paid": true, - "view": false, + "streamer_id": streamerID, + "paid": true, + "view": false, } - rows, err := repoDonat.db.Query(ctx, sql.GetDonat, args) + rows, err := repoDonat.db.Select(ctx, sql.GetDonatByStreamerID, args) if err != nil { - slog.Error("repoDonat.db.Query: " + err.Error()) + slog.Error(err.Error()) return nil, err } var donats []*model.Donat err = pgxscan.ScanAll(&donats, rows) if err != nil { - slog.Error("repoMedia.pgxscan.ScanAll: " + err.Error()) + slog.Error(err.Error()) return nil, err } @@ -78,16 +78,16 @@ func (repoDonat *RepoDonat) GetDonatByOrderID( args := pgx.NamedArgs{ "order_id": orderID, } - rows, err := repoDonat.db.Query(ctx, sql.GetDonatByOrderID, args) + rows, err := repoDonat.db.Select(ctx, sql.GetDonatByOrderID, args) if err != nil { - slog.Error("repoDonat.db.Query: " + err.Error()) + slog.Error(err.Error()) return nil, err } var donats []*model.Donat err = pgxscan.ScanAll(&donats, rows) if err != nil { - slog.Error("repoMedia.pgxscan.ScanAll: " + err.Error()) + slog.Error(err.Error()) return nil, err } if len(donats) == 0 { @@ -105,9 +105,9 @@ func (repoDonat *RepoDonat) MarkDonatView( "id": donatID, "view": true, } - _, err := repoDonat.db.Query(ctx, sql.MarkDonatView, args) + err := repoDonat.db.Update(ctx, sql.MarkDonatView, args) if err != nil { - slog.Error("repoDonat.db.Query: " + err.Error()) + slog.Error(err.Error()) return err } @@ -122,9 +122,9 @@ func (repoDonat *RepoDonat) MarkDonatPaid( "order_id": orderID, "paid": true, } - _, err := repoDonat.db.Query(ctx, sql.MarkDonatPaid, args) + err := repoDonat.db.Update(ctx, sql.MarkDonatPaid, args) if err != nil { - slog.Error("repoDonat.db.Query: " + err.Error()) + slog.Error(err.Error()) return err } diff --git a/internal/repository/target/target.go b/internal/repository/target/target.go index db5f1cf..508f137 100644 --- a/internal/repository/target/target.go +++ b/internal/repository/target/target.go @@ -32,9 +32,9 @@ func (targetRepo *RepoTarget) CreateTarget( "text": text, } - _, err := targetRepo.db.Query(ctx, sql.CreateTarget, args) + _, err := targetRepo.db.Insert(ctx, sql.CreateTarget, args) if err != nil { - slog.Error("targetRepo.db.Query", err) + slog.Error(err.Error()) return err } return nil @@ -47,9 +47,9 @@ func (targetRepo *RepoTarget) GetAllTarget( args := pgx.NamedArgs{ "streamer_id": streamerID, } - rows, err := targetRepo.db.Query(ctx, sql.GetAllTarget, args) + rows, err := targetRepo.db.Select(ctx, sql.GetAllTarget, args) if err != nil { - slog.Error("targetRepo.db.Query", err) + slog.Error(err.Error()) return nil, err } @@ -76,9 +76,9 @@ func (targetRepo *RepoTarget) AddAmountToTarget( "target_id": targetID, "amount": amount, } - _, err := targetRepo.db.Query(ctx, sql.AddAmountToTarget, args) + err := targetRepo.db.Update(ctx, sql.AddAmountToTarget, args) if err != nil { - slog.Error("targetRepo.db.Query", err) + slog.Error(err.Error()) return err } return nil diff --git a/internal/repository/widget/widget.go b/internal/repository/widget/widget.go index f021179..915047c 100644 --- a/internal/repository/widget/widget.go +++ b/internal/repository/widget/widget.go @@ -38,26 +38,23 @@ func (widgetRepo *RepoWidget) CreateWidget( "duration": duration, "min_amount": minAmount, } - _, err := widgetRepo.db.Query(ctx, sql.CreateWidget, args) + widgetID, err := widgetRepo.db.Insert(ctx, sql.CreateWidget, args) if err != nil { - slog.Error("widgetRepo.db.Query: " + err.Error()) + slog.Error(err.Error()) return 0, err } - widgetID := 9 return model.WidgetID(widgetID), nil } -func (widgetRepo *RepoWidget) GetWidget( +func (widgetRepo *RepoWidget) GetWidgetByStreamerID( ctx context.Context, - widgetID model.WidgetID, -) (*model.Widget, error) { - args := pgx.NamedArgs{ - "id": widgetID, - } - rows, err := widgetRepo.db.Query(ctx, sql.GetWidget, args) + streamerID model.StreamerID, +) ([]*model.Widget, error) { + args := pgx.NamedArgs{"streamer_id": streamerID} + rows, err := widgetRepo.db.Select(ctx, sql.GetWidgetByStreamerID, args) if err != nil { - slog.Error("widgetRepo.db.Query: " + err.Error()) + slog.Error(err.Error()) return nil, err } @@ -68,15 +65,28 @@ func (widgetRepo *RepoWidget) GetWidget( return nil, err } - if len(widgets) == 0 { - slog.Error("Widget not found") - return nil, errors.New("widget not found") + return widgets, nil +} + +func (widgetRepo *RepoWidget) GetWidgetByID( + ctx context.Context, + widgetID model.WidgetID, +) ([]*model.Widget, error) { + args := pgx.NamedArgs{"id": widgetID} + rows, err := widgetRepo.db.Select(ctx, sql.GetWidgetByID, args) + if err != nil { + slog.Error(err.Error()) + return nil, err } - widget := widgets[0] - widget.NormalizeUrl() + var widgets []*model.Widget + err = pgxscan.ScanAll(&widgets, rows) + if err != nil { + slog.Error(err.Error()) + return nil, err + } - return widget, nil + return widgets, nil } func (widgetRepo *RepoWidget) GetAllWidget( @@ -86,9 +96,9 @@ func (widgetRepo *RepoWidget) GetAllWidget( args := pgx.NamedArgs{ "streamer_id": streamerID, } - rows, err := widgetRepo.db.Query(ctx, sql.GetAllWidget, args) + rows, err := widgetRepo.db.Select(ctx, sql.GetAllWidget, args) if err != nil { - slog.Error("widgetRepo.db.Query: " + err.Error()) + slog.Error(err.Error()) return nil, err } @@ -98,38 +108,10 @@ func (widgetRepo *RepoWidget) GetAllWidget( slog.Error(err.Error()) return nil, err } - if len(widgets) == 0 { - return nil, errors.New("donat not found") - } return widgets, nil } -func (widgetRepo *RepoWidget) DeleteWidget( - ctx context.Context, - widgetID model.WidgetID, -) error { - panic("implement me") -} - -func (widgetRepo *RepoWidget) UpdateDuration( - ctx context.Context, - widgetID model.WidgetID, - duration model.Duration, -) error { - args := pgx.NamedArgs{ - "id": widgetID, - "duration": duration, - } - _, err := widgetRepo.db.Query(ctx, sql.UpdateDuration, args) - if err != nil { - slog.Error("widgetRepo.db.Query: " + err.Error()) - return err - } - - return nil -} - func (widgetRepo *RepoWidget) SetMediaFile( file model.UploadFile, filename string, @@ -138,7 +120,7 @@ func (widgetRepo *RepoWidget) SetMediaFile( ) (model.FileID, error) { fileData, err := widgetRepo.storage.Upload(file, filename, size, collection) if err != nil { - slog.Error("repoMedia.storage.Upload: " + err.Error()) + slog.Error(err.Error()) return "", err } @@ -150,7 +132,7 @@ func (widgetRepo *RepoWidget) GetMediaFile( ) (model.DownloadFile, error) { file, err := widgetRepo.storage.Download(fileID) if err != nil { - slog.Error("repoMedia.storage.Download: " + err.Error()) + slog.Error(err.Error()) return nil, err } @@ -169,7 +151,7 @@ func (widgetRepo *RepoWidget) UpdateMediaFile( ) error { err := widgetRepo.storage.Update(file, fileID, filename, size, collection) if err != nil { - slog.Error("repoMedia.storage.Update: " + err.Error()) + slog.Error(err.Error()) return err } @@ -178,9 +160,9 @@ func (widgetRepo *RepoWidget) UpdateMediaFile( string(mediaType): model.MediaUrl(fileID), "id": widgetID, } - _, err = widgetRepo.db.Query(ctx, sql.UpdateMediaUrl(mediaType), args) + err = widgetRepo.db.Update(ctx, sql.UpdateMediaUrl(mediaType), args) if err != nil { - slog.Error("repoMedia.db.Query: " + err.Error()) + slog.Error(err.Error()) return err } @@ -199,9 +181,9 @@ func (widgetRepo *RepoWidget) SetMediaUrl( string(mediaType): mediaUrl, "id": widgetID, } - _, err := widgetRepo.db.Query(ctx, sql.UpdateMediaUrl(mediaType), args) + err := widgetRepo.db.Update(ctx, sql.UpdateMediaUrl(mediaType), args) if err != nil { - slog.Error("repoMedia.db.Query: " + err.Error()) + slog.Error(err.Error()) return err } return nil @@ -216,16 +198,16 @@ func (widgetRepo *RepoWidget) GetMediaUrl( args := pgx.NamedArgs{ "id": widgetID, } - rows, err := widgetRepo.db.Query(ctx, sql.GetMediaUrl(mediaType), args) + rows, err := widgetRepo.db.Select(ctx, sql.GetMediaUrl(mediaType), args) if err != nil { - slog.Error("repoMedia.db.Query: " + err.Error()) + slog.Error(err.Error()) return "", err } var widgets []*model.Widget err = pgxscan.ScanAll(&widgets, rows) if err != nil { - slog.Error("repoMedia.pgxscan.ScanAll: " + err.Error()) + slog.Error(err.Error()) return "", err } diff --git a/internal/service/donat/donat.go b/internal/service/donat/donat.go index a411251..0adc74f 100644 --- a/internal/service/donat/donat.go +++ b/internal/service/donat/donat.go @@ -4,7 +4,6 @@ import ( "context" "donat-widget/internal/model" "donat-widget/internal/model/api" - "fmt" "log/slog" ) @@ -37,10 +36,9 @@ func (donatService *ServiceDonat) CreateDonat( ) (api.CreatePaymentResponse, error) { widgets, err := donatService.widgetRepo.GetAllWidget(ctx, streamerID) if err != nil { - slog.Error("donatService.widgetRepo.GetAllWidget: ", err) + slog.Error(err.Error()) return api.CreatePaymentResponse{}, err } - fmt.Println(widgets) var widgetID model.WidgetID for _, widget := range widgets { @@ -50,35 +48,41 @@ func (donatService *ServiceDonat) CreateDonat( } err = donatService.donatRepo.CreateDonat( - ctx, - widgetID, - orderID, - targetID, - amount, - text, - donatUser, + ctx, widgetID, orderID, targetID, amount, text, donatUser, ) if err != nil { - slog.Error("donatService.donatRepo.CreateDonat: " + err.Error()) + slog.Error(err.Error()) return api.CreatePaymentResponse{}, err } createPaymentResponse, err := donatService.paymentClient.CreatePayment(streamerID, amount, orderID) if err != nil { - slog.Error("donatService.paymentClient.CreatePayment: " + err.Error()) + slog.Error(err.Error()) return api.CreatePaymentResponse{}, err } return createPaymentResponse, nil } +func (donatService *ServiceDonat) GetDonatByStreamerID( + ctx context.Context, + streamerID model.StreamerID, +) ([]*model.Donat, error) { + donats, err := donatService.donatRepo.GetDonatByStreamerID(ctx, streamerID) + if err != nil { + slog.Error(err.Error()) + return nil, err + } + return donats, nil +} + func (donatService *ServiceDonat) GetDonatByOrderID( ctx context.Context, orderID model.OrderID, ) (*model.Donat, error) { donat, err := donatService.donatRepo.GetDonatByOrderID(ctx, orderID) if err != nil { - slog.Error("donatService.donatRepo.GetDonatByOrderID: " + err.Error()) + slog.Error(err.Error()) return nil, err } return donat, nil @@ -93,7 +97,7 @@ func (donatService *ServiceDonat) MarkDonatPaid( orderID, ) if err != nil { - slog.Error("donatService.donatRepo.MarkDonatView: " + err.Error()) + slog.Error(err.Error()) return err } return nil diff --git a/internal/service/target/target.go b/internal/service/target/target.go index 25a7868..f3b7aca 100644 --- a/internal/service/target/target.go +++ b/internal/service/target/target.go @@ -26,7 +26,7 @@ func (targetService *ServiceTarget) CreateTarget( ) error { err := targetService.targetRepo.CreateTarget(ctx, streamerID, amount, text) if err != nil { - slog.Error("targetService.CreateTarget: ", err) + slog.Error(err.Error()) return err } return nil @@ -38,7 +38,7 @@ func (targetService *ServiceTarget) GetAllTarget( ) ([]*model.Target, error) { targets, err := targetService.targetRepo.GetAllTarget(ctx, streamerID) if err != nil { - slog.Error("targetService.GetAllTarget: ", err) + slog.Error(err.Error()) return nil, err } @@ -52,7 +52,7 @@ func (targetService *ServiceTarget) AddAmountToTarget( ) error { err := targetService.targetRepo.AddAmountToTarget(ctx, targetID, amount) if err != nil { - slog.Error("targetService.AddAmountToTarget: ", err) + slog.Error(err.Error()) return err } return nil diff --git a/internal/service/widget/widget.go b/internal/service/widget/widget.go index da13ddc..f493d8e 100644 --- a/internal/service/widget/widget.go +++ b/internal/service/widget/widget.go @@ -3,22 +3,20 @@ package widget import ( "context" "donat-widget/internal/model" + "errors" "log/slog" ) func New( widgetRepo model.WidgetRepo, - donatRepo model.DonatRepo, ) *ServiceWidget { return &ServiceWidget{ widgetRepo: widgetRepo, - donatRepo: donatRepo, } } type ServiceWidget struct { widgetRepo model.WidgetRepo - donatRepo model.DonatRepo } func (widgetService *ServiceWidget) CreateWidget( @@ -36,90 +34,50 @@ func (widgetService *ServiceWidget) CreateWidget( minAmount, ) if err != nil { - slog.Error("widgetService.widgetRepo.CreateWidget: " + err.Error()) + slog.Error(err.Error()) return 0, err } return widgetID, nil } -func (widgetService *ServiceWidget) DeleteWidget( - ctx context.Context, - widgetID model.WidgetID, -) error { - err := widgetService.widgetRepo.DeleteWidget(ctx, widgetID) - if err != nil { - slog.Error("widgetService.widgetRepo.DeleteWidget: " + err.Error()) - return err - } - return nil -} - -func (widgetService *ServiceWidget) UpdateDuration( - ctx context.Context, - widgetID model.WidgetID, - duration model.Duration, -) error { - err := widgetService.widgetRepo.UpdateDuration(ctx, widgetID, duration) - if err != nil { - slog.Error("widgetService.widgetRepo.UpdateDuration: " + err.Error()) - return err - } - - return nil -} - func (widgetService *ServiceWidget) GetWidgetHTML( ctx context.Context, - widgetID model.WidgetID, + streamerID model.StreamerID, ) (model.WidgetHTML, error) { - var widgetHTML model.WidgetHTML - widget, err := widgetService.widgetRepo.GetWidget(ctx, widgetID) + widgets, err := widgetService.widgetRepo.GetWidgetByStreamerID(ctx, streamerID) if err != nil { - slog.Error("widgetService.widgetRepo.GetWidget: " + err.Error()) - return widgetHTML, err + 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( - widgetID, + streamerID, widget.BackgroundUrl, ) } return widgetHTML, nil } -func (widgetService *ServiceWidget) GetWidgetInfo( +func (widgetService *ServiceWidget) GetWidgetByID( ctx context.Context, widgetID model.WidgetID, -) (*model.DonatAndWidget, error) { +) ([]*model.Widget, error) { - widget, err := widgetService.widgetRepo.GetWidget(ctx, widgetID) + widget, err := widgetService.widgetRepo.GetWidgetByID(ctx, widgetID) if err != nil { - slog.Error("widgetService.widgetRepo.GetWidget: " + err.Error()) + slog.Error(err.Error()) return nil, err } - donats, err := widgetService.donatRepo.GetDonat(ctx, widgetID) - if err != nil { - slog.Error("widgetService.donatRepo.GetDonat: " + err.Error()) - return nil, err - } - - var donatAndWidget model.DonatAndWidget - if len(donats) == 0 { - donatAndWidget = model.DonatAndWidget{ - Display: false, - } - } else { - donatAndWidget = model.DonatAndWidget{ - Widget: widget, - Donat: donats[0], - Display: true, - } - } - - return &donatAndWidget, nil + return widget, nil } func (widgetService *ServiceWidget) SetMediaFile( @@ -138,7 +96,7 @@ func (widgetService *ServiceWidget) SetMediaFile( collection, ) if err != nil { - slog.Error("mediaService.mediaRepo.SetMediaFile: " + err.Error()) + slog.Error(err.Error()) return err } @@ -149,7 +107,7 @@ func (widgetService *ServiceWidget) SetMediaFile( model.MediaUrl(fileID), ) if err != nil { - slog.Error("mediaService.SetMediaUrl: " + err.Error()) + slog.Error(err.Error()) return err } @@ -167,7 +125,7 @@ func (widgetService *ServiceWidget) GetMediaFile( mediaType, ) if err != nil { - slog.Error("mediaService.mediaRepo.GetMediaUrl: " + err.Error()) + slog.Error(err.Error()) return nil, err } @@ -175,48 +133,12 @@ func (widgetService *ServiceWidget) GetMediaFile( model.FileID(fileID), ) if err != nil { - slog.Error("mediaService.mediaRepo.GetMediaFile: " + err.Error()) + slog.Error(err.Error()) return nil, err } return file, nil } -func (widgetService *ServiceWidget) UpdateMediaFile( - ctx context.Context, - widgetID model.WidgetID, - mediaType model.MediaType, - file model.UploadFile, - filename string, - size int64, - collection string, -) error { - fileID, err := widgetService.widgetRepo.GetMediaUrl( - ctx, - widgetID, - mediaType, - ) - if err != nil { - slog.Error("mediaService.mediaRepo.GetMediaUrl: " + err.Error()) - return err - } - - err = widgetService.widgetRepo.UpdateMediaFile( - ctx, - widgetID, - file, - model.FileID(fileID), - filename, - size, - collection, - mediaType, - ) - if err != nil { - slog.Error("mediaService.mediaRepo.UpdateMediaFile: " + err.Error()) - return err - } - return nil -} - func (widgetService *ServiceWidget) SetMediaUrl( ctx context.Context, mediaType model.MediaType, @@ -230,7 +152,7 @@ func (widgetService *ServiceWidget) SetMediaUrl( mediaType, ) if err != nil { - slog.Error("mediaService.mediaRepo.SetMediaUrl: " + err.Error()) + slog.Error(err.Error()) return err } return nil diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go new file mode 100644 index 0000000..50ee8e7 --- /dev/null +++ b/pkg/logger/logger.go @@ -0,0 +1,15 @@ +package logger + +import ( + "log/slog" + "os" +) + +func New() { + opts := &slog.HandlerOptions{ + Level: slog.LevelDebug, + AddSource: true, + } + logger := slog.New(slog.NewJSONHandler(os.Stdout, opts)) + slog.SetDefault(logger) +}