Exemple #1
0
        public async Task <CourseDetailViewModel> GetCourseAsync(int id)
        {
            CourseDetailViewModel corsoDettaglio = await dbContext.Courses
                                                   .AsNoTracking()
                                                   .Where(course => course.Id == id) // EntityFramework Sanitizza da solo
                                                   .Select(course => new CourseDetailViewModel {
                Id           = course.Id,
                Title        = course.Title,
                Description  = course.Description,
                ImagePath    = course.ImagePath,
                Author       = course.Author,
                Rating       = course.Rating,
                FullPrice    = course.FullPrice,
                CurrentPrice = course.CurrentPrice,
                Lessons      = course.Lessons.Select(lesson => new LessonViewModel {
                    Id          = lesson.Id,
                    Title       = lesson.Title,
                    Description = lesson.Description,
                    Duration    = lesson.Duration
                }).ToList()
            })
                                                                   // .FirstOrDefaultAsync() // Restituisce null se vuoto, non solleva mai un'eccezione
                                                                   //.SingleOrDefaultAsync() // Restituisce il primo elemento dell'elenco. Se l'elenco contiene >1 solleva un'eccezione. Se vuoto restituisce null (o il default del tipo)
                                                                   //.FirstAsync() // Restituisce il primo elemento dell'elenco. Se l'elenco è vuoto, solleva un'eccezione
                                                   .SingleAsync(); //Restituisce il primo elemento dell'elenco. Se l'elenco contiene 0 o >1 solleva un'eccezione

            return(corsoDettaglio);
        }
        public async Task <CourseDetailViewModel> GetCourseAsync(int id)
        {
            logger.LogInformation("Course {id} richiesto", id);

            /*FormattableString query = $@"SELECT Id, Title, Description, ImagePath, Author, Rating, FullPrice_Amount, FullPrice_Currency, CurrentPrice_Amount, CurrentPrice_Currency FROM Courses WHERE Id={id};
             * SELECT Id, CourseId, Title, Description, Duration FROM Lessons WHERE CourseId={id}";*/

            DataSet dataSet = await db.QueryAsync($@"SELECT Id, Title, Description, ImagePath, Author, Rating, FullPrice_Amount, FullPrice_Currency, CurrentPrice_Amount, CurrentPrice_Currency FROM Courses WHERE Id={id};
            SELECT Id, CourseId, Title, Description, Duration FROM Lessons WHERE CourseId={id}");

            //Course
            var corsoTable = dataSet.Tables[0];

            if (corsoTable.Rows.Count != 1)
            {
                logger.LogWarning("Il corso {id} non esiste", id);
                throw new CourseNotFoundException(id);
            }
            var corsoRow             = corsoTable.Rows[0];
            var corsoDetailViewModel = CourseDetailViewModel.FromDataRow(corsoRow);

            //Lezioni corso
            var lezioniDataTable = dataSet.Tables[1];

            foreach (DataRow item in lezioniDataTable.Rows)
            {
                LessonViewModel lezioneViewModel = LessonViewModel.FromDataRow(item);
                corsoDetailViewModel.Lessons.Add(lezioneViewModel);
            }
            return(corsoDetailViewModel);
        }
        public async Task <CourseDetailViewModel> GetCourseAsync(int id)
        {
            logger.LogInformation("Course {id} requested", id); //permette di filtrare i log in base al valore degli id

            //la prima query carica il corso scelto al rispettivo id, la seconda invece carica tutte le lezioni legate all'id di quel corso
            //FormattableString separa la parte fissa dai suoi parametri
            FormattableString query = $@"SELECT Id, Title, Description, ImagePath, Author, Rating, FullPrice_Amount, FullPrice_Currency, CurrentPrice_Amount, CurrentPrice_Currency FROM Courses WHERE Id={id} 
            ; SELECT Id, Title, Description, Duration FROM Lessons WHERE CourseID={id}";

            DataSet dataSet = await db.ExecuteQueryAsync(query);

            //Course:
            //estrae i dati dalla prima datatable, se Rows >1 allora c'é un errore in quanto ci può essere solo 1 Row (evita la SqlInjection)
            var courseTable = dataSet.Tables[0];

            if (courseTable.Rows.Count != 1)
            {
                logger.LogWarning("Course {id} not found", id); //messaggio di log, problema non grave
                throw new CourseNotFoundException(id);
            }
            var courseRow             = courseTable.Rows[0]; //leggiamo la riga (courseRow), la passiamo a FromDataRow che farà la mappatura tra il datarow restituendo un oggetto di tipo courseDetailViewModel
            var courseDetailViewModel = CourseDetailViewModel.FromDataRow(courseRow);

            //Lessons
            var lessonDataTable = dataSet.Tables[1];

            foreach (DataRow lessonRow in lessonDataTable.Rows)
            {
                LessonViewModel lessonViewModel = LessonViewModel.FromDataRow(lessonRow);
                courseDetailViewModel.Lessons.Add(lessonViewModel); //ogni oggetto di LessonViewModel trovato viene aggiunto alla lista
            }
            return(courseDetailViewModel);
        }
        public async Task <CourseDetailViewModel> EditCourseAsync(CourseEditInputModel inputModel)
        {
            DataSet dataSet = await db.QueryAsync($"SELECT COUNT(*) FROM Courses WHERE Id={inputModel.Id}");

            if (Convert.ToInt32(dataSet.Tables[0].Rows[0][0]) == 0)
            {
                throw new CourseNotFoundException(inputModel.Id);
            }

            try
            {
                dataSet = await db.QueryAsync($"UPDATE Courses SET Title={inputModel.Title}, Description={inputModel.Description}, Email={inputModel.Email}, CurrentPrice_Currency={inputModel.CurrentPrice.Currency}, CurrentPrice_Amount={inputModel.CurrentPrice.Amount}, FullPrice_Currency={inputModel.FullPrice.Currency}, FullPrice_Amount={inputModel.FullPrice.Amount} WHERE Id={inputModel.Id}");
            }
            catch (SqliteException exc) when(exc.SqliteErrorCode == 19)
            {
                throw new CourseTitleUnavailableException(inputModel.Title, exc);
            }

            if (inputModel.Image != null)
            {
                try {
                    string imagePath = await imagePersister.SaveCourseImageAsync(inputModel.Id, inputModel.Image);

                    dataSet = await db.QueryAsync($"UPDATE Courses SET ImagePath={imagePath} WHERE Id={inputModel.Id}");
                }
                catch (Exception exc)
                {
                    throw new CourseImageInvalidException(inputModel.Id, exc);
                }
            }

            CourseDetailViewModel course = await GetCourseAsync(inputModel.Id);

            return(course);
        }
Exemple #5
0
        public CourseDetailViewModel GetCourse(int id)      //alla richiesta di un certo id, vengono caricate le informazioni del corso
        {
            var random = new Random();
            var price  = Convert.ToDecimal(random.NextDouble() * 10 + 10);
            var course = new CourseDetailViewModel
            {
                Id           = id,
                Title        = $"Corso {id}",
                CurrentPrice = new Money(Currency.EUR, price),  //Currency = EUR, Amount = price
                FullPrice    = new Money(Currency.EUR, random.NextDouble() > 0.5 ? price : price - 1),
                Author       = "Nome cognome",
                Rating       = random.Next(10, 50) / 10.0,
                ImagePath    = "/logo.svg",
                Description  = $"Descrizione {id}",
                Lessons      = new List <LessonViewModel>() //lista che conterrà tutte le lezioni del corso con id ...
            };

            for (int i = 1; i <= 5; i++)
            {
                var lesson = new LessonViewModel
                {
                    Title    = $"lezione {i}",              //lezione 1, ec...
                    Duration = TimeSpan.FromSeconds(random.Next(40, 90))
                };
                course.Lessons.Add(lesson);
            }
            return(course);
        }
        //--------------------------------Inserimento corso-----------------------------------------

        public async Task <CourseDetailViewModel> CreateCourseAsync(CourseCreateInputModel inputModel)
        {
            //uso il servizio infrastrutturare per rivolgergli la query
            string title  = inputModel.Title;   //cio che l'utente inserisce
            string author = "Mario Rossi";


            try{
                //definisce alcuni valori predefiniti per evitare di inserire un campo vuoto
                int courseId = await db.ExecuteQueryScalarAsync <int>($@"INSERT INTO Courses (Title, Author, ImagePath, CurrentPrice_Currency, CurrentPrice_Amount, FullPrice_Currency, FullPrice_Amount) VALUES ({title}, {author}, 'Courses/default.png', 'EUR', 0, 'EUR', 0);
                                                    SELECT last_insert_rowid();");

                //int courseId = Convert.ToInt32(dataSet.Tables[0].Rows[0][0]); //entra nella prima tabella e di tutte le sue righe e colonne siamo entrati nella prima (il risultato da una sola riga come risultato)

                //fornisco l'id a una chiamata GetCourseAsync per ottenere tutto l'oggetto CourseDetailViewModel(Author, description, ecc...)
                CourseDetailViewModel course = await GetCourseAsync(courseId);

                return(course);

                //catturo solamnte la sqlitexception con codice 19 (i corsi sono unique)
            } catch (SqliteException ex) when(ex.SqliteErrorCode == 19)
            {
                //eccezione personalizzata: creazione del corso fallita perché il titolo é già in utilizzo da un altro corso
                throw new CourseTitleUnavailableException(title, ex);
            }
        }
        public async Task <CourseDetailViewModel> GetCourseAsync(int id)
        {
            CourseDetailViewModel viewModel = await dbContext.Courses
                                              .AsNoTracking()
                                              .Where(course => course.Id == id)
                                              .Select(course => new CourseDetailViewModel
            {
                Id           = course.Id,
                Title        = course.Title,
                Description  = course.Description,
                ImagePath    = course.ImagePath,
                Author       = course.Author,
                Rating       = course.Rating,
                CurrentPrice = course.CurrentPrice,
                FullPrice    = course.FullPrice,
                Lessons      = course.Lessons.Select(lesson => new LessonViewModel
                {
                    Id          = lesson.Id,
                    Title       = lesson.Title,
                    Description = lesson.Description,
                    Duration    = lesson.Duration
                })
                               .ToList()
            })
                                              .SingleAsync(); //Restituisce il primo elemento dell'elenco, ma se l'elemento ne contiene 0 o più di 1, solleva un'eccezione

            return(viewModel);
        }
Exemple #8
0
        public IActionResult Detail(int id)
        {
            AppUser user = _context.Users.Include(x => x.Requests).ThenInclude(x => x.Course).FirstOrDefault(x => x.UserName == User.Identity.Name);

            if (user.Requests.Where(x => x.CourseId == id) != null)
            {
                foreach (var item in user.Requests.Where(x => x.CourseId == id).ToList())
                {
                    if (item.RequestDate.AddMonths(6) < DateTime.UtcNow)
                    {
                        _context.Requests.Remove(item);
                        _context.SaveChanges();
                    }
                }
            }
            CourseDetailViewModel courseDetail = new CourseDetailViewModel()
            {
                Course     = _context.Courses.Include(x => x.Category).Include(x => x.Features).Include(x => x.CourseComments).ThenInclude(x => x.AppUser).Include(x => x.Features).Include(x => x.Teacher).Include(x => x.CourseTags).ThenInclude(x => x.Tag).FirstOrDefault(x => x.Id == id),
                Tags       = _context.Tags.ToList(),
                Categories = _context.Categories.Include(x => x.Courses).ToList(),
                Requests   = _context.Requests.Include(x => x.Course).ThenInclude(x => x.Features).Include(x => x.AppUser).ToList(),
            };

            return(View(courseDetail));
        }
        [HttpPost]                                                              //eseguiamo il metodo SOLO quando la richiesta é post (quando invio i dati)
        public async Task <IActionResult> Edit(CourseEditInputModel inputModel) //ricevo l'istanza riempita con tutti i dati
        {
            //verifica della validità dell'input (in base alle regole definite nel CourseEditInputModel)
            if (ModelState.IsValid)
            {
                //titolo valido: creiamo il corso e se tutto va bene, reindirizziamo l'utente alla pagina di elenco
                try
                {
                    //qui inoltre salviamo l'immagine sul disco
                    CourseDetailViewModel course = await courseService.EditCourseAsync(inputModel);  //passo il titolo (ricevuto nell'oggetto CourseCreateInputModel)

                    //imposto il messaggio di conferma
                    TempData["ConfirmationMessage"] = "I dati sono stati salvati con successo";
                    //redireziono alla pagina di dettaglio, creo un oggetto anonimo con proprietà id valorizzata con l'id del corso
                    return(RedirectToAction(nameof(Detail), new { id = inputModel.Id }));             //dopo aver eseguito l'azione, viene indirizzato alla pagina Index
                }
                catch (CourseImageInvalidException)
                {
                    ModelState.AddModelError(nameof(CourseEditInputModel.Image), "L'immagine selezionata non è valida");
                }
                catch (CourseTitleUnavailableException)
                {
                    //se si verifica l'exception: aggiungiamo l'errore al ModelState e la segnaliamo al docente
                    ModelState.AddModelError(nameof(CourseEditInputModel.Title), "Questo titolo é già esistente e in uso");
                }
                catch (OptimisticConcurrencyException)
                {
                    ModelState.AddModelError("", "Spiacenti, il salvataggio non è andato a buon fine perché nel frattempo un altro utente ha aggiornato il corso. Ti preghiamo di aggiornare la pagina e ripetere le modifiche.");
                }
            }

            ViewData["Title"] = "Modifica corso";
            return(View(inputModel)); //riceve l'oggetto popolato con tutti i dati
        }
        public async Task <IActionResult> Detail(int id)                              //Detail/5
        {
            CourseDetailViewModel viewModel = await courseService.GetCourseAsync(id); //attenzione, con questo metodo ottengo il dettaglio di un solo corso

            ViewData["Title"] = viewModel.Title;                                      //Action: viewModel.Title = 5 (Esempio) e carico il suo titolo
            return(View(viewModel));                                                  //riceve l'oggetto popolato con tutti i dati
        }
        public async Task <IActionResult> Detail(int id)
        {
            CourseDetailViewModel course_detail = await courseService.getCourseDetailAsync(id);

            ViewData["Title"] = "MyCourse - " + course_detail.Title;
            return(View(course_detail));
        }
Exemple #12
0
        public async Task <CourseDetailViewModel> getCourseDetailAsync(int id)
        {
            CourseDetailViewModel courseDetail = await dbContext.Courses
                                                 .AsNoTracking()
                                                 .Where(course => course.Id == id)
                                                 .Select(course => new CourseDetailViewModel {
                Id           = course.Id,
                Title        = course.Title,
                Description  = course.Description,
                ImagePath    = course.ImagePath,
                Author       = course.Author,
                Rating       = course.Rating,
                FullPrice    = course.FullPrice,
                CurrentPrice = course.CurrentPrice,
                Lessons      = course.Lessons.Select(lesson => new LessonViewModel {
                    Id          = lesson.Id,
                    Title       = lesson.Title,
                    Description = lesson.Description,
                    Duration    = lesson.Duration
                }).ToList()
            })
                                                 .SingleAsync();

            return(courseDetail);
        }
Exemple #13
0
        public CourseDetailViewModel GetCourse(int id)
        {
            var rand  = new Random();
            var price = Convert.ToDecimal(rand.NextDouble() * 10 + 120);
            var corso = new CourseDetailViewModel()
            {
                Id           = id,
                Title        = $"Corso {id}",
                FullPrice    = new Money(Currency.EUR, price),
                CurrentPrice = new Money(Currency.EUR, rand.NextDouble() > 0.5 ? price : price - 110),
                Rating       = rand.Next(10, 50) / 10.0,
                Description  = $"Description {id}",
                Lezioni      = new List <CourseLessonViewModel>(),
                Author       = "Nome Cognome",
                ImagePath    = "~/img/bug.png",
            };

            for (var i = 1; i <= 5; i++)
            {
                var lezione = new CourseLessonViewModel()
                {
                    TitleLesson = $"Lezione {i}",
                    Duration    = TimeSpan.FromSeconds(rand.Next(40, 90))
                };
                corso.Lezioni.Add(lezione);
            }

            return(corso);
        }
Exemple #14
0
        public IActionResult Detail(int id)
        {
            CourseDetailViewModel course = courseService.GetCourse(id);

            ViewData["Title"] = course.Title;
            return(View(course));
        }
Exemple #15
0
        public async Task <IActionResult> Create(CourseCreateInputModel inputModel, [FromServices] IAuthorizationService authorizationService, [FromServices] IEmailClient emailClient, [FromServices] IOptionsMonitor <UsersOptions> usersOptions)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    CourseDetailViewModel course = await courseService.CreateCourseAsync(inputModel);

                    // Per non inserire logica nel controller, potremmo spostare questo blocco all'interno del metodo CreateCourseAsync del servizio applicativo
                    // ...ma attenzione a non creare riferimenti circolari! Se il course service dipende da IAuthorizationService
                    // ...e viceversa l'authorization handler dipende dal course service, allora la dependency injection non riuscirà a risolvere nessuno dei due servizi, dandoci un errore
                    AuthorizationResult result = await authorizationService.AuthorizeAsync(User, nameof(Policy.CourseLimit));

                    if (!result.Succeeded)
                    {
                        await emailClient.SendEmailAsync(usersOptions.CurrentValue.NotificationEmailRecipient, "Avviso superamento soglia", $"Il docente {User.Identity.Name} ha creato molti corsi: verifica che riesca a gestirli tutti.");
                    }

                    TempData["ConfirmationMessage"] = "Ok! Il tuo corso è stato creato, ora perché non inserisci anche gli altri dati?";
                    return(RedirectToAction(nameof(Edit), new { id = course.Id }));
                }
                catch (CourseTitleUnavailableException)
                {
                    ModelState.AddModelError(nameof(CourseDetailViewModel.Title), "Questo titolo già esiste");
                }
            }

            ViewData["Title"] = "Nuovo corso";
            return(View(inputModel));
        }
        public async Task <IActionResult> Detail(int id)
        {
            CourseDetailViewModel viewModel = await courseService.GetCourseAsync(id);

            ViewData["Title"] = viewModel.Title;
            return(View(viewModel));
        }
