Exemple #1
0
        public AdminModule(
            IMtgStore mtgStore,
            ILoggingService loggingService,
            ICardPriceStore priceStore,
            IHttpClient httpClient,
            IMtgDataReader mtgDataReader,
            IImporter importer)
            : base("/admin")
        {
            Get["/"] = parameters =>
            {
                if (this.Context.CurrentUser == null)
                {
                    return(this.Context.GetRedirect("/admin/login"));
                }
                else
                {
                    return(View["admin.html"]);
                }
            };

            Get["/login"] = parameters =>
            {
                return(View["login.html"]);
            };


            Get["/logout"] = parameters =>
            {
                return(this.LogoutAndRedirect("/admin/login/"));
            };


            Post["/login"] = args =>
            {
                var userGuid = UserMapper.ValidateUser((string)this.Request.Form.Username, (string)this.Request.Form.Password);

                if (userGuid == null)
                {
                    return(this.Context.GetRedirect("/admin/login"));
                }

                DateTime?expiry = null;
                if (this.Request.Form.RememberMe.HasValue)
                {
                    expiry = DateTime.Now.AddDays(7);
                }

                return(this.LoginAndRedirect(userGuid.Value, expiry, "/admin"));
            };

            #region Sets
            Get["/sets", true] = async(parameters, ct) =>
            {
                this.RequiresAuthentication();

                var sets = await mtgStore.GetSets();

                return(View["listSets.html", new
                            {
                                Sets = sets.Select(s => new
                    {
                        Name = s.Name,
                        Code = s.Code,
                        Block = s.Block,
                        Type = s.Type,
                        ReleasedOn = s.ReleasedOn.ToShortDateString(),
                        ReleasedOnSort = s.ReleasedOn,
                        Symbol = s.SetAsKeyRuneIcon
                    }).OrderByDescending(s => s.ReleasedOnSort)
                            }]);
            };

            Get["/set/{set}", true] = async(parameters, ct) =>
            {
                this.RequiresAuthentication();

                string setCode = parameters.set;

                var set = await mtgStore.GetSetByCode(setCode);

                var db_cards = await mtgStore.GetCardsBySet(set.Name);

                // Get price information
                var cards = db_cards.Select(c => new
                {
                    Name              = c.Name,
                    Code              = c.SetId,
                    Set               = c.SetName,
                    Cost              = c.Cost,
                    CostSymbols       = c.CostWithSymbols,
                    Type              = c.FullType,
                    Rarity            = c.Rarity,
                    Img               = c.Img,
                    MultiverseId      = c.MultiverseId,
                    SearchName        = c.SearchName,
                    Symbol            = c.SetAsKeyRuneIcon,
                    Desc              = c.Desc,
                    DescSymbols       = c.DescWithSymbols,
                    ConvertedManaCost = c.Cmc,
                    SetSymbol         = c.SetAsKeyRuneIcon,
                    Prices            = GetCardPrice(priceStore, c.MultiverseId)
                }).OrderByDescending(c => c.SearchName);

                return(View["set.html", new
                            {
                                Set = set,
                                Cards = cards
                            }]);
            };
            #endregion

            #region Add Set
            Get["/addset"] = parameters =>
            {
                this.RequiresAuthentication();

                return(View["addSet.html"]);
            };

            Post["/addset", true] = async(parameters, ct) =>
            {
                this.RequiresAuthentication();

                var setData = this.Bind <SetAddData>();

                if (string.IsNullOrEmpty(setData.url))
                {
                    return(Response.AsJson(new
                    {
                        Error = "No url provided.",
                        Status = "Error"
                    }).StatusCode = HttpStatusCode.BadRequest);
                }

                string data = await httpClient.GetAsJson(setData.url);

                if (string.IsNullOrEmpty(data))
                {
                    return(Response.AsJson(new
                    {
                        Error = "Url contains invalid data or no data.",
                        Status = "Error"
                    }).StatusCode = HttpStatusCode.BadRequest);
                }

                var set = mtgDataReader.ReadSet(data);

                if (set == null)
                {
                    return(Response.AsJson(new
                    {
                        Error = "No set defined",
                        Status = "Error"
                    }).StatusCode = HttpStatusCode.BadRequest);
                }

                if (set.Type.ToLower() == "promo")
                {
                    return(Response.AsJson(new
                    {
                        Error = "Set is promo, skipping",
                        Status = "Error"
                    }).StatusCode = HttpStatusCode.BadRequest);
                }

                var cards = mtgDataReader.ReadCards(data);

                var status = await importer.Import(set, cards);

                if (status != null)
                {
                    return(Response.AsJson(new
                    {
                        Status = "Success",
                        CardsInserted = status.ImportedCards.Select(
                            c =>
                            new
                        {
                            Name = c.Name,
                            MultiverseId = c.MultiverseId,
                            Cost = c.Cost,
                            Type = c.FullType,
                            Img = c.Img,
                            Set = c.SetId
                        }).ToList(),
                        CardsFailed = status.FailedCards.Select(
                            c =>
                            new
                        {
                            Name = c.Name,
                            MultiverseId = c.MultiverseId,
                            Cost = c.Cost,
                            Type = c.FullType,
                            Img = c.Img,
                            Set = c.SetId
                        }).ToList()
                    }));
                }
                else
                {
                    return(Response.AsText("Import failed").StatusCode = HttpStatusCode.BadRequest);
                }
            };

            #endregion
        }
