feat: add ci

This commit is contained in:
2026-09-13 18:02:09 +07:00
parent af34bc11f1
commit ed5146c73b
21 changed files with 186 additions and 2477 deletions
@@ -1,6 +1,7 @@
using Microsoft.EntityFrameworkCore;
using mws.backend.dotnet.application.Common;
using mws.backend.dotnet.application.Common.Repositories;
using mws.backend.dotnet.application.Projects;
using mws.backend.dotnet.domain.Projects;
namespace mws.backend.dotnet.infrastructure.Persistence.Repositories;
@@ -14,11 +15,36 @@ public class ProjectRepository(AppDbContext db) : RepositoryBase<Project>(db), I
Set.Include(p => p.CreatedByUser).Include(p => p.UpdatedByUser)
.FirstOrDefaultAsync(p => p.Id == projectId && p.Members.Any(m => m.UserId == userId), ct);
public Task<PagedResult<Project>> GetForUserAsync(Guid userId, int page, int pageSize, CancellationToken ct = default) =>
Set.Include(p => p.CreatedByUser).Include(p => p.UpdatedByUser)
.Where(p => p.Members.Any(m => m.UserId == userId))
.OrderByDescending(p => p.UpdatedAt)
.ToPagedResultAsync(page, pageSize, ct);
public Task<PagedResult<Project>> GetForUserAsync(ProjectListFilter filter, int page, int pageSize, CancellationToken ct = default)
{
var query = Set.Include(p => p.CreatedByUser).Include(p => p.UpdatedByUser)
.Where(p => p.Members.Any(m => m.UserId == filter.UserId));
if (!string.IsNullOrWhiteSpace(filter.Term))
{
var lower = filter.Term.Trim().ToLower();
query = query.Where(p => p.Name.ToLower().Contains(lower));
}
if (filter.Status is { } status)
{
query = query.Where(p => p.Status == status);
}
if (!string.IsNullOrWhiteSpace(filter.CreatedBy))
{
var lower = filter.CreatedBy.Trim().ToLower();
query = query.Where(p => p.CreatedByUser != null && p.CreatedByUser.DisplayName.ToLower().Contains(lower));
}
if (!string.IsNullOrWhiteSpace(filter.UpdatedBy))
{
var lower = filter.UpdatedBy.Trim().ToLower();
query = query.Where(p => p.UpdatedByUser != null && p.UpdatedByUser.DisplayName.ToLower().Contains(lower));
}
return query.OrderByDescending(p => p.UpdatedAt).ToPagedResultAsync(page, pageSize, ct);
}
public Task<List<Project>> SearchForUserAsync(Guid userId, string? term, CancellationToken ct = default)
{
@@ -51,13 +77,28 @@ public class ProjectRepository(AppDbContext db) : RepositoryBase<Project>(db), I
public Task<ProjectMember?> GetMemberWithUserAsync(Guid projectId, Guid userId, CancellationToken ct = default) =>
Db.ProjectMembers.Include(m => m.User).FirstOrDefaultAsync(m => m.ProjectId == projectId && m.UserId == userId, ct);
public Task<PagedResult<ProjectMember>> GetMembersWithUserAsync(Guid projectId, int page, int pageSize, CancellationToken ct = default) =>
Db.ProjectMembers
public Task<PagedResult<ProjectMember>> GetMembersWithUserAsync(Guid projectId, MemberListFilter filter, int page, int pageSize, CancellationToken ct = default)
{
var query = Db.ProjectMembers
.Where(m => m.ProjectId == projectId)
.Include(m => m.User)
.OrderByDescending(m => m.Role)
.AsQueryable();
if (!string.IsNullOrWhiteSpace(filter.Term))
{
var lower = filter.Term.Trim().ToLower();
query = query.Where(m => m.User.Username.ToLower().Contains(lower) || m.User.DisplayName.ToLower().Contains(lower));
}
if (filter.Role is { } role)
{
query = query.Where(m => m.Role == role);
}
return query.OrderByDescending(m => m.Role)
.ThenBy(m => m.User.DisplayName)
.ToPagedResultAsync(page, pageSize, ct);
}
public Task<int> CountOwnersAsync(Guid projectId, CancellationToken ct = default) =>
Db.ProjectMembers.CountAsync(m => m.ProjectId == projectId && m.Role == MemberRole.Owner, ct);