From 248984be0b19c6f4d9bc7e45252ed534d909bccb Mon Sep 17 00:00:00 2001 From: esantangelo <enzo020895@gmail.com> Date: Sun, 29 Nov 2020 16:47:14 -0300 Subject: [PATCH] add course attendance report --- .../Tsi1.Api/Controllers/TenantController.cs | 16 +++++ .../Dtos/CourseAttendanceDto.cs | 2 + .../Interfaces/ITenantService.cs | 1 + .../Services/TenantService.cs | 65 ++++++++++++++++++- 4 files changed, 83 insertions(+), 1 deletion(-) diff --git a/Tsi1.Api/Tsi1.Api/Controllers/TenantController.cs b/Tsi1.Api/Tsi1.Api/Controllers/TenantController.cs index 9ffbc2b..b66e243 100644 --- a/Tsi1.Api/Tsi1.Api/Controllers/TenantController.cs +++ b/Tsi1.Api/Tsi1.Api/Controllers/TenantController.cs @@ -161,5 +161,21 @@ namespace Tsi1.Api.Controllers return Ok(result.Data); } + + [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.Professor)] + [HttpGet("CourseAttendance/{courseId}")] + public async Task<IActionResult> CourseAttendance(int courseId) + { + var tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value); + + var result = await _tenantService.CourseAttendance(tenantId, courseId); + + if (result.HasError) + { + return BadRequest(result.Message); + } + + return Ok(result.Data); + } } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/CourseAttendanceDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/CourseAttendanceDto.cs index 608b1cd..6532506 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/CourseAttendanceDto.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/CourseAttendanceDto.cs @@ -10,6 +10,8 @@ namespace Tsi1.BusinessLayer.Dtos public string Name { get; set; } + public int ActivityQuantity { get; set; } + public List<UserAttendanceDto> Users { get; set; } } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ITenantService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ITenantService.cs index 4390132..8c6ae9d 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ITenantService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ITenantService.cs @@ -29,5 +29,6 @@ namespace Tsi1.BusinessLayer.Interfaces Task<ServiceResult<List<RegistrationDto>>> CourseStudentQuantity(int tenantId); Task<ServiceResult<List<CourseAttendanceDto>>> CourseAttendance(int tenantId); + Task<ServiceResult<CourseAttendanceDto>> CourseAttendance(int tenantId, int courseId); } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/TenantService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/TenantService.cs index 2a41d0d..38fbb00 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Services/TenantService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/TenantService.cs @@ -261,7 +261,7 @@ namespace Tsi1.BusinessLayer.Services var attendances = await _context.Attendances .AsNoTracking() .Include(x => x.Activity) - .Where(x => x.User.TenantId == tenantId) + .Where(x => x.User.TenantId == tenantId && x.Activity.IsVideoConference) .ToListAsync(); var courseAttendanceDtos = new List<CourseAttendanceDto>(); @@ -271,6 +271,11 @@ namespace Tsi1.BusinessLayer.Services { Id = course.Id, Name = course.Name, + ActivityQuantity = attendances + .Where(x => x.Activity.CourseId == course.Id) + .Select(x => x.ActivityId) + .Distinct() + .Count(), Users = new List<UserAttendanceDto>(), }; @@ -302,5 +307,63 @@ namespace Tsi1.BusinessLayer.Services result.Data = courseAttendanceDtos; return result; } + + public async Task<ServiceResult<CourseAttendanceDto>> CourseAttendance(int tenantId, int courseId) + { + var result = new ServiceResult<CourseAttendanceDto>(); + + var tenant = await _context.Tenants.FirstOrDefaultAsync(x => x.Id == tenantId && x.Name != TenantAdmin.Name); + + if (tenant == null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, tenantId)); + return result; + } + + var course = await _context.Courses + .AsNoTracking() + .Include(x => x.StudentCourses) + .FirstOrDefaultAsync(x => x.Id == courseId); + + var studentIds = course.StudentCourses.Select(x => x.StudentId).ToList(); + + var users = await _context.Users + .AsNoTracking() + .Where(x => x.TenantId == tenantId && studentIds.Contains((int)x.StudentId)) + .ToListAsync(); + + var attendances = await _context.Attendances + .AsNoTracking() + .Include(x => x.Activity) + .Where(x => x.Activity.CourseId == courseId && x.Activity.IsVideoConference) + .ToListAsync(); + + var courseAttendanceDto = new CourseAttendanceDto + { + Id = course.Id, + Name = course.Name, + ActivityQuantity = attendances.Select(x => x.ActivityId).Distinct().Count(), + Users = new List<UserAttendanceDto>(), + }; + + foreach (var user in users) + { + var attendanceQuantity = attendances.Where(x => x.UserId == user.Id).Count(); + + var userAttendanceDto = new UserAttendanceDto + { + Email = user.Email, + FirstName = user.FirstName, + LastName = user.LastName, + Quantity = attendanceQuantity + }; + + courseAttendanceDto.Users.Add(userAttendanceDto); + } + + result.Data = courseAttendanceDto; + return result; + } } } -- GitLab