From ac769e656b122ff569c3f1534701b71e00fed586 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 27 Oct 2020 19:21:35 +0800 Subject: Split front and back end. --- Timeline/Helpers/DataCacheHelper.cs | 125 ------------------------ Timeline/Helpers/DateTimeExtensions.cs | 14 --- Timeline/Helpers/InvalidModelResponseFactory.cs | 25 ----- Timeline/Helpers/LanguageHelper.cs | 12 --- Timeline/Helpers/Log.cs | 22 ----- 5 files changed, 198 deletions(-) delete mode 100644 Timeline/Helpers/DataCacheHelper.cs delete mode 100644 Timeline/Helpers/DateTimeExtensions.cs delete mode 100644 Timeline/Helpers/InvalidModelResponseFactory.cs delete mode 100644 Timeline/Helpers/LanguageHelper.cs delete mode 100644 Timeline/Helpers/Log.cs (limited to 'Timeline/Helpers') diff --git a/Timeline/Helpers/DataCacheHelper.cs b/Timeline/Helpers/DataCacheHelper.cs deleted file mode 100644 index 1ad69708..00000000 --- a/Timeline/Helpers/DataCacheHelper.cs +++ /dev/null @@ -1,125 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Net.Http.Headers; -using System; -using System.Linq; -using System.Threading.Tasks; -using Timeline.Models.Http; -using static Timeline.Resources.Helper.DataCacheHelper; - -namespace Timeline.Helpers -{ - public interface ICacheableData - { - string Type { get; } -#pragma warning disable CA1819 // Properties should not return arrays - byte[] Data { get; } -#pragma warning restore CA1819 // Properties should not return arrays - DateTime? LastModified { get; } - } - - public class CacheableData : ICacheableData - { - public CacheableData(string type, byte[] data, DateTime? lastModified) - { - Type = type; - Data = data; - LastModified = lastModified; - } - - public string Type { get; set; } -#pragma warning disable CA1819 // Properties should not return arrays - public byte[] Data { get; set; } -#pragma warning restore CA1819 // Properties should not return arrays - public DateTime? LastModified { get; set; } - } - - public interface ICacheableDataProvider - { - Task GetDataETag(); - Task GetData(); - } - - public class DelegateCacheableDataProvider : ICacheableDataProvider - { - private readonly Func> _getDataETagDelegate; - private readonly Func> _getDataDelegate; - - public DelegateCacheableDataProvider(Func> getDataETagDelegate, Func> getDataDelegate) - { - _getDataETagDelegate = getDataETagDelegate; - _getDataDelegate = getDataDelegate; - } - - public Task GetData() - { - return _getDataDelegate(); - } - - public Task GetDataETag() - { - return _getDataETagDelegate(); - } - } - - public static class DataCacheHelper - { - public static async Task GenerateActionResult(Controller controller, ICacheableDataProvider provider, TimeSpan? maxAge = null) - { - const string CacheControlHeaderKey = "Cache-Control"; - const string IfNonMatchHeaderKey = "If-None-Match"; - const string ETagHeaderKey = "ETag"; - - string GenerateCacheControlHeaderValue() - { - var cacheControlHeader = new CacheControlHeaderValue() - { - NoCache = true, - NoStore = false, - MaxAge = maxAge ?? TimeSpan.FromDays(14), - Private = true, - MustRevalidate = true - }; - return cacheControlHeader.ToString(); - } - - var loggerFactory = controller.HttpContext.RequestServices.GetRequiredService(); - var logger = loggerFactory.CreateLogger(typeof(DataCacheHelper)); - - var eTagValue = await provider.GetDataETag(); - eTagValue = '"' + eTagValue + '"'; - var eTag = new EntityTagHeaderValue(eTagValue); - - - if (controller.Request.Headers.TryGetValue(IfNonMatchHeaderKey, out var value)) - { - if (!EntityTagHeaderValue.TryParseStrictList(value, out var eTagList)) - { - logger.LogInformation(Log.Format(LogBadIfNoneMatch, ("Header Value", value))); - return controller.BadRequest(ErrorResponse.Common.Header.IfNonMatch_BadFormat()); - } - - if (eTagList.FirstOrDefault(e => e.Equals(eTag)) != null) - { - logger.LogInformation(LogResultNotModified); - controller.Response.Headers.Add(ETagHeaderKey, eTagValue); - controller.Response.Headers.Add(CacheControlHeaderKey, GenerateCacheControlHeaderValue()); - - return controller.StatusCode(StatusCodes.Status304NotModified, null); - } - } - - var data = await provider.GetData(); - logger.LogInformation(LogResultData); - controller.Response.Headers.Add(CacheControlHeaderKey, GenerateCacheControlHeaderValue()); - return controller.File(data.Data, data.Type, data.LastModified, eTag); - } - - public static Task GenerateActionResult(Controller controller, Func> getDataETagDelegate, Func> getDataDelegate, TimeSpan? maxAge = null) - { - return GenerateActionResult(controller, new DelegateCacheableDataProvider(getDataETagDelegate, getDataDelegate), maxAge); - } - } -} diff --git a/Timeline/Helpers/DateTimeExtensions.cs b/Timeline/Helpers/DateTimeExtensions.cs deleted file mode 100644 index 374f3bc9..00000000 --- a/Timeline/Helpers/DateTimeExtensions.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace Timeline.Helpers -{ - public static class DateTimeExtensions - { - public static DateTime MyToUtc(this DateTime dateTime) - { - if (dateTime.Kind == DateTimeKind.Utc) return dateTime; - if (dateTime.Kind == DateTimeKind.Local) return dateTime.ToUniversalTime(); - return DateTime.SpecifyKind(dateTime, DateTimeKind.Utc); - } - } -} diff --git a/Timeline/Helpers/InvalidModelResponseFactory.cs b/Timeline/Helpers/InvalidModelResponseFactory.cs deleted file mode 100644 index 9b253e7d..00000000 --- a/Timeline/Helpers/InvalidModelResponseFactory.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using System.Text; -using Timeline.Models.Http; - -namespace Timeline.Helpers -{ - public static class InvalidModelResponseFactory - { - public static IActionResult Factory(ActionContext context) - { - var modelState = context.ModelState; - - var messageBuilder = new StringBuilder(); - foreach (var model in modelState) - foreach (var error in model.Value.Errors) - { - messageBuilder.Append(model.Key); - messageBuilder.Append(" : "); - messageBuilder.AppendLine(error.ErrorMessage); - } - - return new BadRequestObjectResult(ErrorResponse.Common.CustomMessage_InvalidModel(messageBuilder.ToString())); - } - } -} diff --git a/Timeline/Helpers/LanguageHelper.cs b/Timeline/Helpers/LanguageHelper.cs deleted file mode 100644 index b0156b8b..00000000 --- a/Timeline/Helpers/LanguageHelper.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Linq; - -namespace Timeline.Helpers -{ - public static class LanguageHelper - { - public static bool AreSame(this bool firstBool, params bool[] otherBools) - { - return otherBools.All(b => b == firstBool); - } - } -} diff --git a/Timeline/Helpers/Log.cs b/Timeline/Helpers/Log.cs deleted file mode 100644 index af0b7e13..00000000 --- a/Timeline/Helpers/Log.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Text; - -namespace Timeline.Helpers -{ - public static class Log - { - public static string Format(string summary, params (string, object?)[] properties) - { - var builder = new StringBuilder(); - builder.Append(summary); - foreach (var property in properties) - { - var (key, value) = property; - builder.AppendLine(); - builder.Append(key); - builder.Append(" : "); - builder.Append(value); - } - return builder.ToString(); - } - } -} -- cgit v1.2.3