예제 #1
0
        public async Task ProcessEventIgnoresAttendanceEventIfNotFoundInCourseCatalog()
        {
            var          mockSharepointManager = new MockSharepointManager();
            var          emptyCourseCatalog    = new MockSharepointCourseCatalog();
            const string listToStoreEvents     = "Attendance Events";

            mockSharepointManager.CreateList(listToStoreEvents, "", new List <string>());
            const string courseIdNotInCatalog = "COMP0101";

            var eventAggregator = new EventAggregator(mockSharepointManager, emptyCourseCatalog, new InMemoryLogger <EventAggregator>());

            StudentEvent eventToStore = new StudentEvent
            {
                CourseID     = courseIdNotInCatalog,
                EventType    = EventType.Attendance,
                ActivityType = "Video",
                ActivityName = "Introductory Lesson",
                Timestamp    = DateTime.UtcNow,
                Student      = new Student {
                    Email = "*****@*****.**", FirstName = "a", LastName = "b", ID = " 0"
                }
            };
            await eventAggregator.ProcessEvent(eventToStore);

            var itemsInSharepointList = await mockSharepointManager.GetItemsFromList(listToStoreEvents);

            Assert.Empty(itemsInSharepointList);
        }
        public void Update(StudentEvent studentEvent)
        {
            var entity = _studentEventRepository.Get(studentEvent.Id);

            StudentEventMapper.ToEntity(studentEvent, entity);
            _studentEventRepository.Update(entity);
        }
예제 #3
0
        public async Task ProcessEvent(StudentEvent studentEvent)
        {
            //Check courseId exist in the coursecatalog
            if (_courseCatalog.CheckCourseIdExist(studentEvent.CourseID))
            {
                if (studentEvent.EventType == EventType.Attendance)
                {
                    // Check the corresponding list of this course according to Catalog.
                    string targetList = _courseCatalog.GetListNameForCourse(studentEvent.CourseID);
                    _logger.LogInformation("Event aggregator will send event to list {0}.", targetList);

                    SharepointListItem eventItem = new SharepointListItem();
                    // Event Detailed Information.
                    eventItem["Title"]        = "Event by " + studentEvent.Student.Email;
                    eventItem["CourseID"]     = studentEvent.CourseID.ToUpper();
                    eventItem["StudentName"]  = studentEvent.Student.FirstName + " (" + studentEvent.Student.LastName + ")";
                    eventItem["StudentID"]    = studentEvent.Student.ID;
                    eventItem["StudentEmail"] = studentEvent.Student.Email;
                    eventItem["EventType"]    = studentEvent.EventType.ToString();
                    eventItem["ActivityType"] = studentEvent.ActivityType;
                    eventItem["ActivityName"] = studentEvent.ActivityName;
                    eventItem["Timestamp"]    = studentEvent.Timestamp;

                    // Assign to different list by course ID.
                    await _sharePointManager.AddItemToList(targetList, eventItem);
                }

                StoreInDatabase(studentEvent);
            }
            else
            {
                _logger.LogInformation($"Cannot find the courseId '{studentEvent.CourseID}', event aggregator has cancelled current event.");
            }
        }
예제 #4
0
        public async Task <List <EventInfo> > GetEventInfo(StudentEvent e, CancellationToken cancellationToken = default)
        {
            var url    = OscaUrlBuilder.EventInfoUrl(AccessTokens.SessionId, e.CourseID);
            var result = await GetParsed <EventInfoMessage>(url, cancellationToken);

            return(result.EventInfo);
        }
