Skip to content

Commit

Permalink
Refactoring state management
Browse files Browse the repository at this point in the history
  • Loading branch information
dyatlov-a committed Jan 22, 2025
1 parent 17ad816 commit e058a4e
Show file tree
Hide file tree
Showing 51 changed files with 411 additions and 357 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
using Inc.TeamAssistant.Appraiser.Model.Common;
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Appraiser.Model.Queries.GetActiveStory;

public sealed record GetActiveStoryResult(string TeamName, string CodeForConnect, StoryDto? Story);
public sealed record GetActiveStoryResult(string TeamName, string CodeForConnect, StoryDto? Story)
: IWithEmpty<GetActiveStoryResult>
{
public static GetActiveStoryResult Empty { get; } = new(string.Empty, string.Empty, Story: null);
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Appraiser.Model.Queries.GetAssessmentHistory;

public sealed record GetAssessmentHistoryResult(IReadOnlyCollection<AssessmentHistoryDto> Items);
public sealed record GetAssessmentHistoryResult(IReadOnlyCollection<AssessmentHistoryDto> Items)
: IWithEmpty<GetAssessmentHistoryResult>
{
public static GetAssessmentHistoryResult Empty { get; } = new(Array.Empty<AssessmentHistoryDto>());
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
using Inc.TeamAssistant.Appraiser.Model.Common;
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Appraiser.Model.Queries.GetStories;

public sealed record GetStoriesResult(IReadOnlyCollection<StoryDto> Items);
public sealed record GetStoriesResult(IReadOnlyCollection<StoryDto> Items)
: IWithEmpty<GetStoriesResult>
{
public static GetStoriesResult Empty { get; } = new(Array.Empty<StoryDto>());
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.CheckIn.Model.Queries.GetMaps;

public sealed record GetMapsResult(IReadOnlyCollection<MapDto> Items);
public sealed record GetMapsResult(IReadOnlyCollection<MapDto> Items)
: IWithEmpty<GetMapsResult>
{
public static GetMapsResult Empty { get; } = new(Array.Empty<MapDto>());
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Connector.Model.Queries.GetBotsByCurrentUser;

public sealed record GetBotsByCurrentUserResult(IReadOnlyCollection<BotDto> Bots);
public sealed record GetBotsByCurrentUserResult(IReadOnlyCollection<BotDto> Bots)
: IWithEmpty<GetBotsByCurrentUserResult>
{
public static GetBotsByCurrentUserResult Empty { get; } = new(Array.Empty<BotDto>());
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,8 @@ namespace Inc.TeamAssistant.Connector.Model.Queries.GetIntegrationProperties;
public sealed record GetIntegrationPropertiesResult(
IntegrationProperties? Properties,
bool HasManagerAccess,
IReadOnlyCollection<Person> Teammates);
IReadOnlyCollection<Person> Teammates)
: IWithEmpty<GetIntegrationPropertiesResult>
{
public static GetIntegrationPropertiesResult Empty { get; } = new(null, false, Array.Empty<Person>());
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Connector.Model.Queries.GetTeamConnector;

public sealed record GetTeamConnectorResult(
string TeamName,
string LinkForConnect,
string Code);
string Code)
: IWithEmpty<GetTeamConnectorResult>
{
public static GetTeamConnectorResult Empty { get; } = new(string.Empty, string.Empty, string.Empty);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Connector.Model.Queries.GetTeammates;

public sealed record GetTeammatesResult(
bool HasManagerAccess,
IReadOnlyCollection<TeammateDto> Teammates);
IReadOnlyCollection<TeammateDto> Teammates)
: IWithEmpty<GetTeammatesResult>
{
public static GetTeammatesResult Empty { get; } = new(false, Array.Empty<TeammateDto>());
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Connector.Model.Queries.GetWidgets;

public sealed record GetWidgetsResult(IReadOnlyCollection<WidgetDto> Widgets);
public sealed record GetWidgetsResult(IReadOnlyCollection<WidgetDto> Widgets)
: IWithEmpty<GetWidgetsResult>
{
public static GetWidgetsResult Empty { get; } = new(Array.Empty<WidgetDto>());
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace Inc.TeamAssistant.Constructor.Application.CommandHandlers.UpdateCalendar;

internal sealed class UpdateCalendarCommandHandler : IRequestHandler<UpdateCalendarCommand, Guid>
internal sealed class UpdateCalendarCommandHandler : IRequestHandler<UpdateCalendarCommand, UpdateCalendarResult>
{
private readonly ICalendarRepository _calendarRepository;
private readonly ICurrentPersonResolver _currentPersonResolver;
Expand All @@ -24,7 +24,7 @@ public UpdateCalendarCommandHandler(
_holidayReader = holidayReader ?? throw new ArgumentNullException(nameof(holidayReader));
}

public async Task<Guid> Handle(UpdateCalendarCommand command, CancellationToken token)
public async Task<UpdateCalendarResult> Handle(UpdateCalendarCommand command, CancellationToken token)
{
ArgumentNullException.ThrowIfNull(command);

Expand All @@ -49,6 +49,6 @@ public async Task<Guid> Handle(UpdateCalendarCommand command, CancellationToken
foreach (var botId in botIds)
_holidayReader.Reload(botId);

return calendar.Id;
return new(calendar.Id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
namespace Inc.TeamAssistant.Constructor.Application.QueryHandlers.GetCalendarByOwner;

internal sealed class GetCalendarByOwnerQueryHandler
: IRequestHandler<GetCalendarByOwnerQuery, GetCalendarByOwnerResult?>
: IRequestHandler<GetCalendarByOwnerQuery, GetCalendarByOwnerResult>
{
private readonly ICalendarRepository _calendarRepository;
private readonly ICurrentPersonResolver _currentPersonResolver;
Expand All @@ -21,15 +21,15 @@ public GetCalendarByOwnerQueryHandler(
currentPersonResolver ?? throw new ArgumentNullException(nameof(currentPersonResolver));
}

public async Task<GetCalendarByOwnerResult?> Handle(GetCalendarByOwnerQuery query, CancellationToken token)
public async Task<GetCalendarByOwnerResult> Handle(GetCalendarByOwnerQuery query, CancellationToken token)
{
ArgumentNullException.ThrowIfNull(query);

var currentPerson = _currentPersonResolver.GetCurrentPerson();
var calendar = await _calendarRepository.FindByOwner(currentPerson.Id, token);

return calendar is null
? null
? GetCalendarByOwnerResult.Empty
: new GetCalendarByOwnerResult(calendar.Id, calendar.OwnerId,
calendar.Schedule is null
? null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ public sealed record UpdateCalendarCommand(
WorkScheduleUtcDto? Schedule,
IReadOnlyCollection<DayOfWeek> Weekends,
IReadOnlyDictionary<DateOnly, string> Holidays)
: IRequest<Guid>;
: IRequest<UpdateCalendarResult>;
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Constructor.Model.Commands.UpdateCalendar;

public sealed record UpdateCalendarResult(Guid Id)
: IWithEmpty<UpdateCalendarResult>
{
public static UpdateCalendarResult Empty { get; } = new(Guid.Empty);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
using Inc.TeamAssistant.Primitives;
using Inc.TeamAssistant.Primitives.Bots;

namespace Inc.TeamAssistant.Constructor.Model.Queries.GetBotDetails;

public sealed record GetBotDetailsResult(IReadOnlyCollection<BotDetails> Items);
public sealed record GetBotDetailsResult(IReadOnlyCollection<BotDetails> Items)
: IWithEmpty<GetBotDetailsResult>
{
public static GetBotDetailsResult Empty { get; } = new(Array.Empty<BotDetails>());
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

namespace Inc.TeamAssistant.Constructor.Model.Queries.GetCalendarByOwner
{
public sealed record GetCalendarByOwnerQuery : IRequest<GetCalendarByOwnerResult?>;
public sealed record GetCalendarByOwnerQuery : IRequest<GetCalendarByOwnerResult>;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Inc.TeamAssistant.Constructor.Model.Common;
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Constructor.Model.Queries.GetCalendarByOwner;

Expand All @@ -7,4 +8,13 @@ public sealed record GetCalendarByOwnerResult(
long OwnerId,
WorkScheduleUtcDto? Schedule,
IReadOnlyCollection<DayOfWeek> Weekends,
IReadOnlyDictionary<DateOnly, string> Holidays);
IReadOnlyDictionary<DateOnly, string> Holidays)
: IWithEmpty<GetCalendarByOwnerResult>
{
public static GetCalendarByOwnerResult Empty { get; } = new(
Guid.Empty,
0,
null,
Array.Empty<DayOfWeek>(),
new Dictionary<DateOnly, string>());
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ public CalendarService(IMediator mediator)
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
}

public async Task<GetCalendarByOwnerResult?> GetCalendarByOwner(CancellationToken token)
public async Task<GetCalendarByOwnerResult> GetCalendarByOwner(CancellationToken token)
{
return await _mediator.Send(new GetCalendarByOwnerQuery(), token);
}

public async Task<Guid> Update(UpdateCalendarCommand command, CancellationToken token)
public async Task<UpdateCalendarResult> Update(UpdateCalendarCommand command, CancellationToken token)
{
ArgumentNullException.ThrowIfNull(command);

Expand Down
5 changes: 3 additions & 2 deletions src/Inc.TeamAssistant.Primitives/Bots/BotContext.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
namespace Inc.TeamAssistant.Primitives.Bots;

public sealed record BotContext(Guid Id, string UserName, IReadOnlyDictionary<string, string> Properties)
: IWithEmpty<BotContext>
{
public static readonly BotContext Empty = new(Guid.Empty, string.Empty, new Dictionary<string, string>());
public static BotContext Empty { get; } = new(Guid.Empty, string.Empty, new Dictionary<string, string>());

public TimeSpan GetIntervalOrDefault(string propertyKey, TimeSpan defaultValue)
{
ArgumentException.ThrowIfNullOrWhiteSpace(propertyKey);
Expand Down
6 changes: 6 additions & 0 deletions src/Inc.TeamAssistant.Primitives/IWithEmpty.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Inc.TeamAssistant.Primitives;

public interface IWithEmpty<out T>
{
static abstract T Empty { get; }
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.RandomCoffee.Model.Queries.GetChats;

public sealed record GetChatsResult(IReadOnlyCollection<ChatDto> Items);
public sealed record GetChatsResult(IReadOnlyCollection<ChatDto> Items)
: IWithEmpty<GetChatsResult>
{
public static GetChatsResult Empty { get; } = new(Array.Empty<ChatDto>());
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Reviewer.Model.Queries.GetAverageByTeam;

public sealed record GetAverageByTeamResult(IReadOnlyCollection<ReviewAverageStatsDto> Items);
public sealed record GetAverageByTeamResult(IReadOnlyCollection<ReviewAverageStatsDto> Items)
: IWithEmpty<GetAverageByTeamResult>
{
public static GetAverageByTeamResult Empty { get; } = new(Array.Empty<ReviewAverageStatsDto>());
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Reviewer.Model.Queries.GetHistoryByTeam;

public sealed record GetHistoryByTeamResult(
IReadOnlyCollection<HistoryByTeamItemDto> Review,
IReadOnlyCollection<HistoryByTeamItemDto> Requests);
IReadOnlyCollection<HistoryByTeamItemDto> Requests)
: IWithEmpty<GetHistoryByTeamResult>
{
public static GetHistoryByTeamResult Empty { get; } = new(Array.Empty<HistoryByTeamItemDto>(), Array.Empty<HistoryByTeamItemDto>());
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
using Inc.TeamAssistant.Primitives;

namespace Inc.TeamAssistant.Reviewer.Model.Queries.GetLastTasks;

public sealed record GetLastTasksResult(IReadOnlyCollection<TaskForReviewDto> Items);
public sealed record GetLastTasksResult(IReadOnlyCollection<TaskForReviewDto> Items)
: IWithEmpty<GetLastTasksResult>
{
public static GetLastTasksResult Empty { get; } = new(Array.Empty<TaskForReviewDto>());
}
11 changes: 7 additions & 4 deletions src/Inc.TeamAssistant.WebUI/Components/LoadingState.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
namespace Inc.TeamAssistant.WebUI.Components;

public sealed class LoadingState
public sealed class LoadingState : IProgress<LoadingState.State>
{
public State Value { get; }
public State Value { get; private set; }

private LoadingState(State value)
{
Value = value;
}

public bool IsLoading => Value == State.Loading;

public static LoadingState Loading() => new(State.Loading);

public static LoadingState Error() => new(State.Error);

public static LoadingState Done() => new(State.Done);

public void Report(State value)
{
Value = value;
}

public enum State
{
Loading = 1,
Expand Down
4 changes: 2 additions & 2 deletions src/Inc.TeamAssistant.WebUI/Contracts/ICalendarService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Inc.TeamAssistant.WebUI.Contracts;

public interface ICalendarService
{
Task<GetCalendarByOwnerResult?> GetCalendarByOwner(CancellationToken token = default);
Task<GetCalendarByOwnerResult> GetCalendarByOwner(CancellationToken token = default);

Task<Guid> Update(UpdateCalendarCommand command, CancellationToken token = default);
Task<UpdateCalendarResult> Update(UpdateCalendarCommand command, CancellationToken token = default);
}
Loading

0 comments on commit e058a4e

Please sign in to comment.