Mongo db saving

This commit is contained in:
Mikhail Shabanov committed 2020-05-31 15:43:39 +02:00
1 parent 36be21e61c
commit 71c0240437
18 files changed
+217 -22

No files matched your search

@@ -1,5 +1,4 @@
using System.Collections.Generic;
using WotBlitzStatisticsPro.Common.Model;
namespace WotBlitzStatisticsPro.Common.Dictionaries
{
@@ -21,7 +20,7 @@ namespace WotBlitzStatisticsPro.Common.Dictionaries
/// <summary>
/// Localized section names
/// </summary>
public Dictionary<RequestLanguage, string> AchievementSectionNames { get; set; }
public List<LocalizableString> AchievementSectionNames { get; set; }
}
}
@@ -1,5 +1,4 @@
using System.Collections.Generic;
using WotBlitzStatisticsPro.Common.Model;
namespace WotBlitzStatisticsPro.Common.Dictionaries
{
@@ -16,6 +15,6 @@ namespace WotBlitzStatisticsPro.Common.Dictionaries
/// <summary>
/// Localized clan role names
/// </summary>
public Dictionary<RequestLanguage, string> ClanRoleNames { get; set; }
public List<LocalizableString> ClanRoleNames { get; set; }
}
}
@@ -0,0 +1,20 @@
using WotBlitzStatisticsPro.Common.Model;
namespace WotBlitzStatisticsPro.Common.Dictionaries
{
/// <summary>
/// Represents localizable string
/// </summary>
public class LocalizableString
{
/// <summary>
/// Language.
/// </summary>
public RequestLanguage Language { get; set; }
/// <summary>
/// Localizable string.
/// </summary>
public string Value { get; set; }
}
}
@@ -1,5 +1,4 @@
using System.Collections.Generic;
using WotBlitzStatisticsPro.Common.Model;
namespace WotBlitzStatisticsPro.Common.Dictionaries
{
@@ -16,6 +15,6 @@ namespace WotBlitzStatisticsPro.Common.Dictionaries
/// <summary>
/// Nation
/// </summary>
public Dictionary<RequestLanguage, string> NationNames { get; set; }
public List<LocalizableString> NationNames { get; set; }
}
}
@@ -1,5 +1,4 @@
using System.Collections.Generic;
using WotBlitzStatisticsPro.Common.Model;
namespace WotBlitzStatisticsPro.Common.Dictionaries
{
@@ -16,7 +15,7 @@ namespace WotBlitzStatisticsPro.Common.Dictionaries
/// <summary>
/// Vehicle type localized name
/// </summary>
public Dictionary<RequestLanguage, string> VehicleTypeNames { get; set; }
public List<LocalizableString> VehicleTypeNames { get; set; }
}
}
@@ -0,0 +1,18 @@
namespace WotBlitzStatisticsPro.Common
{
/// <summary>
/// MongoDB connection settings
/// </summary>
public interface IMongoSettings
{
/// <summary>
/// Connection string
/// </summary>
string ConnectionString { get; set; }
/// <summary>
/// Database name
/// </summary>
string DatabaseName { get; set; }
}
}
@@ -0,0 +1,66 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using MongoDB.Driver;
using WotBlitzStatisticsPro.Common;
using WotBlitzStatisticsPro.Common.Dictionaries;
namespace WotBlitzStatisticsPro.DataAccess
{
public class DictionariesDataAccessor : IDictionariesDataAccessor
{
private const string LanguagesCollectionName = "dictionary-languages";
private const string NationsCollectionName = "dictionary-natons";
private const string VehicleTypesCollectionName = "dictionary-vehicle-types";
private const string ClanRolesCollectionName = "dictionary-clan-roles";
private const string AchievementsSectionsCollectionName = "dictionary-achievements-sections";
private readonly IMongoDatabase _database;
public DictionariesDataAccessor(IMongoSettings settings)
{
var client = new MongoClient(settings.ConnectionString);
_database = client.GetDatabase(settings.DatabaseName);
}
public async Task UpdateLanguages(List<LanguageDictionary> languages)
{
var dbLanguages = _database.GetCollection<LanguageDictionary>(LanguagesCollectionName);
await dbLanguages.DeleteManyAsync(Builders<LanguageDictionary>.Filter.Empty);
await dbLanguages.InsertManyAsync(languages);
}
public async Task UpdateNations(List<NationDictionary> nations)
{
var dbNations = _database.GetCollection<NationDictionary>(NationsCollectionName);
await dbNations.DeleteManyAsync(Builders<NationDictionary>.Filter.Empty);
await dbNations.InsertManyAsync(nations);
}
public async Task UpdateVehicleTypes(List<VehicleTypeDictionary> vehicleTypes)
{
var dbVehicleTypes = _database.GetCollection<VehicleTypeDictionary>(VehicleTypesCollectionName);
await dbVehicleTypes.DeleteManyAsync(Builders<VehicleTypeDictionary>.Filter.Empty);
await dbVehicleTypes.InsertManyAsync(vehicleTypes);
}
public async Task UpdateClanRoles(List<ClanRoleDictionary> clanRoles)
{
var dbClanRoles = _database.GetCollection<ClanRoleDictionary>(ClanRolesCollectionName);
await dbClanRoles.DeleteManyAsync(Builders<ClanRoleDictionary>.Filter.Empty);
await dbClanRoles.InsertManyAsync(clanRoles);
}
public async Task UpdateAchievementsSections(List<AchievementSectionDictionary> achievementSections)
{
var dbAchievementSections =
_database.GetCollection<AchievementSectionDictionary>(AchievementsSectionsCollectionName);
await dbAchievementSections.DeleteManyAsync(Builders<AchievementSectionDictionary>.Filter.Empty);
await dbAchievementSections.InsertManyAsync(achievementSections);
}
}
}
@@ -0,0 +1,19 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using WotBlitzStatisticsPro.Common.Dictionaries;
namespace WotBlitzStatisticsPro.DataAccess
{
public interface IDictionariesDataAccessor
{
Task UpdateLanguages(List<LanguageDictionary> languages);
Task UpdateNations(List<NationDictionary> nations);
Task UpdateVehicleTypes(List<VehicleTypeDictionary> vehicleTypes);
Task UpdateClanRoles(List<ClanRoleDictionary> clanRoles);
Task UpdateAchievementsSections(List<AchievementSectionDictionary> achievementSections);
}
}
@@ -0,0 +1,13 @@
using Microsoft.Extensions.DependencyInjection;
namespace WotBlitzStatisticsPro.DataAccess
{
public static class WotBlitzStatisticsDataAccessInstaller
{
public static void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IDictionariesDataAccessor, DictionariesDataAccessor>();
}
}
}
@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.4" />
<PackageReference Include="MongoDB.Driver" Version="2.10.4" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\WotBlitzStatisticsPro.Common\WotBlitzStatisticsPro.Common.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,10 @@
using WotBlitzStatisticsPro.Common;
namespace WotBlitzStatisticsPro.GraphQl
{
public class MongoSettings : IMongoSettings
{
public string ConnectionString { get; set; }
public string DatabaseName { get; set; }
}
}
+4
View File
@@ -29,7 +29,11 @@ namespace WotBlitzStatisticsPro.GraphQl
var wgApiConfig = new WargamingApiSettings();
Configuration.GetSection("WargamingApi").Bind(wgApiConfig);
var mongoConfig = new MongoSettings();
Configuration.GetSection("Mongo").Bind(mongoConfig);
services.AddSingleton<IWargamingApiSettings>(wgApiConfig);
services.AddSingleton<IMongoSettings>(mongoConfig);
WotBlitzStatisticsLogicInstaller.ConfigureServices(services);
// Global data loader - caches data between requests
@@ -10,5 +10,9 @@
"WargamingApi": {
"ApplicationId": "e6bb7a6cd1b7da3ca5697f97072d2176"
}
},
"Mongo": {
"ConnectionString": "mongodb://root:seCurePwd12!@localhost:27017/?authSource=admin",
"DatabaseName": "WotBlitzStatisticsPro"
}
}
@@ -5,6 +5,7 @@ using System.Threading.Tasks;
using AutoMapper;
using WotBlitzStatisticsPro.Common.Dictionaries;
using WotBlitzStatisticsPro.Common.Model;
using WotBlitzStatisticsPro.DataAccess;
using WotBlitzStatisticsPro.WgApiClient;
using WotBlitzStatisticsPro.WgApiClient.Model;
@@ -13,13 +14,16 @@ namespace WotBlitzStatisticsPro.Logic.Dictionaries
public class StaticDictionariesUpdater : IDictionaryUpdater
{
private readonly IWargamingDictionariesApiClient _wargamingDictionariesApiClient;
private readonly IDictionariesDataAccessor _dataAccessor;
private readonly IMapper _mapper;
public StaticDictionariesUpdater(
IWargamingDictionariesApiClient wargamingDictionariesApiClient,
IDictionariesDataAccessor dataAccessor,
IMapper mapper)
{
_wargamingDictionariesApiClient = wargamingDictionariesApiClient;
_dataAccessor = dataAccessor;
_mapper = mapper;
}
public async Task<UpdateDictionariesResponseItem> Update()
@@ -31,11 +35,20 @@ namespace WotBlitzStatisticsPro.Logic.Dictionaries
clanRoles,
achievementsSections) = await GetAndMapDictionaries();
// ToDo: Save dictionary to Mongo
await _dataAccessor.UpdateLanguages(languages);
await _dataAccessor.UpdateNations(nations);
await _dataAccessor.UpdateVehicleTypes(vehicleTypes);
await _dataAccessor.UpdateClanRoles(clanRoles);
await _dataAccessor.UpdateAchievementsSections(achievementsSections);
// ToDo: create unit tests
throw new System.NotImplementedException();
return new UpdateDictionariesResponseItem
{
DictionaryType = DictionaryType.StaticDictionaries,
Description =
$"Updated {languages.Count} items in Languages dictionary; {nations.Count} items in Nations dictionary; {vehicleTypes.Count} items in VehicleTypes dictionary; {clanRoles.Count} items in ClanRoles dictionary; {achievementsSections.Count} items in AchievementsSections dictionary"
};
}
private async Task<(
@@ -86,12 +99,13 @@ namespace WotBlitzStatisticsPro.Logic.Dictionaries
{
destinationItem = new NationDictionary
{
NationId = source.Key, NationNames = new Dictionary<RequestLanguage, string>()
NationId = source.Key, NationNames = new List<LocalizableString>()
};
destinationDictionary.Add(destinationItem);
}
destinationItem.NationNames[requestLanguage] = source.Value;
destinationItem.NationNames.Add(
new LocalizableString {Language = requestLanguage, Value = source.Value});
}
}
@@ -107,12 +121,13 @@ namespace WotBlitzStatisticsPro.Logic.Dictionaries
{
destinationItem = new VehicleTypeDictionary
{
VehicleTypeId = source.Key, VehicleTypeNames = new Dictionary<RequestLanguage, string>()
VehicleTypeId = source.Key, VehicleTypeNames = new List<LocalizableString>()
};
destinationDictionary.Add(destinationItem);
}
destinationItem.VehicleTypeNames[requestLanguage] = source.Value;
destinationItem.VehicleTypeNames.Add(
new LocalizableString { Language = requestLanguage, Value = source.Value });
}
}
@@ -128,12 +143,13 @@ namespace WotBlitzStatisticsPro.Logic.Dictionaries
{
destinationItem = new ClanRoleDictionary
{
ClanRoleId = source.Key, ClanRoleNames = new Dictionary<RequestLanguage, string>()
ClanRoleId = source.Key, ClanRoleNames = new List<LocalizableString>()
};
destinationDictionary.Add(destinationItem);
}
destinationItem.ClanRoleNames[requestLanguage] = source.Value;
destinationItem.ClanRoleNames.Add(
new LocalizableString { Language = requestLanguage, Value = source.Value });
}
}
@@ -152,12 +168,13 @@ namespace WotBlitzStatisticsPro.Logic.Dictionaries
{
AchievementSectionId = section.Key,
Order = Convert.ToInt32(section.Value.Order),
AchievementSectionNames = new Dictionary<RequestLanguage, string>()
AchievementSectionNames = new List<LocalizableString>()
};
destinationDictionary.Add(destinationItem);
}
destinationItem.AchievementSectionNames[requestLanguage] = section.Value.Name;
destinationItem.AchievementSectionNames.Add(
new LocalizableString { Language = requestLanguage, Value = section.Value.Name });
}
}
}
@@ -24,7 +24,10 @@ namespace WotBlitzStatisticsPro.Logic
if ((updateDictionariesRequest.DictionaryTypes & dictionaryType) != 0)
{
var dictionaryUpdater = _dictionaryUpdaterFactoryMethod(dictionaryType);
response.Add(await dictionaryUpdater.Update());
if (dictionaryUpdater != null)
{
response.Add(await dictionaryUpdater.Update());
}
}
}
@@ -2,6 +2,7 @@
using AutoMapper;
using Microsoft.Extensions.DependencyInjection;
using WotBlitzStatisticsPro.Common.Model;
using WotBlitzStatisticsPro.DataAccess;
using WotBlitzStatisticsPro.Logic.Dictionaries;
using WotBlitzStatisticsPro.WgApiClient;
@@ -14,6 +15,7 @@ namespace WotBlitzStatisticsPro.Logic
public static void ConfigureServices(IServiceCollection services)
{
ConfigureDictionariesFactory(services);
WotBlitzStatisticsDataAccessInstaller.ConfigureServices(services);
services.AddAutoMapper(typeof(WotBlitzStatisticsLogicInstaller));
services.AddHttpClient<IWargamingApiClient, WargamingApiClient>();
services.AddHttpClient<IWargamingDictionariesApiClient, WargamingApiClient>();
@@ -38,8 +40,7 @@ namespace WotBlitzStatisticsPro.Logic
case DictionaryType.Vehicles:
return serviceProvider.GetService<VehiclesDictionaryUpdater>();
default:
throw new KeyNotFoundException(
$"Unable to find service for dictionary type '{dictionaryType}'");
return null;
}
});
}
@@ -13,6 +13,7 @@
<ItemGroup>
<ProjectReference Include="..\WotBlitzStatisticsPro.Common\WotBlitzStatisticsPro.Common.csproj" />
<ProjectReference Include="..\WotBlitzStatisticsPro.DataAccess\WotBlitzStatisticsPro.DataAccess.csproj" />
<ProjectReference Include="..\WotBlitzStatisticsPro.WgApiClient\WotBlitzStatisticsPro.WgApiClient.csproj" />
</ItemGroup>
+7
View File
@@ -13,6 +13,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WotBlitzStatisticsPro.Logic
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WotBlitzStatisticsPro.GraphQl", "WotBlitzStatisticsPro.GraphQl\WotBlitzStatisticsPro.GraphQl.csproj", "{921E0CBA-5696-4BB3-A547-78F599B1479B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WotBlitzStatisticsPro.DataAccess", "WotBlitzStatisticsPro.DataAccess\WotBlitzStatisticsPro.DataAccess.csproj", "{19B1EDE4-1B83-49E2-A666-6CFE3A4A732E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -35,6 +37,10 @@ Global
{921E0CBA-5696-4BB3-A547-78F599B1479B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{921E0CBA-5696-4BB3-A547-78F599B1479B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{921E0CBA-5696-4BB3-A547-78F599B1479B}.Release|Any CPU.Build.0 = Release|Any CPU
{19B1EDE4-1B83-49E2-A666-6CFE3A4A732E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{19B1EDE4-1B83-49E2-A666-6CFE3A4A732E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{19B1EDE4-1B83-49E2-A666-6CFE3A4A732E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{19B1EDE4-1B83-49E2-A666-6CFE3A4A732E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -42,6 +48,7 @@ Global
GlobalSection(NestedProjects) = preSolution
{E1AB7997-C2A1-433B-A4F5-F8E9C4B73515} = {5095AE8F-F1D4-4BC0-95FD-B3DB0D3AED15}
{A79103B3-4F04-4090-803E-B7AABFCC93B1} = {5095AE8F-F1D4-4BC0-95FD-B3DB0D3AED15}
{19B1EDE4-1B83-49E2-A666-6CFE3A4A732E} = {5095AE8F-F1D4-4BC0-95FD-B3DB0D3AED15}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {295179CC-53B9-4A2F-8051-A6B033EED16E}