Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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));
            }
        }
Exemplo n.º 3
0
        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");
        }
Exemplo n.º 4
0
        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));
            }
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 7
0
 /// <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;
 }
Exemplo n.º 8
0
        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();
        }
Exemplo n.º 9
0
 /// <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();
        }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 12
0
        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);
        }
Exemplo n.º 13
0
        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} 님이 주문을 취소하였습니다.");
            }
        }
Exemplo n.º 14
0
        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}원 입니다.");
        }
Exemplo n.º 15
0
        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);
        }
Exemplo n.º 16
0
        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}");
            }
        }
Exemplo n.º 17
0
        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}원으로 수정하였습니다.");
        }
Exemplo n.º 18
0
        async Task Refresh()
        {
            IsBusy = true;

            await Task.Delay(2000);

            Coffee.Clear();

            var coffees = await CoffeeService.GetCoffee();

            Coffee.AddRange(coffees);

            IsBusy = false;
        }
Exemplo n.º 19
0
        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 ? "활성화" : "비활성화")} 시켰습니다.");
        }
Exemplo n.º 20
0
        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 ? "로 변경" : "를 주문")} 하였습니다.");
        }
Exemplo n.º 21
0
        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());
        }
Exemplo n.º 22
0
        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} 님이 오후 커피를 취소하였습니다.");
            }
        }
Exemplo n.º 23
0
        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());
        }
Exemplo n.º 24
0
        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");
        }
Exemplo n.º 25
0
        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);
        }
Exemplo n.º 26
0
        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);
        }
Exemplo n.º 27
0
        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);
        }
Exemplo n.º 28
0
        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());
        }
Exemplo n.º 29
0
        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 });
        }
Exemplo n.º 30
0
        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 ? "변경" : "예약")} 하였습니다.");
        }
Exemplo n.º 31
0
 public HomeController()
 {
     coffeeService = new CoffeeService();
     blobService = new BlobService();
 }