Replaced NewtonsoftJson with System.Text.Json

This commit is contained in:
pavelbannov 2020-02-21 16:19:32 +03:00
parent 30d952b946
commit 9db8b26985
19 changed files with 65 additions and 207 deletions

View File

@ -28,14 +28,15 @@ using System;
using System.ComponentModel;
using System.Globalization;
using System.Runtime.Serialization;
using System.Text.Json;
using System.Text.Json.Serialization;
using ASC.Common.Utils;
using ASC.Core;
using Newtonsoft.Json;
namespace ASC.Api.Core
{
[DataContract(Name = "date", Namespace = "")]
[JsonConverter(typeof(ApiDateTimeConverter))]
[TypeConverter(typeof(ApiDateTimeTypeConverter))]
public class ApiDateTime : IComparable<ApiDateTime>, IComparable
{
@ -321,43 +322,30 @@ namespace ASC.Api.Core
}
}
public class ApiDateTimeConverter : JsonConverter
public class ApiDateTimeConverter : JsonConverter<ApiDateTime>
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
public override ApiDateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (value is ApiDateTime)
if (reader.TryGetDateTime(out var result))
{
writer.WriteValue(value.ToString());
return new ApiDateTime(result, TimeSpan.Zero);
}
else
{
if (DateTime.TryParseExact(reader.GetString(), ApiDateTime.Formats, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTime))
{
return new ApiDateTime(dateTime, TimeSpan.Zero);
}
else
{
return new ApiDateTime();
}
}
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
public override void Write(Utf8JsonWriter writer, ApiDateTime value, JsonSerializerOptions options)
{
if (reader.ValueType != null)
{
if (reader.ValueType.Name == "String")
{
if (DateTime.TryParseExact(reader.Value?.ToString(), ApiDateTime.Formats, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var result))
{
return new ApiDateTime(result, TimeSpan.Zero);
}
else
{
return new ApiDateTime();
}
}
else if (reader.ValueType.Name == "DateTime")
{
return new ApiDateTime((DateTime)reader.Value, TimeSpan.Zero);
}
}
return DateTime.MinValue;
}
public override bool CanConvert(Type objectType)
{
return typeof(ApiDateTime).IsAssignableFrom(objectType);
writer.WriteStringValue(value.ToString());
}
}
}

View File

@ -23,20 +23,14 @@
*
*/
using System.Runtime.Serialization;
namespace ASC.Api.Collections
{
[DataContract]
public class ItemKeyValuePair<TKey, TValue>
{
[DataMember]
public TKey Key { get; set; }
[DataMember]
public TValue Value { get; set; }
}

View File

@ -1,19 +1,14 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Runtime.Serialization;
namespace ASC.Api.Core.Middleware
{
[DataContract]
public abstract class CommonApiResponse
{
[DataMember(Order = 1)]
public int Status { get; set; }
[DataMember(Order = 2)]
public HttpStatusCode StatusCode { get; set; }
protected CommonApiResponse(HttpStatusCode statusCode)
@ -32,10 +27,8 @@ namespace ASC.Api.Core.Middleware
}
}
[DataContract]
public class ErrorApiResponse : CommonApiResponse
{
[DataMember(EmitDefaultValue = false, Order = 3)]
public CommonApiError Error { get; set; }
protected internal ErrorApiResponse(HttpStatusCode statusCode, Exception error) : base(statusCode)
@ -45,16 +38,12 @@ namespace ASC.Api.Core.Middleware
}
}
[DataContract]
public class SuccessApiResponse : CommonApiResponse
{
[DataMember(EmitDefaultValue = false, Order = 0)]
public int? Count { get; set; }
[DataMember(EmitDefaultValue = false, Order = 1)]
public long? Total { get; set; }
[DataMember(EmitDefaultValue = false, Order = 3)]
public object Response { get; set; }
protected internal SuccessApiResponse(HttpStatusCode statusCode, object response, long? total = null, int? count = null) : base(statusCode)
@ -89,33 +78,24 @@ namespace ASC.Api.Core.Middleware
}
}
[DataContract]
public class CommonApiError
{
[DataMember]
public string Message { get; set; }
[DataMember]
public Type Type { get; set; }
public string Type { get; set; }
[DataMember]
public string Stack { get; set; }
[DataMember]
public int Hresult { get; set; }
[DataMember]
public IDictionary Data { get; set; }
public static CommonApiError FromException(Exception exception)
{
return new CommonApiError()
{
Message = exception.Message,
Type = exception.GetType(),
Type = exception.GetType().ToString(),
Stack = exception.StackTrace,
Hresult = exception.HResult,
Data = exception.Data
Hresult = exception.HResult
};
}
}

