added redis integration and command line arguments handling to cart service. Didn't test in the cloud yet

This commit is contained in:
Simon Zeltser 2018-06-21 11:09:12 -07:00
parent 572c02f588
commit 8860d8bfdd
7 changed files with 184 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
src/cartservice/bin/*
src/cartservice/obj/*
.vs/*.*

28
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,28 @@
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/src/cartservice/bin/Debug/netcoreapp2.0/cartservice.dll",
"args": [],
"cwd": "${workspaceFolder}/src/cartservice",
// For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window
"console": "internalConsole",
"stopAtEntry": false,
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach",
"processId": "${command:pickProcess}"
}
,]
}

15
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,15 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/src/cartservice/cartservice.csproj"
],
"problemMatcher": "$msCompile"
}
]
}

View File

@ -0,0 +1,41 @@
using System.Collections.Concurrent;
using cartservice.interfaces;
namespace cartservice.cartstore
{
internal class LocalCartStore
{
// Maps between user and their cart
private ConcurrentDictionary<string, Cart> userCartItems = new ConcurrentDictionary<string, Cart>();
public void AddItem(string userId, string productId, int quantity)
{
Cart cart;
if (!userCartItems.TryGetValue(userId, out cart))
{
cart = new Cart(userId);
}
else
{
cart = userCartItems[userId];
}
cart.AddItem(productId, quantity);
}
public void EmptyCart(string userId)
{
Cart cart;
if (userCartItems.TryGetValue(userId, out cart))
{
cart.EmptyCart();
}
}
public Cart GetCart(string userId)
{
Cart cart = null;
userCartItems.TryGetValue(userId, out cart);
return cart;
}
}
}

View File

@ -0,0 +1,74 @@
using System;
using System.IO;
using System.Threading.Tasks;
using cartservice.interfaces;
using Google.Protobuf;
using Hipstershop;
using StackExchange.Redis;
namespace cartservice.cartstore
{
public class RedisCartStore : ICartStore
{
private const string CART_FIELD_NAME = "cart";
private readonly ConnectionMultiplexer redis;
private readonly byte[] emptyCartBytes;
public RedisCartStore(string redisAddress)
{
// Serialize empty cart into byte array.
var cart = new Hipstershop.Cart();
emptyCartBytes = cart.ToByteArray();
string connectionString = $"{redisAddress},ssl=false,allowAdmin=true";
Console.WriteLine("Connecting to Redis: " + connectionString);
redis = ConnectionMultiplexer.Connect(connectionString);
}
public async Task AddItemAsync(string userId, string productId, int quantity)
{
var db = redis.GetDatabase();
// Access the cart from the cache
var value = await db.HashGetAsync(userId, CART_FIELD_NAME);
Hipstershop.Cart cart;
if (value.IsNull)
{
cart = new Hipstershop.Cart();
}
else
{
cart = Hipstershop.Cart.Parser.ParseFrom(value);
}
cart.Items.Add(new Hipstershop.CartItem { ProductId = productId, Quantity = quantity });
}
public async Task EmptyCartAsync(string userId)
{
var db = redis.GetDatabase();
// Update the cache with empty cart for given user
await db.HashSetAsync(userId, new[] { new HashEntry(CART_FIELD_NAME, emptyCartBytes) });
}
public async Task<Hipstershop.Cart> GetCartAsync(string userId)
{
var db = redis.GetDatabase();
// Access the cart from the cache
var value = await db.HashGetAsync(userId, CART_FIELD_NAME);
Hipstershop.Cart cart = null;
if (!value.IsNull)
{
cart = Hipstershop.Cart.Parser.ParseFrom(value);
}
return cart;
}
}
}

View File

@ -0,0 +1,12 @@
using System.Threading.Tasks;
namespace cartservice.interfaces
{
internal interface ICartStore
{
Task AddItemAsync(string userId, string productId, int quantity);
Task EmptyCartAsync(string userId);
Task<Hipstershop.Cart> GetCartAsync(string userId);
}
}

View File

@ -0,0 +1,11 @@
@echo off
rem install redis on windows using choco
rem choco install redis-64
rem run redis
redis-server --daemonize yes
rem testing locally
rem redis-cli
rem SET foo bar
rem GET foo