public void Should_return_all_list_of_coffees() { var context = new TestLambdaContext(); var mockData = new CoffeeService(); var function = new Function(); var response = function.FunctionHandler(new APIGatewayProxyRequest { Body = "All" }, context); var expectedResponse = new APIGatewayProxyResponse { Body = JsonConvert.SerializeObject(mockData.GetAllAvailableCoffees()), StatusCode = 200, Headers = new Dictionary <string, string> { { "Content-Type", "application/json" } } }; _testOutputHelper.WriteLine("Lambda Response: \n" + response.Body); _testOutputHelper.WriteLine("Expected Response: \n" + expectedResponse.Body); Assert.Equal(expectedResponse.Body, response.Body); Assert.Equal(expectedResponse.Headers, response.Headers); Assert.Equal(expectedResponse.StatusCode, response.StatusCode); }
public async Task <IActionResult> Do() { using var coffee = new CoffeeService(_coffeeContext); string id = Request.Form["userId"]; string name = Request.Form["userName"]; var user = await coffee.FindUserAsync(id); if (user == null) { user = await coffee.CreateUserAsync(id, false); } var splitted = Request.Form["text"].ToString().Trim().Split(' ', 2); var command = splitted[0]; var option = splitted.Length > 1 ? splitted[1] : ""; var handler = handlers.GetHandler(this, user, command); if (handler == null) { return(SlackBadRequest("없는 명령어 입니다.")); } try { return(await handler(option)); } catch (BadRequestException e) { return(SlackBadRequest(e.Message)); } }
public async Task PickMoreOrders(CoffeeService coffee, User user, string text, SlackResponse response) { if (!int.TryParse(text, out var count)) { throw new NotWellFormedException(); } if (count <= 0) { throw new NotWellFormedException(); } var at = DateTime.Now; var picked = await coffee.PickMoreOrderAsync(count, at); if (picked.Count <= 0) { throw new NoOneToPickException(); } var orders = await coffee.GetOrdersAsync(at); var candidatesCount = picked.Count + orders.Count(o => o.PickedAt <= DateTime.MinValue); var sb = new StringBuilder($"<추가 당첨자 명단> {candidatesCount}명 중에 {picked.Count}명").AppendLine(); await sb.AppendOrders(coffee, picked); var responseText = sb.ToString(); response .Ephemeral("추첨하였습니다") .InChannel(responseText, "manager") .InChannel(responseText, "user"); }
public static async Task AppendOrderInfo(this StringBuilder sb, CoffeeService coffee, List <Order> orders) { var pickedCount = orders.Count(o => o.IsPicked); if (pickedCount > 0) { sb.AppendLine($"총 {orders.Count}명 중 {pickedCount}명 당첨"); var pickedOrders = orders .Where(o => o.IsPicked) .OrderBy(o => o.MenuId) .ToArray(); await sb.AppendOrders(coffee, pickedOrders); var menus = (await coffee.GetMenusAsync()).ToDictionary(m => m.Id); var menuCounts = pickedOrders.GroupBy(o => o.MenuId).Select(grouping => (grouping.Key, grouping.Count())); var steamCount = menuCounts.Select((info) => menus[info.Key].SteamMilkNeeded ? info.Item2 : 0).Sum(); if (steamCount > 0) { sb.AppendLine($"*스팀밀크* : {steamCount} 잔"); } } else { sb.AppendLine($"총 {orders.Count}명"); await sb.AppendOrders(coffee, orders.OrderBy(o => o.OrderedAt)); } }
public async Task GetMenu(CoffeeService coffee, User user, string text, SlackResponse response) { var menus = await coffee.GetMenusAsync(); var enabledMenus = menus.Where(m => m.Enabled); var disabledMenus = menus.Where(m => !m.Enabled).ToArray(); var sb = new StringBuilder("*메뉴*").AppendLine(); foreach (var m in enabledMenus) { sb.AppendLine($"*{m.Id}* - {m.Description}: {m.Price}원"); } if (disabledMenus.Length > 0) { sb.AppendLine().AppendLine("*비활성화된 메뉴*"); foreach (var m in disabledMenus) { sb.AppendLine($"{m.Description}"); } } response.Ephemeral(sb.ToString()); }
protected override async void OnAppearing() { base.OnAppearing(); int.TryParse(CoffeeId, out var result); BindingContext = await CoffeeService.GetCoffee(result); }
/// <summary> /// Create a new instance of the CoffeeController. /// </summary> /// <param name="_coffeeService">Service for persisting coffees.</param> /// <param name="_weatherService">Service for fetching weather.</param> public CoffeeController( CoffeeService _coffeeService, IWeatherService _weatherService ) { this._coffeeService = _coffeeService; this._weatherService = _weatherService; }
static void Main(string[] args) { var fileService = new FileService("./Resources/ingredients.txt"); var ingredients = fileService.ReadLinesFromFile(); var units = new List <string>() { "ml", "cup", "cups", "g", "l" }; var products = new List <string>() { "milk", "water", "coffeebeans", "whippedcream" }; var features = new List <string>() { "boiled", "steamed", "roasted", "foamed" }; var ingredientsValidator = new IngredientsService(ingredients, units, products, features); var coffeeIngredients = new List <Ingredient>(); foreach (var i in ingredients) { try { var ingredient = ingredientsValidator.IsIngredientValid(i); coffeeIngredients.Add(ingredient); } catch (Exception ex) { Console.WriteLine(ex); } } var recipe = new Recipe() { Ingredients = coffeeIngredients }; var coffeeService = new CoffeeService(); var coffeeBuilder = coffeeService.MakeCoffee(recipe); if (coffeeBuilder == null) { Console.WriteLine("We don't know to prepare that coffee"); } else { var preparedCoffee = coffeeBuilder.GetPreparedCoffee(); Console.WriteLine($"Here is your coffee {preparedCoffee.GetCoffeeType()}"); } Console.ReadKey(); }
/// <summary> /// Create a new instance of the CoffeeController. /// </summary> /// <param name="_coffeeService">Service for persisting coffees.</param> /// <param name="_weatherService">Service for fetching weather.</param> /// <param name="_logger">Logger</param> public CoffeeController( CoffeeService _coffeeService, IWeatherService _weatherService, ILogger <CoffeeController> _logger ) { this._coffeeService = _coffeeService; this._weatherService = _weatherService; this._logger = _logger; }
async Task Add() { var name = await App.Current.MainPage.DisplayPromptAsync("Name", "Name of coffee"); var roaster = await App.Current.MainPage.DisplayPromptAsync("Roaster", "Roaster of coffee"); await CoffeeService.AddCoffee(name, roaster); await Refresh(); }
public void Setup() { var timezoneOffset = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time").BaseUtcOffset; _rightTime -= timezoneOffset; _coffeeRepository.Setup(repo => repo.GetCoffeeBreak()).Returns(new CoffeeBreak()); _userRepository.Setup(repo => repo.GetUser(It.IsAny <string>())).Returns(new User()); _coffeeService = new CoffeeService(_slack.Object, _coffeeRepository.Object, _backgroundJobClient.Object, _inventoryRepository.Object, _userService.Object, _creditsRepository.Object, _itemRepository.Object); }
public SearchCoffeeMachinesTest(CoffeeMockDbContext mockDbContext) { _mockDbContext = mockDbContext; var coffeeMachineRepository = new EfReadRepository <CoffeeMachine>(_mockDbContext.CoffeeContext); var coffeePodRepository = new EfReadRepository <CoffeePod>(_mockDbContext.CoffeeContext); var specificationFactory = new SpecificationFactory(); _coffeeService = new CoffeeService(specificationFactory, coffeeMachineRepository, coffeePodRepository, null); }
public async Task CancelOrder(CoffeeService coffee, User user, string text, SlackResponse response) { var canceled = await coffee.CancelOrderAsync(user.Id, DateTime.Now, DateTime.MinValue); response.Ephemeral(canceled != null ? "취소하였습니다." : "예약이 없습니다."); if (canceled != null) { response.InChannel($"{user.Name} 님이 주문을 취소하였습니다."); } }
public async Task FillWallet(CoffeeService coffee, User user, string text, SlackResponse response) { if (!int.TryParse(text, out var amount)) { throw new NotWellFormedException(); } var u = await coffee.FillWalletAsync(user.Id, amount, DateTime.Now); response.Ephemeral($"현재 잔액은 {u.Deposit}원 입니다."); }
public void CreateCofeeWithMissingNameThrowsException() { var coffRepo = new Mock <ICoffeeRepository>(); ICoffeeService service = new CoffeeService(coffRepo.Object); var coffee = new Coffee() { }; Exception ex = Assert.Throws <InvalidDataException>(() => service.CreateCoffee(coffee)); Assert.Equal("You have to enter a name for the coffee", ex.Message); }
public static async Task AppendOrders(this StringBuilder sb, CoffeeService coffee, IEnumerable <Order> orders) { var users = await coffee.GetUsersAsync(orders.Select(o => o.UserId)); foreach (var order in orders) { if (order.IsPicked) { sb.Append(":_v: "); } sb.AppendLine($"{users[order.UserId].Name}: {order.MenuId} {order.Options}"); } }
public async Task ChangeMenu(CoffeeService coffee, User user, string text, SlackResponse response) { var menu = UnpackMenu(text); if (menu == null) { throw new NotWellFormedException(); } await coffee.ChangeMenuAsync(menu); response.Ephemeral($"{menu.Id}를 {menu.Price}원으로 수정하였습니다."); }
async Task Refresh() { IsBusy = true; await Task.Delay(2000); Coffee.Clear(); var coffees = await CoffeeService.GetCoffee(); Coffee.AddRange(coffees); IsBusy = false; }
public async Task EnableMenu(CoffeeService coffee, User user, string text, SlackResponse response) { var splitted = text.Split(' ').Select(s => s.Trim()).ToArray(); if (splitted.Length != 2 || !int.TryParse(splitted[1], out var enabledInt)) { throw new NotWellFormedException(); } var enabled = enabledInt > 0; await coffee.EnableMenuAsync(splitted[0], enabled); response.Ephemeral($"{splitted[0]}를 {(enabled ? "활성화" : "비활성화")} 시켰습니다."); }
public async Task MakeOrder(CoffeeService coffee, User user, string text, SlackResponse response) { var canceled = await coffee.CancelOrderAsync(user.Id, DateTime.Now, DateTime.MinValue); var order = await coffee.MakeOrderAsync(user.Id, text, DateTime.Now, canceled); var deposit = await coffee.GetDepositAsync(user.Id); response.Ephemeral($"{order.Price}원, 현재 잔액 {deposit}원"); if (canceled != null && canceled.IsPicked && order.Price != canceled.Price) { response.Ephemeral($"추첨된 메뉴와 가격이 다릅니다. 추출러에게 바뀐 메뉴를 확실히 알려주세요."); } response.InChannel($"{user.Name} 님이 {order.MenuId}{(canceled != null ? "로 변경" : "를 주문")} 하였습니다."); }
public async Task GetHelp(CoffeeService coffee, User user, string text, SlackResponse response) { var sb = new StringBuilder(); foreach ((var command, var name, var description) in handlers.GetDescriptions()) { if (command.ForManager && !user.IsManager) { continue; } sb.AppendLine($"*{name}* : {description}"); } response.Ephemeral(sb.ToString()); }
public async Task CancelAfternoonReservationOrder(CoffeeService coffee, User user, string text, SlackResponse response) { var at = DateTime.Now.Noon(); if (DateTime.Now > at) { throw new BadRequestException("오전에만 사용 가능한 메뉴입니다."); } var canceled = await coffee.CancelOrderAsync(user.Id, at, at); response.Ephemeral(canceled != null ? "취소하였습니다." : "예약이 없습니다."); if (canceled != null) { response.InChannel($"{user.Name} 님이 오후 커피를 취소하였습니다."); } }
public async Task GetOrders(CoffeeService coffee, User user, string text, SlackResponse response) { var at = DateTime.Now; var orders = await coffee.GetOrdersAsync(at); if (orders.Count <= 0) { response.Ephemeral("주문자가 없습니다."); return; } var sb = new StringBuilder(); await sb.AppendOrderInfo(coffee, orders); response.Ephemeral(sb.ToString()); }
public async Task CompleteOrders(CoffeeService coffee, User user, string text, SlackResponse response) { var orders = await coffee.CompleteOrderAsync(); var sb = new StringBuilder(); foreach (var o in orders) { sb.Append(SlackBot.Utils.UserIdToString(o.UserId)).Append(' '); } sb.Append("님 커피 가져가세요~"); // TODO: 왓카페 채널에 완성 명단을 알리기 response .Ephemeral("공지하였습니다.") .InChannel(sb.ToString(), "user"); }
public void CreateCoffeeWithMissingDescriptionThrowsException() { var coffRepo = new Mock <ICoffeeRepository>(); ICoffeeService service = new CoffeeService(coffRepo.Object); var coffee = new Coffee() { CoffeeName = "bob", CoffeePrice = 1, CoffeeStrength = 1, CoffeePicUrl = "URL" }; Exception ex = Assert.Throws <InvalidDataException>(() => service.CreateCoffee(coffee)); Assert.Equal("You need to insert a description!", ex.Message); }
private async Task ExecuteCommandAsync(CoffeeContext context, SlackRequest request, SlackResponse response) { var splitted = request.Text.ToString().Trim().Split(' ', 2); var command = splitted[0]; var option = splitted.Length > 1 ? splitted[1] : ""; using var coffee = new CoffeeService(context); var user = await coffee.FindUserAsync(request.UserId); if (user == null) { var userName = await GetUserNameAsync(request.Workspace.Name, request.UserId); user = await coffee.CreateUserAsync(request.UserId, userName, false); await coffee.SaveAsync(); } else if (string.IsNullOrEmpty(user.Name)) { var userName = await GetUserNameAsync(request.Workspace.Name, request.UserId); user = await coffee.UpdateUserNameAsync(request.UserId, userName); await coffee.SaveAsync(); } try { await commands.HandleCommandAsync(coffee, user, command, option, response, _logger); await coffee.SaveAsync(); } catch (BadRequestException e) { response.Empty(); response.Ephemeral(e.ResponseMsg); } catch (Exception e) { _logger.LogError(e, $"Error occured during handling command: {command}"); } await response.SendAsync(_slackService); }
public ServiceLocator() { var path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); var dbConnectionProvider = new DbConnectionProvider(Path.Combine(path, "user-db")); var httpProvider = new HttpClientProvider(() => new ModernHttpClient.NativeMessageHandler()); dbConnectionProvider.InitializeDb(); var favoriteService = new FavoriteService(dbConnectionProvider); var coffeeService = new CoffeeService(httpProvider); this.NavigationService = new Navigation(); this.CoffeeListViewModel = new CoffeeListViewModel(coffeeService, favoriteService); this.CoffeeViewModel = new CoffeeViewModel(favoriteService, this.NavigationService); }
public async Task GetHistory(CoffeeService coffee, User user, string text, SlackResponse response) { if (!int.TryParse(text, out int days)) { days = 180; } StringBuilder sb = new StringBuilder(); var walletHistory = await coffee.GetFillHistories(user.Id, DateTime.Now, days); foreach (var fill in walletHistory) { sb.AppendLine($"{fill.At.Month}월 {fill.At.Day}일 : *{fill.Amount}* 원"); } response.Ephemeral(sb.ToString()); }
public async Task HandleCommandAsync(CoffeeService coffee, User user, string commandId, string options, SlackResponse response, ILogger logger = null) { if (!handlers.TryGetHandler(commandId, out var handlerInfo)) { throw new CommandNotFoundException(); } var command = handlerInfo.Key; var methodInfo = handlerInfo.Value; if (command.ForManager && !user.IsManager) { throw new OnlyForManagerException(); } await(Task) methodInfo.Invoke(this, new object[] { coffee, user, options, response }); }
public async Task MakeReservationForAfternoon(CoffeeService coffee, User user, string text, SlackResponse response) { var at = DateTime.Now.Noon(); if (DateTime.Now > at) { throw new BadRequestException("오전에만 사용 가능한 메뉴입니다."); } var canceled = await coffee.CancelOrderAsync(user.Id, at, at); var order = await coffee.MakeOrderAsync(user.Id, text, at); var deposit = await coffee.GetDepositAsync(user.Id); response .Ephemeral($"{order.Price}원, 현재 잔액 {deposit}원") .InChannel($"{user.Name} 님이 오후 커피를 {order.MenuId}로 {(canceled != null ? "변경" : "예약")} 하였습니다."); }
public HomeController() { coffeeService = new CoffeeService(); blobService = new BlobService(); }