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,11 +1,12 @@
using mws.backend.dotnet.application.Common;
using mws.backend.dotnet.application.MasterData;
using mws.backend.dotnet.domain.MasterData;
namespace mws.backend.dotnet.application.Common.Repositories;
public interface IMasterDataRepository : IRepository<MasterDataEntry>
{
Task<PagedResult<MasterDataEntry>> GetAllAsync(string? group, int page, int pageSize, CancellationToken ct = default);
Task<PagedResult<MasterDataEntry>> GetAllAsync(MasterDataFilter filter, int page, int pageSize, CancellationToken ct = default);
Task<List<MasterDataEntry>> GetActiveByGroupAsync(string group, CancellationToken ct = default);
Task<MasterDataEntry?> GetByIdAsync(Guid id, CancellationToken ct = default);
Task<bool> ExistsAsync(string group, string value, Guid? excludeId, CancellationToken ct = default);
@@ -1,4 +1,5 @@
using mws.backend.dotnet.application.Common;
using mws.backend.dotnet.application.Projects;
using mws.backend.dotnet.domain.Projects;
namespace mws.backend.dotnet.application.Common.Repositories;
@@ -7,7 +8,7 @@ public interface IProjectRepository : IRepository<Project>
{
Task<Project?> GetByIdAsync(Guid id, CancellationToken ct = default);
Task<Project?> GetForUserAsync(Guid userId, Guid projectId, CancellationToken ct = default);
Task<PagedResult<Project>> GetForUserAsync(Guid userId, int page, int pageSize, CancellationToken ct = default);
Task<PagedResult<Project>> GetForUserAsync(ProjectListFilter filter, int page, int pageSize, CancellationToken ct = default);
Task<List<Project>> SearchForUserAsync(Guid userId, string? term, CancellationToken ct = default);
Task<int> CountMembersAsync(Guid projectId, CancellationToken ct = default);
@@ -15,7 +16,7 @@ public interface IProjectRepository : IRepository<Project>
Task<MemberRole?> GetMemberRoleAsync(Guid projectId, Guid userId, CancellationToken ct = default);
Task<ProjectMember?> GetMemberAsync(Guid projectId, Guid userId, CancellationToken ct = default);
Task<ProjectMember?> GetMemberWithUserAsync(Guid projectId, Guid userId, CancellationToken ct = default);
Task<PagedResult<ProjectMember>> GetMembersWithUserAsync(Guid projectId, int page, int pageSize, CancellationToken ct = default);
Task<PagedResult<ProjectMember>> GetMembersWithUserAsync(Guid projectId, MemberListFilter filter, int page, int pageSize, CancellationToken ct = default);
Task<int> CountOwnersAsync(Guid projectId, CancellationToken ct = default);
Task<List<Guid>> GetProjectIdsForUserAsync(Guid userId, CancellationToken ct = default);
Task<List<Guid>> GetOwnedProjectIdsAsync(Guid userId, CancellationToken ct = default);
@@ -1,4 +1,5 @@
using mws.backend.dotnet.application.Common;
using mws.backend.dotnet.application.Users;
using mws.backend.dotnet.domain.Users;
namespace mws.backend.dotnet.application.Common.Repositories;
@@ -12,5 +13,5 @@ public interface IUserRepository : IRepository<User>
Task<bool> ExistsByRoleIdAsync(Guid roleId, CancellationToken ct = default);
Task<List<Guid>> GetRoleIdsAsync(Guid userId, CancellationToken ct = default);
Task<List<User>> SearchWithRoleAsync(string? term, int? take, CancellationToken ct = default);
Task<PagedResult<User>> SearchWithRolePagedAsync(string? term, int page, int pageSize, CancellationToken ct = default);
Task<PagedResult<User>> SearchWithRolePagedAsync(UserListFilter filter, int page, int pageSize, CancellationToken ct = default);
}
+2
View File
@@ -18,3 +18,5 @@ public class SaveMasterDataRequest
public int SortOrder { get; set; }
public bool IsActive { get; set; } = true;
}
public record MasterDataFilter(string? Group, string? Term, bool? IsActive);
@@ -4,13 +4,13 @@ using mws.backend.dotnet.application.Common;
namespace mws.backend.dotnet.application.MasterData;
public record GetMasterDataListQuery(string? Group, int Page, int PageSize) : IRequest<PagedResult<MasterDataDto>>;
public record GetMasterDataListQuery(MasterDataFilter Filter, int Page, int PageSize) : IRequest<PagedResult<MasterDataDto>>;
public class GetMasterDataListHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler<GetMasterDataListQuery, PagedResult<MasterDataDto>>
{
public async Task<PagedResult<MasterDataDto>> Handle(GetMasterDataListQuery query, CancellationToken ct)
{
var entries = await uow.MasterData.GetAllAsync(query.Group, query.Page, query.PageSize, ct);
var entries = await uow.MasterData.GetAllAsync(query.Filter, query.Page, query.PageSize, ct);
return new PagedResult<MasterDataDto>
{
Items = mapper.Map<List<MasterDataDto>>(entries.Items),
+5 -1
View File
@@ -78,4 +78,8 @@ public class RecentDocumentDto
public Guid Id { get; set; }
public string Title { get; set; } = string.Empty;
public DateTime UpdatedAt { get; set; }
}
}
public record ProjectListFilter(Guid UserId, string? Term, ProjectStatus? Status, string? CreatedBy, string? UpdatedBy);
public record MemberListFilter(string? Term, MemberRole? Role);
@@ -4,7 +4,7 @@ using mws.backend.dotnet.domain.Projects;
namespace mws.backend.dotnet.application.Projects;
public record GetProjectMembersQuery(Guid UserId, Guid ProjectId, int Page, int PageSize) : IRequest<PagedResult<ProjectMemberDto>>;
public record GetProjectMembersQuery(Guid UserId, Guid ProjectId, MemberListFilter Filter, int Page, int PageSize) : IRequest<PagedResult<ProjectMemberDto>>;
public class GetProjectMembersHandler(IUnitOfWork uow) : IRequestHandler<GetProjectMembersQuery, PagedResult<ProjectMemberDto>>
{
@@ -16,7 +16,7 @@ public class GetProjectMembersHandler(IUnitOfWork uow) : IRequestHandler<GetProj
throw new NotFoundException("Project not found");
}
var members = await uow.Projects.GetMembersWithUserAsync(query.ProjectId, query.Page, query.PageSize, ct);
var members = await uow.Projects.GetMembersWithUserAsync(query.ProjectId, query.Filter, query.Page, query.PageSize, ct);
var permissions = await uow.Projects.GetMemberPermissionsAsync(query.ProjectId, ProjectPermissionScreens.Documents, ct);
var items = members.Items.Select(m =>
+2 -2
View File
@@ -4,13 +4,13 @@ using mws.backend.dotnet.application.Common;
namespace mws.backend.dotnet.application.Projects;
public record GetProjectsQuery(Guid UserId, int Page, int PageSize) : IRequest<PagedResult<ProjectDto>>;
public record GetProjectsQuery(ProjectListFilter Filter, int Page, int PageSize) : IRequest<PagedResult<ProjectDto>>;
public class GetProjectsHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler<GetProjectsQuery, PagedResult<ProjectDto>>
{
public async Task<PagedResult<ProjectDto>> Handle(GetProjectsQuery query, CancellationToken ct)
{
var projects = await uow.Projects.GetForUserAsync(query.UserId, query.Page, query.PageSize, ct);
var projects = await uow.Projects.GetForUserAsync(query.Filter, query.Page, query.PageSize, ct);
return new PagedResult<ProjectDto>
{
Items = mapper.Map<List<ProjectDto>>(projects.Items),
+3 -1
View File
@@ -45,4 +45,6 @@ public class UserRoleDetailDto
public class AssignRoleRequest
{
public Guid RoleId { get; set; }
}
}
public record UserListFilter(string? Term, bool? IsActive);
+2 -2
View File
@@ -5,7 +5,7 @@ using mws.backend.dotnet.application.Permissions;
namespace mws.backend.dotnet.application.Users;
public record GetUsersQuery(Guid ActorUserId, string? Term, int Page, int PageSize) : IRequest<PagedResult<UserDto>>;
public record GetUsersQuery(Guid ActorUserId, UserListFilter Filter, int Page, int PageSize) : IRequest<PagedResult<UserDto>>;
public class GetUsersHandler(IUnitOfWork uow, IPermissionService permissions, IMapper mapper)
: IRequestHandler<GetUsersQuery, PagedResult<UserDto>>
@@ -16,7 +16,7 @@ public class GetUsersHandler(IUnitOfWork uow, IPermissionService permissions, IM
{
await permissions.EnsureAsync(query.ActorUserId, Screen, PermissionAction.View, ct);
var users = await uow.Users.SearchWithRolePagedAsync(query.Term, query.Page, query.PageSize, ct);
var users = await uow.Users.SearchWithRolePagedAsync(query.Filter, query.Page, query.PageSize, ct);
return new PagedResult<UserDto>
{
Items = mapper.Map<List<UserDto>>(users.Items),