Exemple #2
0
        static void Main(string[] args)
        {
            Bootstrapper.Register();

            var    p         = new FluentCommandLineParser();
            string inputName = null;

            // Parse command line arguments
            bool   isMtgDbInfo      = false;
            string mtgDbInfoSet     = null;
            bool   isMtgJson        = false;
            string mtgJsonFilename  = null;
            bool   skipTokens       = true;
            string mtgJsonDirectory = null;
            bool   importByFile     = true;

            try
            {
                mStopwatch      = Stopwatch.StartNew();
                mLoggingService = TinyIoCContainer.Current.Resolve <ILoggingService>();
                mMtgStore       = TinyIoCContainer.Current.Resolve <IMtgStore>();
                mFileSystem     = TinyIoCContainer.Current.Resolve <IFileSystem>();
                mImporter       = TinyIoCContainer.Current.Resolve <IImporter>();

                p.Setup <string>("set")
                .Callback(value => mtgDbInfoSet = value)
                .Required();

                p.Setup <bool>("mtgjson")
                .Callback(value => isMtgJson = value)
                .SetDefault(true);

                p.Setup <string>("file")
                .Callback(value => mtgJsonFilename = value);

                p.Setup <string>("dir")
                .Callback(value => mtgJsonDirectory = value);

                p.Setup <bool>("skiptokens")
                .Callback(value => skipTokens = value)
                .SetDefault(true);

                p.Setup <bool>("skippromos")
                .Callback(value => mSkipPromos = value)
                .SetDefault(true);

                p.Parse(args);

                // Make sure we have either --file or --dir
                if (string.IsNullOrEmpty(mtgJsonDirectory) && string.IsNullOrEmpty(mtgJsonFilename))
                {
                    throw new Exception("You must either use --file or --dir.");
                }

                if (!string.IsNullOrEmpty(mtgJsonDirectory))
                {
                    importByFile = false;
                }

                if (isMtgJson && importByFile)
                {
                    inputName = mtgJsonFilename;
                }
                else if (isMtgJson && !importByFile)
                {
                    inputName = mtgJsonDirectory;

                    if (!Directory.Exists(inputName))
                    {
                        throw new DirectoryNotFoundException(inputName);
                    }
                }
                else
                {
                    throw new Exception("Please provide either --mtgdbinfo or --mtgjson arguments.");
                }

                mDataReader = new MtgJsonReader(
                    TinyIoCContainer.Current.Resolve <IMtgDataMapper <MtgJsonCard, MtgJsonSet> >("MtgJson"),
                    mLoggingService);

                mDataReader.SkipTokens = skipTokens;

                // Setup worker
                mUpdaterBackgroundWorker = new BackgroundWorker();
                mUpdaterBackgroundWorker.WorkerReportsProgress      = true;
                mUpdaterBackgroundWorker.WorkerSupportsCancellation = true;
                mUpdaterBackgroundWorker.DoWork             += new DoWorkEventHandler(bw_UpdaterDoWork);
                mUpdaterBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_Completed);
                mUpdaterBackgroundWorker.ProgressChanged    += new ProgressChangedEventHandler(bw_ProgressChanged);

                Console.WriteLine("Running worker thread...");
                mUpdaterBackgroundWorker.RunWorkerAsync(new WorkArgs {
                    ImportByFile = importByFile, InputName = inputName
                });
            }
            catch (Exception er)
            {
                string msg = string.Format("Error: {0}", er.Message);

                mLoggingService.Fatal(er, msg);
                Console.WriteLine(msg);
            }

            while (mUpdaterBackgroundWorker.IsBusy)
            {
                Thread.Sleep(100);
            }
        }