public static StandardResult postBarnesNoble(BarnesDto bnDto)
        {
            using (WebClient webClient = new WebClient())
            {
                webClient.Headers["Content-type"] = "application/json";

                var memoryStream = new MemoryStream();
                var serializedJson = new DataContractJsonSerializer(typeof(BarnesDto));

                serializedJson.WriteObject(memoryStream, bnDto);

                var uri = new Uri(@"http://apps.apprendacloud.com/api/services/json/r/bookcavetest(v1)/BookService/IBook/books");
                byte[] res1 = webClient.UploadData(uri.ToString(), "POST", memoryStream.ToArray());

                StandardResult stdres = standardResult(res1, bnDto.Isbn13);
                return stdres;
            }
        }
Example #2
0
        public ResultDto PostBarnesData(BarnesDto barnesDto)
        {
            ResultDto result = new ResultDto { ResultDescription = "" };
            using (var context = new BookcaveEntities())
            {
                var bookRecords = context.Database.SqlQuery<BookRecord>("Select * from BookRecords where Isbn13 = {0}", barnesDto.Isbn13);
                if (bookRecords.FirstOrDefault() == null)
                    return new ResultDto { ResultDescription = "no general info exists yet for " + barnesDto.Isbn13 };

                var ratingRecords = context.Database.SqlQuery<RatingRecord>("Select * from RatingRecords where Isbn13 = {0}", barnesDto.Isbn13);
                RatingRecord currentRatingRecord = null;

                if (ratingRecords.Count() > 0) currentRatingRecord = ratingRecords.FirstOrDefault();
                Mapper.CreateMap<BarnesDto, RatingRecord>();

                if (currentRatingRecord != null)
                {
                    var modifiedRatingRecord = Mapper.Map<BarnesDto, RatingRecord>(barnesDto, currentRatingRecord);
                    context.Database.ExecuteSqlCommand("update RatingRecords set BarnesAvg={0} where Isbn13={1}",
                        barnesDto.BarnesAvg,
                        barnesDto.Isbn13);
                    result.ResultDescription += barnesDto.Isbn13 + " ratings updated ";
                }
                else
                {
                    var newRatingRecord = Mapper.Map<BarnesDto, RatingRecord>(barnesDto);
                    context.RatingRecords.Add(newRatingRecord);
                    result.ResultDescription += barnesDto.Isbn13 + " ratings added ";
                }

                var contentRecords = context.Database.SqlQuery<ContentRecord>("Select * from ContentRecords where Isbn13 = {0}", barnesDto.Isbn13);
                ContentRecord currentContentRecord = null;

                if (contentRecords.Count() > 0)
                    currentContentRecord = contentRecords.FirstOrDefault();
                Mapper.CreateMap<BarnesDto, ContentRecord>();

                if (currentContentRecord != null)
                {
                    var modifiedContentRecord = Mapper.Map(barnesDto, currentContentRecord);
                    var averageContentAge = DataFunctions.GetAverageContentAge(modifiedContentRecord);
                    context.Database.ExecuteSqlCommand
                    (
                        "update ContentRecords set BarnesAgeYoung={0},BarnesAgeOld={1},AverageContentAge={2} where Isbn13={3}",
                        barnesDto.BarnesAgeYoung,
                        barnesDto.BarnesAgeOld,
                        averageContentAge,
                        barnesDto.Isbn13
                    );
                    context.SaveChanges();
                    result.ResultDescription += barnesDto.Isbn13 + " contents updated";
                }
                else
                {
                    var newContentRecord = Mapper.Map<BarnesDto, ContentRecord>(barnesDto);
                    newContentRecord.AverageContentAge = DataFunctions.GetAverageContentAge(newContentRecord);
                    context.ContentRecords.Add(newContentRecord);
                    context.SaveChanges();
                    result.ResultDescription += barnesDto.Isbn13 + " contents added";
                }
                //try
                //{
                //}
                //catch (DbUpdateException e)
                //{
                //    Console.WriteLine("book metadata wasn't found in primary table.");
                //    return new ResultDto { ResultDescription = e.Message };
                //}
            }
            return result;
        }
        public static List<StandardResult> getbndata(List<string> isbns, string action = "post")
        {
            List<StandardResult> resultlist = new List<StandardResult>();

            // for each isbn, get info from bn.com
            using (WebClient client = new WebClient())
            {
                foreach (string isbn in isbns)
                {
                    BarnesDto bndata = new BarnesDto();
                    bndata.Isbn13 = isbn;

                    //create url for bn with incoming isbn
                    string url = "http://www.barnesandnoble.com/s/" + isbn + "?store=book&keyword=" + isbn;

                    //add user agent
                    client.Headers.Add("user-agent", "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31");
                    string html = client.DownloadString(url);
                    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
                    doc.LoadHtml(html);

                    //parse through the html
                    HtmlAgilityPack.HtmlNode ratingnode = doc.DocumentNode.SelectSingleNode("//span[@class='starDisplay']");

                    try
                    {
                        HtmlAgilityPack.HtmlNode starnode = ratingnode.SelectSingleNode("//span/span[1]");

                        string ratingstring = starnode.GetAttributeValue("title", "attribute not found");

                        // if rating is found, string will be "Average rating of 4.33333 out of 5 stars"
                        // exception cases: "attribute not found", or "No rating data available yet"

                        if (ratingstring != "attribute not found" && ratingstring != "No rating data available yet")
                        {
                            string rPattern = "(\\d+(?:\\.\\d*)?|\\.\\d+)";
                            Match rMatch = Regex.Match(ratingstring, rPattern);

                            string rating = rMatch.Value;

                            bndata.BarnesAvg = double.Parse(rating) * .02;
                        }
                    }
                    catch { }

                    // get Product Details node, searching for Age Range
                    HtmlAgilityPack.HtmlNodeCollection detailsnode = doc.DocumentNode.SelectNodes("//div[@class='product-details box']/ul/li");

                    try
                    {
                        foreach (HtmlAgilityPack.HtmlNode detailnode in detailsnode)
                        {
                            //check through details nodes searching for <span>Age range: </span>
                            //the text node which follows is the age range
                            string agerangestring = "no age range found";

                            string tPattern = "Age range";

                            Match tMatch = Regex.Match(detailnode.InnerHtml, tPattern);

                            if (tMatch.Success)
                            {
                                agerangestring = detailnode.InnerHtml;
                                string arPattern = "(\\d+)";
                                MatchCollection arMatches = Regex.Matches(agerangestring, arPattern);

                                if (arMatches.Count > 0)
                                {
                                    bndata.BarnesAgeYoung = byte.Parse(arMatches[0].Value);
                                }
                                if (arMatches.Count > 1)
                                {
                                    bndata.BarnesAgeOld = byte.Parse(arMatches[1].Value);
                                }

                            }

                        }
                    }
                    catch { }

                    StandardResult result = new StandardResult();
                    if (action == "post" || action == "both")
                    {
                        //post new csmdata to BookCaveSvc
                        result = BookCaveSvc.postBarnesNoble(bndata);

                    }

                    if (action == "loaddb" || action == "both")
                    {
                        string msg = loadbndata(bndata);

                        if (result.isbn13 == null)
                        {
                            result.isbn13 = bndata.Isbn13;
                            result.message = msg;
                        }

                        else
                        {
                            string postmsg = result.message;
                            result.message = postmsg + " " + msg;
                        }

                    }

                    resultlist.Add(result);

                }

            }
            return resultlist;
        }
        public static string loadbndata(BarnesDto bndata)
        {
            string msg = "(Unable to load to local db)";
            // receive bndata, load to database
            try
            {
                using (LexileTitlesEntities lr = new LexileTitlesEntities())
                {
                    List<BarnesAndNoble> existing = new List<BarnesAndNoble>(from b in lr.BarnesAndNobles
                                                                             where b.Isbn13 == bndata.Isbn13
                                                                             select b);

                    if (existing.Count == 0)
                    {
                        // create new BarnesAndNoble
                        BarnesAndNoble bn = new BarnesAndNoble();
                        bn.Isbn13 = bndata.Isbn13;
                        bn.AgeHigh = bndata.BarnesAgeOld;
                        bn.AgeLow = bndata.BarnesAgeYoung;
                        bn.Rating = (decimal)bndata.BarnesAvg;

                        lr.BarnesAndNobles.Add(bn);
                        lr.SaveChanges();

                        msg = "(Loaded new BN to DB)";
                    }
                    else
                    {
                        // update fields on existing BarnesAndNoble
                        existing[0].AgeHigh = bndata.BarnesAgeOld;
                        existing[0].AgeLow = bndata.BarnesAgeYoung;
                        existing[0].Rating = (decimal)bndata.BarnesAvg;

                        lr.SaveChanges();

                        msg = "(Updated existing BN in DB)";
                    }
                }
            }

            catch { }

            return msg;
        }
        public static List<StandardResult> postBarnesNoble(List<BarnesAndNoble> bns)
        {
            List<StandardResult> resultset = new List<StandardResult>();

            foreach (BarnesAndNoble bn in bns)
            {
                // map bn to BarnesDto
                var bnDto = new BarnesDto();

                bnDto.Isbn13 = bn.Isbn13;
                bnDto.BarnesAvg = (double?)bn.Rating;
                bnDto.BarnesAgeYoung = (byte)bn.AgeLow;
                bnDto.BarnesAgeOld = (byte)bn.AgeHigh;

                using (WebClient webClient = new WebClient())
                {
                    webClient.Headers["Content-type"] = "application/json";

                    var memoryStream = new MemoryStream();
                    var serializedJson = new DataContractJsonSerializer(typeof(BarnesDto));

                    serializedJson.WriteObject(memoryStream, bnDto);

                    var uri = new Uri(@"http://apps.apprendacloud.com/api/services/json/r/bookcavetest(v1)/BookService/IBook/books");
                    byte[] res1 = webClient.UploadData(uri.ToString(), "POST", memoryStream.ToArray());

                    StandardResult stdres = standardResult(res1, bnDto.Isbn13);
                    resultset.Add(stdres);
                }

            }

            return resultset;
        }
        public void PostBarnesData()
        {
            // Create an instance of StreamReader to read from a file.
            // The using statement also closes the StreamReader.
            using (var sr = new StreamReader(@"C:\Users\tiliska\Documents\bn-sample.csv"))
            {
                string svLine;
                // Read and display lines from the file until the end of
                // the file is reached.

                using (var webClient = new WebClient())
                {
                    while ((svLine = sr.ReadLine()) != null)
                    {
                        var barnesNobleData = svLine.Split(',');
                        var barnesDto = new BarnesDto();

                        var isbn13 = barnesNobleData[0];
                        barnesDto.Isbn13 = isbn13;

                        try
                        {
                            var ageLow = Convert.ToByte(barnesNobleData[1]);
                            barnesDto.BarnesAgeYoung = ageLow;

                            var ageHigh = Convert.ToByte(barnesNobleData[2]);
                            barnesDto.BarnesAgeOld = ageHigh;

                            var rating = Convert.ToDouble(barnesNobleData[3]);
                            barnesDto.BarnesAvg = rating;
                        }
                        catch (FormatException)
                        {
                            Console.WriteLine("data in csv aren't valid");
                        }

                        if (post)
                        {
                            var sourceCode = "barnes";

                            if (useCloud)
                                uri = new Uri(cloudUrl + sourceCode);
                            else
                                uri = new Uri(localUrl + sourceCode);

                            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

                            webClient.Headers["Content-type"] = "application/json";

                            var memoryStream = new MemoryStream();
                            var serializedJson = new DataContractJsonSerializer(typeof(BarnesDto));

                            serializedJson.WriteObject(memoryStream, barnesDto);
                            byte[] res1 = webClient.UploadData(uri.ToString(), "POST", memoryStream.ToArray());

                            try
                            {
                            }
                            catch (WebException) { Console.WriteLine(barnesDto.Isbn13 + " has no general data"); }
                        }
                        else
                        {
                            var service = new BookService();
                            service.PostBarnesData(barnesDto);

                            try
                            {
                            }
                            catch (Exception) { }
                        }
                    }//while
                }//using
            }//using
        }