From f313a5f22116468583276c06cfaedcd269e1d561 Mon Sep 17 00:00:00 2001 From: Kukks Date: Wed, 3 Jun 2020 11:58:49 +0200 Subject: [PATCH] GreenField: Handle status codes, error models consistently --- .../Controllers/GreenField/GreenFieldUtils.cs | 26 ++ .../GreenField/LightningNodeApiController.cs | 35 +-- .../GreenField/PaymentRequestsController.cs | 2 +- .../GreenField/StoresController.cs | 10 +- .../Controllers/GreenField/UsersController.cs | 26 +- .../swagger.template.lightning.internal.json | 116 +++++-- .../v1/swagger.template.lightning.store.json | 295 +++++++++++------- 7 files changed, 316 insertions(+), 194 deletions(-) create mode 100644 BTCPayServer/Controllers/GreenField/GreenFieldUtils.cs diff --git a/BTCPayServer/Controllers/GreenField/GreenFieldUtils.cs b/BTCPayServer/Controllers/GreenField/GreenFieldUtils.cs new file mode 100644 index 000000000..4b330f5e3 --- /dev/null +++ b/BTCPayServer/Controllers/GreenField/GreenFieldUtils.cs @@ -0,0 +1,26 @@ +using System; +using Microsoft.AspNetCore.Mvc; + +namespace BTCPayServer.Controllers.GreenField +{ + public static class GreenFieldUtils + { + public static IActionResult GetValidationResponse(this ControllerBase controller) + { + return controller.UnprocessableEntity( new ValidationProblemDetails(controller.ModelState)); + } + public static IActionResult GetExceptionResponse(this ControllerBase controller, Exception e) + { + return GetGeneralErrorResponse(controller, e.Message); + } + + public static IActionResult GetGeneralErrorResponse(this ControllerBase controller, string error) + { + return controller.BadRequest( new ProblemDetails() + { + Detail = error + }); + } + + } +} diff --git a/BTCPayServer/Controllers/GreenField/LightningNodeApiController.cs b/BTCPayServer/Controllers/GreenField/LightningNodeApiController.cs index 225963cc9..89a62ae3c 100644 --- a/BTCPayServer/Controllers/GreenField/LightningNodeApiController.cs +++ b/BTCPayServer/Controllers/GreenField/LightningNodeApiController.cs @@ -44,8 +44,7 @@ namespace BTCPayServer.Controllers.GreenField } catch (Exception e) { - ModelState.AddModelError(string.Empty, e.Message); - return BadRequest(new ValidationProblemDetails(ModelState)); + return this.GetExceptionResponse(e); } } @@ -73,8 +72,7 @@ namespace BTCPayServer.Controllers.GreenField } catch (Exception e) { - ModelState.AddModelError(string.Empty, e.Message); - return BadRequest(new ValidationProblemDetails(ModelState)); + return this.GetExceptionResponse(e); } return Ok(); @@ -103,8 +101,7 @@ namespace BTCPayServer.Controllers.GreenField } catch (Exception e) { - ModelState.AddModelError(string.Empty, e.Message); - return BadRequest(new ValidationProblemDetails(ModelState)); + return this.GetExceptionResponse(e); } } @@ -157,13 +154,11 @@ namespace BTCPayServer.Controllers.GreenField return Ok(); } - ModelState.AddModelError(string.Empty, response.Result.ToString()); - return BadRequest(new ValidationProblemDetails(ModelState)); + return this.GetGeneralErrorResponse(response.Result.ToString()); } catch (Exception e) { - ModelState.AddModelError(string.Empty, e.Message); - return BadRequest(new ValidationProblemDetails(ModelState)); + return this.GetExceptionResponse(e); } } @@ -193,7 +188,7 @@ namespace BTCPayServer.Controllers.GreenField } catch (Exception) { - ModelState.AddModelError(nameof(lightningInvoice), "The BOLT11 invoice was invalid."); + ModelState.AddModelError(nameof(lightningInvoice.Invoice), "The BOLT11 invoice was invalid."); } if (CheckValidation(out var errorActionResult)) @@ -204,17 +199,13 @@ namespace BTCPayServer.Controllers.GreenField var result = await lightningClient.Pay(lightningInvoice.Invoice); switch (result.Result) { - case PayResult.Ok: - return Ok(); case PayResult.CouldNotFindRoute: - ModelState.AddModelError(nameof(lightningInvoice.Invoice), "Could not find route"); - break; + return this.GetGeneralErrorResponse("Could not find route"); case PayResult.Error: - ModelState.AddModelError(nameof(lightningInvoice.Invoice), result.ErrorDetail); - break; + return this.GetGeneralErrorResponse(result.ErrorDetail); } - return BadRequest(new ValidationProblemDetails(ModelState)); + return Ok(); } public virtual async Task GetInvoice(string cryptoCode, string id) @@ -237,8 +228,7 @@ namespace BTCPayServer.Controllers.GreenField } catch (Exception e) { - ModelState.AddModelError(string.Empty, e.Message); - return BadRequest(new ValidationProblemDetails(ModelState)); + return this.GetExceptionResponse(e); } } @@ -269,8 +259,7 @@ namespace BTCPayServer.Controllers.GreenField } catch (Exception e) { - ModelState.AddModelError(string.Empty, e.Message); - return BadRequest(new ValidationProblemDetails(ModelState)); + return this.GetExceptionResponse(e); } } @@ -292,7 +281,7 @@ namespace BTCPayServer.Controllers.GreenField { if (!ModelState.IsValid) { - result = BadRequest(new ValidationProblemDetails(ModelState)); + result = this.GetValidationResponse(); return true; } diff --git a/BTCPayServer/Controllers/GreenField/PaymentRequestsController.cs b/BTCPayServer/Controllers/GreenField/PaymentRequestsController.cs index 1dc79cef7..75e4539e2 100644 --- a/BTCPayServer/Controllers/GreenField/PaymentRequestsController.cs +++ b/BTCPayServer/Controllers/GreenField/PaymentRequestsController.cs @@ -137,7 +137,7 @@ namespace BTCPayServer.Controllers.GreenField if (!string.IsNullOrEmpty(data.CustomCSSLink) && data.CustomCSSLink.Length > 500) ModelState.AddModelError(nameof(data.CustomCSSLink), "CustomCSSLink is 500 chars max"); - return !ModelState.IsValid ? BadRequest(new ValidationProblemDetails(ModelState)) : null; + return !ModelState.IsValid ? this.GetValidationResponse() :null; } private static Client.Models.PaymentRequestData FromModel(PaymentRequestData data) diff --git a/BTCPayServer/Controllers/GreenField/StoresController.cs b/BTCPayServer/Controllers/GreenField/StoresController.cs index fe10705d1..89af4d935 100644 --- a/BTCPayServer/Controllers/GreenField/StoresController.cs +++ b/BTCPayServer/Controllers/GreenField/StoresController.cs @@ -47,7 +47,7 @@ namespace BTCPayServer.Controllers.GreenField [Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] [HttpDelete("~/api/v1/stores/{storeId}")] - public async Task RemoveStore(string storeId) + public async Task RemoveStore(string storeId) { var store = HttpContext.GetStoreData(); if (store == null) @@ -57,8 +57,8 @@ namespace BTCPayServer.Controllers.GreenField if (!_storeRepository.CanDeleteStores()) { - ModelState.AddModelError(string.Empty, "BTCPay Server is using a database server that does not allow you to remove stores."); - return BadRequest(new ValidationProblemDetails(ModelState)); + return this.GetGeneralErrorResponse( + "BTCPay Server is using a database server that does not allow you to remove stores."); } await _storeRepository.RemoveStore(storeId, _userManager.GetUserId(User)); return Ok(); @@ -194,8 +194,8 @@ namespace BTCPayServer.Controllers.GreenField ModelState.AddModelError(nameof(request.MonitoringExpiration), "InvoiceExpiration can only be between 10 and 34560 mins"); if(request.PaymentTolerance < 0 && request.PaymentTolerance > 100) ModelState.AddModelError(nameof(request.PaymentTolerance), "PaymentTolerance can only be between 0 and 100 percent"); - - return !ModelState.IsValid ? BadRequest(new ValidationProblemDetails(ModelState)) : null; + + return !ModelState.IsValid ? this.GetValidationResponse() : null; } } } diff --git a/BTCPayServer/Controllers/GreenField/UsersController.cs b/BTCPayServer/Controllers/GreenField/UsersController.cs index c31bf4ed6..8f3e1ac20 100644 --- a/BTCPayServer/Controllers/GreenField/UsersController.cs +++ b/BTCPayServer/Controllers/GreenField/UsersController.cs @@ -62,16 +62,21 @@ namespace BTCPayServer.Controllers.GreenField [AllowAnonymous] [HttpPost("~/api/v1/users")] - public async Task> CreateUser(CreateApplicationUserRequest request, CancellationToken cancellationToken = default) + public async Task CreateUser(CreateApplicationUserRequest request, CancellationToken cancellationToken = default) { if (request?.Email is null) - return BadRequest(CreateValidationProblem(nameof(request.Email), "Email is missing")); - if (!Validation.EmailValidator.IsEmail(request.Email)) + ModelState.AddModelError(nameof(request.Email), "Email is missing"); + if (!string.IsNullOrEmpty(request?.Email) && !Validation.EmailValidator.IsEmail(request.Email)) { - return BadRequest(CreateValidationProblem(nameof(request.Email), "Invalid email")); + ModelState.AddModelError(nameof(request.Email), "Invalid email"); } if (request?.Password is null) - return BadRequest(CreateValidationProblem(nameof(request.Password), "Password is missing")); + ModelState.AddModelError(nameof(request.Password), "Password is missing"); + + if (!ModelState.IsValid) + { + return this.GetValidationResponse(); + } var anyAdmin = (await _userManager.GetUsersInRoleAsync(Roles.ServerAdmin)).Any(); var policies = await _settingsRepository.GetSettingAsync() ?? new PoliciesSettings(); var isAuth = User.Identity.AuthenticationType == GreenFieldConstants.AuthenticationType; @@ -113,7 +118,7 @@ namespace BTCPayServer.Controllers.GreenField { ModelState.AddModelError(nameof(request.Password), error.Description); } - return BadRequest(new ValidationProblemDetails(ModelState)); + return this.GetValidationResponse(); } if (!isAdmin) { @@ -127,7 +132,7 @@ namespace BTCPayServer.Controllers.GreenField { ModelState.AddModelError(string.Empty, error.Description); } - return BadRequest(new ValidationProblemDetails(ModelState)); + return this.GetValidationResponse(); } if (request.IsAdministrator is true) @@ -152,13 +157,6 @@ namespace BTCPayServer.Controllers.GreenField return CreatedAtAction(string.Empty, user); } - private ValidationProblemDetails CreateValidationProblem(string propertyName, string errorMessage) - { - var modelState = new ModelStateDictionary(); - modelState.AddModelError(propertyName, errorMessage); - return new ValidationProblemDetails(modelState); - } - private static ApplicationUserData FromModel(ApplicationUser data) { return new ApplicationUserData() diff --git a/BTCPayServer/wwwroot/swagger/v1/swagger.template.lightning.internal.json b/BTCPayServer/wwwroot/swagger/v1/swagger.template.lightning.internal.json index e91204b8d..a7c99f680 100644 --- a/BTCPayServer/wwwroot/swagger/v1/swagger.template.lightning.internal.json +++ b/BTCPayServer/wwwroot/swagger/v1/swagger.template.lightning.internal.json @@ -30,7 +30,7 @@ } } }, - "400": { + "422": { "description": "A list of errors that occurred", "content": { "application/json": { @@ -40,8 +40,21 @@ } } }, + "400": { + "description": "An error occurred", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "security": [ @@ -77,8 +90,8 @@ "200": { "description": "Successfully connected" }, - "400": { - "description": "A list of errors that occurred when attempting to connect to the lightning node", + "422": { + "description": "A list of errors that occurred", "content": { "application/json": { "schema": { @@ -87,8 +100,21 @@ } } }, + "400": { + "description": "An error occurred", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "requestBody": { @@ -145,17 +171,20 @@ } }, "400": { - "description": "A list of errors that occurred", + "description": "An error occurred", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ValidationProblemDetails" + "$ref": "#/components/schemas/ProblemDetails" } } } }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "security": [ @@ -189,8 +218,8 @@ "200": { "description": "Successfully opened" }, - "400": { - "description": "A list of errors that occurred when attempting to connect to the lightning node", + "422": { + "description": "A list of errors that occurred", "content": { "application/json": { "schema": { @@ -199,8 +228,21 @@ } } }, + "400": { + "description": "An error occurred", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "requestBody": { @@ -253,18 +295,11 @@ } } }, - "400": { - "description": "A list of errors that occurred", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ValidationProblemDetails" - } - } - } - }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "security": [ @@ -316,18 +351,11 @@ } } }, - "400": { - "description": "A list of errors that occurred", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ValidationProblemDetails" - } - } - } - }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration or the specified invoice was not found " } }, "security": [ @@ -363,8 +391,8 @@ "200": { "description": "Successfully paid" }, - "400": { - "description": "A list of errors that occurred when attempting to pay the lightning invoice", + "422": { + "description": "A list of errors that occurred", "content": { "application/json": { "schema": { @@ -373,8 +401,21 @@ } } }, + "400": { + "description": "An error occurred", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "requestBody": { @@ -427,8 +468,8 @@ } } }, - "400": { - "description": "A list of errors that occurred when attempting to create the lightning invoice", + "422": { + "description": "A list of errors that occurred", "content": { "application/json": { "schema": { @@ -437,8 +478,21 @@ } } }, + "400": { + "description": "An error occurred", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "requestBody": { diff --git a/BTCPayServer/wwwroot/swagger/v1/swagger.template.lightning.store.json b/BTCPayServer/wwwroot/swagger/v1/swagger.template.lightning.store.json index dd3095b09..b6a813441 100644 --- a/BTCPayServer/wwwroot/swagger/v1/swagger.template.lightning.store.json +++ b/BTCPayServer/wwwroot/swagger/v1/swagger.template.lightning.store.json @@ -3,19 +3,10 @@ "/api/v1/stores/{storeId}/lightning/{cryptoCode}/info": { "get": { "tags": [ - "Lightning (Store)" + "Lightning (Internal Node)" ], "summary": "Get node information", "parameters": [ - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning node configuration you wish to use", - "schema": { - "type": "string" - } - }, { "name": "cryptoCode", "in": "path", @@ -24,6 +15,15 @@ "schema": { "type": "string" } + }, + { + "name": "storeId", + "in": "path", + "required": true, + "description": "The store id with the lightning-node configuration to query", + "schema": { + "type": "string" + } } ], "description": "View information about the lightning node", @@ -39,7 +39,7 @@ } } }, - "400": { + "422": { "description": "A list of errors that occurred", "content": { "application/json": { @@ -49,14 +49,27 @@ } } }, + "400": { + "description": "An error occurred", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "security": [ { "API Key": [ - "btcpay.store.canuselightningnode" + "btcpay.server.canuseinternallightningnode" ], "Basic": [] } @@ -66,19 +79,10 @@ "/api/v1/stores/{storeId}/lightning/{cryptoCode}/connect": { "post": { "tags": [ - "Lightning (Store)" + "Lightning (Internal Node)" ], "summary": "Connect to lightning node", "parameters": [ - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning node configuration you wish to use", - "schema": { - "type": "string" - } - }, { "name": "cryptoCode", "in": "path", @@ -87,6 +91,15 @@ "schema": { "type": "string" } + }, + { + "name": "storeId", + "in": "path", + "required": true, + "description": "The store id with the lightning-node configuration to query", + "schema": { + "type": "string" + } } ], "description": "Connect to another lightning node.", @@ -95,8 +108,8 @@ "200": { "description": "Successfully connected" }, - "400": { - "description": "A list of errors that occurred when attempting to connect to the lightning node", + "422": { + "description": "A list of errors that occurred", "content": { "application/json": { "schema": { @@ -105,8 +118,21 @@ } } }, + "400": { + "description": "An error occurred", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "requestBody": { @@ -122,7 +148,7 @@ "security": [ { "API Key": [ - "btcpay.store.canuselightningnode" + "btcpay.server.canuseinternallightningnode" ], "Basic": [] } @@ -132,19 +158,10 @@ "/api/v1/stores/{storeId}/lightning/{cryptoCode}/channels": { "get": { "tags": [ - "Lightning (Store)" + "Lightning (Internal Node)" ], "summary": "Get channels", "parameters": [ - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning node configuration you wish to use", - "schema": { - "type": "string" - } - }, { "name": "cryptoCode", "in": "path", @@ -153,6 +170,15 @@ "schema": { "type": "string" } + }, + { + "name": "storeId", + "in": "path", + "required": true, + "description": "The store id with the lightning-node configuration to query", + "schema": { + "type": "string" + } } ], "description": "View information about the current channels of the lightning node", @@ -172,23 +198,26 @@ } }, "400": { - "description": "A list of errors that occurred", + "description": "An error occurred", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ValidationProblemDetails" + "$ref": "#/components/schemas/ProblemDetails" } } } }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "security": [ { "API Key": [ - "btcpay.store.canuselightningnode" + "btcpay.server.canuseinternallightningnode" ], "Basic": [] } @@ -196,19 +225,10 @@ }, "post": { "tags": [ - "Lightning (Store)" + "Lightning (Internal Node)" ], "summary": "Open channel", "parameters": [ - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning node configuration you wish to use", - "schema": { - "type": "string" - } - }, { "name": "cryptoCode", "in": "path", @@ -217,6 +237,15 @@ "schema": { "type": "string" } + }, + { + "name": "storeId", + "in": "path", + "required": true, + "description": "The store id with the lightning-node configuration to query", + "schema": { + "type": "string" + } } ], "description": "Open a channel with another lightning node. You should connect to that node first.", @@ -225,8 +254,8 @@ "200": { "description": "Successfully opened" }, - "400": { - "description": "A list of errors that occurred when attempting to connect to the lightning node", + "422": { + "description": "A list of errors that occurred", "content": { "application/json": { "schema": { @@ -235,8 +264,21 @@ } } }, + "400": { + "description": "An error occurred", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "requestBody": { @@ -252,7 +294,7 @@ "security": [ { "API Key": [ - "btcpay.store.canuselightningnode" + "btcpay.server.canuseinternallightningnode" ], "Basic": [] } @@ -262,19 +304,10 @@ "/api/v1/stores/{storeId}/lightning/{cryptoCode}/address": { "get": { "tags": [ - "Lightning (Store)" + "Lightning (Internal Node)" ], "summary": "Get deposit address", "parameters": [ - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning node configuration you wish to use", - "schema": { - "type": "string" - } - }, { "name": "cryptoCode", "in": "path", @@ -283,6 +316,15 @@ "schema": { "type": "string" } + }, + { + "name": "storeId", + "in": "path", + "required": true, + "description": "The store id with the lightning-node configuration to query", + "schema": { + "type": "string" + } } ], "description": "Get an on-chain deposit address for the lightning node ", @@ -298,46 +340,31 @@ } } }, - "400": { - "description": "A list of errors that occurred", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ValidationProblemDetails" - } - } - } - }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "security": [ { "API Key": [ - "btcpay.store.canuselightningnode" + "btcpay.server.canuseinternallightningnode" ], "Basic": [] } ] } }, + "/api/v1/stores/{storeId}/lightning/{cryptoCode}/invoices/{id}": { "get": { "tags": [ - "Lightning (Store)" + "Lightning (Internal Node)" ], "summary": "Get invoice", "parameters": [ - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning node configuration you wish to use", - "schema": { - "type": "string" - } - }, { "name": "cryptoCode", "in": "path", @@ -347,6 +374,15 @@ "type": "string" } }, + { + "name": "storeId", + "in": "path", + "required": true, + "description": "The store id with the lightning-node configuration to query", + "schema": { + "type": "string" + } + }, { "name": "id", "in": "path", @@ -370,24 +406,17 @@ } } }, - "400": { - "description": "A list of errors that occurred", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ValidationProblemDetails" - } - } - } - }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration or the specified invoice was not found " } }, "security": [ { "API Key": [ - "btcpay.store.canuselightningnode" + "btcpay.server.canuseinternallightningnode" ], "Basic": [] } @@ -397,19 +426,10 @@ "/api/v1/stores/{storeId}/lightning/{cryptoCode}/invoices/pay": { "post": { "tags": [ - "Lightning (Store)" + "Lightning (Internal Node)" ], "summary": "Pay Lightning Invoice", "parameters": [ - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning node configuration you wish to use", - "schema": { - "type": "string" - } - }, { "name": "cryptoCode", "in": "path", @@ -418,6 +438,15 @@ "schema": { "type": "string" } + }, + { + "name": "storeId", + "in": "path", + "required": true, + "description": "The store id with the lightning-node configuration to query", + "schema": { + "type": "string" + } } ], "description": "Pay a lightning invoice.", @@ -426,8 +455,8 @@ "200": { "description": "Successfully paid" }, - "400": { - "description": "A list of errors that occurred when attempting to pay the lightning invoice", + "422": { + "description": "A list of errors that occurred", "content": { "application/json": { "schema": { @@ -436,8 +465,21 @@ } } }, + "400": { + "description": "An error occurred", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "requestBody": { @@ -453,7 +495,7 @@ "security": [ { "API Key": [ - "btcpay.store.canuselightningnode" + "btcpay.server.canuseinternallightningnode" ], "Basic": [] } @@ -463,19 +505,10 @@ "/api/v1/stores/{storeId}/lightning/{cryptoCode}/invoices": { "post": { "tags": [ - "Lightning (Store)" + "Lightning (Internal Node)" ], "summary": "Create lightning invoice", "parameters": [ - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning node configuration you wish to use", - "schema": { - "type": "string" - } - }, { "name": "cryptoCode", "in": "path", @@ -484,6 +517,15 @@ "schema": { "type": "string" } + }, + { + "name": "storeId", + "in": "path", + "required": true, + "description": "The store id with the lightning-node configuration to query", + "schema": { + "type": "string" + } } ], "description": "Create a lightning invoice.", @@ -499,8 +541,8 @@ } } }, - "400": { - "description": "A list of errors that occurred when attempting to create the lightning invoice", + "422": { + "description": "A list of errors that occurred", "content": { "application/json": { "schema": { @@ -509,8 +551,21 @@ } } }, + "400": { + "description": "An error occurred", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, "403": { "description": "If you are authenticated but forbidden" + }, + "404": { + "description": "The lightning node configuration was not found" } }, "requestBody": { @@ -526,7 +581,7 @@ "security": [ { "API Key": [ - "btcpay.store.cancreatelightninginvoice" + "btcpay.server.cancreatelightninginvoiceinternalnode" ], "Basic": [] } @@ -536,7 +591,7 @@ }, "tags": [ { - "name": "Lightning (Store)" + "name": "Lightning (Internal Node)" } ] }