예제 #5
0
        public async Task ProcessEvents(CaliperEventBatchDto caliperEventBatch)
        {
            var filteredCaliperEvents = caliperEventBatch.Data.Where(e => IsAboutStudent(e) && IsAboutCourse(e));

            foreach (var caliperEvent in filteredCaliperEvents)
            {
                //TODO cleaner way to get firstname/lastname
                var    studentName            = caliperEvent.Actor.Name.Split(' ', 2);
                string caliperActivityType    = caliperEvent.Object.ObjectType;
                string activityTypeWithoutUrl = caliperActivityType.Substring(caliperActivityType.LastIndexOf('/') + 1);
                var    studentEvent           = new StudentEvent
                {
                    CourseID = caliperEvent.Group.Name,
                    //TODO don't have this hardcoded in case of live lecture links
                    EventType    = EventType.Engagement,
                    ActivityName = caliperEvent.Object.Name,
                    ActivityType = activityTypeWithoutUrl,
                    Student      = new Student {
                        ID = caliperEvent.Actor.Id, FirstName = studentName[0], LastName = studentName[1], Email = caliperEvent.Actor.Extensions.Email
                    },
                    Timestamp = caliperEvent.EventTime
                };
                await _eventAggregator.ProcessEvent(studentEvent);
            }
        }
예제 #6
0
        public async Task <IActionResult> GenerateEvent()
        {
            if (!_enabled)
            {
                return(NotFound());
            }
            StudentEvent testEvent = new StudentEvent
            {
                CourseID     = "COMP0199", // Course ID Upper case.
                Timestamp    = DateTime.UtcNow,
                EventType    = EventType.Attendance,
                ActivityType = "Video",
                ActivityName = "Weekly Lecture",
                Student      = new Student
                {
                    Email     = "*****@*****.**",
                    FirstName = "Vcdin",
                    LastName  = "Zard",
                    ID        = "202001955"
                }
            };
            await _eventAggregator.ProcessEvent(testEvent);

            return(Ok(testEvent));
        }
예제 #7
0
        public async Task ProcessEvents(CaliperEventBatchDto caliperEventBatch)
        {
            var filteredCaliperEvents = caliperEventBatch.Data.Where(e => IsAboutStudent(e) && IsAboutCourse(e));

            foreach (var caliperEvent in filteredCaliperEvents)
            {
                string studentEmail = caliperEvent.Actor.Extensions.Email;
                string studentId    = await _identityResolver.GetUserIdByEmail(studentEmail);

                if (studentId != null)
                {
                    //TODO cleaner way to get firstname/lastname
                    var    studentName            = caliperEvent.Actor.Name.Split(' ', 2);
                    string caliperActivityType    = caliperEvent.Object.ObjectType;
                    string activityTypeWithoutUrl = caliperActivityType.Substring(caliperActivityType.LastIndexOf('/') + 1);
                    var    studentEvent           = new StudentEvent
                    {
                        CourseID = caliperEvent.Group.Name,
                        //TODO don't have this hardcoded in case of live lecture links
                        EventType    = activityTypeWithoutUrl == "zoom" || activityTypeWithoutUrl == "teams" ? EventType.Attendance : EventType.Engagement,
                        ActivityName = caliperEvent.Object.Name,
                        ActivityType = activityTypeWithoutUrl,
                        Student      = new Student {
                            ID = studentId, FirstName = studentName[0], LastName = studentName[1], Email = studentEmail
                        },
                        Timestamp = caliperEvent.EventTime
                    };
                    await _eventAggregator.ProcessEvent(studentEvent);
                }
                else
                {
                    _logger.LogError($"Event for student with email '{studentEmail}' ignored as no student ID could be resolved.");
                }
            }
        }
예제 #8
0
        public async Task ProcessEventForgetToCreateList()
        {
            var mockSharepointManager = new MockSharepointManager();
            var courseCatalog         = new MockSharepointCourseCatalog();

            string courseId          = "COMP0101";
            string listToStoreEvents = "Attendance Events";

            courseCatalog.mockCatalog.Add(courseId, new CourseCatalogType {
                ListName = listToStoreEvents, JoinWebUrl = null
            });

            bool eventListExist = mockSharepointManager.CheckListExists(listToStoreEvents);

            Assert.False(eventListExist);

            var eventAggregator = new EventAggregator(mockSharepointManager, courseCatalog, new InMemoryLogger <EventAggregator>());

            StudentEvent eventToStore = new StudentEvent
            {
                CourseID     = courseId,
                EventType    = EventType.Attendance,
                ActivityType = "Video",
                ActivityName = "Introductory Lesson",
                Timestamp    = DateTime.UtcNow,
                Student      = new Student {
                    Email = "*****@*****.**", FirstName = "a", LastName = "b", ID = " 0"
                }
            };
            await eventAggregator.ProcessEvent(eventToStore);

            bool afterProcessEventListExist = mockSharepointManager.CheckListExists(listToStoreEvents);

            Assert.True(afterProcessEventListExist);
        }
