public async Task <IActionResult> NewDonation([FromBody] NewDonationRequest request)
        {
            await _donationReceivedCommandHandler.HandleAsync(
                new DonationReceivedCommand
            {
                Name           = request.Name,
                PostCode       = request.PostCode,
                DonationAmount = request.DonationAmount
            });

            return(Ok());
        }
        public NewDonationResponse HandleNewDonationRequest(NewDonationRequest request)
        {
            NewDonationResponse ret;
            SqlCommand          com = new SqlCommand(
                $"select MaterialID, MaterialName, MaterialQuantity " +
                $"from Materials " +
                $"where " +
                $"MaterialId = {request.MaterialId}",
                Connect.Connection);

            SqlDataAdapter da = new SqlDataAdapter(com);
            DataSet        ds = new DataSet();

            int n = da.Fill(ds, "Materials");

            if (n != 0)
            {
                DateTime now = DateTime.Now;

                com.CommandText = $"INSERT INTO Tranc (UserId, Address, MaterialId, MaterialQuantity, TransactionState, TransactionType, StartTime, AdminId) " +
                                  $"OUTPUT INSERTED.TransactionId values ({UserId}, '{request.Address}', {request.MaterialId}, {request.Quantity}, " +
                                  $"{(int)ApplicationState.Applying}, {(int)TransactionType.DONATION}, '{now}', -1)";

                // https://stackoverflow.com/questions/18373461/execute-insert-command-and-return-inserted-id-in-sql
                int modified = Convert.ToInt32(com.ExecuteScalar());

                ret = new NewDonationResponse()
                {
                    Item = new GetDonationListResponse.Item()
                    {
                        ID        = modified,
                        Name      = ds.Tables[0].Rows[0]["MaterialName"].ToString(),
                        Quantity  = request.Quantity,
                        State     = DonationState.Applying,
                        StartTime = now
                    }
                };
            }
            else
            {
                Console.WriteLine($"DEBUG: material {request.MaterialId} doesn't exist");
                ret = new NewDonationResponse()
                {
                };
            }
            return(ret);
        }
        public void GivenNameIsNullOrEmpty_ShouldReturnInvalid()
        {
            // Arrange
            NewDonationRequestValidator validator = new NewDonationRequestValidator();

            NewDonationRequest request = new NewDonationRequest
            {
                PostCode       = "AB12CD",
                DonationAmount = 20.0m
            };

            // Act
            var result = validator.Validate(request);

            // Assert
            Assert.False(result.IsValid);
        }
        public void GivenDonationAmountIsLessThan2_ShouldReturnInvalid()
        {
            // Arrange
            NewDonationRequestValidator validator = new NewDonationRequestValidator();

            NewDonationRequest request = new NewDonationRequest
            {
                Name           = "Test User",
                PostCode       = "AB12CD",
                DonationAmount = 1.99m
            };

            // Act
            var result = validator.Validate(request);

            // Assert
            Assert.False(result.IsValid);
        }
        public void GivenPostCodeIsNullOrEmpty_ShouldReturnAppropriateError()
        {
            // Arrange
            NewDonationRequestValidator validator = new NewDonationRequestValidator();

            NewDonationRequest request = new NewDonationRequest
            {
                Name           = "Test User",
                DonationAmount = 20.0m
            };

            // Act
            var result = validator.Validate(request);

            // Assert
            Assert.IsNotEmpty(result.Errors);
            Assert.True(
                result.Errors.Any(
                    x => x.ErrorMessage.Contains("not be empty")
                    ));
        }
        public void GivenDonationAmountIsMoreThan100000_ShouldReturnAppropriateError()
        {
            // Arrange
            NewDonationRequestValidator validator = new NewDonationRequestValidator();

            NewDonationRequest request = new NewDonationRequest
            {
                Name           = "Test User",
                PostCode       = "AB12CD",
                DonationAmount = 100001.01m
            };

            // Act
            var result = validator.Validate(request);

            // Assert
            Assert.IsNotEmpty(result.Errors);
            Assert.True(
                result.Errors.Any(
                    x => x.ErrorMessage.Contains("less than or equal to '100000'")
                    ));
        }
        private Response handleRequest(Request request)
        {
            Response response = null;

            //LOGIN
            if (request is LoginRequest)
            {
                Console.WriteLine("Login request... ");
                LoginRequest loginRequest = (LoginRequest)request;
                Volunteer    volunteer    = loginRequest.Volunteer;
                try
                {
                    lock (server)
                    {
                        server.login(this, volunteer.Username, volunteer.Password);
                    }

                    return(new OKResponse());
                }
                catch (TeledonException e)
                {
                    connected = false;
                    return(new ErrorResponse(e.Message));
                }
            }

            //LOGOUT
            if (request is LogoutRequest)
            {
                Console.WriteLine("Logout request... ");
                LogoutRequest logoutRequest = (LogoutRequest)request;
                try
                {
                    lock (server)
                    {
                        server.logout(this);
                    }

                    connected = false;
                    return(new OKResponse());
                }
                catch (TeledonException e)
                {
                    return(new ErrorResponse(e.Message));
                }
            }

            //GET ALL CASES
            if (request is GetAllCasesRequest)
            {
                Console.WriteLine("Get all cases request... ");
                GetAllCasesRequest getAllCasesRequest = (GetAllCasesRequest)request;
                try
                {
                    lock (server)
                    {
                        IEnumerable <Case> cases = server.getAllCases();
                        return(new GetAllCasesResponse(cases));
                    }
                }
                catch (TeledonException e)
                {
                    return(new ErrorResponse(e.Message));
                }
            }

            //GET ALL DONORS
            if (request is GetAllDonorsRequest)
            {
                Console.WriteLine("Get all donors request...");
                GetAllDonorsRequest getAllDonorsRequest = (GetAllDonorsRequest)request;
                string subtring = getAllDonorsRequest.Substring;
                try
                {
                    lock (server)
                    {
                        IEnumerable <Donor> donors = server.searchDonorByName(subtring);
                        return(new GetAllDonorsResponse(donors));
                    }
                }
                catch (TeledonException e)
                {
                    return(new ErrorResponse(e.Message));
                }
            }

            //NEW DONATION
            if (request is NewDonationRequest)
            {
                Console.WriteLine("New donation request...");
                NewDonationRequest newDonationRequest = (NewDonationRequest)request;
                int    donorId   = newDonationRequest.DonorId;
                String name      = newDonationRequest.Name;
                String address   = newDonationRequest.Address;
                String telephone = newDonationRequest.Telephone;
                Double sum       = newDonationRequest.Sum;
                int    caseId    = newDonationRequest.CaseId;
                try
                {
                    lock (server)
                    {
                        server.saveDonation(donorId, name, address, telephone, sum, caseId);
                        return(new OKResponse());
                    }
                }
                catch (TeledonException e)
                {
                    return(new ErrorResponse(e.Message));
                }
            }

            return(response);
        }