Merge pull request #311 from egorikas/dev
Fix "DRY up RedisBasketRepository"
This commit is contained in:
commit
d0e9cc58a9
@ -18,7 +18,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.IntegrationEvents.Even
|
|||||||
|
|
||||||
public async Task Handle(ProductPriceChangedIntegrationEvent @event)
|
public async Task Handle(ProductPriceChangedIntegrationEvent @event)
|
||||||
{
|
{
|
||||||
var userIds = await _repository.GetUsersAsync();
|
var userIds = _repository.GetUsers();
|
||||||
|
|
||||||
foreach (var id in userIds)
|
foreach (var id in userIds)
|
||||||
{
|
{
|
||||||
|
@ -6,7 +6,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
|
|||||||
public interface IBasketRepository
|
public interface IBasketRepository
|
||||||
{
|
{
|
||||||
Task<CustomerBasket> GetBasketAsync(string customerId);
|
Task<CustomerBasket> GetBasketAsync(string customerId);
|
||||||
Task<IEnumerable<string>> GetUsersAsync();
|
IEnumerable<string> GetUsers();
|
||||||
Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket);
|
Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket);
|
||||||
Task<bool> DeleteBasketAsync(string id);
|
Task<bool> DeleteBasketAsync(string id);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using StackExchange.Redis;
|
using StackExchange.Redis;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -10,40 +9,33 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
|
|||||||
{
|
{
|
||||||
public class RedisBasketRepository : IBasketRepository
|
public class RedisBasketRepository : IBasketRepository
|
||||||
{
|
{
|
||||||
private ILogger<RedisBasketRepository> _logger;
|
private readonly ILogger<RedisBasketRepository> _logger;
|
||||||
private BasketSettings _settings;
|
|
||||||
|
|
||||||
private ConnectionMultiplexer _redis;
|
private readonly ConnectionMultiplexer _redis;
|
||||||
|
private readonly IDatabase _database;
|
||||||
|
|
||||||
public RedisBasketRepository(IOptionsSnapshot<BasketSettings> options, ILoggerFactory loggerFactory)
|
public RedisBasketRepository(ILoggerFactory loggerFactory, ConnectionMultiplexer redis)
|
||||||
{
|
{
|
||||||
_settings = options.Value;
|
|
||||||
_logger = loggerFactory.CreateLogger<RedisBasketRepository>();
|
_logger = loggerFactory.CreateLogger<RedisBasketRepository>();
|
||||||
|
_redis = redis;
|
||||||
|
_database = redis.GetDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> DeleteBasketAsync(string id)
|
public async Task<bool> DeleteBasketAsync(string id)
|
||||||
{
|
{
|
||||||
var database = await GetDatabase();
|
return await _database.KeyDeleteAsync(id);
|
||||||
return await database.KeyDeleteAsync(id.ToString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<string>> GetUsersAsync()
|
public IEnumerable<string> GetUsers()
|
||||||
{
|
{
|
||||||
var server = await GetServer();
|
var server = GetServer();
|
||||||
|
var data = server.Keys();
|
||||||
IEnumerable<RedisKey> data = server.Keys();
|
return data?.Select(k => k.ToString());
|
||||||
if (data == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return data.Select(k => k.ToString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<CustomerBasket> GetBasketAsync(string customerId)
|
public async Task<CustomerBasket> GetBasketAsync(string customerId)
|
||||||
{
|
{
|
||||||
var database = await GetDatabase();
|
var data = await _database.StringGetAsync(customerId);
|
||||||
|
|
||||||
var data = await database.StringGetAsync(customerId.ToString());
|
|
||||||
if (data.IsNullOrEmpty)
|
if (data.IsNullOrEmpty)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
@ -54,9 +46,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
|
|||||||
|
|
||||||
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket)
|
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket)
|
||||||
{
|
{
|
||||||
var database = await GetDatabase();
|
var created = await _database.StringSetAsync(basket.BuyerId, JsonConvert.SerializeObject(basket));
|
||||||
|
|
||||||
var created = await database.StringSetAsync(basket.BuyerId, JsonConvert.SerializeObject(basket));
|
|
||||||
if (!created)
|
if (!created)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("Problem occur persisting the item.");
|
_logger.LogInformation("Problem occur persisting the item.");
|
||||||
@ -68,34 +58,10 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
|
|||||||
return await GetBasketAsync(basket.BuyerId);
|
return await GetBasketAsync(basket.BuyerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<IDatabase> GetDatabase()
|
private IServer GetServer()
|
||||||
{
|
{
|
||||||
if (_redis == null)
|
|
||||||
{
|
|
||||||
await ConnectToRedisAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
return _redis.GetDatabase();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<IServer> GetServer()
|
|
||||||
{
|
|
||||||
if (_redis == null)
|
|
||||||
{
|
|
||||||
await ConnectToRedisAsync();
|
|
||||||
}
|
|
||||||
var endpoint = _redis.GetEndPoints();
|
var endpoint = _redis.GetEndPoints();
|
||||||
|
|
||||||
return _redis.GetServer(endpoint.First());
|
return _redis.GetServer(endpoint.First());
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task ConnectToRedisAsync()
|
|
||||||
{
|
|
||||||
var configuration = ConfigurationOptions.Parse(_settings.ConnectionString, true);
|
|
||||||
configuration.ResolveDns = true;
|
|
||||||
|
|
||||||
_logger.LogInformation($"Connecting to database {configuration.SslHost}.");
|
|
||||||
_redis = await ConnectionMultiplexer.ConnectAsync(configuration);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
|
|
||||||
|
using StackExchange.Redis;
|
||||||
|
|
||||||
namespace IntegrationTests.Services.Basket
|
namespace IntegrationTests.Services.Basket
|
||||||
{
|
{
|
||||||
using Microsoft.eShopOnContainers.Services.Basket.API;
|
using Microsoft.eShopOnContainers.Services.Basket.API;
|
||||||
@ -57,10 +59,9 @@ namespace IntegrationTests.Services.Basket
|
|||||||
RedisBasketRepository BuildBasketRepository()
|
RedisBasketRepository BuildBasketRepository()
|
||||||
{
|
{
|
||||||
var loggerFactory = new LoggerFactory();
|
var loggerFactory = new LoggerFactory();
|
||||||
var basketSettings = new BasketSettings() { ConnectionString = "127.0.0.1" };
|
var configuration = ConfigurationOptions.Parse("127.0.0.1", true);
|
||||||
_optionsMock.Setup(x => x.Value).Returns(basketSettings);
|
configuration.ResolveDns = true;
|
||||||
|
return new RedisBasketRepository(loggerFactory, ConnectionMultiplexer.Connect(configuration));
|
||||||
return new RedisBasketRepository(_optionsMock.Object, loggerFactory);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<BasketItem> BuildBasketItems()
|
List<BasketItem> BuildBasketItems()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user