Greenfield: Add update store API (#1495)

* Greenfield: Add update store API

* update update store model

* change greenfield controller name to stop conflict
This commit is contained in:
Andrew Camilleri
2020-04-27 13:13:20 +02:00
committed by GitHub
parent b600e5777e
commit c784144a07
7 changed files with 127 additions and 8 deletions

View File

@@ -37,5 +37,15 @@ namespace BTCPayServer.Client
return await HandleResponse<StoreData>(response);
}
public virtual async Task<StoreData> UpdateStore(string storeId, UpdateStoreRequest request, CancellationToken token = default)
{
if (request == null)
throw new ArgumentNullException(nameof(request));
if (storeId == null)
throw new ArgumentNullException(nameof(storeId));
var response = await _httpClient.SendAsync(CreateHttpRequest($"api/v1/stores/{storeId}", bodyPayload: request, method: HttpMethod.Put), token);
return await HandleResponse<StoreData>(response);
}
}
}

View File

@@ -0,0 +1,10 @@
namespace BTCPayServer.Client.Models
{
public abstract class StoreBaseData
{
/// <summary>
/// the name of the store
/// </summary>
public string Name { get; set; }
}
}

View File

@@ -1,14 +1,11 @@
namespace BTCPayServer.Client.Models
{
public class StoreData
public class StoreData: StoreBaseData
{
/// <summary>
/// the id of the store
/// </summary>
public string Id { get; set; }
/// <summary>
/// the name of the store
/// </summary>
public string Name { get; set; }
}
}

View File

@@ -0,0 +1,6 @@
namespace BTCPayServer.Client.Models
{
public class UpdateStoreRequest: StoreBaseData
{
}
}

View File

@@ -172,6 +172,11 @@ namespace BTCPayServer.Tests
//create store
var newStore = await client.CreateStore(new CreateStoreRequest() {Name = "A"});
//update store
var updatedStore = await client.UpdateStore(newStore.Id, new UpdateStoreRequest() {Name = "B"});
Assert.Equal("B", updatedStore.Name);
Assert.Equal("B", (await client.GetStore(newStore.Id)).Name);
//list stores
var stores = await client.GetStores();
var storeIds = stores.Select(data => data.Id);
@@ -194,7 +199,6 @@ namespace BTCPayServer.Tests
});
Assert.Single(await client.GetStores());
newStore = await client.CreateStore(new CreateStoreRequest() {Name = "A"});
var scopedClient = await user.CreateClient(Permission.Create(Policies.CanViewStoreSettings, user.StoreId).ToString());
Assert.Single(await scopedClient.GetStores());

View File

@@ -15,12 +15,12 @@ namespace BTCPayServer.Controllers.GreenField
{
[ApiController]
[Authorize(AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
public class StoresController : ControllerBase
public class GreenFieldController : ControllerBase
{
private readonly StoreRepository _storeRepository;
private readonly UserManager<ApplicationUser> _userManager;
public StoresController(StoreRepository storeRepository, UserManager<ApplicationUser> userManager)
public GreenFieldController(StoreRepository storeRepository, UserManager<ApplicationUser> userManager)
{
_storeRepository = storeRepository;
_userManager = userManager;
@@ -74,6 +74,23 @@ namespace BTCPayServer.Controllers.GreenField
return Ok(FromModel(store));
}
[Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
[HttpPut("~/api/v1/stores/{storeId}")]
public async Task<ActionResult> UpdateStore(string storeId, UpdateStoreRequest request)
{
var store = HttpContext.GetStoreData();
if (store == null)
{
return NotFound();
}
if (request?.Name is null)
return BadRequest(CreateValidationProblem(nameof(request.Name), "Name is missing"));
store.StoreName = request.Name;
await _storeRepository.UpdateStore(store);
return Ok(FromModel(store));
}
private static Client.Models.StoreData FromModel(Data.StoreData data)
{
return new Client.Models.StoreData()

View File

@@ -136,6 +136,81 @@
}
]
},
"put": {
"tags": [
"Stores"
],
"summary": "Update store",
"parameters": [
{
"name": "storeId",
"in": "path",
"required": true,
"description": "The store to update",
"schema": {
"type": "string"
}
}
],
"description": "Update the specified store",
"requestBody": {
"x-name": "request",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"description": "The name of the store",
"nullable": false
}
}
}
}
},
"required": true,
"x-position": 1
},
"operationId": "Stores_UpdateStore",
"responses": {
"200": {
"description": "updated specified store",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StoreData"
}
}
}
},
"400": {
"description": "A list of errors that occurred when updating the store",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ValidationProblemDetails"
}
}
}
},
"403": {
"description": "If you are authenticated but forbidden to update the specified store"
},
"404": {
"description": "The key is not found for this store"
}
},
"security": [
{
"API Key": [
"btcpay.store.canmodifystoresettings"
],
"Basic": []
}
]
},
"delete": {
"tags": [
"Stores"