Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
361 changes: 199 additions & 162 deletions api/TwoWeeksReady/EmergencyKits/BaseKitsApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using AzureFunctions.OidcAuthentication;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Documents;
Expand All @@ -13,190 +14,226 @@
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using AzureFunctions.OidcAuthentication;
using TwoWeeksReady.Common.EmergencyKits;
using TwoWeeksReady.Authorization;
using TwoWeeksReady.Common.EmergencyKits;

namespace TwoWeeksReady.EmergencyKits
{
public class BaseKitsApi
{
private readonly IApiAuthentication _apiAuthentication;

public BaseKitsApi(IApiAuthentication apiAuthentication)
public class BaseKitsApi
{
_apiAuthentication = apiAuthentication;
}
private readonly IApiAuthentication _apiAuthentication;

[FunctionName("basekits")]
public async Task<IActionResult> GetKits(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
public BaseKitsApi(IApiAuthentication apiAuthentication)
{
_apiAuthentication = apiAuthentication;
}

[FunctionName("basekits")]
public async Task<IActionResult> GetKits(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
HttpRequest req,
[CosmosDB( databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
[CosmosDB( databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
DocumentClient client,
ILogger log)
{
ILogger log)
{

log.LogInformation($"Getting list of base kits");
var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);
if (authorizationResult.Failed)
{
log.LogWarning(authorizationResult.FailureReason);
return new UnauthorizedResult();
}
Uri collectionUri = UriFactory.CreateDocumentCollectionUri("2wr", "basekits");
var query = client.CreateDocumentQuery<BaseKit>(collectionUri, new FeedOptions { EnableCrossPartitionQuery = true })
.AsDocumentQuery();

var baseKits = new List<BaseKit>();
while (query.HasMoreResults)
{
var result = await query.ExecuteNextAsync<BaseKit>();
baseKits.AddRange(result);
}

return new OkObjectResult(baseKits);
}
log.LogInformation($"Getting list of base kits");
var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);
if (authorizationResult.Failed)
{
log.LogWarning(authorizationResult.FailureReason);
return new UnauthorizedResult();
}
Uri collectionUri = UriFactory.CreateDocumentCollectionUri("2wr", "basekits");
var query = client.CreateDocumentQuery<BaseKit>(collectionUri, new FeedOptions { EnableCrossPartitionQuery = true })
.AsDocumentQuery();

var baseKits = new List<BaseKit>();
while (query.HasMoreResults)
{
var result = await query.ExecuteNextAsync<BaseKit>();
baseKits.AddRange(result);
}

return new OkObjectResult(baseKits);
}

[FunctionName("basekit-create")]
public async Task<IActionResult> CreateBaseKit(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)]
HttpRequest req,
[CosmosDB(databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
DocumentClient client,
ILogger log)
{

log.LogInformation($"Creating a base kit");
var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);
if (authorizationResult.Failed)
[FunctionName("basekit-by-id")]
public async Task<IActionResult> GetKit(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "basekit-by-id/{id}")]
HttpRequest req,
string id,
[CosmosDB( databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
DocumentClient client,
ILogger log)
{
log.LogWarning(authorizationResult.FailureReason);
return new UnauthorizedResult();
var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);
if (authorizationResult.Failed)
{
log.LogWarning(authorizationResult.FailureReason);
return new UnauthorizedResult();
}

if (String.IsNullOrWhiteSpace(id))
{
return new BadRequestObjectResult("Kit id was not specified.");
}

log.LogInformation($"Getting single base kit");
Uri collectionUri = UriFactory.CreateDocumentCollectionUri("2wr", "basekits");
var baseKit = client.CreateDocumentQuery<BaseKit>(collectionUri, new FeedOptions { EnableCrossPartitionQuery = true })
.Where(b => b.Id == id).FirstOrDefault();

if (baseKit == null)
{
log.LogWarning($"Kit: {id} not found.");
return new BadRequestObjectResult("Kit not found.");
}

return new OkObjectResult(baseKit);
}

if (!authorizationResult.IsInRole(Roles.Admin))
[FunctionName("basekit-create")]
public async Task<IActionResult> CreateBaseKit(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)]
HttpRequest req,
[CosmosDB(databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
DocumentClient client,
ILogger log)
{
log.LogWarning($"User is not in the {Roles.Admin} role");
return new UnauthorizedResult();
}

log.LogInformation($"Creating a base kit");
var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);
if (authorizationResult.Failed)
{
log.LogWarning(authorizationResult.FailureReason);
return new UnauthorizedResult();
}

if (!authorizationResult.IsInRole(Roles.Admin))
{
log.LogWarning($"User is not in the {Roles.Admin} role");
return new UnauthorizedResult();
}

var content = await new StreamReader(req.Body).ReadToEndAsync();
var newBaseKit = JsonConvert.DeserializeObject<BaseKit>(content);
newBaseKit.Id = Guid.NewGuid().ToString();
if(newBaseKit.Items.Count > 0)
{
newBaseKit.Items.ForEach(ki => {ki.Id=Guid.NewGuid().ToString();});
}
var newBaseKit = JsonConvert.DeserializeObject<BaseKit>(content);
newBaseKit.Id = Guid.NewGuid().ToString();
if (newBaseKit.Items.Count > 0)
{
newBaseKit.Items.ForEach(ki => { ki.Id = Guid.NewGuid().ToString(); });
}

Uri collectionUri = UriFactory.CreateDocumentCollectionUri("2wr", "basekits");
Document document = await client.CreateDocumentAsync(collectionUri, newBaseKit);
return new OkObjectResult(newBaseKit);
}
Uri collectionUri = UriFactory.CreateDocumentCollectionUri("2wr", "basekits");
Document document = await client.CreateDocumentAsync(collectionUri, newBaseKit);

return new OkObjectResult(newBaseKit);
}