예제 #9
0
        public async Task ProcessEventDoesNotStoreEngagementEventOnSharepoint()
        {
            var    mockSharepointManager = new MockSharepointManager();
            var    courseCatalog         = new MockSharepointCourseCatalog();
            string courseId          = "COMP0101";
            string listToStoreEvents = "Attendance Events";

            courseCatalog.mockCatalog.Add(courseId, new CourseCatalogType {
                ListName = listToStoreEvents, JoinWebUrl = null
            });
            mockSharepointManager.CreateList(listToStoreEvents, "", new List <string>());

            var eventAggregator = new EventAggregator(mockSharepointManager, courseCatalog, new InMemoryLogger <EventAggregator>());

            StudentEvent engagementEvent = new StudentEvent
            {
                CourseID     = courseId,
                EventType    = EventType.Engagement,
                ActivityType = "Video",
                ActivityName = "Introductory Lesson",
                Timestamp    = DateTime.UtcNow,
                Student      = new Student {
                    Email = "*****@*****.**", FirstName = "a", LastName = "b", ID = " 0"
                }
            };
            await eventAggregator.ProcessEvent(engagementEvent);

            var itemsInSharepointList = await mockSharepointManager.GetItemsFromList(listToStoreEvents);

            Assert.Empty(itemsInSharepointList);
        }
        public ActionResult DeleteConfirmed(int id)
        {
            StudentEvent studentEvent = db.StudentEvents.Find(id);

            db.StudentEvents.Remove(studentEvent);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
예제 #11
0
 private GradePostedIntegrationEvent MapGradePostedIntegrationEvent(StudentEvent studentEvent) => new GradePostedIntegrationEvent(studentEvent.UserId, studentEvent.MessageTypeId, studentEvent.Published ?? DateTime.UtcNow)
 {
     Grade          = studentEvent.Content.FirstOrDefault(e => e.Key.Equals("Grade", StringComparison.InvariantCultureIgnoreCase))?.Value ?? string.Empty,
     CoursePrefix   = studentEvent.Content.FirstOrDefault(e => e.Key.Equals("CoursePrefix", StringComparison.InvariantCultureIgnoreCase))?.Value ?? string.Empty,
     GradeType      = studentEvent.Content.FirstOrDefault(e => e.Key.Equals("GradeType", StringComparison.InvariantCultureIgnoreCase))?.Value ?? string.Empty,
     Points         = studentEvent.Content.FirstOrDefault(e => e.Key.Equals("Points", StringComparison.InvariantCultureIgnoreCase))?.Value ?? string.Empty,
     PointsPossible = studentEvent.Content.FirstOrDefault(e => e.Key.Equals("PointsPossible", StringComparison.InvariantCultureIgnoreCase))?.Value ?? string.Empty
 };
예제 #12
0
        private void StoreInDatabase(StudentEvent studentEvent)
        {
            _logger.LogInformation(studentEvent.ToString());
            DatabaseConnect connect = new DatabaseConnect();

            connect.StoreStudentToDatabase(studentEvent);
            connect.StoreEventToDatabase(studentEvent);
        }
        public void Create(StudentEvent studentEvent)
        {
            var entity = new StudentEventEntity();

            StudentEventMapper.ToEntity(studentEvent, entity);
            _studentEventRepository.Create(entity);
            studentEvent.Id = entity.Id;
        }
 public static void ToEntity(StudentEvent vm, StudentEventEntity entity)
 {
     entity.Name        = vm.Name;
     entity.Description = vm.Description;
     entity.StartDate   = vm.StartDate;
     entity.EndDate     = vm.EndDate;
     entity.Maximum     = vm.Maximum;
     entity.VenueId     = vm.Venue.Id;
 }
예제 #15
0
        public Task LoadAnnouncementsFor(StudentEvent studentEvent, bool show)
        {
            var mapping = new AnnouncementEventMapping
            {
                EventId             = studentEvent.CourseID,
                ShowInAnnouncements = show
            };

            return(_connection.InsertOrReplaceAsync(mapping));
        }
예제 #16
0
        public void SendSpenl()
        {
            Console.WriteLine("准备调用send");
            var request = new StudentResgistCommand("sdf");

            _executor.Execute(request);
            var eventinfo = new StudentEvent();

            //调用事件
            _bus.Puslish(eventinfo);
        }
예제 #17
0
        private async Task StoreEventInDatabase(StudentEvent studentEvent)
        {
            using (var scope = _scope.CreateScope())
            {
                var db = scope.ServiceProvider.GetService <DatabaseConnect>();

                await db.StoreStudentToDatabase(studentEvent);

                await db.StoreEventToDatabase(studentEvent);
            }
        }
예제 #18
0
        public IActionResult AddStudentEvent(StudentEvent studentEvent)
        {
            var wasSucessful = _studentEventRepository.AddStudentEvent(studentEvent);

            if (wasSucessful)
            {
                return(Ok());
            }

            return(Forbid());
        }
 public ActionResult Edit([Bind(Include = "ID,studentID,eventID")] StudentEvent studentEvent)
 {
     if (ModelState.IsValid)
     {
         db.Entry(studentEvent).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     ViewBag.eventID   = new SelectList(db.Events, "ID", "eventName", studentEvent.eventID);
     ViewBag.studentID = new SelectList(db.Students, "ID", "firstName", studentEvent.studentID);
     return(View(studentEvent));
 }
예제 #20
0
        public Task DownloadFile(CourseFile file, StudentEvent studentEvent)
        {
            var path = file.ServerRelativeUrl.Replace(Path.GetFileName(file.ServerRelativeUrl), "");

            // Path.Combine(,) ist komisch wenn der zweite Pfad mit einem PathSeperator anfängt :/
            // siehe dazu https://docs.microsoft.com/de-de/dotnet/api/system.io.path.combine?view=netframework-4.7.2
            path = path.Substring(1);

            path = Path.Combine(studentEvent.CourseName, path);
            var destination = Path.Combine(GetFileStoragePath(), path);

            return(_oscaWebService.DowloadFile(file.DownloadUrl, destination, Path.GetFileName(file.ServerRelativeUrl)));
        }
예제 #21
0
        public void StoreStudentToDatabase(StudentEvent studentEvent)
        {
            string sql = "INSERT INTO student(id, first_name, last_name,email) VALUES(@ID, @first_name, @last_name,@studentEmail)";

            MySqlParameter[] parameters =
            {
                new MySqlParameter("@ID",           studentEvent.Student.ID),
                new MySqlParameter("@first_name",   studentEvent.Student.FirstName),
                new MySqlParameter("@last_name",    studentEvent.Student.LastName),
                new MySqlParameter("@studentEmail", studentEvent.Student.Email)
            };
            AddInfoToDatabase(sql, parameters);
            Console.WriteLine("student: {0} {1} has been added into database", studentEvent.Student.FirstName, studentEvent.Student.LastName);
        }
        // GET: StudentEvents/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            StudentEvent studentEvent = db.StudentEvents.Find(id);

            if (studentEvent == null)
            {
                return(HttpNotFound());
            }
            return(View(studentEvent));
        }
예제 #23
0
        public async Task StoreStudentToDatabase(StudentEvent studentEvent)
        {
            string sql = "INSERT INTO student(id, first_name, last_name,email) VALUES(@ID, @first_name, @last_name,@studentEmail) ON CONFLICT DO NOTHING";

            NpgsqlParameter[] parameters =
            {
                new NpgsqlParameter("@ID",           studentEvent.Student.ID),
                new NpgsqlParameter("@first_name",   studentEvent.Student.FirstName),
                new NpgsqlParameter("@last_name",    studentEvent.Student.LastName),
                new NpgsqlParameter("@studentEmail", studentEvent.Student.Email)
            };

            await AddInfoToDatabase(sql, parameters);
        }
예제 #24
0
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            var factory = new ConnectionFactory()
            {
                HostName = "localhost"
            };

            using (IConnection connection = factory.CreateConnection())
                using (IModel channel = connection.CreateModel())
                {
                    channel.QueueDeclare(queue: "StudentSave", //Queue kuyrukta hangi isimde tutulacağı bilgisi operasyon istek zamanı gönderilebilir
                                         durable: false,       // ile in-memory mi yoksa fiziksel olarak mı saklanacağı belirlenir.
                                         exclusive: false,     // yalnızca bir bağlantı tarafından kullanılır ve bu bağlantı kapandığında sıra silinir - özel olarak işaretlenirse silinmez
                                         autoDelete: false,    // en son bir abonelik iptal edildiğinde en az bir müşteriye sahip olan kuyruk silinir
                                         arguments: null);     // isteğe bağlı; eklentiler tarafından kullanılır ve TTL mesajı, kuyruk uzunluğu sınırı, vb.

                    var consumer = new EventingBasicConsumer(channel);
                    consumer.Received += (model, ea) =>
                    {
                        var           body    = ea.Body;
                        var           message = Encoding.UTF8.GetString(body.ToArray());
                        StudentCommon st      = JsonConvert.DeserializeObject <StudentCommon>(message); //Herhangi bir tipte gönderilebilir where koşullaırına uyan
                        Console.WriteLine($" Adı: {st.Name} Soyadı:{st.LastName} Yaş:{st.Age}");
                    };
                    channel.BasicConsume(queue: "StudentSave", //Queue kuyrukta hangi isimde tutulacağı bilgisi operasyon istek zamanı gönderilebilir.
                                         autoAck: false,

                                         /* autoAck: bir mesajı aldıktan sonra bunu anladığına
                                          * dair(acknowledgment) kuyruğa bildirimde bulunur ya da timeout gibi vakalar oluştuğunda
                                          * mesajı geri çevirmek(Discard) veya yeniden kuyruğa aldırmak(Re-Queue) için dönüşler yapar*/
                                         consumer: consumer);

                    Console.WriteLine(" Kaydınız Yapıldı. Teşekkürler :)");
                    StudentEvent studentEvent = new StudentEvent()
                    {
                        Result = "Başarılı"
                    };
                    string message = JsonConvert.SerializeObject(studentEvent);
                    var    body    = Encoding.UTF8.GetBytes(message);
                    channel.BasicPublish(exchange: "",
                                         routingKey: "StudentSaveEvent",
                                         basicProperties: null,
                                         body: body);
                    Console.ReadLine();
                    //try catch ile veya farklı algoritmalarınızla loglama yapılabilir
                }
        }