Exemple #17
0
        public async Task <CourseDetailViewModel> GetCourseAsync(int id)
        {
            logger.LogInformation("Course {id} requested", id);

            FormattableString query = $@"SELECT Id, Title, Description, ImagePath, Author, Rating, FullPrice_Amount, FullPrice_Currency, CurrentPrice_Amount, CurrentPrice_Currency FROM Courses WHERE Id={id}
            ; SELECT Id, Title, Description, Duration FROM Lessons WHERE CourseId={id}";

            DataSet dataSet = await db.QueryAsync(query);

            //Course
            var courseTable = dataSet.Tables[0];

            if (courseTable.Rows.Count != 1)
            {
                logger.LogWarning("Course {id} not found", id);
                throw new CourseNotFoundException(id);
            }
            var courseRow             = courseTable.Rows[0];
            var courseDetailViewModel = CourseDetailViewModel.FromDataRow(courseRow);

            //Course lessons
            var lessonDataTable = dataSet.Tables[1];

            foreach (DataRow lessonRow in lessonDataTable.Rows)
            {
                LessonViewModel lessonViewModel = LessonViewModel.FromDataRow(lessonRow);
                courseDetailViewModel.Lessons.Add(lessonViewModel);
            }
            return(courseDetailViewModel);
        }
        private async Task AddCourse()
        {
            var rawCourses = await App.Database.GetCoursesAsync();

            var filteredCourses = rawCourses.Where(r => r.TermId == _term[0].Id);
            var courses         = new ObservableCollection <Course>(filteredCourses);

            var termDueDate = _term[0].End;

            if (courses.Count == 6)
            {
                await DisplayAlert("Warning - Too many courses!", "You may not add more than 6 courses per term.", "Ok");
            }
            else
            {
                var detailViewModel = new CourseDetailViewModel();

                var detailPage = new CourseDetailPage(true, new Course(0, termDueDate), _term[0])
                {
                    BindingContext = detailViewModel // Set the binding context
                };

                await this.Navigation.PushAsync(detailPage, true);
            }
        }
