Skip to content
Closed
Show file tree
Hide file tree
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
42 changes: 41 additions & 1 deletion ResourceInformationV2.Function/Events.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,61 @@
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Attributes;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using ResourceInformationV2.Data.DataHelpers;
using ResourceInformationV2.Data.DataModels;
using ResourceInformationV2.Function.Helper;
using ResourceInformationV2.Search.Getters;
using ResourceInformationV2.Search.JsonThinModels;
using ResourceInformationV2.Search.Models;
using ResourceInformationV2.Search.Setters;
using System.Net;

namespace ResourceInformationV2.Function;

public class Events {
private readonly EventGetter _eventGetter;
private readonly ILogger<Events> _logger;
private readonly ApiHelper _apiHelper;
private readonly LogHelper _logHelper;
private readonly EventSetter _eventSetter;

public Events(ILogger<Events> logger, EventGetter eventGetter) {
public Events(ILogger<Events> logger, EventGetter eventGetter, ApiHelper apiHelper, LogHelper logHelper, EventSetter eventSetter) {
_logger = logger;
_eventGetter = eventGetter;
_apiHelper = apiHelper;
_logHelper = logHelper;
_eventSetter = eventSetter;
}

[Function("EventLoad")]
[OpenApiOperation(operationId: "EventLoad", tags: "Events", Description = "Load an event by API. This will be put in draft mode unless instructed by the Administration application.")]
[OpenApiParameter(name: "ilw-key", In = ParameterLocation.Header, Required = true, Type = typeof(string), Description = "The API Key.")]
[OpenApiRequestBody(contentType: "application/json", bodyType: typeof(Event), Required = true, Description = "A json implementation of an event. An ID will be generated automatically if it isn't created, and it will error out if the ID doesn't start with the source plus a '-' value.")]
[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "text/plain", bodyType: typeof(string), Description = "The ID of the event that was loaded.")]
public async Task<HttpResponseData> Load([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) {
try {
_logger.LogInformation("Called EventLoad.");
var requestHelper = RequestHelperFactory.Create();
requestHelper.Initialize(req);
var key = requestHelper.GetCodeFromHeader(req);
var item = await req.ReadFromJsonAsync<Event>() ?? new Event();
var results = await _apiHelper.CheckApi(item.Source, key);
if (!results.allowApi) {
throw new Exception($"API Key in header ilw-key is needed, was sent '{key}'");
}
item.Prepare();
var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync(results.forceDraft
? await _eventSetter.SetItemWithDraft(item)
: await _eventSetter.SetItem(item));
await _logHelper.Log(CategoryType.Event, FieldType.None, "API", item.Source, item, "API Load",
EmailType.OnSubmission);
return response;
} catch (Exception ex) {
var response = req.CreateResponse(HttpStatusCode.InternalServerError);
await response.WriteAsJsonAsync(ex.Message);
return response;
}
}

[Function("EventFragment")]
Expand Down
85 changes: 59 additions & 26 deletions ResourceInformationV2.Function/Faqs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,41 +4,76 @@
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Attributes;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using ResourceInformationV2.Data.DataHelpers;
using ResourceInformationV2.Data.DataModels;
using ResourceInformationV2.Function.Helper;
using ResourceInformationV2.Search.Getters;
using ResourceInformationV2.Search.JsonThinModels;
using ResourceInformationV2.Search.Models;
using ResourceInformationV2.Search.Setters;
using System.Net;

namespace ResourceInformationV2.Function;

public class Faqs
{
public class Faqs {
private readonly FaqGetter _faqGetter;
private readonly ILogger<Faqs> _logger;

public Faqs(ILogger<Faqs> logger, FaqGetter faqGetter)
{
private readonly ApiHelper _apiHelper;
private readonly LogHelper _logHelper;
private readonly FaqSetter _faqSetter;
public Faqs(ILogger<Faqs> logger, FaqGetter faqGetter, ApiHelper apiHelper, LogHelper logHelper, FaqSetter faqSetter) {
_logger = logger;
_faqGetter = faqGetter;
_apiHelper = apiHelper;
_logHelper = logHelper;
_faqSetter = faqSetter;
}

[Function("FaqLoad")]
[OpenApiOperation(operationId: "FaqLoad", tags: "FAQs", Description = "Load a FAQ by API. This will be put in draft mode unless instructed by the Administration application.")]
[OpenApiParameter(name: "ilw-key", In = ParameterLocation.Header, Required = true, Type = typeof(string), Description = "The API Key.")]
[OpenApiRequestBody(contentType: "application/json", bodyType: typeof(FaqItem), Required = true, Description = "A json implementation of a FAQ. An ID will be generated automatically if it isn't created, and it will error out if the ID doesn't start with the source plus a '-' value.")]
[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "text/plain", bodyType: typeof(string), Description = "The ID of the FAQ that was loaded.")]
public async Task<HttpResponseData> Load([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) {
try {
_logger.LogInformation("Called FaqLoad.");
var requestHelper = RequestHelperFactory.Create();
requestHelper.Initialize(req);
var key = requestHelper.GetCodeFromHeader(req);
var item = await req.ReadFromJsonAsync<FaqItem>() ?? new FaqItem();
var results = await _apiHelper.CheckApi(item.Source, key);
if (!results.allowApi) {
throw new Exception($"API Key in header ilw-key is needed, was sent '{key}'");
}
item.Prepare();
var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync(results.forceDraft
? await _faqSetter.SetItemWithDraft(item)
: await _faqSetter.SetItem(item));
await _logHelper.Log(CategoryType.Faq, FieldType.None, "API", item.Source, item, "API Load", EmailType.OnSubmission);
return response;
} catch (Exception ex) {
var response = req.CreateResponse(HttpStatusCode.InternalServerError);
await response.WriteAsJsonAsync(ex.Message);
return response;
}
}

[Function("FaqFragment")]
[OpenApiOperation(operationId: "FaqFragment", tags: "FAQs", Description = "Get a specific FAQ by a URL-friendly string.")]
[OpenApiParameter(name: "source", In = ParameterLocation.Query, Required = true, Type = typeof(string), Description = "The **source** parameter given to you, can use 'test' to test.")]
[OpenApiParameter(name: "fragment", In = ParameterLocation.Query, Required = true, Type = typeof(string), Description = "The fragment. If multiple items have the same fragment, this will return the first one it finds.")]
[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "text/plain", bodyType: typeof(FaqItem), Description = "The FAQ. If the FAQ is not found, it will be blank.")]
public async Task<HttpResponseData> GetByFragment([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
{
public async Task<HttpResponseData> GetByFragment([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) {
_logger.LogInformation("Called FaqFragment.");
RequestHelper requestHelper = RequestHelperFactory.Create();
var requestHelper = RequestHelperFactory.Create();
requestHelper.Initialize(req);
var source = requestHelper.GetRequest(req, "source");
var fragment = requestHelper.GetRequest(req, "fragment");
requestHelper.Validate();
FaqItem returnItem = await _faqGetter.GetItem(source, fragment);
var returnItem = await _faqGetter.GetItem(source, fragment);
returnItem.PrepareForExport();
HttpResponseData response = req.CreateResponse(HttpStatusCode.OK);
var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync(returnItem);
return response;
}
Expand All @@ -47,16 +82,15 @@ public async Task<HttpResponseData> GetByFragment([HttpTrigger(AuthorizationLeve
[OpenApiOperation(operationId: "Faq", tags: "FAQs", Description = "Get a specific FAQ.")]
[OpenApiParameter(name: "id", In = ParameterLocation.Query, Required = true, Type = typeof(string), Description = "The id of the item (the id includes the source).")]
[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "text/plain", bodyType: typeof(FaqItem), Description = "The FAQ. If the FAQ is not found, it will be blank.")]
public async Task<HttpResponseData> GetById([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
{
public async Task<HttpResponseData> GetById([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) {
_logger.LogInformation("Called Faq.");
RequestHelper requestHelper = RequestHelperFactory.Create();
var requestHelper = RequestHelperFactory.Create();
requestHelper.Initialize(req);
var id = requestHelper.GetRequest(req, "id");
requestHelper.Validate();
FaqItem returnItem = await _faqGetter.GetItem(id, true);
var returnItem = await _faqGetter.GetItem(id, true);
returnItem.PrepareForExport();
HttpResponseData response = req.CreateResponse(HttpStatusCode.OK);
var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync(returnItem);
return response;
}
Expand All @@ -75,26 +109,25 @@ public async Task<HttpResponseData> GetById([HttpTrigger(AuthorizationLevel.Anon
[OpenApiParameter(name: "take", In = ParameterLocation.Query, Required = false, Type = typeof(int), Description = "How many items do you want? Defaults to 1000.")]
[OpenApiParameter(name: "skip", In = ParameterLocation.Query, Required = false, Type = typeof(int), Description = "A skip value to help with pagination. Defaults to 0.")]
[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "text/plain", bodyType: typeof(SearchObject<FaqItem>), Description = "The list of FAQs")]
public async Task<HttpResponseData> Search([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
{
public async Task<HttpResponseData> Search([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) {
_logger.LogInformation("Called FaqSearch.");
RequestHelper requestHelper = RequestHelperFactory.Create();
var requestHelper = RequestHelperFactory.Create();
requestHelper.Initialize(req);
var source = requestHelper.GetRequest(req, "source");
IEnumerable<string> tags = requestHelper.GetArray(req, "tag1");
IEnumerable<string> tags2 = requestHelper.GetArray(req, "tag2");
IEnumerable<string> tags3 = requestHelper.GetArray(req, "tag3");
IEnumerable<string> tags4 = requestHelper.GetArray(req, "tag4");
IEnumerable<string> topics = requestHelper.GetArray(req, "topic");
IEnumerable<string> audience = requestHelper.GetArray(req, "audience");
IEnumerable<string> department = requestHelper.GetArray(req, "department");
var tags = requestHelper.GetArray(req, "tag1");
var tags2 = requestHelper.GetArray(req, "tag2");
var tags3 = requestHelper.GetArray(req, "tag3");
var tags4 = requestHelper.GetArray(req, "tag4");
var topics = requestHelper.GetArray(req, "topic");
var audience = requestHelper.GetArray(req, "audience");
var department = requestHelper.GetArray(req, "department");
var query = requestHelper.GetRequest(req, "q", false);
var take = requestHelper.GetInteger(req, "take", 1000);
var skip = requestHelper.GetInteger(req, "skip");
var sort = requestHelper.GetRequest(req, "sort", false).ToLowerInvariant();

requestHelper.Validate();
HttpResponseData response = req.CreateResponse(HttpStatusCode.OK);
var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync(await _faqGetter.Search(source, query, tags, tags2, tags3, tags4, topics, audience, department, take, skip, sort));
return response;
}
Expand Down
Loading