diff --git a/rag-2-backend/Infrastructure/Common/Model/SortDirection.cs b/rag-2-backend/Infrastructure/Common/Model/SortDirection.cs new file mode 100644 index 0000000..6d6ce59 --- /dev/null +++ b/rag-2-backend/Infrastructure/Common/Model/SortDirection.cs @@ -0,0 +1,7 @@ +namespace rag_2_backend.Infrastructure.Common.Model; + +public enum SortDirection +{ + Asc, + Desc +} \ No newline at end of file diff --git a/rag-2-backend/Infrastructure/Module/Administration/AdministrationController.cs b/rag-2-backend/Infrastructure/Module/Administration/AdministrationController.cs index c78c534..39f70f2 100644 --- a/rag-2-backend/Infrastructure/Module/Administration/AdministrationController.cs +++ b/rag-2-backend/Infrastructure/Module/Administration/AdministrationController.cs @@ -64,8 +64,24 @@ public LimitsResponse GetCurrentLimits() /// Get all users list (Admin, Teacher) [HttpGet("users")] [Authorize(Roles = "Admin, Teacher")] - public List GetStudents() + public List GetUsers( + string? email, + int? studyCycleYearA, + int? studyCycleYearB, + string? group, + string? courseName, + SortDirection sortDirection = SortDirection.Asc, + UserSortByFields sortBy = UserSortByFields.Id + ) { - return administrationService.GetStudents(); + return administrationService.GetUsers( + email, + studyCycleYearA, + studyCycleYearB, + group, + courseName, + sortDirection, + sortBy + ); } } \ No newline at end of file diff --git a/rag-2-backend/Infrastructure/Module/Administration/AdministrationService.cs b/rag-2-backend/Infrastructure/Module/Administration/AdministrationService.cs index 8563865..2a73f85 100644 --- a/rag-2-backend/Infrastructure/Module/Administration/AdministrationService.cs +++ b/rag-2-backend/Infrastructure/Module/Administration/AdministrationService.cs @@ -1,10 +1,13 @@ #region +using System.Linq.Expressions; using HttpExceptions.Exceptions; +using Microsoft.EntityFrameworkCore; using rag_2_backend.Infrastructure.Common.Mapper; using rag_2_backend.Infrastructure.Common.Model; using rag_2_backend.Infrastructure.Dao; using rag_2_backend.Infrastructure.Database; +using rag_2_backend.Infrastructure.Module.Administration.Dto; using rag_2_backend.Infrastructure.Module.User.Dto; #endregion @@ -45,10 +48,66 @@ public UserResponse GetUserDetails(string principalEmail, int userId) return UserMapper.Map(userDao.GetUserByIdOrThrow(userId)); } - public List GetStudents() + public List GetUsers( + string? email, + int? studyCycleYearA, + int? studyCycleYearB, + string? group, + string? courseName, + SortDirection sortDirection, + UserSortByFields sortBy + ) { - return context.Users - .Select(u => UserMapper.Map(u)) - .ToList(); + var query = context.Users.Include(u => u.Course).AsQueryable(); + + query = FilterUsers(email, studyCycleYearA, studyCycleYearB, group, courseName, query); + query = SortUsers(sortDirection, sortBy, query); + + return query.AsEnumerable().Select(UserMapper.Map).ToList(); + } + + // + + private static IQueryable FilterUsers(string? email, int? studyCycleYearA, + int? studyCycleYearB, string? group, + string? courseName, IQueryable query) + { + if (!string.IsNullOrEmpty(email)) + query = query.Where(u => u.Email.ToLower().Contains(email.ToLower())); + if (studyCycleYearA.HasValue) + query = query.Where(u => u.StudyCycleYearA == studyCycleYearA.Value); + if (studyCycleYearB.HasValue) + query = query.Where(u => u.StudyCycleYearB == studyCycleYearB.Value); + if (!string.IsNullOrEmpty(group)) + query = query.Where(u => u.Group != null && u.Group.ToLower().Contains( + group.ToLower() + )); + if (!string.IsNullOrEmpty(courseName)) + query = query.Where(u => u.Course != null && u.Course.Name.Equals(courseName)); + return query; + } + + private static IQueryable SortUsers(SortDirection sortDirection, UserSortByFields sortBy, + IQueryable query) + { + return sortBy switch + { + UserSortByFields.Id => ApplySorting(query, x => x.Id, sortDirection), + UserSortByFields.Email => ApplySorting(query, x => x.Email, sortDirection), + UserSortByFields.Name => ApplySorting(query, x => x.Name, sortDirection), + UserSortByFields.StudyYearCycleA => ApplySorting(query, x => x.StudyCycleYearA, sortDirection), + UserSortByFields.StudyYearCycleB => ApplySorting(query, x => x.StudyCycleYearB, sortDirection), + UserSortByFields.LastPlayed => ApplySorting(query, x => x.LastPlayed, sortDirection), + UserSortByFields.CourseName => ApplySorting(query, x => x.Course != null ? x.Course.Name : string.Empty, + sortDirection), + UserSortByFields.Group => ApplySorting(query, x => x.Group, sortDirection), + _ => query + }; + } + + private static IQueryable ApplySorting(IQueryable query, Expression> keySelector, + SortDirection sortDirection) + { + return sortDirection == SortDirection.Desc ? query.OrderByDescending(keySelector) : query.OrderBy(keySelector); } } \ No newline at end of file diff --git a/rag-2-backend/Infrastructure/Module/Administration/Dto/UserSortByFields.cs b/rag-2-backend/Infrastructure/Module/Administration/Dto/UserSortByFields.cs new file mode 100644 index 0000000..d54e216 --- /dev/null +++ b/rag-2-backend/Infrastructure/Module/Administration/Dto/UserSortByFields.cs @@ -0,0 +1,13 @@ +namespace rag_2_backend.Infrastructure.Module.Administration.Dto; + +public enum UserSortByFields +{ + Id, + Email, + Name, + StudyYearCycleA, + StudyYearCycleB, + LastPlayed, + CourseName, + Group +} \ No newline at end of file diff --git a/rag-2-backend/Test/Service/AdministrationServiceTest.cs b/rag-2-backend/Test/Service/AdministrationServiceTest.cs index bf740af..9caac28 100644 --- a/rag-2-backend/Test/Service/AdministrationServiceTest.cs +++ b/rag-2-backend/Test/Service/AdministrationServiceTest.cs @@ -10,6 +10,7 @@ using rag_2_backend.Infrastructure.Database; using rag_2_backend.Infrastructure.Database.Entity; using rag_2_backend.Infrastructure.Module.Administration; +using rag_2_backend.Infrastructure.Module.Administration.Dto; using rag_2_backend.Infrastructure.Module.User.Dto; using Xunit; @@ -116,7 +117,8 @@ public void ShouldGetStudents() Assert.Equal( JsonConvert.SerializeObject(response), - JsonConvert.SerializeObject(_administrationService.GetStudents()[0]) + JsonConvert.SerializeObject(_administrationService.GetUsers(null, null, null, null, null, SortDirection.Asc, + UserSortByFields.Id)[0]) ); } } \ No newline at end of file diff --git a/rag-2-backend/appsettings.Development.json b/rag-2-backend/appsettings.Development.json index 0df88ac..8259ad1 100644 --- a/rag-2-backend/appsettings.Development.json +++ b/rag-2-backend/appsettings.Development.json @@ -7,7 +7,8 @@ }, "AllowedOrigins": "http://localhost:4200,http://localhost", "Jwt": { - "Key": "MIHcAgEBBEIBIHk9RDBDHoudslGHKpNqh8Tsr7fWu0J" + "Key": "MIHcAgEBBEIBIHk9RDBDHoudslGHKpNqh8Tsr7fWu0J", + "ExpireMinutes": 100 }, "ConnectionStrings": { "DefaultConnection": "Host=localhost;Port=5432;Database=postgres;Username=postgres;Password=postgres"