Exemple #19
0
        public async Task <CourseDetailViewModel> GetCourseAsync(int id)
        {
            /*Per registrare i Log dell'applicazione*/
            logger.LogInformation($"Course {id} richiesto");

            FormattableString query   = $@"
            SELECT * FROM Courses WHERE Id={id};
            SELECT * FROM Lessons WHERE IdCourse={id}";
            DataSet           dataSet = await db.QueryAsync(query);

            var courseTable = dataSet.Tables[0];

            if (courseTable.Rows.Count != 1)
            {
                logger.LogWarning($"Corso {id} non trovato!");
                throw new CourseNotFoundException(id);
            }
            var courseRow             = courseTable.Rows[0];
            var courseDetailViewModel = CourseDetailViewModel.FromDataRow(courseRow);
            var lessonDataTable       = dataSet.Tables[1];

            foreach (DataRow lessonRow in lessonDataTable.Rows)
            {
                LessonViewModel lessonViewModel = LessonViewModel.FromDataRow(lessonRow);
                courseDetailViewModel.Lezioni.Add(lessonViewModel);
            }
            return(courseDetailViewModel);
        }
Exemple #20
0
        public async Task <ViewResult> CourseDetail(string id)
        {
            string instructorId;
            IEnumerable <string> participants;

            instructorId = _unitOfWork.Courses.GetInstructorId(id);
            participants = _unitOfWork.Courses.GetMemberIds(id);

            List <string>   usernames = new List <string>();
            ApplicationUser user;

            foreach (string p in participants)
            {
                user = await _userManager.FindByIdAsync(p);

                usernames.Add(user.UserName);
            }
            var model = new CourseDetailViewModel
            {
                CourseTitle  = id,
                InstructorId = instructorId,
                Participants = usernames
            };

            return(View(model));
        }
