added redis integration and command line arguments handling to cart service. Didn't test in the cloud yet
This commit is contained in:
parent
572c02f588
commit
8860d8bfdd
7 changed files with 184 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
src/cartservice/bin/*
|
||||||
|
src/cartservice/obj/*
|
||||||
|
.vs/*.*
|
28
.vscode/launch.json
vendored
Normal file
28
.vscode/launch.json
vendored
Normal 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
15
.vscode/tasks.json
vendored
Normal 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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
41
src/cartservice/cartstore/LocalCartStore.cs
Normal file
41
src/cartservice/cartstore/LocalCartStore.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
74
src/cartservice/cartstore/RedisCartStore.cs
Normal file
74
src/cartservice/cartstore/RedisCartStore.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
12
src/cartservice/interfaces/ICartStore.cs
Normal file
12
src/cartservice/interfaces/ICartStore.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
11
src/cartservice/run_redis_emulator_windows.bat
Normal file
11
src/cartservice/run_redis_emulator_windows.bat
Normal 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
|
Loading…
Reference in a new issue