From 61c8d8a53c4c522616ed2fb7e9a418b469be21b5 Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Fri, 18 Mar 2022 18:03:32 +0100 Subject: [PATCH 1/3] Add method to fetch user by login --- lib/service/user.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/service/user.go b/lib/service/user.go index 766a3bb..e8bc4ac 100644 --- a/lib/service/user.go +++ b/lib/service/user.go @@ -65,6 +65,16 @@ func (svc *LndhubService) FindUser(ctx context.Context, userId int64) (*models.U return &user, nil } +func (svc *LndhubService) FindUserByLogin(ctx context.Context, login string) (*models.User, error) { + var user models.User + + err := svc.DB.NewSelect().Model(&user).Where("login = ?", login).Limit(1).Scan(ctx) + if err != nil { + return &user, err + } + return &user, nil +} + func (svc *LndhubService) CurrentUserBalance(ctx context.Context, userId int64) (int64, error) { var balance int64 From 2d34317acb10199833e6cf227244a2f9eb75fefd Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Fri, 18 Mar 2022 18:03:46 +0100 Subject: [PATCH 2/3] Add and register invoice endpoint --- controllers/invoice.ctrl.go | 59 +++++++++++++++++++++++++++++++++++++ main.go | 1 + 2 files changed, 60 insertions(+) create mode 100644 controllers/invoice.ctrl.go diff --git a/controllers/invoice.ctrl.go b/controllers/invoice.ctrl.go new file mode 100644 index 0000000..cd06d96 --- /dev/null +++ b/controllers/invoice.ctrl.go @@ -0,0 +1,59 @@ +package controllers + +import ( + "net/http" + + "github.com/getAlby/lndhub.go/lib/responses" + "github.com/getAlby/lndhub.go/lib/service" + "github.com/getsentry/sentry-go" + "github.com/labstack/echo/v4" +) + +// InvoiceController : Add invoice controller struct +type InvoiceController struct { + svc *service.LndhubService +} + +func NewInvoiceController(svc *service.LndhubService) *InvoiceController { + return &InvoiceController{svc: svc} +} + +// Invoice : Invoice Controller +func (controller *InvoiceController) Invoice(c echo.Context) error { + user, err := controller.svc.FindUserByLogin(c.Request().Context(), c.Param("user_login")) + if err != nil { + c.Logger().Errorf("Failed to find user by login: login %v error %v", c.Param("user_login"), err) + return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) + } + + var body AddInvoiceRequestBody + + if err := c.Bind(&body); err != nil { + c.Logger().Errorf("Failed to load invoice request body: %v", err) + return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) + } + + if err := c.Validate(&body); err != nil { + c.Logger().Errorf("Invalid invoice request body: %v", err) + return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) + } + + amount, err := controller.svc.ParseInt(body.Amount) + if err != nil { + return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) + } + c.Logger().Infof("Adding invoice: user_id=%v memo=%s value=%v description_hash=%s", user.ID, body.Memo, amount, body.DescriptionHash) + + invoice, err := controller.svc.AddIncomingInvoice(c.Request().Context(), user.ID, amount, body.Memo, body.DescriptionHash) + if err != nil { + c.Logger().Errorf("Error creating invoice: %v", err) + sentry.CaptureException(err) + return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) + } + responseBody := AddInvoiceResponseBody{} + responseBody.RHash = invoice.RHash + responseBody.PaymentRequest = invoice.PaymentRequest + responseBody.PayReq = invoice.PaymentRequest + + return c.JSON(http.StatusOK, &responseBody) +} diff --git a/main.go b/main.go index a54f6c0..f7bc90a 100644 --- a/main.go +++ b/main.go @@ -128,6 +128,7 @@ func main() { // Public endpoints for account creation and authentication e.POST("/auth", controllers.NewAuthController(svc).Auth) e.POST("/create", controllers.NewCreateUserController(svc).CreateUser, strictRateLimitMiddleware) + e.POST("/invoice/:user_login", controllers.NewInvoiceController(svc).Invoice, middleware.RateLimiter(middleware.NewRateLimiterMemoryStore(rate.Limit(c.DefaultRateLimit)))) // Secured endpoints which require a Authorization token (JWT) secured := e.Group("", tokens.Middleware(c.JWTSecret), middleware.RateLimiter(middleware.NewRateLimiterMemoryStore(rate.Limit(c.DefaultRateLimit)))) From 88d7d21aa103bde07ee514484c955bdedc3ca71b Mon Sep 17 00:00:00 2001 From: Stefan Kostic Date: Fri, 18 Mar 2022 18:06:39 +0100 Subject: [PATCH 3/3] Add common add invoice ctrl method --- controllers/addinvoice.ctrl.go | 8 ++++++-- controllers/invoice.ctrl.go | 32 +------------------------------- 2 files changed, 7 insertions(+), 33 deletions(-) diff --git a/controllers/addinvoice.ctrl.go b/controllers/addinvoice.ctrl.go index 04a7b01..d15b19b 100644 --- a/controllers/addinvoice.ctrl.go +++ b/controllers/addinvoice.ctrl.go @@ -33,6 +33,10 @@ type AddInvoiceResponseBody struct { // AddInvoice : Add invoice Controller func (controller *AddInvoiceController) AddInvoice(c echo.Context) error { userID := c.Get("UserID").(int64) + return AddInvoice(c, controller.svc, userID) +} + +func AddInvoice(c echo.Context, svc *service.LndhubService, userID int64) error { var body AddInvoiceRequestBody if err := c.Bind(&body); err != nil { @@ -45,13 +49,13 @@ func (controller *AddInvoiceController) AddInvoice(c echo.Context) error { return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) } - amount, err := controller.svc.ParseInt(body.Amount) + amount, err := svc.ParseInt(body.Amount) if err != nil { return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) } c.Logger().Infof("Adding invoice: user_id=%v memo=%s value=%v description_hash=%s", userID, body.Memo, amount, body.DescriptionHash) - invoice, err := controller.svc.AddIncomingInvoice(c.Request().Context(), userID, amount, body.Memo, body.DescriptionHash) + invoice, err := svc.AddIncomingInvoice(c.Request().Context(), userID, amount, body.Memo, body.DescriptionHash) if err != nil { c.Logger().Errorf("Error creating invoice: %v", err) sentry.CaptureException(err) diff --git a/controllers/invoice.ctrl.go b/controllers/invoice.ctrl.go index cd06d96..f0a720b 100644 --- a/controllers/invoice.ctrl.go +++ b/controllers/invoice.ctrl.go @@ -5,7 +5,6 @@ import ( "github.com/getAlby/lndhub.go/lib/responses" "github.com/getAlby/lndhub.go/lib/service" - "github.com/getsentry/sentry-go" "github.com/labstack/echo/v4" ) @@ -26,34 +25,5 @@ func (controller *InvoiceController) Invoice(c echo.Context) error { return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) } - var body AddInvoiceRequestBody - - if err := c.Bind(&body); err != nil { - c.Logger().Errorf("Failed to load invoice request body: %v", err) - return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) - } - - if err := c.Validate(&body); err != nil { - c.Logger().Errorf("Invalid invoice request body: %v", err) - return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) - } - - amount, err := controller.svc.ParseInt(body.Amount) - if err != nil { - return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) - } - c.Logger().Infof("Adding invoice: user_id=%v memo=%s value=%v description_hash=%s", user.ID, body.Memo, amount, body.DescriptionHash) - - invoice, err := controller.svc.AddIncomingInvoice(c.Request().Context(), user.ID, amount, body.Memo, body.DescriptionHash) - if err != nil { - c.Logger().Errorf("Error creating invoice: %v", err) - sentry.CaptureException(err) - return c.JSON(http.StatusBadRequest, responses.BadArgumentsError) - } - responseBody := AddInvoiceResponseBody{} - responseBody.RHash = invoice.RHash - responseBody.PaymentRequest = invoice.PaymentRequest - responseBody.PayReq = invoice.PaymentRequest - - return c.JSON(http.StatusOK, &responseBody) + return AddInvoice(c, controller.svc, user.ID) }