Exemple #21
0
        public async Task <IActionResult> Edit(CourseEditInputModel inputModel)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    CourseDetailViewModel course = await courseService.EditCourseAsync(inputModel);

                    TempData["ConfirmationMessage"] = "I dati sono stati salvati con successo";
                    return(RedirectToAction(nameof(Detail), new { id = inputModel.Id }));
                }
                catch (CourseImageInvalidException)
                {
                    ModelState.AddModelError(nameof(CourseEditInputModel.Image), "L'immagine selezionata non è valida");
                }
                catch (CourseTitleUnavailableException)
                {
                    ModelState.AddModelError(nameof(CourseEditInputModel.Title), "Questo titolo già esiste");
                }
                catch (OptimisticConcurrencyException)
                {
                    ModelState.AddModelError("", "Spiacenti, il salvataggio non è andato a buon fine perché nel frattempo un altro utente ha aggiornato il corso. Ti preghiamo di aggiornare la pagina e ripetere le modifiche.");
                }
            }

            ViewData["Title"] = "Modifica corso";
            return(View(inputModel));
        }
Exemple #22
0
        public CourseDetailViewModel GetCourse(int id)
        {
            var rand = new Random();
            var price = Convert.ToDecimal(rand.NextDouble() *10+10);
            var course = new CourseDetailViewModel
            {
                Id=id,
                Title=$"Corso{id}",
                CurrentPrice = new Money(Currency.EUR, price),
                FullPrice = new Money(Currency.EUR, rand.NextDouble() >0.5 ? price: price -1),
                Author = "Nome Cognome",
                Rating = rand.Next(10,50) /10.0,
                ImagePath ="/logo.csv",
                Description = $"Desrizione {id}",
                Lessons = new List<LessonViewModel>()
            };

            for(int i=1;i<=5;i++)
            {
                var lesson = new LessonViewModel{
                    Title = $"Lezione {i}",
                    Duration = TimeSpan.FromSeconds(rand.Next(40,90))
                };
                course.Lessons.Add(lesson);
            }
            return course;
        }