[FunctionName("basekit-update")]
public async Task<IActionResult> UpdateBaseKit(
[HttpTrigger(AuthorizationLevel.Anonymous, "put", Route = null)]
[FunctionName("basekit-update")]
public async Task<IActionResult> UpdateBaseKit(
[HttpTrigger(AuthorizationLevel.Anonymous, "put", Route = null)]
HttpRequest req,
[CosmosDB( databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
[CosmosDB( databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
DocumentClient client,
ILogger log)
{

log.LogInformation($"Updating a base kit");
var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);
if (authorizationResult.Failed)
{
log.LogWarning(authorizationResult.FailureReason);
return new UnauthorizedResult();
}

if (!authorizationResult.IsInRole(Roles.Admin))
{
log.LogWarning($"User is not in the {Roles.Admin} role");
return new UnauthorizedResult();
}

var content = await new StreamReader(req.Body).ReadToEndAsync();
var kit = JsonConvert.DeserializeObject<BaseKit>(content);

//verify existing document (not upserting as this is an update only function)
var baseKitUri = UriFactory.CreateDocumentUri("2wr", "basekits", kit.Id);
BaseKit existingKit = null;
try
{
existingKit = (await client.ReadDocumentAsync<BaseKit>(baseKitUri, new RequestOptions{PartitionKey = new PartitionKey(kit.Id)})).Document;
}
catch(DocumentClientException ex)
{
if(ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
log.LogWarning($"Base Kit: {kit.Id} not found.");
return new BadRequestObjectResult("Base Kit not found.");
}
}

if(kit.Items.Count > 0)
{
kit.Items.ForEach(ki => {
if(String.IsNullOrWhiteSpace(ki.Id)){
ki.Id=Guid.NewGuid().ToString();
}
});
}
Document document = await client.ReplaceDocumentAsync(baseKitUri, kit, new RequestOptions{PartitionKey = new PartitionKey(existingKit.Id)});

return new OkObjectResult(kit);
}

[FunctionName("basekit-delete")]
public async Task<IActionResult> DeleteBaseKit(
[HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "basekit-delete/{id}")]
ILogger log)
{

log.LogInformation($"Updating a base kit");
var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);
if (authorizationResult.Failed)
{
log.LogWarning(authorizationResult.FailureReason);
return new UnauthorizedResult();
}

if (!authorizationResult.IsInRole(Roles.Admin))
{
log.LogWarning($"User is not in the {Roles.Admin} role");
return new UnauthorizedResult();
}

var content = await new StreamReader(req.Body).ReadToEndAsync();
var kit = JsonConvert.DeserializeObject<BaseKit>(content);

//verify existing document (not upserting as this is an update only function)
var baseKitUri = UriFactory.CreateDocumentUri("2wr", "basekits", kit.Id);
BaseKit existingKit = null;
try
{
existingKit = (await client.ReadDocumentAsync<BaseKit>(baseKitUri, new RequestOptions { PartitionKey = new PartitionKey(kit.Id) })).Document;
}
catch (DocumentClientException ex)
{
if (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
log.LogWarning($"Base Kit: {kit.Id} not found.");
return new BadRequestObjectResult("Base Kit not found.");
}
}

if (kit.Items.Count > 0)
{
kit.Items.ForEach(ki =>
{
if (String.IsNullOrWhiteSpace(ki.Id))
{
ki.Id = Guid.NewGuid().ToString();
}
});
}
Document document = await client.ReplaceDocumentAsync(baseKitUri, kit, new RequestOptions { PartitionKey = new PartitionKey(existingKit.Id) });

return new OkObjectResult(kit);
}

[FunctionName("basekit-delete")]
public async Task<IActionResult> DeleteBaseKit(
[HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "basekit-delete/{id}")]
HttpRequest req,
string id,
[CosmosDB( databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
string id,
[CosmosDB( databaseName: "2wr", collectionName: "basekits", ConnectionStringSetting = "CosmosDBConnection")]
DocumentClient client,
ILogger log)
{
log.LogInformation($"Deleting a base kit");
var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);
if (authorizationResult.Failed)
{
log.LogWarning(authorizationResult.FailureReason);
return new UnauthorizedResult();
}
if (!authorizationResult.IsInRole(Roles.Admin))
{
log.LogWarning($"User is not in the {Roles.Admin} role");
return new UnauthorizedResult();
}
ILogger log)
{

log.LogInformation($"Deleting a base kit");
var authorizationResult = await _apiAuthentication.AuthenticateAsync(req.Headers);
if (authorizationResult.Failed)
{
log.LogWarning(authorizationResult.FailureReason);
return new UnauthorizedResult();
}
if (!authorizationResult.IsInRole(Roles.Admin))
{
log.LogWarning($"User is not in the {Roles.Admin} role");
return new UnauthorizedResult();
}

if (String.IsNullOrWhiteSpace(id))
{
return new BadRequestObjectResult("Base Kit id was not specified.");
}

//verify existing document
var baseKitUri = UriFactory.CreateDocumentUri("2wr", "basekits", id);
BaseKit existingKit = null;
try
{
existingKit = (await client.ReadDocumentAsync<BaseKit>(baseKitUri, new RequestOptions{PartitionKey = new PartitionKey(id)})).Document;
}
catch(DocumentClientException ex)
{
if(ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
log.LogWarning($"Base Kit: {id} not found.");
return new BadRequestObjectResult("Base Kit not found.");
}
}
Document document = await client.DeleteDocumentAsync(baseKitUri, new RequestOptions{PartitionKey = new PartitionKey(existingKit.Id)});
return new OkObjectResult(true);
}

}
{
return new BadRequestObjectResult("Base Kit id was not specified.");
}

//verify existing document
var baseKitUri = UriFactory.CreateDocumentUri("2wr", "basekits", id);
BaseKit existingKit = null;
try
{
existingKit = (await client.ReadDocumentAsync<BaseKit>(baseKitUri, new RequestOptions { PartitionKey = new PartitionKey(id) })).Document;
}
catch (DocumentClientException ex)
{
if (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
log.LogWarning($"Base Kit: {id} not found.");
return new BadRequestObjectResult("Base Kit not found.");
}
}

Document document = await client.DeleteDocumentAsync(baseKitUri, new RequestOptions { PartitionKey = new PartitionKey(existingKit.Id) });
return new OkObjectResult(true);
}

}
}