public async Task <ActionResult> TestGroupDetails(Guid testGroupGuid)
        {
            TestGroupRepository testGroupRepo = new TestGroupRepository();
            var testGroupTask = testGroupRepo.GetByIdAsync(testGroupGuid);

            ApplicationUserRepository <Tester> userRepo = new ApplicationUserRepository <Tester>();
            var testerTask = userRepo.GetByUserNameAsync(User.Identity.Name);

            TestGroupsRepository testGroupsRepo = new TestGroupsRepository();

            ViewBag.Takened   = testGroupsRepo.GetGroupStatus(await testGroupTask, await testerTask);
            ViewBag.TestsGuid = testGroupsRepo.GetByTestGroupForTester(await testerTask, await testGroupTask);
            return(View(await testGroupTask));
        }
        public async Task <ActionResult> ResolveGroup(Guid testGroupGuid)
        {
            TestGroupsRepository testGroupsRepo = new TestGroupsRepository();
            var testGroups = testGroupsRepo.GetById(testGroupGuid);

            ApplicationUserRepository <Tester> userRepo = new ApplicationUserRepository <Tester>();
            var testerTask = userRepo.GetByUserNameAsync(User.Identity.Name);

            TestsRepository testsRepo = new TestsRepository();
            IList <DataAccess.Model.Tests.Tests> tests = new List <DataAccess.Model.Tests.Tests>();

            foreach (var testCase in testGroups.TestGroup.TestCases)
            {
                DataAccess.Model.Tests.Tests testsRecord = testsRepo.GetByTestCaseForTesterByStatus(await testerTask, testCase, TestsStatus.Takened);
                if (testsRecord != null)
                {
                    tests.Add(testsRecord);
                }
            }

            if (tests.Count <= 0)
            {
                testGroups.Finished         = DateTime.Now;
                testGroups.Status           = GroupStatus.Finished;
                testGroups.TestGroup.Rating = testGroups.TestGroup.CountRating();

                testGroupsRepo.Update(testGroups);

                return(RedirectToAction("FinishedTestGroups"));
            }

            TestStatusRepository testStatusRepo = new TestStatusRepository();

            ViewBag.TestStatus     = testStatusRepo.GetAll();
            ViewBag.TestGroup      = testGroups.TestGroup.Name;
            ViewBag.TestGroupsGuid = testGroups.Id;

            return(View(tests.First()));
        }
        public async Task <ActionResult> FinishedTestGroups(int?page, string searchTerm)
        {
            TestGroupsRepository testGroupsRepo = new TestGroupsRepository();

            ApplicationUserRepository <Tester> userRepo = new ApplicationUserRepository <Tester>();
            var testerTask = userRepo.GetByUserNameAsync(User.Identity.Name);

            int itemsOnPage = 8;
            int pg          = page ?? 1;
            int startIndex  = (pg * itemsOnPage) - itemsOnPage;

            ViewBag.CurrentSearch = searchTerm;
            IList <TestGroups> testGroups = testGroupsRepo.GetAvailableEntities(out var totalTests, await testerTask, GroupStatus.Finished, startIndex, itemsOnPage, searchTerm);

            ViewBag.Pages       = (int)Math.Ceiling((double)totalTests / (double)itemsOnPage);
            ViewBag.CurrentPage = pg;

            if (Request.IsAjaxRequest())
            {
                return(PartialView(testGroups));
            }

            return(View(testGroups));
        }
        public async Task TakeGroup(Guid groupId)
        {
            TestGroupRepository testGroupRepo = new TestGroupRepository();
            var testGroupTask = testGroupRepo.GetByIdAsync(groupId);

            ApplicationUserRepository <Tester> userRepo = new ApplicationUserRepository <Tester>();
            var testerTask = userRepo.GetByUserNameAsync(User.Identity.Name);

            TestGroups testGroups = new TestGroups();

            testGroups.TestGroup = await testGroupTask;
            testGroups.Status    = GroupStatus.Takened;
            testGroups.Takened   = DateTime.Now;
            testGroups.Tester    = await testerTask;

            TestGroup       testGroup = await testGroupTask;
            TestsRepository testsRepo = new TestsRepository();

            foreach (var testCase in testGroup.TestCases)
            {
                if (!testsRepo.IsTestTakened(testCase, await testerTask))
                {
                    DataAccess.Model.Tests.Tests tests = new DataAccess.Model.Tests.Tests();
                    tests.Test    = testCase;
                    tests.Status  = TestsStatus.Takened;
                    tests.Takened = DateTime.Now;
                    tests.Tester  = await testerTask;

                    testsRepo.Create(tests);
                }
            }

            TestGroupsRepository testGroupsRepo = new TestGroupsRepository();

            testGroupsRepo.Create(testGroups);
        }
        public async Task <ActionResult> Resolve(DataAccess.Model.Tests.Tests tests, HttpPostedFileBase[] files, Guid testGroupsGuid)
        {
            TestsRepository testsRepo = new TestsRepository();

            DataAccess.Model.Tests.Tests testsRecord = testsRepo.GetById(tests.Id);

            TestGroupsRepository testGroupsRepo = new TestGroupsRepository();
            TestGroups           testGroups     = testGroupsRepo.GetById(testGroupsGuid);

            TestStatusRepository testStatusRepo = new TestStatusRepository();

            ModelState.Remove("files");
            ModelState.Remove("testGroupsGuid");
            ModelState.Remove(nameof(DataAccess.Model.Tests.Tests.Tester));
            ModelState.Remove(nameof(DataAccess.Model.Tests.Tests.Status));
            ModelState.Remove(nameof(DataAccess.Model.Tests.Tests.Test));
            ModelState.Remove(nameof(DataAccess.Model.Tests.Tests.Evidences));
            ModelState.Remove(nameof(DataAccess.Model.Tests.Tests.Finished));
            ModelState.Remove(nameof(DataAccess.Model.Tests.Tests.Rejected));
            ModelState.Remove(nameof(DataAccess.Model.Tests.Tests.Takened));
            ModelState.Remove("TestStatus.Status");
            if (ModelState.IsValid)
            {
                if (testsRecord.Test.Creator.Credits < (int)Math.Ceiling(testsRecord.Test.Reward * testGroups.TestGroup.RewardMultiplier))
                {
                    ViewBag.TestStatus     = testStatusRepo.GetAll();
                    ViewBag.TestGroup      = testGroups.TestGroup.Name;
                    ViewBag.TestGroupsGuid = testGroups.Id;

                    TempData["error"] = "Createor of tests don't have required amount of coins. Please try resolve test later, or contact our support team.";
                    return(RedirectToAction("TakenedTestGroups"));
                }

                var testStatusTask = testStatusRepo.GetByIdAsync(tests.TestStatus.Id);

                IList <Evidence> evidences = new List <Evidence>();

                if (files[0] != null)
                {
                    var maxSizeInMb    = 20;
                    var byteSize       = 1048576;
                    var maxSizeInBytes = byteSize * maxSizeInMb;
                    foreach (var file in files)
                    {
                        if (file.ContentLength > maxSizeInBytes)
                        {
                            TempData["error"] = "File " + file.FileName + " is too big! (max size is " + maxSizeInMb + "MB)";

                            ViewBag.TestStatus     = testStatusRepo.GetAll();
                            ViewBag.TestGroup      = testGroups.TestGroup.Name;
                            ViewBag.TestGroupsGuid = testGroups.Id;
                            return(View("ResolveGroup", testsRecord));
                        }
                    }

                    foreach (var file in files)
                    {
                        Evidence evidence = new Evidence();
                        evidence.Id       = Guid.NewGuid();
                        evidence.Name     = evidence.Id.ToString();
                        evidence.RealName = Path.GetFileNameWithoutExtension(file.FileName);
                        evidence.Attached = DateTime.Now;

                        var extension = Path.GetExtension(file.FileName);
                        evidence.Extension = extension;

                        var path = Path.Combine(Server.MapPath($"~/Uploads/{testsRecord.Id}"), evidence.Name + extension);
                        Directory.CreateDirectory(Server.MapPath($"~/Uploads/{testsRecord.Id}"));
                        file.SaveAs(path);

                        evidences.Add(evidence);
                    }

                    testsRecord.Evidences = evidences;
                }

                testsRecord.TestStatus = await testStatusTask;
                testsRecord.Finished   = DateTime.Now;
                testsRecord.Status     = TestsStatus.Finished;

                testsRecord.Tester.Credits       = testsRecord.Tester.Credits + (int)Math.Ceiling(testsRecord.Test.Reward * testGroups.TestGroup.RewardMultiplier);
                testsRecord.Test.Creator.Credits = testsRecord.Test.Creator.Credits - (int)Math.Ceiling(testsRecord.Test.Reward * testGroups.TestGroup.RewardMultiplier);

                EvidenceRepository evidRepo = new EvidenceRepository();

                foreach (var evidence in evidences)
                {
                    evidRepo.Create(evidence);
                }

                testsRepo.Update(testsRecord);

                return(RedirectToAction("ResolveGroup", new { testGroupGuid = testGroups.Id }));
            }

            ViewBag.TestStatus     = testStatusRepo.GetAll();
            ViewBag.TestGroup      = testGroups.TestGroup.Name;
            ViewBag.TestGroupsGuid = testGroups.Id;

            return(View("ResolveGroup", testsRecord));
        }