Exemple #23
0
        public async Task <CourseDetailViewModel> EditCourseAsync(CourseEditInputModel inputModel)
        {
            CourseDetailViewModel viewModel = await courseService.EditCourseAsync(inputModel);

            memoryCache.Remove($"Course{inputModel.Id}");
            return(viewModel);
        }
Exemple #24
0
        public CourseDetailViewModel GetCourse(int id)
        {
            Random rand = new Random();
            CourseDetailViewModel course = new CourseDetailViewModel()
            {
                Id        = id,
                NomeCorso = $"Corso {id}",
                Prezzo    = Convert.ToDecimal(12.50),
                Autore    = "Nome Cognome",
                Rating    = rand.Next(10, 50) / 10,
                Image     = "index.png",
                DescrizioneDettagliata = "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.",
                Lezioni = new List <LessonViewModel>()
            };

            for (var i = 1; i <= 5; i++)
            {
                var lezione = new LessonViewModel {
                    Titolo = $"Lezione {i}",
                    Durata = TimeSpan.FromSeconds(rand.Next(40, 90))
                };
                course.Lezioni.Add(lezione);
            }
            return(course);
        }
        public async void CourseDetailVMTest()
        {
            DbContextOptions <SchoolDbContext> options = new DbContextOptionsBuilder <SchoolDbContext>()
                                                         .UseInMemoryDatabase("CourseDetailVMDb")
                                                         .Options;

            using (SchoolDbContext context = new SchoolDbContext(options))
            {
                // arrange
                Student student1 = new Student();
                student1.ID             = 4;
                student1.Name           = "Bill Test";
                student1.Level          = Level.Graduate;
                student1.CourseID       = 88;
                student1.EnrollmentTerm = EnrollmentTerm.Fall2018;

                Student student2 = new Student();
                student2.ID             = 5;
                student2.Name           = "Sally Testing";
                student2.Level          = Level.Graduate;
                student2.CourseID       = 88;
                student2.EnrollmentTerm = EnrollmentTerm.Spring2019;

                Course course1 = new Course();
                course1.ID         = 77;
                course1.Name       = "Advanced Anger Management";
                course1.Teacher    = "Bob Saget";
                course1.CourseTerm = CourseTerm.Fall2018;

                Course course2 = new Course();
                course2.ID         = 88;
                course2.Name       = "Making Unit Tests";
                course2.Teacher    = "Ron Testmaster";
                course2.CourseTerm = CourseTerm.Spring2019;

                // act
                await context.Students.AddAsync(student1);

                await context.Students.AddAsync(student2);

                await context.Courses.AddAsync(course1);

                await context.Courses.AddAsync(course2);

                await context.SaveChangesAsync();

                CourseDetailViewModel courseDVM1 = await CourseDetailViewModel.FromIDAsync(77, context);

                CourseDetailViewModel courseDVM2 = await CourseDetailViewModel.FromIDAsync(88, context);

                var result1 = courseDVM1.Course.ID;
                var result2 = courseDVM2.Course.ID;

                // assert
                Assert.True(courseDVM1.Students.Count() == 0);
                Assert.Equal(2, courseDVM2.Students.Count());
                Assert.Equal(77, result1);
                Assert.Equal(88, result2);
            }
        }
        public async Task <CourseDetailViewModel> GetCourseAsync(int id)
        {
            string key = $"Course{id}";

            //Proviamo a recuperare l'oggetto dalla cache
            string serializedObject = await distributedCache.GetStringAsync(key);

            //Se l'oggetto esisteva in cache (cioè se è diverso da null)
            if (serializedObject != null)
            {
                //Allora lo deserializzo e lo restituisco
                return(Deserialize <CourseDetailViewModel>(serializedObject));
            }

            //Se invece non esisteva, lo andiamo a recuperare dal database
            CourseDetailViewModel course = await courseService.GetCourseAsync(id);

            //Prima di restituire l'oggetto al chiamante, lo serializziamo.
            //Cioè ne creiamo una rappresentazione stringa o binaria
            serializedObject = Serialize(course);

            //Impostiamo la durata di permanenza in cache
            var cacheOptions = new DistributedCacheEntryOptions();

            cacheOptions.SetAbsoluteExpiration(TimeSpan.FromSeconds(60));

            //Aggiungiamo in cache l'oggetto serializzato
            await distributedCache.SetStringAsync(key, serializedObject, cacheOptions);

            //Lo restituisco
            return(course);
        }