예제 #25
0
        // [HttpPost]
        public async Task <IActionResult> ChooseEventB(EventModel model)
        {
            // var Event = from crs in db.Events where crs.EventId == model.EventId select crs;
            // EventModel crs = Event[0];


            var evt = db.Events.SingleOrDefault(e => e.EventId == model.EventId);

            if (evt.OccupiedSeats >= evt.NumberOfSeats)
            {
                TempData["Message"] = "The event is full!";
                // return View();
                return(RedirectToAction("ChooseEvent", "Event"));
            }
            evt.OccupiedSeats += 1;

            var us = await GetCurrentUserAsync();

            var check = db.StudentEvents.SingleOrDefault(l => l.EventId == model.EventId && l.ApplicationUser == us);

            if (check != null)
            {
                TempData["Message"] = "Duplicated Enrollment!";
                // return View("ChooseEvent");
                return(RedirectToAction("ChooseEvent", "Event"));
            }



            StudentEvent scs = new StudentEvent();

            scs.EventId         = model.EventId;
            scs.ApplicationUser = us;

            db.StudentEvents.Add(scs);



            db.SaveChanges();
            ScheduleEmail send = new ScheduleEmail(db);

            send.getEvent();


            // return PartialView("part",_model);
            return(RedirectToAction("ChooseEvent", "Event"));
            // return View(db.Events.ToList());
        }
        // GET: StudentEvents/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            StudentEvent studentEvent = db.StudentEvents.Find(id);

            if (studentEvent == null)
            {
                return(HttpNotFound());
            }
            ViewBag.eventID   = new SelectList(db.Events, "ID", "eventName", studentEvent.eventID);
            ViewBag.studentID = new SelectList(db.Students, "ID", "firstName", studentEvent.studentID);
            return(View(studentEvent));
        }
