dev
This commit is contained in:
parent
d42c9b1d44
commit
1a2cbfb6cd
@ -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)
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
@ -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)
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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))
|
||||
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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 = `
|
||||
|
@ -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(`<!DOCTYPE html>
|
||||
<html>
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
15
pkg/logger/logger.go
Normal file
15
pkg/logger/logger.go
Normal file
@ -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)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user