Skip to content

Commit

Permalink
Merge pull request #62 from theImmortalCoders/issue-57
Browse files Browse the repository at this point in the history
Issue 57
  • Loading branch information
marcinbator authored Nov 21, 2024
2 parents e911d34 + 0587434 commit 9d1b888
Show file tree
Hide file tree
Showing 6 changed files with 106 additions and 8 deletions.
7 changes: 7 additions & 0 deletions rag-2-backend/Infrastructure/Common/Model/SortDirection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace rag_2_backend.Infrastructure.Common.Model;

public enum SortDirection
{
Asc,
Desc
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,24 @@ public LimitsResponse GetCurrentLimits()
/// <summary>Get all users list (Admin, Teacher)</summary>
[HttpGet("users")]
[Authorize(Roles = "Admin, Teacher")]
public List<UserResponse> GetStudents()
public List<UserResponse> 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
);
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -45,10 +48,66 @@ public UserResponse GetUserDetails(string principalEmail, int userId)
return UserMapper.Map(userDao.GetUserByIdOrThrow(userId));
}

public List<UserResponse> GetStudents()
public List<UserResponse> 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<Database.Entity.User> FilterUsers(string? email, int? studyCycleYearA,
int? studyCycleYearB, string? group,
string? courseName, IQueryable<Database.Entity.User> 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<Database.Entity.User> SortUsers(SortDirection sortDirection, UserSortByFields sortBy,
IQueryable<Database.Entity.User> 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<T> ApplySorting<T, TKey>(IQueryable<T> query, Expression<Func<T, TKey>> keySelector,
SortDirection sortDirection)
{
return sortDirection == SortDirection.Desc ? query.OrderByDescending(keySelector) : query.OrderBy(keySelector);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace rag_2_backend.Infrastructure.Module.Administration.Dto;

public enum UserSortByFields
{
Id,
Email,
Name,
StudyYearCycleA,
StudyYearCycleB,
LastPlayed,
CourseName,
Group
}
4 changes: 3 additions & 1 deletion rag-2-backend/Test/Service/AdministrationServiceTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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])
);
}
}
3 changes: 2 additions & 1 deletion rag-2-backend/appsettings.Development.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down

0 comments on commit 9d1b888

Please sign in to comment.