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"