예제 #27
0
        private SharepointListItem PackEventItem(StudentEvent studentEvent)
        {
            SharepointListItem eventItem = new SharepointListItem();

            // Event Detailed Information.
            eventItem[EVENT_LIST_COURSE_ID]     = studentEvent.CourseID.ToUpper();
            eventItem[EVENT_LIST_STUDENT_NAME]  = studentEvent.Student.LastName + ", " + studentEvent.Student.FirstName;
            eventItem[EVENT_LIST_STUDENT_EMAIL] = studentEvent.Student.Email;
            eventItem[EVENT_LIST_STUDENT_ID]    = studentEvent.Student.ID;
            eventItem[EVENT_LIST_ACTIVITY_TYPE] = studentEvent.ActivityType;
            eventItem[EVENT_LIST_ACTIVITY_NAME] = studentEvent.ActivityName;
            eventItem[EVENT_LIST_TIMESTAMP]     = studentEvent.Timestamp;

            _logger.LogDebug("Event by {0} has been packed.", studentEvent.Student.FirstName);
            return(eventItem);
        }
예제 #28
0
        public void StoreEventToDatabase(StudentEvent studentEvent)
        {
            string sql = "INSERT INTO event(student_ID, course_ID, Timestamp, event_type, activity_name, activity_details) VALUES(@student_ID,@course_ID, @Timestamp, @event_type, @activity_name, @activity_details)";

            MySqlParameter[] parameters =
            {
                new MySqlParameter("@student_ID",       studentEvent.Student.ID),
                new MySqlParameter("@course_ID",        studentEvent.CourseID),
                new MySqlParameter("@Timestamp",        studentEvent.Timestamp),
                new MySqlParameter("@event_type",       studentEvent.EventType),
                new MySqlParameter("@activity_name",    studentEvent.ActivityName),
                new MySqlParameter("@activity_details", studentEvent.ActivityType)
            };
            AddInfoToDatabase(sql, parameters);
            Console.WriteLine("event of student {0} has been added into database", studentEvent.Student.ID);
        }
