diff --git a/ResourceInformationV2.Function/Events.cs b/ResourceInformationV2.Function/Events.cs index ad23084..6f21f91 100644 --- a/ResourceInformationV2.Function/Events.cs +++ b/ResourceInformationV2.Function/Events.cs @@ -4,10 +4,13 @@ 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; @@ -15,10 +18,47 @@ namespace ResourceInformationV2.Function; public class Events { private readonly EventGetter _eventGetter; private readonly ILogger _logger; + private readonly ApiHelper _apiHelper; + private readonly LogHelper _logHelper; + private readonly EventSetter _eventSetter; - public Events(ILogger logger, EventGetter eventGetter) { + public Events(ILogger 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 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() ?? 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")] diff --git a/ResourceInformationV2.Function/Faqs.cs b/ResourceInformationV2.Function/Faqs.cs index d3453ea..091bf87 100644 --- a/ResourceInformationV2.Function/Faqs.cs +++ b/ResourceInformationV2.Function/Faqs.cs @@ -4,23 +4,59 @@ 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 _logger; - - public Faqs(ILogger logger, FaqGetter faqGetter) - { + private readonly ApiHelper _apiHelper; + private readonly LogHelper _logHelper; + private readonly FaqSetter _faqSetter; + public Faqs(ILogger 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 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() ?? 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")] @@ -28,17 +64,16 @@ public Faqs(ILogger logger, FaqGetter faqGetter) [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 GetByFragment([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) - { + public async Task 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; } @@ -47,16 +82,15 @@ public async Task 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 GetById([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) - { + public async Task 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; } @@ -75,26 +109,25 @@ public async Task 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), Description = "The list of FAQs")] - public async Task Search([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) - { + public async Task 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 tags = requestHelper.GetArray(req, "tag1"); - IEnumerable tags2 = requestHelper.GetArray(req, "tag2"); - IEnumerable tags3 = requestHelper.GetArray(req, "tag3"); - IEnumerable tags4 = requestHelper.GetArray(req, "tag4"); - IEnumerable topics = requestHelper.GetArray(req, "topic"); - IEnumerable audience = requestHelper.GetArray(req, "audience"); - IEnumerable 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; } diff --git a/ResourceInformationV2.Function/Notes.cs b/ResourceInformationV2.Function/Notes.cs index d476ea2..657c2a7 100644 --- a/ResourceInformationV2.Function/Notes.cs +++ b/ResourceInformationV2.Function/Notes.cs @@ -4,23 +4,60 @@ 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 Notes -{ +public class Notes { private readonly ILogger _logger; private readonly NoteGetter _noteGetter; + private readonly ApiHelper _apiHelper; + private readonly LogHelper _logHelper; + private readonly NoteSetter _noteSetter; - public Notes(ILogger logger, NoteGetter noteGetter) - { + public Notes(ILogger logger, NoteGetter noteGetter, ApiHelper apiHelper, LogHelper logHelper, NoteSetter noteSetter) { _logger = logger; _noteGetter = noteGetter; + _apiHelper = apiHelper; + _logHelper = logHelper; + _noteSetter = noteSetter; + } + + [Function("NoteLoad")] + [OpenApiOperation(operationId: "NoteLoad", tags: "Notes", Description = "Load a note 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(NoteItem), Required = true, Description = "A json implementation of a note. 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 note that was loaded.")] + public async Task Load([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) { + try { + _logger.LogInformation("Called NoteLoad."); + var requestHelper = RequestHelperFactory.Create(); + requestHelper.Initialize(req); + var key = requestHelper.GetCodeFromHeader(req); + var item = await req.ReadFromJsonAsync() ?? new NoteItem(); + 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 _noteSetter.SetItemWithDraft(item) + : await _noteSetter.SetItem(item)); + await _logHelper.Log(CategoryType.Note, 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("NoteFragment")] @@ -28,17 +65,16 @@ public Notes(ILogger logger, NoteGetter noteGetter) [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(NoteItem), Description = "The note. If the note is not found, it will be blank.")] - public async Task GetByFragment([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) - { + public async Task GetByFragment([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) { _logger.LogInformation("Called NotesFragment."); - 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(); - NoteItem returnItem = await _noteGetter.GetItem(source, fragment); + var returnItem = await _noteGetter.GetItem(source, fragment); returnItem.PrepareForExport(); - HttpResponseData response = req.CreateResponse(HttpStatusCode.OK); + var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteAsJsonAsync(returnItem); return response; } @@ -47,16 +83,15 @@ public async Task GetByFragment([HttpTrigger(AuthorizationLeve [OpenApiOperation(operationId: "Note", tags: "Notes", Description = "Get a specific note.")] [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(NoteItem), Description = "The note. If the note is not found, it will be blank.")] - public async Task GetById([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) - { + public async Task GetById([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) { _logger.LogInformation("Called Note."); - RequestHelper requestHelper = RequestHelperFactory.Create(); + var requestHelper = RequestHelperFactory.Create(); requestHelper.Initialize(req); var id = requestHelper.GetRequest(req, "id"); requestHelper.Validate(); - NoteItem returnItem = await _noteGetter.GetItem(id, true); + var returnItem = await _noteGetter.GetItem(id, true); returnItem.PrepareForExport(); - HttpResponseData response = req.CreateResponse(HttpStatusCode.OK); + var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteAsJsonAsync(returnItem); return response; } @@ -75,26 +110,25 @@ public async Task 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), Description = "The list of notes")] - public async Task Search([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) - { + public async Task Search([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) { _logger.LogInformation("Called NoteSearch."); - RequestHelper requestHelper = RequestHelperFactory.Create(); + var requestHelper = RequestHelperFactory.Create(); requestHelper.Initialize(req); var source = requestHelper.GetRequest(req, "source"); - IEnumerable tags = requestHelper.GetArray(req, "tag1"); - IEnumerable tags2 = requestHelper.GetArray(req, "tag2"); - IEnumerable tags3 = requestHelper.GetArray(req, "tag3"); - IEnumerable tags4 = requestHelper.GetArray(req, "tag4"); - IEnumerable topics = requestHelper.GetArray(req, "topic"); - IEnumerable audience = requestHelper.GetArray(req, "audience"); - IEnumerable 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 _noteGetter.Search(source, query, tags, tags2, tags3, tags4, topics, audience, department, take, skip, sort)); return response; } diff --git a/ResourceInformationV2.Function/People.cs b/ResourceInformationV2.Function/People.cs index 8b79f41..60b7884 100644 --- a/ResourceInformationV2.Function/People.cs +++ b/ResourceInformationV2.Function/People.cs @@ -89,8 +89,7 @@ public async Task Load([HttpTrigger(AuthorizationLevel.Anonymo await response.WriteAsJsonAsync(results.forceDraft ? await _personSetter.SetItemWithDraft(item) : await _personSetter.SetItem(item)); - await _logHelper.Log(CategoryType.Person, FieldType.None, "API", item.Source, item, "API Load", - EmailType.OnSubmission); + await _logHelper.Log(CategoryType.Person, FieldType.None, "API", item.Source, item, "API Load", EmailType.OnSubmission); return response; } catch (Exception ex) { var response = req.CreateResponse(HttpStatusCode.InternalServerError); diff --git a/ResourceInformationV2.Function/Program.cs b/ResourceInformationV2.Function/Program.cs index e753b16..fe370ee 100644 --- a/ResourceInformationV2.Function/Program.cs +++ b/ResourceInformationV2.Function/Program.cs @@ -45,11 +45,15 @@ _ = services.AddScoped(); _ = services.AddScoped(); _ = services.AddScoped(); + _ = services.AddScoped(); _ = services.AddScoped(); + _ = services.AddScoped(); _ = services.AddScoped(); + _ = services.AddScoped(); _ = services.AddScoped(); _ = services.AddScoped(); _ = services.AddScoped(); + _ = services.AddScoped(); _ = services.AddScoped(); }) .Build(); diff --git a/ResourceInformationV2.Function/Publicatons.cs b/ResourceInformationV2.Function/Publicatons.cs index 744b56e..ae7f78a 100644 --- a/ResourceInformationV2.Function/Publicatons.cs +++ b/ResourceInformationV2.Function/Publicatons.cs @@ -4,10 +4,13 @@ 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; @@ -15,10 +18,46 @@ namespace ResourceInformationV2.Function; public class Publications { private readonly ILogger _logger; private readonly PublicationGetter _publicationGetter; + private readonly ApiHelper _apiHelper; + private readonly LogHelper _logHelper; + private readonly PublicationSetter _publicationSetter; - public Publications(ILogger logger, PublicationGetter publicationGetter) { + public Publications(ILogger logger, PublicationGetter publicationGetter, ApiHelper apiHelper, LogHelper logHelper, PublicationSetter publicationSetter) { _logger = logger; _publicationGetter = publicationGetter; + _apiHelper = apiHelper; + _logHelper = logHelper; + _publicationSetter = publicationSetter; + } + + [Function("PublicationLoad")] + [OpenApiOperation(operationId: "PublicationLoad", tags: "Publications", Description = "Load a publication 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(Publication), Required = true, Description = "A json implementation of a publication. 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 publication that was loaded.")] + public async Task Load([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req) { + try { + _logger.LogInformation("Called PublicationLoad."); + var requestHelper = RequestHelperFactory.Create(); + requestHelper.Initialize(req); + var key = requestHelper.GetCodeFromHeader(req); + var item = await req.ReadFromJsonAsync() ?? new Publication(); + 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 _publicationSetter.SetItemWithDraft(item) + : await _publicationSetter.SetItem(item)); + await _logHelper.Log(CategoryType.Publication, 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("PublicationFragment")] diff --git a/ResourceInformationV2.Function/Resources.cs b/ResourceInformationV2.Function/Resources.cs index 26cb206..c88b15c 100644 --- a/ResourceInformationV2.Function/Resources.cs +++ b/ResourceInformationV2.Function/Resources.cs @@ -143,8 +143,7 @@ public async Task Load([HttpTrigger(AuthorizationLevel.Anonymo await response.WriteAsJsonAsync(results.forceDraft ? await _resourceSetter.SetItemWithDraft(item) : await _resourceSetter.SetItem(item)); - await _logHelper.Log(CategoryType.Resource, FieldType.None, "API", item.Source, item, "API Load", - EmailType.OnSubmission); + await _logHelper.Log(CategoryType.Resource, FieldType.None, "API", item.Source, item, "API Load", EmailType.OnSubmission); return response; } catch (Exception ex) { var response = req.CreateResponse(HttpStatusCode.InternalServerError); diff --git a/ResourceInformationV2.Search/Models/BaseObject.cs b/ResourceInformationV2.Search/Models/BaseObject.cs index 04a340d..c042480 100644 --- a/ResourceInformationV2.Search/Models/BaseObject.cs +++ b/ResourceInformationV2.Search/Models/BaseObject.cs @@ -68,6 +68,8 @@ public abstract class BaseObject { [Keyword] public string Url { get; set; } = ""; + [Keyword] public string UrlText { get; set; } = ""; + [Keyword] public string VideoUrl { get; set; } = ""; public bool UseManualCheck { get; set; } diff --git a/ResourceInformationV2.Search/Models/Event.cs b/ResourceInformationV2.Search/Models/Event.cs index e81d9ef..80af687 100644 --- a/ResourceInformationV2.Search/Models/Event.cs +++ b/ResourceInformationV2.Search/Models/Event.cs @@ -13,7 +13,7 @@ public class Event : BaseObject { [Keyword] public string Sponsor { get; set; } = ""; public DateTime StartDate { get; set; } = DateTime.Now; - internal override string[] Headings => ["Id", "Title", "Description", "Start Date", "End Date", "Is All Day", "Location", "Speaker", "Sponsor", "Fragment", "Url", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Related Links", "Order", "Review Email", "Last Updated Date"]; + internal override string[] Headings => ["Id", "Title", "Description", "Start Date", "End Date", "Is All Day", "Location", "Speaker", "Sponsor", "Fragment", "Link Url", "Link Text", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Related Links", "Order", "Review Email", "Last Updated Date"]; public override void Prepare() { base.Prepare(); @@ -35,27 +35,28 @@ internal override bool LoadFromStringPrivate(string[] lineArray) { Sponsor = PrepareForTextUpload(lineArray[8]); Fragment = lineArray[9]; Url = lineArray[10]; - Image = lineArray[11]; - ImageAltText = lineArray[12]; - ImageSource = lineArray[13]; - VideoUrl = lineArray[14]; - Notes = PrepareForTextUpload(lineArray[15]); - _ = DateTime.TryParse(lineArray[16], out var createdDate); + UrlText = lineArray[11]; + Image = lineArray[12]; + ImageAltText = lineArray[13]; + ImageSource = lineArray[14]; + VideoUrl = lineArray[15]; + Notes = PrepareForTextUpload(lineArray[16]); + _ = DateTime.TryParse(lineArray[17], out var createdDate); CreatedOn = createdDate == default ? DateTime.Now : createdDate; - _ = bool.TryParse(lineArray[17], out var isActive); + _ = bool.TryParse(lineArray[18], out var isActive); IsActive = isActive; - AudienceList = GetTagsFromString(lineArray[18]); - DepartmentList = GetTagsFromString(lineArray[19]); - TopicList = GetTagsFromString(lineArray[20]); - TagList = GetTagsFromString(lineArray[21]); - Tag2List = GetTagsFromString(lineArray[22]); - Tag3List = GetTagsFromString(lineArray[23]); - Tag4List = GetTagsFromString(lineArray[24]); - LinkList = GetLinksFromString(lineArray[25]); - _ = int.TryParse(lineArray[26], out var order); + AudienceList = GetTagsFromString(lineArray[19]); + DepartmentList = GetTagsFromString(lineArray[20]); + TopicList = GetTagsFromString(lineArray[21]); + TagList = GetTagsFromString(lineArray[22]); + Tag2List = GetTagsFromString(lineArray[23]); + Tag3List = GetTagsFromString(lineArray[24]); + Tag4List = GetTagsFromString(lineArray[25]); + LinkList = GetLinksFromString(lineArray[26]); + _ = int.TryParse(lineArray[27], out var order); Order = order; - ReviewEmail = lineArray[27]; - _ = DateTime.TryParse(lineArray[28], out var lastUpdatedDate); + ReviewEmail = lineArray[28]; + _ = DateTime.TryParse(lineArray[29], out var lastUpdatedDate); LastUpdated = lastUpdatedDate == default ? DateTime.Now : lastUpdatedDate; return true; } @@ -72,6 +73,7 @@ internal override string[] SaveToStringPrivate() => [ Sponsor, Fragment, Url, + UrlText, Image, ImageAltText, ImageSource, diff --git a/ResourceInformationV2.Search/Models/FaqItem.cs b/ResourceInformationV2.Search/Models/FaqItem.cs index a5f5722..aa7b79a 100644 --- a/ResourceInformationV2.Search/Models/FaqItem.cs +++ b/ResourceInformationV2.Search/Models/FaqItem.cs @@ -9,7 +9,7 @@ public class FaqItem : BaseObject { public string SummaryAnswer { get; set; } = ""; public override string Title { get => Question; set => Question = value; } - internal override string[] Headings => ["Id", "Question", "Summary Answer", "Detail Answer", "Fragment", "Url", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Related Links", "Order", "Review Email", "Last Updated Date"]; + internal override string[] Headings => ["Id", "Question", "Summary Answer", "Detail Answer", "Fragment", "Link Url", "Link Text", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Related Links", "Order", "Review Email", "Last Updated Date"]; internal override bool LoadFromStringPrivate(string[] lineArray) { Id = lineArray[0]; @@ -18,27 +18,28 @@ internal override bool LoadFromStringPrivate(string[] lineArray) { DetailAnswer = PrepareForTextUpload(lineArray[3]); Fragment = lineArray[4]; Url = lineArray[5]; - Image = lineArray[6]; - ImageAltText = lineArray[7]; - ImageSource = lineArray[8]; - VideoUrl = lineArray[9]; - Notes = PrepareForTextUpload(lineArray[10]); - _ = DateTime.TryParse(lineArray[11], out var createdDate); + UrlText = lineArray[6]; + Image = lineArray[7]; + ImageAltText = lineArray[8]; + ImageSource = lineArray[9]; + VideoUrl = lineArray[10]; + Notes = PrepareForTextUpload(lineArray[11]); + _ = DateTime.TryParse(lineArray[12], out var createdDate); CreatedOn = createdDate == default ? DateTime.Now : createdDate; - _ = bool.TryParse(lineArray[12], out var isActive); + _ = bool.TryParse(lineArray[13], out var isActive); IsActive = isActive; - AudienceList = GetTagsFromString(lineArray[13]); - DepartmentList = GetTagsFromString(lineArray[14]); - TopicList = GetTagsFromString(lineArray[15]); - TagList = GetTagsFromString(lineArray[16]); - Tag2List = GetTagsFromString(lineArray[17]); - Tag3List = GetTagsFromString(lineArray[18]); - Tag4List = GetTagsFromString(lineArray[19]); - LinkList = GetLinksFromString(lineArray[20]); - _ = int.TryParse(lineArray[21], out var order); + AudienceList = GetTagsFromString(lineArray[14]); + DepartmentList = GetTagsFromString(lineArray[15]); + TopicList = GetTagsFromString(lineArray[16]); + TagList = GetTagsFromString(lineArray[17]); + Tag2List = GetTagsFromString(lineArray[18]); + Tag3List = GetTagsFromString(lineArray[19]); + Tag4List = GetTagsFromString(lineArray[20]); + LinkList = GetLinksFromString(lineArray[21]); + _ = int.TryParse(lineArray[22], out var order); Order = order; - ReviewEmail = lineArray[22]; - _ = DateTime.TryParse(lineArray[23], out var lastUpdatedDate); + ReviewEmail = lineArray[23]; + _ = DateTime.TryParse(lineArray[24], out var lastUpdatedDate); LastUpdated = lastUpdatedDate == default ? DateTime.Now : lastUpdatedDate; return true; } @@ -50,6 +51,7 @@ internal override string[] SaveToStringPrivate() => [ PrepareForTextDownload(DetailAnswer), Fragment, Url, + UrlText, Image, ImageAltText, ImageSource, diff --git a/ResourceInformationV2.Search/Models/NoteItem.cs b/ResourceInformationV2.Search/Models/NoteItem.cs index 5350d59..574d633 100644 --- a/ResourceInformationV2.Search/Models/NoteItem.cs +++ b/ResourceInformationV2.Search/Models/NoteItem.cs @@ -5,7 +5,7 @@ public class NoteItem : BaseObject { public override string EditLink => EditLinkRoot + "note/" + Id; public override string NameType => "Note"; - internal override string[] Headings => ["Id", "Title", "Description", "Detail Text", "Fragment", "Url", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Related Links", "Order", "Review Email", "Last Updated Date"]; + internal override string[] Headings => ["Id", "Title", "Description", "Detail Text", "Fragment", "Link Url", "Link Text", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Related Links", "Order", "Review Email", "Last Updated Date"]; internal override bool LoadFromStringPrivate(string[] lineArray) { Id = lineArray[0]; @@ -14,27 +14,28 @@ internal override bool LoadFromStringPrivate(string[] lineArray) { DetailText = PrepareForTextUpload(lineArray[3]); Fragment = lineArray[4]; Url = lineArray[5]; - Image = lineArray[6]; - ImageAltText = lineArray[7]; - ImageSource = lineArray[8]; - VideoUrl = lineArray[9]; - Notes = PrepareForTextUpload(lineArray[10]); - _ = DateTime.TryParse(lineArray[11], out var createdDate); + UrlText = lineArray[6]; + Image = lineArray[7]; + ImageAltText = lineArray[8]; + ImageSource = lineArray[9]; + VideoUrl = lineArray[10]; + Notes = PrepareForTextUpload(lineArray[11]); + _ = DateTime.TryParse(lineArray[12], out var createdDate); CreatedOn = createdDate == default ? DateTime.Now : createdDate; - _ = bool.TryParse(lineArray[12], out var isActive); + _ = bool.TryParse(lineArray[13], out var isActive); IsActive = isActive; - AudienceList = GetTagsFromString(lineArray[13]); - DepartmentList = GetTagsFromString(lineArray[14]); - TopicList = GetTagsFromString(lineArray[15]); - TagList = GetTagsFromString(lineArray[16]); - Tag2List = GetTagsFromString(lineArray[17]); - Tag3List = GetTagsFromString(lineArray[18]); - Tag4List = GetTagsFromString(lineArray[19]); - LinkList = GetLinksFromString(lineArray[20]); - _ = int.TryParse(lineArray[21], out var order); + AudienceList = GetTagsFromString(lineArray[14]); + DepartmentList = GetTagsFromString(lineArray[15]); + TopicList = GetTagsFromString(lineArray[16]); + TagList = GetTagsFromString(lineArray[17]); + Tag2List = GetTagsFromString(lineArray[18]); + Tag3List = GetTagsFromString(lineArray[19]); + Tag4List = GetTagsFromString(lineArray[20]); + LinkList = GetLinksFromString(lineArray[21]); + _ = int.TryParse(lineArray[22], out var order); Order = order; - ReviewEmail = lineArray[22]; - _ = DateTime.TryParse(lineArray[23], out var lastUpdatedDate); + ReviewEmail = lineArray[23]; + _ = DateTime.TryParse(lineArray[24], out var lastUpdatedDate); LastUpdated = lastUpdatedDate == default ? DateTime.Now : lastUpdatedDate; return true; } @@ -46,6 +47,7 @@ internal override string[] SaveToStringPrivate() => [ PrepareForTextDownload(DetailText), Fragment, Url, + UrlText, Image, ImageAltText, ImageSource, diff --git a/ResourceInformationV2.Search/Models/Person.cs b/ResourceInformationV2.Search/Models/Person.cs index c051879..dc7848f 100644 --- a/ResourceInformationV2.Search/Models/Person.cs +++ b/ResourceInformationV2.Search/Models/Person.cs @@ -10,7 +10,7 @@ public class Person : BaseObject { public override string NameType => "Person"; public override string Title => LastName + ", " + FirstName; - internal override string[] Headings => ["Id", "First Name", "Last Name", "Job Title", "Job Location", "Biography", "Fragment", "Url", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Related Links", "Order", "Review Email", "Last Updated Date"]; + internal override string[] Headings => ["Id", "First Name", "Last Name", "Job Title", "Job Location", "Biography", "Fragment", "Link Url", "Link Text", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Related Links", "Order", "Review Email", "Last Updated Date"]; internal override bool LoadFromStringPrivate(string[] lineArray) { Id = lineArray[0]; @@ -21,27 +21,28 @@ internal override bool LoadFromStringPrivate(string[] lineArray) { Description = PrepareForTextUpload(lineArray[5]); Fragment = lineArray[6]; Url = lineArray[7]; - Image = lineArray[8]; - ImageAltText = lineArray[9]; - ImageSource = lineArray[10]; - VideoUrl = lineArray[11]; - Notes = PrepareForTextUpload(lineArray[12]); - _ = DateTime.TryParse(lineArray[13], out var createdDate); + UrlText = lineArray[8]; + Image = lineArray[9]; + ImageAltText = lineArray[10]; + ImageSource = lineArray[11]; + VideoUrl = lineArray[12]; + Notes = PrepareForTextUpload(lineArray[13]); + _ = DateTime.TryParse(lineArray[14], out var createdDate); CreatedOn = createdDate == default ? DateTime.Now : createdDate; - _ = bool.TryParse(lineArray[14], out var isActive); + _ = bool.TryParse(lineArray[15], out var isActive); IsActive = isActive; - AudienceList = GetTagsFromString(lineArray[15]); - DepartmentList = GetTagsFromString(lineArray[16]); - TopicList = GetTagsFromString(lineArray[17]); - TagList = GetTagsFromString(lineArray[18]); - Tag2List = GetTagsFromString(lineArray[19]); - Tag3List = GetTagsFromString(lineArray[20]); - Tag4List = GetTagsFromString(lineArray[21]); - LinkList = GetLinksFromString(lineArray[22]); - _ = int.TryParse(lineArray[23], out var order); + AudienceList = GetTagsFromString(lineArray[16]); + DepartmentList = GetTagsFromString(lineArray[17]); + TopicList = GetTagsFromString(lineArray[18]); + TagList = GetTagsFromString(lineArray[19]); + Tag2List = GetTagsFromString(lineArray[20]); + Tag3List = GetTagsFromString(lineArray[21]); + Tag4List = GetTagsFromString(lineArray[22]); + LinkList = GetLinksFromString(lineArray[23]); + _ = int.TryParse(lineArray[24], out var order); Order = order; - ReviewEmail = lineArray[24]; - _ = DateTime.TryParse(lineArray[25], out var lastUpdatedDate); + ReviewEmail = lineArray[25]; + _ = DateTime.TryParse(lineArray[26], out var lastUpdatedDate); LastUpdated = lastUpdatedDate == default ? DateTime.Now : lastUpdatedDate; return true; } @@ -55,6 +56,7 @@ internal override string[] SaveToStringPrivate() => [ PrepareForTextDownload(Description), Fragment, Url, + UrlText, Image, ImageAltText, ImageSource, diff --git a/ResourceInformationV2.Search/Models/Publication.cs b/ResourceInformationV2.Search/Models/Publication.cs index 63ae8a9..9d772b2 100644 --- a/ResourceInformationV2.Search/Models/Publication.cs +++ b/ResourceInformationV2.Search/Models/Publication.cs @@ -17,7 +17,7 @@ public class Publication : BaseObject { [Keyword] public string Status { get; set; } = ""; [Keyword] public string Volume { get; set; } = ""; - internal override string[] Headings => ["Id", "Title", "Description", "Fragment", "Url", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Authors", "Book Title", "Issue", "Journal Name", "Page Numbers", "Publication Type", "PublishedDate", "Status", "Volume", "DOI", "Related Links", "Order", "Review Email", "Last Updated Date"]; + internal override string[] Headings => ["Id", "Title", "Description", "Fragment", "Link Url", "Link Text", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Authors", "Book Title", "Issue", "Journal Name", "Page Numbers", "Publication Type", "PublishedDate", "Status", "Volume", "DOI", "Related Links", "Order", "Review Email", "Last Updated Date"]; internal override bool LoadFromStringPrivate(string[] lineArray) { Id = lineArray[0]; @@ -25,37 +25,38 @@ internal override bool LoadFromStringPrivate(string[] lineArray) { Description = PrepareForTextUpload(lineArray[2]); Fragment = lineArray[3]; Url = lineArray[4]; - Image = lineArray[5]; - ImageAltText = lineArray[6]; - ImageSource = lineArray[7]; - VideoUrl = lineArray[8]; - Notes = PrepareForTextUpload(lineArray[9]); - _ = DateTime.TryParse(PrepareForTextUpload(lineArray[10]), out var createdDate); + UrlText = lineArray[5]; + Image = lineArray[6]; + ImageAltText = lineArray[7]; + ImageSource = lineArray[8]; + VideoUrl = lineArray[9]; + Notes = PrepareForTextUpload(lineArray[10]); + _ = DateTime.TryParse(PrepareForTextUpload(lineArray[11]), out var createdDate); CreatedOn = createdDate == default ? DateTime.Now : createdDate; - _ = bool.TryParse(lineArray[11], out var isActive); + _ = bool.TryParse(lineArray[12], out var isActive); IsActive = isActive; - AudienceList = GetTagsFromString(lineArray[12]); - DepartmentList = GetTagsFromString(lineArray[13]); - TopicList = GetTagsFromString(lineArray[14]); - TagList = GetTagsFromString(lineArray[15]); - Tag2List = GetTagsFromString(lineArray[16]); - Tag3List = GetTagsFromString(lineArray[17]); - Tag4List = GetTagsFromString(lineArray[18]); - Authors = GetTagsFromString(lineArray[19]); - BookTitle = PrepareForTextUpload(lineArray[20]); - Issue = PrepareForTextUpload(lineArray[21]); - JournalName = PrepareForTextUpload(lineArray[22]); - PageNumbers = PrepareForTextUpload(lineArray[23]); - PublicationType = PrepareForTextUpload(lineArray[24]); - PublishedDate = PrepareForTextUpload(lineArray[25]); - Status = PrepareForTextUpload(lineArray[26]); - Volume = PrepareForTextUpload(lineArray[27]); - Doi = PrepareForTextUpload(lineArray[28]); - LinkList = GetLinksFromString(lineArray[29]); - _ = int.TryParse(lineArray[30], out var order); + AudienceList = GetTagsFromString(lineArray[13]); + DepartmentList = GetTagsFromString(lineArray[14]); + TopicList = GetTagsFromString(lineArray[15]); + TagList = GetTagsFromString(lineArray[16]); + Tag2List = GetTagsFromString(lineArray[17]); + Tag3List = GetTagsFromString(lineArray[18]); + Tag4List = GetTagsFromString(lineArray[19]); + Authors = GetTagsFromString(lineArray[20]); + BookTitle = PrepareForTextUpload(lineArray[21]); + Issue = PrepareForTextUpload(lineArray[22]); + JournalName = PrepareForTextUpload(lineArray[23]); + PageNumbers = PrepareForTextUpload(lineArray[24]); + PublicationType = PrepareForTextUpload(lineArray[25]); + PublishedDate = PrepareForTextUpload(lineArray[26]); + Status = PrepareForTextUpload(lineArray[27]); + Volume = PrepareForTextUpload(lineArray[28]); + Doi = PrepareForTextUpload(lineArray[29]); + LinkList = GetLinksFromString(lineArray[30]); + _ = int.TryParse(lineArray[31], out var order); Order = order; - ReviewEmail = lineArray[31]; - _ = DateTime.TryParse(PrepareForTextUpload(lineArray[32]), out var lastUpdatedDate); + ReviewEmail = lineArray[32]; + _ = DateTime.TryParse(PrepareForTextUpload(lineArray[33]), out var lastUpdatedDate); LastUpdated = lastUpdatedDate == default ? DateTime.Now : lastUpdatedDate; return true; } @@ -66,6 +67,7 @@ internal override string[] SaveToStringPrivate() => [ PrepareForTextDownload(Description), Fragment, Url, + UrlText, Image, ImageAltText, ImageSource, diff --git a/ResourceInformationV2.Search/Models/Resource.cs b/ResourceInformationV2.Search/Models/Resource.cs index ca15147..3a880b5 100644 --- a/ResourceInformationV2.Search/Models/Resource.cs +++ b/ResourceInformationV2.Search/Models/Resource.cs @@ -4,7 +4,7 @@ public class Resource : BaseObject { public override string EditLink => EditLinkRoot + "resource/" + Id; public override string NameType => "Resource"; - internal override string[] Headings => ["Id", "Title", "Description", "Fragment", "Url", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Related Links", "Order", "Review Email", "Last Updated Date"]; + internal override string[] Headings => ["Id", "Title", "Description", "Fragment", "Link Url", "Link Text", "Image", "Image Alt Text", "Image Source", "Video Url", "Notes", "Created Date", "Is Active", "Audience List", "Department List", "Topic List", "Tag 1 List", "Tag 2 List", "Tag 3 List", "Tag 4 List", "Related Links", "Order", "Review Email", "Last Updated Date"]; internal override bool LoadFromStringPrivate(string[] lineArray) { Id = lineArray[0]; @@ -12,27 +12,28 @@ internal override bool LoadFromStringPrivate(string[] lineArray) { Description = PrepareForTextUpload(lineArray[2]); Fragment = lineArray[3]; Url = lineArray[4]; - Image = lineArray[5]; - ImageAltText = lineArray[6]; - ImageSource = lineArray[7]; - VideoUrl = lineArray[8]; - Notes = PrepareForTextUpload(lineArray[9]); - _ = DateTime.TryParse(lineArray[10], out var createdDate); + UrlText = lineArray[5]; + Image = lineArray[6]; + ImageAltText = lineArray[7]; + ImageSource = lineArray[8]; + VideoUrl = lineArray[9]; + Notes = PrepareForTextUpload(lineArray[10]); + _ = DateTime.TryParse(lineArray[11], out var createdDate); CreatedOn = createdDate == default ? DateTime.Now : createdDate; - _ = bool.TryParse(lineArray[11], out var isActive); + _ = bool.TryParse(lineArray[12], out var isActive); IsActive = isActive; - AudienceList = GetTagsFromString(lineArray[12]); - DepartmentList = GetTagsFromString(lineArray[13]); - TopicList = GetTagsFromString(lineArray[14]); - TagList = GetTagsFromString(lineArray[15]); - Tag2List = GetTagsFromString(lineArray[16]); - Tag3List = GetTagsFromString(lineArray[17]); - Tag4List = GetTagsFromString(lineArray[18]); - LinkList = GetLinksFromString(lineArray[19]); - _ = int.TryParse(lineArray[20], out var order); + AudienceList = GetTagsFromString(lineArray[13]); + DepartmentList = GetTagsFromString(lineArray[14]); + TopicList = GetTagsFromString(lineArray[15]); + TagList = GetTagsFromString(lineArray[16]); + Tag2List = GetTagsFromString(lineArray[17]); + Tag3List = GetTagsFromString(lineArray[18]); + Tag4List = GetTagsFromString(lineArray[19]); + LinkList = GetLinksFromString(lineArray[20]); + _ = int.TryParse(lineArray[21], out var order); Order = order; - ReviewEmail = lineArray[21]; - _ = DateTime.TryParse(lineArray[22], out var lastUpdatedDate); + ReviewEmail = lineArray[22]; + _ = DateTime.TryParse(lineArray[23], out var lastUpdatedDate); LastUpdated = lastUpdatedDate == default ? DateTime.Now : lastUpdatedDate; return true; } @@ -43,6 +44,7 @@ internal override string[] SaveToStringPrivate() => [ PrepareForTextDownload(Description), Fragment, Url, + UrlText, Image, ImageAltText, ImageSource, diff --git a/ResourceInformationV2/Components/Pages/Event/General.razor b/ResourceInformationV2/Components/Pages/Event/General.razor index 11aa487..6182fa0 100644 --- a/ResourceInformationV2/Components/Pages/Event/General.razor +++ b/ResourceInformationV2/Components/Pages/Event/General.razor @@ -22,6 +22,12 @@ + +
+ + +
+
diff --git a/ResourceInformationV2/Components/Pages/Faq/General.razor b/ResourceInformationV2/Components/Pages/Faq/General.razor index 06ae2c8..b54f66f 100644 --- a/ResourceInformationV2/Components/Pages/Faq/General.razor +++ b/ResourceInformationV2/Components/Pages/Faq/General.razor @@ -19,17 +19,23 @@
- -