Ejemplo n.º 1
0
        public IActionResult Create([FromBody] AttendanceRegistrationData data)
        {
            var dataValidation = LogHelper.ValidateRegistrationData(data, this._context, this._configuration);

            if (data == null)
            {
                return(BadRequest());
            }
            else if (!dataValidation.valid)
            {
                if (!string.IsNullOrWhiteSpace(dataValidation.error))
                {
                    return(Content($"Error: {dataValidation.error}"));
                }
                return(Content("Error: Invalid data"));
            }

            data.Attendance.Longitude = data.GeoLon;
            data.Attendance.Latitude  = data.GeoLat;
            data.Attendance.Timestamp = data.SessionStartTimestamp;

            // Remove existing log in same date
            var existingLogs = LogHelper.GetDuplicatedLog(data.Attendance, _context);

            if (existingLogs.Count() > 0)
            {
                _context.AttendanceLog.RemoveRange(existingLogs);
                _context.SaveChanges();
            }

            var log = data.Attendance;

            log.Id = AdoHelper.GetNextId("AttendanceLog", _connString);
            _context.AttendanceLog.Add(log);
            _context.SaveChanges();
            return(CreatedAtRoute("GetLog", new { id = log.Id }, log));
        }
Ejemplo n.º 2
0
        public static AttendanceRegistrationDataValidationObject ValidateRegistrationData(AttendanceRegistrationData data, attWebApiContext context, IConfiguration configuration)
        {
            var valid = true;
            var error = string.Empty;

            if (!LogHelper.ValidateNewAttendanceLog(data.Attendance, context))
            {
                valid = false;
            }
            else
            {
                // Validate location and timestamp
                if (data.CoursesAssignmentID != null)
                {
                    // Classroom's coordinates
                    var classRoom = (from c in context.ClassRooms
                                     join ca in context.CoursesAssignments on c.Id equals ca.ClassRoomId
                                     where ca.Id == data.CoursesAssignmentID
                                     select c).SingleOrDefault();

                    if (classRoom != default(ClassRooms) && classRoom.Longitude != null && classRoom.Latitude != null && classRoom.RangeInMeters != null)
                    {
                        double thisLon        = (double)classRoom.Longitude;
                        double thisLat        = (double)classRoom.Latitude;
                        var    distanceBuffer = (double)classRoom.RangeInMeters;

                        var minutesBuffer = configuration.GetSection("App").GetSection("RegisterAttendance").GetSection("TimeBufferInMinutes").Value;
                        var distance      = LogHelper.DistanceInMeters(thisLat, thisLon, data.GeoLat, data.GeoLon);

                        var enrollments = GetEnrollmentsForUserId(data.Attendance.StudentId, context);

                        if (distance > distanceBuffer)
                        {
                            valid = false;
                            error = "Your device is detected too far from the classroom!";
                        }
                        else if (TimeSpan.FromTicks(DateTime.Now.Ticks - data.SessionStartTimestamp).TotalMinutes > Convert.ToInt32(minutesBuffer))
                        {
                            valid = false;
                            error = $"It's been over {minutesBuffer} minutes since the beginning of the course";
                        }
                        else if (!enrollments.Any(e => e.CourseId == data.Attendance.CourseId))
                        {
                            valid = false;
                            error = $"You are not enrolled to {context.Courses.SingleOrDefault(c=>c.Id == data.Attendance.CourseId).Title}";
                        }
                    }
                    else
                    {
                        valid = false;
                    }
                }
                else
                {
                    valid = false;
                }
            }
            return(new AttendanceRegistrationDataValidationObject {
                valid = valid,
                error = error
            });
        }