Exemple #27
0
        public async Task <CourseDetailViewModel> CreateCourseAsync(CourseCreateInputModel inputModel)
        {
            string title = inputModel.Title;
            string author;
            string authorId;

            try
            {
                author   = httpContextAccessor.HttpContext.User.FindFirst("FullName").Value;
                authorId = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
            }
            catch (NullReferenceException)
            {
                throw new UserUnknownException();
            }

            Course course = new(title, author, authorId);

            dbContext.Add(course);
            try
            {
                await dbContext.SaveChangesAsync();
            }
            catch (DbUpdateException exc) when((exc.InnerException as SqliteException)?.SqliteErrorCode == 19)
            {
                throw new CourseTitleUnavailableException(title, exc);
            }

            return(CourseDetailViewModel.FromEntity(course));
        }
        public async Task <CourseDetailViewModel> CreateCourseAsync(CourseCreateInputModel inputModel)
        {
            string title = inputModel.Title;
            string author;
            string authorId;

            try
            {
                author   = httpContextAccessor.HttpContext.User.FindFirst("FullName").Value;
                authorId = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
            }
            catch (NullReferenceException)
            {
                throw new UserUnknownException();
            }

            try
            {
                int courseId = await db.QueryScalarAsync <int>($@"INSERT INTO Courses (Title, Author, AuthorId, ImagePath, Rating, CurrentPrice_Currency, CurrentPrice_Amount, FullPrice_Currency, FullPrice_Amount, Status) VALUES ({title}, {author}, {authorId}, '/Courses/default.png', 0, 'EUR', 0, 'EUR', 0, {nameof(CourseStatus.Draft)});
                                                 SELECT last_insert_rowid();");

                CourseDetailViewModel course = await GetCourseAsync(courseId);

                return(course);
            }
            catch (ConstraintViolationException exc)
            {
                throw new CourseTitleUnavailableException(inputModel.Title, exc);
            }
        }
        public async Task <CourseDetailViewModel> GetCourseAsync(int id)
        {
            /* La query fornisce 2 tabelle: Corsi e lezioni. */
            FormattableString query = $@"SELECT Id, Title, Description, ImagePath, Author, Rating, FullPrice_Amount, FullPrice_Currency, CurrentPrice_Amount, CurrentPrice_Currency FROM Courses WHERE Id={id}
            ; SELECT Id, Title, Description, Duration FROM Lessons WHERE CourseId={id}";

            DataSet dataSet = await db.QueryAsync(query);

            // Course
            var courseTable = dataSet.Tables[0];

            if (courseTable.Rows.Count != 1)
            {
                throw new InvalidOperationException($"Did not return exactly 1 row for Course {id}");
            }

            // Prende la riga del corso
            var courseRow = courseTable.Rows[0];
            // crea l'oggetto principale della pagina: Dettaglio corso.
            var courseDetailViewModel = CourseDetailViewModel.FromDataRow(courseRow); // Prende dati del corso dal ViewModel

            // Course Lessons
            var lessonsDataTable = dataSet.Tables[1];

            foreach (DataRow lessonRow in lessonsDataTable.Rows)
            {
                CourseLessonViewModel lessonViewModel = CourseLessonViewModel.FromDataRow(lessonRow);
                courseDetailViewModel.Lessons.Add(lessonViewModel);
            }

            return(courseDetailViewModel);
        }
        public CourseDetailViewModel GetCourse(int id)
        {
            var rand  = new Random();
            var price = Convert.ToDecimal(rand.NextDouble() * 10 + 10);
            var corso = new CourseDetailViewModel
            {
                Id           = id,
                Title        = $"Course {id}",
                CurrentPrice = new Money(Currency.EUR, price),
                FullPrice    = new Money(Currency.EUR, (rand.NextDouble() * 10) > 5 ? price : price + 2),
                Author       = "Nome&Cognome",
                Rating       = rand.NextDouble() * 5,
                ImagePath    = "~/Free_logo.svg",
                Description  = "Qui ci va la descrizione",
                Lessons      = new List <LessonViewModel>()
            };

            for (int i = 1; i <= 5; i++)
            {
                var lezioni = new LessonViewModel {
                    Title    = $"Lezione {i}",
                    Duration = TimeSpan.FromSeconds(rand.Next(40, 90))
                };
                corso.Lessons.Add(lezioni);
            }

            return(corso);
        }
        public ActionResult Detail(int id = 1)
        {
            var course = this.courses.GetById(id);
            var viewModel = new CourseDetailViewModel
            {
                Title = course.Title,
                Category = course.Category.Name,
                Materials = course.Materials
            };

            return View(viewModel);
        }