View File

@ -25,32 +25,27 @@
using System;
using System.Runtime.Serialization;
using ASC.Api.Core;
using ASC.Core.Users;
using ASC.Web.Core.Users;
using ASC.Web.Studio.Utility;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace ASC.Web.Api.Models
{
[DataContract(Name = "person", Namespace = "")]
public class EmployeeWraper
{
[DataMember(Order = 1)]
public Guid Id { get; set; }
[DataMember(Order = 10)]
public string DisplayName { get; set; }
[DataMember(Order = 11, EmitDefaultValue = false)]
public string Title { get; set; }
[DataMember(Order = 20)]
public string AvatarSmall { get; set; }
[DataMember(Order = 30)]
public string ProfileUrl { get; set; }
public static EmployeeWraper GetSample()

View File

@ -26,6 +26,7 @@
using System;
using System.Runtime.Serialization;
using ASC.Core;
using ASC.Core.Users;
@ -46,13 +47,10 @@ namespace ASC.Web.Api.Models
}
[DataMember(Order = 2)]
public string Name { get; set; }
[DataMember(Order = 1)]
public Guid Id { get; set; }
[DataMember(Order = 9, EmitDefaultValue = true)]
public string Manager { get; set; }
public static GroupWrapperSummary GetSample()

View File

@ -23,18 +23,12 @@
*
*/
using System.Runtime.Serialization;
namespace ASC.Web.Api.Models
{
[DataContract(Name = "contact", Namespace = "")]
public class Contact
{
[DataMember(Order = 1)]
public string Type { get; set; }
[DataMember(Order = 2)]
public string Value { get; set; }
public Contact()

View File

@ -27,7 +27,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using ASC.Api.Core;
using ASC.Common.Utils;
using ASC.Core;
@ -35,94 +35,67 @@ using ASC.Core.Users;
using ASC.Web.Core;
using ASC.Web.Core.Users;
using ASC.Web.Studio.Utility;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace ASC.Web.Api.Models
{
[DataContract(Name = "person", Namespace = "")]
public class EmployeeWraperFull : EmployeeWraper
{
[DataMember(Order = 10)]
public string FirstName { get; set; }
[DataMember(Order = 10)]
public string LastName { get; set; }
[DataMember(Order = 2)]
public string UserName { get; set; }
[DataMember(Order = 10)]
public string Email { get; set; }
[DataMember(Order = 12, EmitDefaultValue = false)]
public List<Contact> Contacts { get; set; }
[DataMember(Order = 10, EmitDefaultValue = false)]
public ApiDateTime Birthday { get; set; }
[DataMember(Order = 10, EmitDefaultValue = false)]
public string Sex { get; set; }
[DataMember(Order = 10)]
public EmployeeStatus Status { get; set; }
[DataMember(Order = 10)]
public EmployeeActivationStatus ActivationStatus { get; set; }
[DataMember(Order = 10)]
public ApiDateTime Terminated { get; set; }
[DataMember(Order = 10, EmitDefaultValue = false)]
public string Department { get; set; }
[DataMember(Order = 10, EmitDefaultValue = false)]
public ApiDateTime WorkFrom { get; set; }
[DataMember(Order = 20, EmitDefaultValue = false)]
public List<GroupWrapperSummary> Groups { get; set; }
[DataMember(Order = 10, EmitDefaultValue = false)]
public string Location { get; set; }
[DataMember(Order = 10, EmitDefaultValue = false)]
public string Notes { get; set; }
[DataMember(Order = 20)]
public string AvatarMax { get; set; }
[DataMember(Order = 20)]
public string AvatarMedium { get; set; }
[DataMember(Order = 20)]
public string Avatar { get; set; }
[DataMember(Order = 20)]
public bool IsAdmin { get; set; }
[DataMember(Order = 20)]
public bool IsLDAP { get; set; }
[DataMember(Order = 20, EmitDefaultValue = false)]
public List<string> ListAdminModules { get; set; }
[DataMember(Order = 20)]
public bool IsOwner { get; set; }
[DataMember(Order = 2)]
public bool IsVisitor { get; set; }
[DataMember(Order = 20, EmitDefaultValue = false)]
public string CultureName { get; set; }
[DataMember(Order = 11, EmitDefaultValue = false)]
public string MobilePhone { get; set; }
[DataMember(Order = 11, EmitDefaultValue = false)]
public MobilePhoneActivationStatus MobilePhoneActivationStatus { get; set; }
[DataMember(Order = 20)]
public bool IsSSO { get; set; }
public new static EmployeeWraperFull GetSample()

View File

@ -27,38 +27,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using ASC.Core;
using ASC.Core.Users;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace ASC.Web.Api.Models
{
[DataContract(Name = "group", Namespace = "")]
public class GroupWrapperFull
{
[DataMember(Order = 5)]
public string Description { get; set; }
[DataMember(Order = 2)]
public string Name { get; set; }
[DataMember(Order = 4, EmitDefaultValue = true)]
public Guid? Parent { get; set; }
[DataMember(Order = 3)]
public Guid Category { get; set; }
[DataMember(Order = 1)]
public Guid Id { get; set; }
[DataMember(Order = 9, EmitDefaultValue = true)]
public EmployeeWraper Manager { get; set; }
[DataMember(Order = 10, EmitDefaultValue = false)]
public List<EmployeeWraper> Members { get; set; }
public UserManager UserManager { get; }
public static GroupWrapperFull GetSample()
{

View File

@ -25,12 +25,11 @@
using System;
using System.Runtime.Serialization;
using ASC.Web.Core.Users;
namespace ASC.Web.Api.Models
{
[DataContract]
public class ThumbnailsDataWrapper
{
public ThumbnailsDataWrapper(Guid userId, UserPhotoManager userPhotoManager)
@ -47,22 +46,16 @@ namespace ASC.Web.Api.Models
{
}
[DataMember]
public string Original { get; set; }
[DataMember]
public string Retina { get; set; }
[DataMember]
public string Max { get; set; }
[DataMember]
public string Big { get; set; }
[DataMember]
public string Medium { get; set; }
[DataMember]
public string Small { get; set; }

View File

@ -1,6 +1,7 @@
using System;
using ASC.Api.Core;
using ASC.Api.Core.Auth;
using ASC.Api.Core.Core;
using ASC.Api.Core.Middleware;
@ -23,7 +24,6 @@ using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
namespace ASC.People
{
@ -43,10 +43,13 @@ namespace ASC.People
services.AddHttpContextAccessor();
services.AddControllers()
.AddNewtonsoftJson()
.AddXmlSerializerFormatters();
services.AddTransient<IConfigureOptions<MvcNewtonsoftJsonOptions>, CustomJsonOptionsWrapper>();
.AddXmlSerializerFormatters()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.WriteIndented = false;
options.JsonSerializerOptions.IgnoreNullValues = true;
options.JsonSerializerOptions.Converters.Add(new ApiDateTimeConverter());
});
services.AddAuthentication("cookie")
.AddScheme<AuthenticationSchemeOptions, CookieAuthHandler>("cookie", a => { })

View File

@ -311,9 +311,9 @@ namespace ASC.Api.Settings
[AllowAnonymous]
[Read("cultures")]
public List<CultureInfo> GetSupportedCultures()
public IEnumerable<object> GetSupportedCultures()
{
return SetupInfo.EnabledCultures;
return SetupInfo.EnabledCultures.Select(r => new { r.Name });
}
[Read("timezones")]

View File

@ -24,25 +24,24 @@
*/
using System.Runtime.Serialization;
using System.Text.Json.Serialization;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace ASC.Api.Settings
{
[DataContract(Name = "buildversion", Namespace = "")]
public class BuildVersion
{
[DataMember]
public string CommunityServer { get; set; }
[DataMember(EmitDefaultValue = false)]
public string DocumentServer { get; set; }
[DataMember(EmitDefaultValue = false)]
public string MailServer { get; set; }
public IConfiguration Configuration { get; }
[JsonIgnore]
private IConfiguration Configuration { get; }
public BuildVersion(IConfiguration configuration)
{

View File

@ -27,7 +27,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text.Json.Serialization;
using ASC.Core;
using ASC.Core.Common.Settings;
using ASC.Core.Tenants;
@ -37,57 +38,50 @@ using ASC.Web.Studio.Utility;
namespace ASC.Web.Studio.Core.Quota
{
[DataContract(Name = "quota", Namespace = "")]
public class QuotaWrapper
{
[DataMember(Name = "storageSize")]
public ulong StorageSize { get; set; }
[DataMember(Name = "maxFileSize")]
public ulong MaxFileSize { get; set; }
[DataMember(Name = "usedSize")]
public ulong UsedSize { get; set; }
[DataMember(Name = "maxUsersCount")]
public int MaxUsersCount { get; set; }
[DataMember(Name = "usersCount")]
public int UsersCount { get; set; }
[DataMember(Name = "availableSize")]
public ulong AvailableSize
{
get { return Math.Max(0, StorageSize > UsedSize ? StorageSize - UsedSize : 0); }
set { throw new NotImplementedException(); }
}
[DataMember(Name = "availableUsersCount")]
public int AvailableUsersCount
{
get { return Math.Max(0, MaxUsersCount - UsersCount); }
set { throw new NotImplementedException(); }
}
[DataMember(Name = "storageUsage")]
public IList<QuotaUsage> StorageUsage { get; set; }
[DataMember(Name = "userStorageSize")]
public long UserStorageSize { get; set; }
[DataMember(Name = "userUsedSize")]
public long UserUsedSize { get; set; }
[DataMember(Name = "userAvailableSize")]
public long UserAvailableSize
{
get { return Math.Max(0, UserStorageSize - UserUsedSize); }
set { throw new NotImplementedException(); }
}
public TenantExtra TenantExtra { get; }
public TenantStatisticsProvider TenantStatisticsProvider { get; }
public WebItemManager WebItemManager { get; }
[JsonIgnore]
private TenantExtra TenantExtra { get; }
[JsonIgnore]
private TenantStatisticsProvider TenantStatisticsProvider { get; }
[JsonIgnore]
private WebItemManager WebItemManager { get; }
public QuotaWrapper()
{
@ -140,14 +134,10 @@ namespace ASC.Web.Studio.Core.Quota
};
}
[DataContract(Name = "quota_usage", Namespace = "")]
public class QuotaUsage
{
[DataMember(Name = "path")]
public string Path { get; set; }
[DataMember(Name = "size")]
public long Size { get; set; }
}
}

View File

@ -26,27 +26,21 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using ASC.Web.Api.Models;
namespace ASC.Api.Settings
{
[DataContract(Name = "security", Namespace = "")]
public class SecurityWrapper
{
[DataMember]
public string WebItemId { get; set; }
[DataMember]
public IEnumerable<EmployeeWraper> Users { get; set; }
[DataMember]
public IEnumerable<GroupWrapperSummary> Groups { get; set; }
[DataMember]
public bool Enabled { get; set; }
[DataMember]
public bool IsSubItem { get; set; }
public static SecurityWrapper GetSample()

View File

@ -26,42 +26,29 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using ASC.Core.Tenants;
namespace ASC.Api.Settings
{
[DataContract(Name = "settings", Namespace = "")]
public class SettingsWrapper
{
[DataMember(EmitDefaultValue = false)]
public string Timezone { get; set; }
[DataMember(EmitDefaultValue = false)]
public List<string> TrustedDomains { get; set; }
[DataMember(EmitDefaultValue = false)]
public TenantTrustedDomainsType TrustedDomainsType { get; set; }
[DataMember(EmitDefaultValue = false)]
public string Culture { get; set; }
[DataMember(EmitDefaultValue = false)]
public TimeSpan UtcOffset { get; set; }
[DataMember(EmitDefaultValue = false)]
public double UtcHoursOffset { get; set; }
[DataMember(EmitDefaultValue = false)]
public string GreetingSettings { get; set; }
[DataMember(EmitDefaultValue = false)]
public Guid OwnerId { get; set; }
[DataMember(EmitDefaultValue = false)]
public string NameSchemaId { get; set; }
public static SettingsWrapper GetSample()

View File

@ -23,30 +23,20 @@
*
*/
using System.Runtime.Serialization;
namespace ASC.Api.Settings.Smtp
{
[DataContract]
public class SmtpOperationStatus
{
[DataMember]
public bool Completed { get; set; }
[DataMember]
public string Id { get; set; }
[DataMember]
public string Status { get; set; }
[DataMember]
public string Error { get; set; }
[DataMember]
public int Percents { get; set; }
[DataMember]
public string Source { get; set; }
public static SmtpOperationStatus GetSample()

View File

@ -23,36 +23,24 @@
*
*/
using System.Runtime.Serialization;
namespace ASC.Api.Settings.Smtp
{
[DataContract(Name = "quota", Namespace = "")]
public class SmtpSettingsWrapper
{
[DataMember]
public string Host { get; set; }
[DataMember]
public int? Port { get; set; }
[DataMember]
public string SenderAddress { get; set; }
[DataMember]
public string SenderDisplayName { get; set; }
[DataMember]
public string CredentialsUserName { get; set; }
[DataMember]
public string CredentialsUserPassword { get; set; }
[DataMember]
public bool EnableSSL { get; set; }
[DataMember]
public bool EnableAuth { get; set; }
public static SmtpSettingsWrapper GetSample()

View File

@ -1,3 +1,4 @@
using ASC.Api.Core;
using ASC.Api.Core.Auth;
using ASC.Api.Core.Core;
using ASC.Api.Core.Middleware;
@ -17,7 +18,6 @@ using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
namespace ASC.Web.Api
{
@ -37,10 +37,13 @@ namespace ASC.Web.Api
services.AddHttpContextAccessor();
services.AddControllers()
.AddNewtonsoftJson()
.AddXmlSerializerFormatters();
services.AddTransient<IConfigureOptions<MvcNewtonsoftJsonOptions>, CustomJsonOptionsWrapper>();
.AddXmlSerializerFormatters()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.WriteIndented = false;
options.JsonSerializerOptions.IgnoreNullValues = true;
options.JsonSerializerOptions.Converters.Add(new ApiDateTimeConverter());
});
services.AddAuthentication("cookie")
.AddScheme<AuthenticationSchemeOptions, CookieAuthHandler>("cookie", a => { })

View File

@ -25,10 +25,7 @@
using System;
using ASC.Common.Security.Authentication;
using ASC.Core;
using ASC.Notify.Patterns;
using ASC.Web.Core.Users;
namespace ASC.Web.Studio.Core.Notify
{