diff --git a/Program.cs b/Program.cs index 85cdebf..d5d0597 100644 --- a/Program.cs +++ b/Program.cs @@ -22,6 +22,8 @@ using NHibernate.Driver; using FirmTracker_Server.Controllers; using FirmTracker_Server.nHibernate.Products; using FirmTracker_Server.nHibernate; +using FirmTracker_Server.Utilities.Converters; +using FirmTracker_Server.Utilities.Swagger; namespace FirmTracker_Server { @@ -60,10 +62,18 @@ namespace FirmTracker_Server .AllowAnyHeader() .AllowAnyMethod()); }); - builder.Services.AddControllers(); + builder.Services.AddControllers() + .AddJsonOptions(options => + { + options.JsonSerializerOptions.Converters.Add(new DateTimeConverter()); + }); + ; builder.Services.AddEndpointsApiExplorer(); - builder.Services.AddSwaggerGen(); + builder.Services.AddSwaggerGen(c => + { + c.SchemaFilter(); + }); var app = builder.Build(); var configSwagger = new ConfigurationBuilder() diff --git a/Utilities/Converters/DateTimeConverter.cs b/Utilities/Converters/DateTimeConverter.cs new file mode 100644 index 0000000..aae28bc --- /dev/null +++ b/Utilities/Converters/DateTimeConverter.cs @@ -0,0 +1,28 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace FirmTracker_Server.Utilities.Converters +{ + public class DateTimeConverter : JsonConverter + { + private const string DateFormat = "yyyy-MM-ddTHH:mm"; + + public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.String) + { + if (DateTime.TryParseExact(reader.GetString(), DateFormat, null, System.Globalization.DateTimeStyles.None, out var date)) + { + return date; + } + } + throw new JsonException("Invalid date format"); + } + + public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString(DateFormat)); + } + } +} diff --git a/Utilities/Swagger/SwaggerDateTimeSchemaFilter.cs b/Utilities/Swagger/SwaggerDateTimeSchemaFilter.cs new file mode 100644 index 0000000..bcf0511 --- /dev/null +++ b/Utilities/Swagger/SwaggerDateTimeSchemaFilter.cs @@ -0,0 +1,18 @@ +using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace FirmTracker_Server.Utilities.Swagger +{ + public class SwaggerDateTimeSchemaFilter : ISchemaFilter + { + public void Apply(OpenApiSchema schema, SchemaFilterContext context) + { + if (context.Type == typeof(DateTime) || context.Type == typeof(DateTime?)) + { + schema.Format = "yyyy-MM-ddTHH:mm"; + schema.Example = new OpenApiString(DateTime.Now.ToString("yyyy-MM-ddTHH:mm")); + } + } + } +} diff --git a/nHIbernate/Expenses/Expense.cs b/nHIbernate/Expenses/Expense.cs index 4b18723..2c59f31 100644 --- a/nHIbernate/Expenses/Expense.cs +++ b/nHIbernate/Expenses/Expense.cs @@ -16,12 +16,14 @@ */ using FirmTracker_Server.nHibernate.Reports; +using System.ComponentModel.DataAnnotations; namespace FirmTracker_Server.nHibernate.Expenses { public class Expense { public virtual int Id { get; set; } + [DataType(DataType.DateTime)] public virtual DateTime Date { get; set; } public virtual decimal Value { get; set; } public virtual string Description { get; set; } diff --git a/nHIbernate/Reports/Report.cs b/nHIbernate/Reports/Report.cs index d0ce32b..c81be6d 100644 --- a/nHIbernate/Reports/Report.cs +++ b/nHIbernate/Reports/Report.cs @@ -18,13 +18,16 @@ using FirmTracker_Server.nHibernate.Expenses; using FirmTracker_Server.nHibernate.Transactions; using Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; namespace FirmTracker_Server.nHibernate.Reports { public class Report { public virtual int Id { get; set; } + [DataType(DataType.DateTime)] public virtual DateTime FromDate { get; set; } + [DataType(DataType.DateTime)] public virtual DateTime ToDate { get; set; } public virtual decimal TotalIncome { get; set; } public virtual decimal TotalExpenses { get; set; } diff --git a/nHibernate/Transactions/Transaction.cs b/nHibernate/Transactions/Transaction.cs index 6068319..f84e893 100644 --- a/nHibernate/Transactions/Transaction.cs +++ b/nHibernate/Transactions/Transaction.cs @@ -2,6 +2,7 @@ using FirmTracker_Server.nHibernate.Reports; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; namespace FirmTracker_Server.nHibernate.Transactions @@ -9,6 +10,7 @@ namespace FirmTracker_Server.nHibernate.Transactions public class Transaction { public virtual int Id { get; set; } + [DataType(DataType.DateTime)] public virtual DateTime Date { get; set; } public virtual int EmployeeId { get; set; } public virtual IList TransactionProducts { get; set; } = new List(); diff --git a/nHibernate/Transactions/Transaction2.cs b/nHibernate/Transactions/Transaction2.cs index 45d3c58..522b7fc 100644 --- a/nHibernate/Transactions/Transaction2.cs +++ b/nHibernate/Transactions/Transaction2.cs @@ -2,6 +2,7 @@ using FirmTracker_Server.nHibernate.Reports; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; namespace FirmTracker_Server.nHibernate.Transactions @@ -9,6 +10,7 @@ namespace FirmTracker_Server.nHibernate.Transactions public class Transaction2 { public virtual int Id { get; set; } + [DataType(DataType.DateTime)] public virtual DateTime Date { get; set; } public virtual int EmployeeId { get; set; } public virtual IList TransactionProducts { get; set; } = new List();