-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* added logic and endpoint tests for teams (CRUD etc.) * added endpoint tests for testing concurrency errors * fixed dependency tests * refactoring (naming ...)
- Loading branch information
1 parent
b5ac482
commit 5c59487
Showing
69 changed files
with
3,785 additions
and
39 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3 changes: 0 additions & 3 deletions
3
src/Modules/TeamManagement/TeamUp.TeamManagement.Application/AssemblyReference.cs
This file was deleted.
Oops, something went wrong.
14 changes: 14 additions & 0 deletions
14
src/Modules/TeamManagement/TeamUp.TeamManagement.Application/ITeamManagementQueryContext.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
using TeamUp.TeamManagement.Domain.Aggregates.Events; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Invitations; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Teams; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Users; | ||
|
||
namespace TeamUp.TeamManagement.Application; | ||
|
||
public interface ITeamManagementQueryContext | ||
{ | ||
public IQueryable<User> Users { get; } | ||
public IQueryable<Team> Teams { get; } | ||
public IQueryable<Invitation> Invitations { get; } | ||
public IQueryable<Event> Events { get; } | ||
} |
4 changes: 4 additions & 0 deletions
4
...TeamManagement/TeamUp.TeamManagement.Application/TeamUp.TeamManagement.Application.csproj
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
30 changes: 30 additions & 0 deletions
30
...es/TeamManagement/TeamUp.TeamManagement.Application/Teams/ChangeNicknameCommandHandler.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
using RailwayResult; | ||
using RailwayResult.FunctionalExtensions; | ||
|
||
using TeamUp.Common.Application; | ||
using TeamUp.TeamManagement.Contracts; | ||
using TeamUp.TeamManagement.Contracts.Teams.ChangeNickname; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Teams; | ||
|
||
namespace TeamUp.TeamManagement.Application.Teams; | ||
|
||
internal sealed class ChangeNicknameCommandHandler : ICommandHandler<ChangeNicknameCommand> | ||
{ | ||
private readonly ITeamRepository _teamRepository; | ||
private readonly IUnitOfWork<TeamManagementModuleId> _unitOfWork; | ||
|
||
public ChangeNicknameCommandHandler(ITeamRepository teamRepository, IUnitOfWork<TeamManagementModuleId> unitOfWork) | ||
{ | ||
_teamRepository = teamRepository; | ||
_unitOfWork = unitOfWork; | ||
} | ||
|
||
public async Task<Result> Handle(ChangeNicknameCommand command, CancellationToken ct) | ||
{ | ||
var team = await _teamRepository.GetTeamByIdAsync(command.TeamId, ct); | ||
return await team | ||
.EnsureNotNull(TeamErrors.TeamNotFound) | ||
.Then(team => team.ChangeNickname(command.InitiatorId, command.Nickname)) | ||
.TapAsync(() => _unitOfWork.SaveChangesAsync(ct)); | ||
} | ||
} |
30 changes: 30 additions & 0 deletions
30
...s/TeamManagement/TeamUp.TeamManagement.Application/Teams/ChangeOwnershipCommandHandler.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
using RailwayResult; | ||
using RailwayResult.FunctionalExtensions; | ||
|
||
using TeamUp.Common.Application; | ||
using TeamUp.TeamManagement.Contracts; | ||
using TeamUp.TeamManagement.Contracts.Teams.ChangeOwnership; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Teams; | ||
|
||
namespace TeamUp.TeamManagement.Application.Teams; | ||
|
||
internal sealed class ChangeOwnershipCommandHandler : ICommandHandler<ChangeOwnershipCommand> | ||
{ | ||
private readonly ITeamRepository _teamRepository; | ||
private readonly IUnitOfWork<TeamManagementModuleId> _unitOfWork; | ||
|
||
public ChangeOwnershipCommandHandler(ITeamRepository teamRepository, IUnitOfWork<TeamManagementModuleId> unitOfWork) | ||
{ | ||
_teamRepository = teamRepository; | ||
_unitOfWork = unitOfWork; | ||
} | ||
|
||
public async Task<Result> Handle(ChangeOwnershipCommand command, CancellationToken ct) | ||
{ | ||
var team = await _teamRepository.GetTeamByIdAsync(command.TeamId, ct); | ||
return await team | ||
.EnsureNotNull(TeamErrors.TeamNotFound) | ||
.Then(team => team.ChangeOwnership(command.InitiatorId, command.NewOwnerId)) | ||
.TapAsync(() => _unitOfWork.SaveChangesAsync(ct)); | ||
} | ||
} |
31 changes: 31 additions & 0 deletions
31
...s/TeamManagement/TeamUp.TeamManagement.Application/Teams/CreateEventTypeCommandHandler.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
using RailwayResult; | ||
using RailwayResult.FunctionalExtensions; | ||
|
||
using TeamUp.Common.Application; | ||
using TeamUp.TeamManagement.Contracts; | ||
using TeamUp.TeamManagement.Contracts.Teams; | ||
using TeamUp.TeamManagement.Contracts.Teams.CreateEventType; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Teams; | ||
|
||
namespace TeamUp.TeamManagement.Application.Teams; | ||
|
||
internal sealed class CreateEventTypeCommandHandler : ICommandHandler<CreateEventTypeCommand, EventTypeId> | ||
{ | ||
private readonly ITeamRepository _teamRepository; | ||
private readonly IUnitOfWork<TeamManagementModuleId> _unitOfWork; | ||
|
||
public CreateEventTypeCommandHandler(ITeamRepository teamRepository, IUnitOfWork<TeamManagementModuleId> unitOfWork) | ||
{ | ||
_teamRepository = teamRepository; | ||
_unitOfWork = unitOfWork; | ||
} | ||
|
||
public async Task<Result<EventTypeId>> Handle(CreateEventTypeCommand command, CancellationToken ct) | ||
{ | ||
var team = await _teamRepository.GetTeamByIdAsync(command.TeamId, ct); | ||
return await team | ||
.EnsureNotNull(TeamErrors.TeamNotFound) | ||
.Then(team => team.CreateEventType(command.InitiatorId, command.Name, command.Description)) | ||
.TapAsync(_ => _unitOfWork.SaveChangesAsync(ct)); | ||
} | ||
} |
40 changes: 40 additions & 0 deletions
40
...odules/TeamManagement/TeamUp.TeamManagement.Application/Teams/CreateTeamCommandHandler.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
using RailwayResult; | ||
using RailwayResult.FunctionalExtensions; | ||
|
||
using TeamUp.Common.Application; | ||
using TeamUp.Common.Contracts; | ||
using TeamUp.TeamManagement.Contracts; | ||
using TeamUp.TeamManagement.Contracts.Teams; | ||
using TeamUp.TeamManagement.Contracts.Teams.CreateTeam; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Teams; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Users; | ||
|
||
namespace TeamUp.TeamManagement.Application.Teams; | ||
|
||
internal sealed class CreateTeamCommandHandler : ICommandHandler<CreateTeamCommand, TeamId> | ||
{ | ||
private readonly ITeamRepository _teamRepository; | ||
private readonly IDateTimeProvider _dateTimeProvider; | ||
private readonly IUserRepository _userRepository; | ||
private readonly IUnitOfWork<TeamManagementModuleId> _unitOfWork; | ||
|
||
public CreateTeamCommandHandler(ITeamRepository teamRepository, IDateTimeProvider dateTimeProvider, IUserRepository userRepository, IUnitOfWork<TeamManagementModuleId> unitOfWork) | ||
{ | ||
_teamRepository = teamRepository; | ||
_dateTimeProvider = dateTimeProvider; | ||
_userRepository = userRepository; | ||
_unitOfWork = unitOfWork; | ||
} | ||
|
||
public async Task<Result<TeamId>> Handle(CreateTeamCommand command, CancellationToken ct) | ||
{ | ||
var user = await _userRepository.GetUserByIdAsync(command.OwnerId, ct); | ||
return await user | ||
.EnsureNotNull(UserErrors.UserNotFound) | ||
.Ensure(TeamRules.UserDoesNotOwnToManyTeams) | ||
.Then(user => Team.Create(command.Name, user, _dateTimeProvider)) | ||
.Tap(_teamRepository.AddTeam) | ||
.Then(team => team.Id) | ||
.TapAsync(_ => _unitOfWork.SaveChangesAsync(ct)); | ||
} | ||
} |
30 changes: 30 additions & 0 deletions
30
...odules/TeamManagement/TeamUp.TeamManagement.Application/Teams/DeleteTeamCommandHandler.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
using RailwayResult; | ||
using RailwayResult.FunctionalExtensions; | ||
|
||
using TeamUp.Common.Application; | ||
using TeamUp.TeamManagement.Contracts; | ||
using TeamUp.TeamManagement.Contracts.Teams.DeleteTeam; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Teams; | ||
|
||
namespace TeamUp.TeamManagement.Application.Teams; | ||
|
||
internal sealed class DeleteTeamCommandHandler : ICommandHandler<DeleteTeamCommand> | ||
{ | ||
private readonly ITeamRepository _teamRepository; | ||
private readonly IUnitOfWork<TeamManagementModuleId> _unitOfWork; | ||
|
||
public DeleteTeamCommandHandler(ITeamRepository teamDomainService, IUnitOfWork<TeamManagementModuleId> unitOfWork) | ||
{ | ||
_teamRepository = teamDomainService; | ||
_unitOfWork = unitOfWork; | ||
} | ||
|
||
public async Task<Result> Handle(DeleteTeamCommand command, CancellationToken ct) | ||
{ | ||
var team = await _teamRepository.GetTeamByIdAsync(command.TeamId, ct); | ||
return await team | ||
.EnsureNotNull(TeamErrors.TeamNotFound) | ||
.Then(team => team.Delete(command.InitiatorId)) | ||
.TapAsync(() => _unitOfWork.SaveChangesAsync(ct)); | ||
} | ||
} |
47 changes: 47 additions & 0 deletions
47
src/Modules/TeamManagement/TeamUp.TeamManagement.Application/Teams/GetTeamQueryHandler.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
using Microsoft.EntityFrameworkCore; | ||
|
||
using RailwayResult; | ||
using RailwayResult.FunctionalExtensions; | ||
|
||
using TeamUp.Common.Application; | ||
using TeamUp.Contracts.Teams; | ||
using TeamUp.TeamManagement.Contracts.Teams; | ||
using TeamUp.TeamManagement.Contracts.Teams.GetTeam; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Teams; | ||
|
||
namespace TeamUp.TeamManagement.Application.Teams; | ||
|
||
internal sealed class GetTeamQueryHandler : IQueryHandler<GetTeamQuery, TeamResponse> | ||
{ | ||
private readonly ITeamManagementQueryContext _appQueryContext; | ||
|
||
public GetTeamQueryHandler(ITeamManagementQueryContext appQueryContext) | ||
{ | ||
_appQueryContext = appQueryContext; | ||
} | ||
|
||
public async Task<Result<TeamResponse>> Handle(GetTeamQuery query, CancellationToken ct) | ||
{ | ||
var team = await _appQueryContext.Teams | ||
.Where(team => team.Id == query.TeamId) | ||
.Select(team => new TeamResponse | ||
{ | ||
Name = team.Name, | ||
Members = team.Members | ||
.Select(member => new TeamMemberResponse | ||
{ | ||
Id = member.Id, | ||
UserId = member.UserId, | ||
Nickname = member.Nickname, | ||
Role = member.Role | ||
}) | ||
.ToList() | ||
.AsReadOnly() | ||
}) | ||
.FirstOrDefaultAsync(ct); | ||
|
||
return team | ||
.EnsureNotNull(TeamErrors.TeamNotFound) | ||
.Ensure(team => team.Members.Any(member => member.UserId == query.InitiatorId), TeamErrors.NotMemberOfTeam); | ||
} | ||
} |
30 changes: 30 additions & 0 deletions
30
.../TeamManagement/TeamUp.TeamManagement.Application/Teams/RemoveTeamMemberCommandHandler.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
using RailwayResult; | ||
using RailwayResult.FunctionalExtensions; | ||
|
||
using TeamUp.Common.Application; | ||
using TeamUp.TeamManagement.Contracts; | ||
using TeamUp.TeamManagement.Contracts.Teams.RemoveTeamMember; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Teams; | ||
|
||
namespace TeamUp.TeamManagement.Application.Teams; | ||
|
||
internal sealed class RemoveTeamMemberCommandHandler : ICommandHandler<RemoveTeamMemberCommand> | ||
{ | ||
private readonly ITeamRepository _teamRepository; | ||
private readonly IUnitOfWork<TeamManagementModuleId> _unitOfWork; | ||
|
||
public RemoveTeamMemberCommandHandler(ITeamRepository teamRepository, IUnitOfWork<TeamManagementModuleId> unitOfWork) | ||
{ | ||
_teamRepository = teamRepository; | ||
_unitOfWork = unitOfWork; | ||
} | ||
|
||
public async Task<Result> Handle(RemoveTeamMemberCommand command, CancellationToken ct) | ||
{ | ||
var team = await _teamRepository.GetTeamByIdAsync(command.TeamId, ct); | ||
return await team | ||
.EnsureNotNull(TeamErrors.TeamNotFound) | ||
.Then(team => team.RemoveTeamMember(command.InitiatorId, command.MemberId)) | ||
.TapAsync(() => _unitOfWork.SaveChangesAsync(ct)); | ||
} | ||
} |
30 changes: 30 additions & 0 deletions
30
...les/TeamManagement/TeamUp.TeamManagement.Application/Teams/SetMemberRoleCommandHandler.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
using RailwayResult; | ||
using RailwayResult.FunctionalExtensions; | ||
|
||
using TeamUp.Common.Application; | ||
using TeamUp.TeamManagement.Contracts; | ||
using TeamUp.TeamManagement.Contracts.Teams.SetMemberRole; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Teams; | ||
|
||
namespace TeamUp.TeamManagement.Application.Teams; | ||
|
||
internal sealed class SetMemberRoleCommandHandler : ICommandHandler<SetMemberRoleCommand> | ||
{ | ||
private readonly ITeamRepository _teamRepository; | ||
private readonly IUnitOfWork<TeamManagementModuleId> _unitOfWork; | ||
|
||
public SetMemberRoleCommandHandler(ITeamRepository teamRepository, IUnitOfWork<TeamManagementModuleId> unitOfWork) | ||
{ | ||
_teamRepository = teamRepository; | ||
_unitOfWork = unitOfWork; | ||
} | ||
|
||
public async Task<Result> Handle(SetMemberRoleCommand command, CancellationToken ct) | ||
{ | ||
var team = await _teamRepository.GetTeamByIdAsync(command.TeamId, ct); | ||
return await team | ||
.EnsureNotNull(TeamErrors.TeamNotFound) | ||
.Then(team => team.SetMemberRole(command.InitiatorId, command.MemberId, command.Role)) | ||
.TapAsync(() => _unitOfWork.SaveChangesAsync(ct)); | ||
} | ||
} |
30 changes: 30 additions & 0 deletions
30
...dules/TeamManagement/TeamUp.TeamManagement.Application/Teams/SetTeamNameCommandHandler.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
using RailwayResult; | ||
using RailwayResult.FunctionalExtensions; | ||
|
||
using TeamUp.Common.Application; | ||
using TeamUp.TeamManagement.Contracts; | ||
using TeamUp.TeamManagement.Contracts.Teams.SetTeamName; | ||
using TeamUp.TeamManagement.Domain.Aggregates.Teams; | ||
|
||
namespace TeamUp.TeamManagement.Application.Teams; | ||
|
||
internal sealed class SetTeamNameCommandHandler : ICommandHandler<SetTeamNameCommand> | ||
{ | ||
private readonly ITeamRepository _teamRepository; | ||
private readonly IUnitOfWork<TeamManagementModuleId> _unitOfWork; | ||
|
||
public SetTeamNameCommandHandler(ITeamRepository teamRepository, IUnitOfWork<TeamManagementModuleId> unitOfWork) | ||
{ | ||
_teamRepository = teamRepository; | ||
_unitOfWork = unitOfWork; | ||
} | ||
|
||
public async Task<Result> Handle(SetTeamNameCommand command, CancellationToken ct) | ||
{ | ||
var team = await _teamRepository.GetTeamByIdAsync(command.TeamId, ct); | ||
return await team | ||
.EnsureNotNull(TeamErrors.TeamNotFound) | ||
.Then(team => team.ChangeTeamName(command.InitiatorId, command.Name)) | ||
.TapAsync(() => _unitOfWork.SaveChangesAsync(ct)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
25 changes: 25 additions & 0 deletions
25
...mManagement/TeamUp.TeamManagement.Contracts/Teams/ChangeNickname/ChangeNicknameCommand.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
using FluentValidation; | ||
using TeamUp.UserAccess.Contracts; | ||
using TeamUp.Common.Contracts; | ||
|
||
namespace TeamUp.TeamManagement.Contracts.Teams.ChangeNickname; | ||
|
||
public sealed record ChangeNicknameCommand : ICommand | ||
{ | ||
public required UserId InitiatorId { get; init; } | ||
public required TeamId TeamId { get; init; } | ||
public required string Nickname { get; init; } | ||
|
||
public sealed class Validator : AbstractValidator<ChangeNicknameCommand> | ||
{ | ||
public Validator() | ||
{ | ||
RuleFor(x => x.InitiatorId).NotEmpty(); | ||
RuleFor(x => x.TeamId).NotEmpty(); | ||
RuleFor(x => x.Nickname) | ||
.NotEmpty() | ||
.MinimumLength(TeamConstants.NICKNAME_MIN_SIZE) | ||
.MaximumLength(TeamConstants.NICKNAME_MAX_SIZE); | ||
} | ||
} | ||
} |
9 changes: 9 additions & 0 deletions
9
...mManagement/TeamUp.TeamManagement.Contracts/Teams/ChangeNickname/ChangeNicknameRequest.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
using System.ComponentModel.DataAnnotations; | ||
|
||
namespace TeamUp.TeamManagement.Contracts.Teams.ChangeNickname; | ||
|
||
public sealed class ChangeNicknameRequest | ||
{ | ||
[DataType(DataType.Text)] | ||
public required string Nickname { get; init; } | ||
} |
Oops, something went wrong.