예제 #29
0
        public async Task StoreEventToDatabase(StudentEvent studentEvent)
        {
            string sql = "INSERT INTO event(student_ID, course_ID, Timestamp, event_type, activity_name, activity_details) VALUES(@student_ID,@course_ID, @Timestamp, @event_type, @activity_name, @activity_details)";

            NpgsqlParameter[] parameters =
            {
                new NpgsqlParameter("@student_ID",       studentEvent.Student.ID),
                new NpgsqlParameter("@course_ID",        studentEvent.CourseID),
                new NpgsqlParameter("@Timestamp",        studentEvent.Timestamp),
                new NpgsqlParameter("@event_type",       studentEvent.EventType.ToString()),
                new NpgsqlParameter("@activity_name",    studentEvent.ActivityName),
                new NpgsqlParameter("@activity_details", studentEvent.ActivityType)
            };

            await AddInfoToDatabase(sql, parameters);
        }
예제 #30
0
 public async Task ProcessEvent(ResourciumEventDto manualAttendanceEvent)
 {
     StudentEvent convertedEvent = new StudentEvent
     {
         CourseID = MANUAL_ATTENDANCE_COURSE_ID,
         Student  = new Student
         {
             ID        = manualAttendanceEvent.Student.ID,
             Email     = manualAttendanceEvent.Student.Email,
             FirstName = manualAttendanceEvent.Student.FirstName,
             LastName  = manualAttendanceEvent.Student.LastName
         },
         Timestamp = manualAttendanceEvent.Timestamp,
         EventType = EventType.Attendance
     };
     await _eventAggregator.ProcessEvent(convertedEvent);
 }