Skip to content

feat(duely): add admin list endpoints - #337

Merged
DIvanCode merged 4 commits into
masterfrom
codex/issue-331-admin-queries
Aug 9, 2026
Merged

feat(duely): add admin list endpoints#337
DIvanCode merged 4 commits into
masterfrom
codex/issue-331-admin-queries

Conversation

@DIvanCode

@DIvanCode DIvanCode commented Aug 9, 2026

Copy link
Copy Markdown
Owner

Summary

  • add OnlyAdmin list endpoints for users, duels, submissions, groups, and tournaments
  • allow administrators to inspect any duel, both participants' submission lists, full submission details, any group and its read-only subresources, and any tournament
  • include duel_id and task_key in admin submission-list rows so the frontend can open the owning duel and selected task
  • expose active users from the WebSocket connection registry and ranked-search wait metadata
  • make the active-user contract explicitly process-local, document the current single-container production topology, and test instance isolation
  • return pending-duel acceptance state plus group and tournament references
  • keep all mutation permissions unchanged; GroupDto.user_role is null when an admin is not a member

Admin list API

  • GET /users/admin/all
  • GET /users/admin/active
  • GET /duels/admin/pending
  • GET /duels/admin/ranked-searchers
  • GET /duels/admin/active
  • GET /duels/admin/finished
  • GET /duels/admin/submissions/testing
  • GET /duels/admin/submissions/all
  • GET /groups/admin/all
  • GET /tournaments/admin/active
  • GET /tournaments/admin/finished

Both admin submission endpoints return the regular submission-list fields plus duel_id and task_key.

Additional admin read access

  • GET /duels/{duelId}
  • GET /duels/{duelId}/submissions?taskKey={taskKey}
  • GET /duels/{duelId}/submissions/{submissionId}
  • GET /groups/{id}
  • GET /groups/{id}/users
  • GET /groups/{id}/duels
  • GET /groups/{id}/tournaments
  • GET /tournaments/{id}

Verification

  • rebased onto master at eb6131e
  • dotnet test --configuration Release --no-restore --maxcpucount:1 --disable-build-servers — 445 tests passed
  • focused submission access handlers — 10 passed
  • focused admin controller tests — 4 passed

Closes #331

@DIvanCode
DIvanCode marked this pull request as ready for review August 9, 2026 15:27
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown

Summary

Summary
Generated on: 08/09/2026 - 15:29:14
Coverage date: 08/09/2026 - 15:28:28 - 08/09/2026 - 15:29:11
Parser: MultiReport (3x Cobertura)
Assemblies: 4
Classes: 250
Files: 168
Line coverage: 92.6% (4048 of 4370)
Covered lines: 4048
Uncovered lines: 322
Coverable lines: 4370
Total lines: 8905
Branch coverage: 84.7% (840 of 991)
Covered branches: 840
Total branches: 991
Method coverage: Feature is only available for sponsors
Tag: 147_31321171135

Coverage

Duely.Application.Services - 88.3%
Name Line Branch
Duely.Application.Services 88.3% 100%
Duely.Application.Services.Errors.AuthenticationError 100%
Duely.Application.Services.Errors.EntityAlreadyExistsError 33.3%
Duely.Application.Services.Errors.EntityNotFoundError 33.3%
Duely.Application.Services.Errors.ForbiddenError 66.6%
Duely.Application.Services.Errors.RateLimitExceededError 100%
Duely.Application.Services.Outbox.ExecuteOutboxMessageCommand 100%
Duely.Application.Services.Outbox.ExecuteOutboxMessageHandler 100%
Duely.Application.Services.Outbox.Handlers.RunCodeOutboxHandler 100% 100%
Duely.Application.Services.Outbox.Handlers.SendMessageOutboxHandler 100%
Duely.Application.Services.Outbox.Handlers.TestSolutionHandler 100%
Duely.Application.Services.Outbox.Relay.OutboxDispatcher 100% 100%
Duely.Application.Services.RateLimiting.RateLimitingOptions 100%
Duely.Application.Services.RateLimiting.RunUserCodeLimiter 100%
Duely.Application.Services.RateLimiting.SubmissionRateLimiter 100%
Duely.Application.UseCases - 93%
Name Line Branch
Duely.Application.UseCases 93% 85.5%
Duely.Application.UseCases.Dtos.CodeRunDto 100%
Duely.Application.UseCases.Dtos.DuelConfigurationDto 100%
Duely.Application.UseCases.Dtos.DuelDto 100%
Duely.Application.UseCases.Dtos.DuelInvitationDto 100%
Duely.Application.UseCases.Dtos.DuelTaskConfigurationDto 100%
Duely.Application.UseCases.Dtos.DuelTaskDto 100%
Duely.Application.UseCases.Dtos.DuelTaskSolutionDto 100%
Duely.Application.UseCases.Dtos.GroupDto 100%
Duely.Application.UseCases.Dtos.GroupDuelDto 100%
Duely.Application.UseCases.Dtos.GroupDuelInvitationDto 100%
Duely.Application.UseCases.Dtos.GroupInvitationDto 100%
Duely.Application.UseCases.Dtos.GroupListItemDto 100%
Duely.Application.UseCases.Dtos.GroupStageDto 0%
Duely.Application.UseCases.Dtos.GroupStageDuelDto 0%
Duely.Application.UseCases.Dtos.GroupStageStandingDto 0%
Duely.Application.UseCases.Dtos.GroupUserDto 100%
Duely.Application.UseCases.Dtos.PendingDuelDto 100%
Duely.Application.UseCases.Dtos.RankedDuelSearcherDto 100%
Duely.Application.UseCases.Dtos.SingleEliminationBracketDto 100%
Duely.Application.UseCases.Dtos.SingleEliminationBracketNodeDto 100%
Duely.Application.UseCases.Dtos.SubmissionDto 100%
Duely.Application.UseCases.Dtos.SubmissionListItemDto 100%
Duely.Application.UseCases.Dtos.TicketDto 100%
Duely.Application.UseCases.Dtos.TokenDto 100%
Duely.Application.UseCases.Dtos.TournamentDetailsDto 66.6%
Duely.Application.UseCases.Dtos.TournamentDto 100%
Duely.Application.UseCases.Dtos.TournamentDuelInvitationDto 100%
Duely.Application.UseCases.Dtos.UserDto 100%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunCommand 100%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunCommandValidator 0% 0%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunHandler 100% 100%
Duely.Application.UseCases.Features.CodeRuns.GetCodeRunHandler 100% 100%
Duely.Application.UseCases.Features.CodeRuns.GetCodeRunQuery 100%
Duely.Application.UseCases.Features.CodeRuns.UpdateCodeRunCommand 100%
Duely.Application.UseCases.Features.CodeRuns.UpdateCodeRunHandler 98.1% 94.7%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionCommandValidator
96.7% 66.6%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.DeleteDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.DeleteDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.GetDuelConfiguration
Handler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.GetDuelConfiguration
Query
100%
Duely.Application.UseCases.Features.DuelConfigurations.GetUserDuelConfigura
tionsHandler
100%
Duely.Application.UseCases.Features.DuelConfigurations.GetUserDuelConfigura
tionsQuery
100%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionCommandValidator
96.7% 50%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.CancelPendingDuelsCommand 100%
Duely.Application.UseCases.Features.Duels.CancelPendingDuelsHandler 97.3% 80%
Duely.Application.UseCases.Features.Duels.CheckDuelsForAnticheatCommand 100%
Duely.Application.UseCases.Features.Duels.CheckDuelsForAnticheatHandler 89.7% 75%
Duely.Application.UseCases.Features.Duels.CheckDuelsForFinishHandler 100% 89.2%
Duely.Application.UseCases.Features.Duels.GetActiveDuelHandler 100% 100%
Duely.Application.UseCases.Features.Duels.GetActiveDuelQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelHandler 94.9% 75%
Duely.Application.UseCases.Features.Duels.GetDuelQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelsByStatusHandler 100%
Duely.Application.UseCases.Features.Duels.GetDuelsByStatusQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelsHistoryHandler 100% 100%
Duely.Application.UseCases.Features.Duels.GetDuelsHistoryQuery 100%
Duely.Application.UseCases.Features.Duels.GetGroupDuelsHandler 98.3% 75%
Duely.Application.UseCases.Features.Duels.GetGroupDuelsQuery 100%
Duely.Application.UseCases.Features.Duels.GetPendingDuelsHandler 100%
Duely.Application.UseCases.Features.Duels.GetRankedDuelSearchersHandler 100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptDuelInvitationH
andler
100% 92.8%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptGroupDuelInvita
tionHandler
100% 92.8%
Duely.Application.UseCases.Features.Duels.Invitations.CancelDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelDuelInvitationH
andler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelGroupDuelInvita
tionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateDuelInvitationH
andler
100% 91.6%
Duely.Application.UseCases.Features.Duels.Invitations.CreateGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateGroupDuelInvita
tionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.DenyDuelInvitationCom
mand
100%
Duely.Application.UseCases.Features.Duels.Invitations.DenyDuelInvitationHan
dler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingDuelInvita
tionsHandler
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingDuelInvita
tionsQuery
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingGroupDuelI
nvitationsHandler
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingGroupDuelI
nvitationsQuery
100%
Duely.Application.UseCases.Features.Duels.Search.StartDuelSearchCommand 100%
Duely.Application.UseCases.Features.Duels.Search.StartDuelSearchHandler 100% 83.3%
Duely.Application.UseCases.Features.Duels.TryCreateDuelHandler 94.6% 90.9%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionCommand 100%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionCommandVali
dator
0%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionHandler 83.6% 85.7%
Duely.Application.UseCases.Features.Groups.AcceptInviteCommand 100%
Duely.Application.UseCases.Features.Groups.AcceptInviteHandler 100% 100%
Duely.Application.UseCases.Features.Groups.CancelInviteCommand 100%
Duely.Application.UseCases.Features.Groups.CancelInviteHandler 96.6% 75%
Duely.Application.UseCases.Features.Groups.ChangeRoleCommand 100%
Duely.Application.UseCases.Features.Groups.ChangeRoleHandler 90.4% 78.5%
Duely.Application.UseCases.Features.Groups.CreateGroupCommand 100%
Duely.Application.UseCases.Features.Groups.CreateGroupCommandValidator 0%
Duely.Application.UseCases.Features.Groups.CreateGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.DenyInviteCommand 100%
Duely.Application.UseCases.Features.Groups.DenyInviteHandler 100% 100%
Duely.Application.UseCases.Features.Groups.ExcludeUserCommand 100%
Duely.Application.UseCases.Features.Groups.ExcludeUserHandler 88.8% 75%
Duely.Application.UseCases.Features.Groups.GetAllGroupsHandler 100%
Duely.Application.UseCases.Features.Groups.GetGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.GetGroupInvitationsHandler 100%
Duely.Application.UseCases.Features.Groups.GetGroupInvitationsQuery 100%
Duely.Application.UseCases.Features.Groups.GetGroupQuery 100%
Duely.Application.UseCases.Features.Groups.GetGroupUsersHandler 97.6% 90%
Duely.Application.UseCases.Features.Groups.GetGroupUsersQuery 100%
Duely.Application.UseCases.Features.Groups.GetUserGroupsHandler 100%
Duely.Application.UseCases.Features.Groups.GetUserGroupsQuery 100%
Duely.Application.UseCases.Features.Groups.InviteUserCommand 100%
Duely.Application.UseCases.Features.Groups.InviteUserHandler 95.9% 83.3%
Duely.Application.UseCases.Features.Groups.LeaveGroupCommand 100%
Duely.Application.UseCases.Features.Groups.LeaveGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.UpdateGroupCommand 100%
Duely.Application.UseCases.Features.Groups.UpdateGroupCommandValidator 0%
Duely.Application.UseCases.Features.Groups.UpdateGroupHandler 100% 100%
Duely.Application.UseCases.Features.Submissions.GetAllSubmissionsHandler 100% 100%
Duely.Application.UseCases.Features.Submissions.GetAllSubmissionsQuery 100%
Duely.Application.UseCases.Features.Submissions.GetSubmissionHandler 95.2% 83.3%
Duely.Application.UseCases.Features.Submissions.GetSubmissionQuery 100%
Duely.Application.UseCases.Features.Submissions.GetUserSubmissionsHandler 100% 92.8%
Duely.Application.UseCases.Features.Submissions.GetUserSubmissionsQuery 100%
Duely.Application.UseCases.Features.Submissions.SendSubmissionCommand 83.3%
Duely.Application.UseCases.Features.Submissions.SendSubmissionHandler 92.8% 56.2%
Duely.Application.UseCases.Features.Submissions.UpdateSubmissionStatusComma
nd
100%
Duely.Application.UseCases.Features.Submissions.UpdateSubmissionStatusHandl
er
96% 80%
Duely.Application.UseCases.Features.Tournaments.AcceptTournamentDuelCommand 100%
Duely.Application.UseCases.Features.Tournaments.AcceptTournamentDuelHandler 100% 92.8%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentCommand 100%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentCommandVali
dator
100%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentHandler 87.8% 81.2%
Duely.Application.UseCases.Features.Tournaments.GetGroupTournamentsHandler 96.2% 87.5%
Duely.Application.UseCases.Features.Tournaments.GetGroupTournamentsQuery 100%
Duely.Application.UseCases.Features.Tournaments.GetIncomingTournamentDuelIn
vitationsHandler
100%
Duely.Application.UseCases.Features.Tournaments.GetIncomingTournamentDuelIn
vitationsQuery
100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentHandler 94.2% 50%
Duely.Application.UseCases.Features.Tournaments.GetTournamentQuery 100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentsByStateHandle
r
100% 100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentsByStateQuery 100%
Duely.Application.UseCases.Features.Tournaments.StartTournamentCommand 100%
Duely.Application.UseCases.Features.Tournaments.StartTournamentHandler 95% 87.5%
Duely.Application.UseCases.Features.Tournaments.SyncActiveTournamentsHandle
r
99.3% 83.3%
Duely.Application.UseCases.Features.UserActions.GetUserActionsHandler 100%
Duely.Application.UseCases.Features.UserActions.GetUserActionsQuery 75%
Duely.Application.UseCases.Features.UserActions.GetUserActionsQueryValidato
r
0%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsCommand 66.6%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsCommandValid
ator
0%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsHandler 100% 100%
Duely.Application.UseCases.Features.UserActions.UserActionValidator 0%
Duely.Application.UseCases.Features.Users.CreateTicketCommand 100%
Duely.Application.UseCases.Features.Users.CreateTicketHandler 94.7% 66.6%
Duely.Application.UseCases.Features.Users.GetByNicknameHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUserByNicknameQuery 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketCommand 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketCommandValidator 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUserQuery 100%
Duely.Application.UseCases.Features.Users.GetUsersHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUsersQuery 100%
Duely.Application.UseCases.Features.Users.LoginCommand 100%
Duely.Application.UseCases.Features.Users.LoginHandler 100% 100%
Duely.Application.UseCases.Features.Users.RefreshTokenCommand 100%
Duely.Application.UseCases.Features.Users.RefreshTokenHandler 100% 100%
Duely.Application.UseCases.Features.Users.RegisterCommand 100%
Duely.Application.UseCases.Features.Users.RegisterCommandValidator 100%
Duely.Application.UseCases.Features.Users.RegisterHandler 100% 100%
Duely.Application.UseCases.Helpers.DuelDtoMapper 96% 87.5%
Duely.Application.UseCases.Helpers.GroupStageTournamentDetailsMapper 0% 0%
Duely.Application.UseCases.Helpers.SingleEliminationBracketTournamentDetail
sMapper
100% 100%
Duely.Application.UseCases.Helpers.TournamentDetailsMapperResolver 100%
Duely.Application.UseCases.Helpers.TournamentDtoMapper 100% 100%
Duely.Domain.Models - 88.9%
Name Line Branch
Duely.Domain.Models 88.9% ****
Duely.Domain.Models.AnticheatScore 100%
Duely.Domain.Models.CodeRun 100%
Duely.Domain.Models.Duels.Duel 100%
Duely.Domain.Models.Duels.DuelConfiguration 100%
Duely.Domain.Models.Duels.DuelTask 100%
Duely.Domain.Models.Duels.DuelTaskConfiguration 100%
Duely.Domain.Models.Duels.DuelTaskSolution 100%
Duely.Domain.Models.Duels.Pending.FriendlyPendingDuel 100%
Duely.Domain.Models.Duels.Pending.GroupPendingDuel 100%
Duely.Domain.Models.Duels.Pending.PendingDuel 100%
Duely.Domain.Models.Duels.Pending.RankedPendingDuel 100%
Duely.Domain.Models.Duels.Pending.TournamentPendingDuel 100%
Duely.Domain.Models.Groups.Group 100%
Duely.Domain.Models.Groups.GroupDuel 100%
Duely.Domain.Models.Groups.GroupMembership 100%
Duely.Domain.Models.Messages.CodeRunStatusUpdatedMessage 100%
Duely.Domain.Models.Messages.DuelChangedMessage 100%
Duely.Domain.Models.Messages.DuelFinishedMessage 100%
Duely.Domain.Models.Messages.DuelInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.DuelInvitationDeniedMessage 100%
Duely.Domain.Models.Messages.DuelInvitationMessage 100%
Duely.Domain.Models.Messages.DuelStartedMessage 100%
Duely.Domain.Models.Messages.GroupDuelInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.GroupDuelInvitationMessage 100%
Duely.Domain.Models.Messages.GroupInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.GroupInvitationMessage 100%
Duely.Domain.Models.Messages.OpponentSolutionUpdatedMessage 100%
Duely.Domain.Models.Messages.SubmissionStatusUpdatedMessage 100%
Duely.Domain.Models.Messages.TournamentDuelInvitationMessage 100%
Duely.Domain.Models.Outbox.OutboxMessage 71.4%
Duely.Domain.Models.Outbox.Payloads.RunCodePayload 100%
Duely.Domain.Models.Outbox.Payloads.SendMessagePayload 100%
Duely.Domain.Models.Outbox.Payloads.TestSolutionPayload 100%
Duely.Domain.Models.Submission 100%
Duely.Domain.Models.Tournaments.GroupStageTournament 100%
Duely.Domain.Models.Tournaments.SingleEliminationBracketNode 100%
Duely.Domain.Models.Tournaments.SingleEliminationBracketTournament 100%
Duely.Domain.Models.Tournaments.Tournament 100%
Duely.Domain.Models.Tournaments.TournamentParticipant 100%
Duely.Domain.Models.User 100%
Duely.Domain.Models.UserActions.ChooseLanguageUserAction 50%
Duely.Domain.Models.UserActions.CutCodeUserAction 0%
Duely.Domain.Models.UserActions.DeleteCodeUserAction 0%
Duely.Domain.Models.UserActions.MoveCursorUserAction 75%
Duely.Domain.Models.UserActions.PasteCodeUserAction 0%
Duely.Domain.Models.UserActions.RunCustomTestUserAction 0%
Duely.Domain.Models.UserActions.RunSampleTestUserAction 0%
Duely.Domain.Models.UserActions.SubmitSolutionUserAction 0%
Duely.Domain.Models.UserActions.UserAction 85.7%
Duely.Domain.Models.UserActions.WriteCodeUserAction 66.6%
Duely.Domain.Services - 91.8%
Name Line Branch
Duely.Domain.Services 91.8% 82.9%
Duely.Domain.Services.Duels.DuelManager 89.3% 86.8%
Duely.Domain.Services.Duels.DuelOptions 100%
Duely.Domain.Services.Duels.DuelPair 100%
Duely.Domain.Services.Duels.RatingManager 96.3% 86.3%
Duely.Domain.Services.Duels.RatingToTaskLevelMappingItem 100%
Duely.Domain.Services.Duels.TaskService 84.5% 86.7%
Duely.Domain.Services.Groups.GroupPermissionsService 97.1% 82.6%
Duely.Domain.Services.Tournaments.GroupStageMatchmakingStrategy 95.1% 80%
Duely.Domain.Services.Tournaments.SingleEliminationBracketMatchmakingStrate
gy
93.6% 77.4%
Duely.Domain.Services.Tournaments.TournamentMatchmakingStrategyResolver 100%
Duely.Domain.Services.Tournaments.TournamentPendingDuelCandidate 100%
Duely.Domain.Services.Users.JwtTokenOptions 100%
Duely.Domain.Services.Users.TokenService 100%

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5291939d65

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

{
var query = new GetUsersQuery
{
UserIds = webSocketConnectionManager.GetConnectedUserIds()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Make the active-user listing global across instances

When Duely runs more than one application instance, this returns only users connected to the instance serving the request because IWebSocketConnectionManager is a process-local singleton; users whose sockets terminate on another instance are omitted from /users/admin/active. The existing connection-lifecycle documentation explicitly states that no distributed presence exists, so this endpoint needs distributed aggregation or an explicitly local contract with corresponding process documentation and tests before it can reliably represent active users.

AGENTS.md reference: AGENTS.md:L39-L40

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 7d1ceed. The active-user API is now explicitly process-local: the manager method is named GetLocallyConnectedUserIds, the current single-container production topology and multi-instance limitation are documented, and a test proves separate manager instances keep isolated presence snapshots. Verification: full Duely suite passed, 444/444 tests.

@DIvanCode
DIvanCode marked this pull request as draft August 9, 2026 15:42
@DIvanCode
DIvanCode force-pushed the codex/issue-331-admin-queries branch from 5291939 to 7d1ceed Compare August 9, 2026 15:58
@DIvanCode
DIvanCode marked this pull request as ready for review August 9, 2026 16:05
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown

Summary

Summary
Generated on: 08/09/2026 - 16:06:42
Coverage date: 08/09/2026 - 16:06:04 - 08/09/2026 - 16:06:39
Parser: MultiReport (3x Cobertura)
Assemblies: 4
Classes: 251
Files: 169
Line coverage: 92.2% (4053 of 4394)
Covered lines: 4053
Uncovered lines: 341
Coverable lines: 4394
Total lines: 8937
Branch coverage: 84.8% (844 of 995)
Covered branches: 844
Total branches: 995
Method coverage: Feature is only available for sponsors
Tag: 149_31322861070

Coverage

Duely.Application.Services - 88.3%
Name Line Branch
Duely.Application.Services 88.3% 100%
Duely.Application.Services.Errors.AuthenticationError 100%
Duely.Application.Services.Errors.EntityAlreadyExistsError 33.3%
Duely.Application.Services.Errors.EntityNotFoundError 33.3%
Duely.Application.Services.Errors.ForbiddenError 66.6%
Duely.Application.Services.Errors.RateLimitExceededError 100%
Duely.Application.Services.Outbox.ExecuteOutboxMessageCommand 100%
Duely.Application.Services.Outbox.ExecuteOutboxMessageHandler 100%
Duely.Application.Services.Outbox.Handlers.RunCodeOutboxHandler 100% 100%
Duely.Application.Services.Outbox.Handlers.SendMessageOutboxHandler 100%
Duely.Application.Services.Outbox.Handlers.TestSolutionHandler 100%
Duely.Application.Services.Outbox.Relay.OutboxDispatcher 100% 100%
Duely.Application.Services.RateLimiting.RateLimitingOptions 100%
Duely.Application.Services.RateLimiting.RunUserCodeLimiter 100%
Duely.Application.Services.RateLimiting.SubmissionRateLimiter 100%
Duely.Application.UseCases - 92.3%
Name Line Branch
Duely.Application.UseCases 92.3% 85.2%
Duely.Application.UseCases.Dtos.CodeRunDto 100%
Duely.Application.UseCases.Dtos.DuelConfigurationDto 100%
Duely.Application.UseCases.Dtos.DuelDto 100%
Duely.Application.UseCases.Dtos.DuelInvitationDto 100%
Duely.Application.UseCases.Dtos.DuelTaskConfigurationDto 100%
Duely.Application.UseCases.Dtos.DuelTaskDto 100%
Duely.Application.UseCases.Dtos.DuelTaskSolutionDto 100%
Duely.Application.UseCases.Dtos.GroupDto 100%
Duely.Application.UseCases.Dtos.GroupDuelDto 100%
Duely.Application.UseCases.Dtos.GroupDuelInvitationDto 100%
Duely.Application.UseCases.Dtos.GroupInvitationDto 100%
Duely.Application.UseCases.Dtos.GroupListItemDto 100%
Duely.Application.UseCases.Dtos.GroupStageDto 0%
Duely.Application.UseCases.Dtos.GroupStageDuelDto 0%
Duely.Application.UseCases.Dtos.GroupStageStandingDto 0%
Duely.Application.UseCases.Dtos.GroupUserDto 100%
Duely.Application.UseCases.Dtos.PendingDuelDto 100%
Duely.Application.UseCases.Dtos.RankedDuelSearcherDto 100%
Duely.Application.UseCases.Dtos.SingleEliminationBracketDto 100%
Duely.Application.UseCases.Dtos.SingleEliminationBracketNodeDto 100%
Duely.Application.UseCases.Dtos.SubmissionDto 100%
Duely.Application.UseCases.Dtos.SubmissionListItemDto 100%
Duely.Application.UseCases.Dtos.TicketDto 100%
Duely.Application.UseCases.Dtos.TokenDto 100%
Duely.Application.UseCases.Dtos.TournamentDetailsDto 66.6%
Duely.Application.UseCases.Dtos.TournamentDto 100%
Duely.Application.UseCases.Dtos.TournamentDuelInvitationDto 100%
Duely.Application.UseCases.Dtos.UserDto 100%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunCommand 100%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunCommandValidator 0% 0%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunHandler 100% 100%
Duely.Application.UseCases.Features.CodeRuns.GetCodeRunHandler 100% 100%
Duely.Application.UseCases.Features.CodeRuns.GetCodeRunQuery 100%
Duely.Application.UseCases.Features.CodeRuns.UpdateCodeRunCommand 100%
Duely.Application.UseCases.Features.CodeRuns.UpdateCodeRunHandler 98.1% 94.7%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionCommandValidator
96.7% 66.6%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.DeleteDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.DeleteDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.GetDuelConfiguration
Handler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.GetDuelConfiguration
Query
100%
Duely.Application.UseCases.Features.DuelConfigurations.GetUserDuelConfigura
tionsHandler
100%
Duely.Application.UseCases.Features.DuelConfigurations.GetUserDuelConfigura
tionsQuery
100%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionCommandValidator
96.7% 50%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.CancelPendingDuelsCommand 100%
Duely.Application.UseCases.Features.Duels.CancelPendingDuelsHandler 97.3% 80%
Duely.Application.UseCases.Features.Duels.CheckDuelsForAnticheatCommand 100%
Duely.Application.UseCases.Features.Duels.CheckDuelsForAnticheatHandler 89.7% 75%
Duely.Application.UseCases.Features.Duels.CheckDuelsForFinishHandler 100% 89.2%
Duely.Application.UseCases.Features.Duels.GetActiveDuelHandler 100% 100%
Duely.Application.UseCases.Features.Duels.GetActiveDuelQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelHandler 95% 77.2%
Duely.Application.UseCases.Features.Duels.GetDuelQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelsByStatusHandler 100%
Duely.Application.UseCases.Features.Duels.GetDuelsByStatusQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelsHistoryHandler 100% 100%
Duely.Application.UseCases.Features.Duels.GetDuelsHistoryQuery 100%
Duely.Application.UseCases.Features.Duels.GetGroupDuelsHandler 98.3% 75%
Duely.Application.UseCases.Features.Duels.GetGroupDuelsQuery 100%
Duely.Application.UseCases.Features.Duels.GetPendingDuelsHandler 100%
Duely.Application.UseCases.Features.Duels.GetRankedDuelSearchersHandler 100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptDuelInvitationH
andler
100% 92.8%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptGroupDuelInvita
tionHandler
100% 92.8%
Duely.Application.UseCases.Features.Duels.Invitations.CancelDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelDuelInvitationH
andler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelGroupDuelInvita
tionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateDuelInvitationH
andler
100% 91.6%
Duely.Application.UseCases.Features.Duels.Invitations.CreateGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateGroupDuelInvita
tionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.DenyDuelInvitationCom
mand
100%
Duely.Application.UseCases.Features.Duels.Invitations.DenyDuelInvitationHan
dler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingDuelInvita
tionsHandler
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingDuelInvita
tionsQuery
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingGroupDuelI
nvitationsHandler
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingGroupDuelI
nvitationsQuery
100%
Duely.Application.UseCases.Features.Duels.Search.AddInactiveBotsToRankedSea
rchHandler
0% 0%
Duely.Application.UseCases.Features.Duels.Search.StartDuelSearchCommand 100%
Duely.Application.UseCases.Features.Duels.Search.StartDuelSearchHandler 100% 83.3%
Duely.Application.UseCases.Features.Duels.TryCreateDuelHandler 94.6% 90.9%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionCommand 100%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionCommandVali
dator
0%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionHandler 83.6% 85.7%
Duely.Application.UseCases.Features.Groups.AcceptInviteCommand 100%
Duely.Application.UseCases.Features.Groups.AcceptInviteHandler 100% 100%
Duely.Application.UseCases.Features.Groups.CancelInviteCommand 100%
Duely.Application.UseCases.Features.Groups.CancelInviteHandler 96.6% 75%
Duely.Application.UseCases.Features.Groups.ChangeRoleCommand 100%
Duely.Application.UseCases.Features.Groups.ChangeRoleHandler 90.4% 78.5%
Duely.Application.UseCases.Features.Groups.CreateGroupCommand 100%
Duely.Application.UseCases.Features.Groups.CreateGroupCommandValidator 0%
Duely.Application.UseCases.Features.Groups.CreateGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.DenyInviteCommand 100%
Duely.Application.UseCases.Features.Groups.DenyInviteHandler 100% 100%
Duely.Application.UseCases.Features.Groups.ExcludeUserCommand 100%
Duely.Application.UseCases.Features.Groups.ExcludeUserHandler 88.8% 75%
Duely.Application.UseCases.Features.Groups.GetAllGroupsHandler 100%
Duely.Application.UseCases.Features.Groups.GetGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.GetGroupInvitationsHandler 100%
Duely.Application.UseCases.Features.Groups.GetGroupInvitationsQuery 100%
Duely.Application.UseCases.Features.Groups.GetGroupQuery 100%
Duely.Application.UseCases.Features.Groups.GetGroupUsersHandler 97.6% 91.6%
Duely.Application.UseCases.Features.Groups.GetGroupUsersQuery 100%
Duely.Application.UseCases.Features.Groups.GetUserGroupsHandler 100%
Duely.Application.UseCases.Features.Groups.GetUserGroupsQuery 100%
Duely.Application.UseCases.Features.Groups.InviteUserCommand 100%
Duely.Application.UseCases.Features.Groups.InviteUserHandler 95.9% 83.3%
Duely.Application.UseCases.Features.Groups.LeaveGroupCommand 100%
Duely.Application.UseCases.Features.Groups.LeaveGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.UpdateGroupCommand 100%
Duely.Application.UseCases.Features.Groups.UpdateGroupCommandValidator 0%
Duely.Application.UseCases.Features.Groups.UpdateGroupHandler 100% 100%
Duely.Application.UseCases.Features.Submissions.GetAllSubmissionsHandler 100% 100%
Duely.Application.UseCases.Features.Submissions.GetAllSubmissionsQuery 100%
Duely.Application.UseCases.Features.Submissions.GetSubmissionHandler 95.2% 87.5%
Duely.Application.UseCases.Features.Submissions.GetSubmissionQuery 100%
Duely.Application.UseCases.Features.Submissions.GetUserSubmissionsHandler 100% 92.8%
Duely.Application.UseCases.Features.Submissions.GetUserSubmissionsQuery 100%
Duely.Application.UseCases.Features.Submissions.SendSubmissionCommand 83.3%
Duely.Application.UseCases.Features.Submissions.SendSubmissionHandler 92.8% 56.2%
Duely.Application.UseCases.Features.Submissions.UpdateSubmissionStatusComma
nd
100%
Duely.Application.UseCases.Features.Submissions.UpdateSubmissionStatusHandl
er
96% 80%
Duely.Application.UseCases.Features.Tournaments.AcceptTournamentDuelCommand 100%
Duely.Application.UseCases.Features.Tournaments.AcceptTournamentDuelHandler 100% 92.8%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentCommand 100%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentCommandVali
dator
100%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentHandler 87.8% 81.2%
Duely.Application.UseCases.Features.Tournaments.GetGroupTournamentsHandler 96.2% 90%
Duely.Application.UseCases.Features.Tournaments.GetGroupTournamentsQuery 100%
Duely.Application.UseCases.Features.Tournaments.GetIncomingTournamentDuelIn
vitationsHandler
100%
Duely.Application.UseCases.Features.Tournaments.GetIncomingTournamentDuelIn
vitationsQuery
100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentHandler 94.2% 62.5%
Duely.Application.UseCases.Features.Tournaments.GetTournamentQuery 100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentsByStateHandle
r
100% 100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentsByStateQuery 100%
Duely.Application.UseCases.Features.Tournaments.StartTournamentCommand 100%
Duely.Application.UseCases.Features.Tournaments.StartTournamentHandler 95% 87.5%
Duely.Application.UseCases.Features.Tournaments.SyncActiveTournamentsHandle
r
99.3% 83.3%
Duely.Application.UseCases.Features.UserActions.GetUserActionsHandler 100%
Duely.Application.UseCases.Features.UserActions.GetUserActionsQuery 75%
Duely.Application.UseCases.Features.UserActions.GetUserActionsQueryValidato
r
0%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsCommand 66.6%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsCommandValid
ator
0%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsHandler 100% 100%
Duely.Application.UseCases.Features.UserActions.UserActionValidator 0%
Duely.Application.UseCases.Features.Users.CreateTicketCommand 100%
Duely.Application.UseCases.Features.Users.CreateTicketHandler 94.7% 66.6%
Duely.Application.UseCases.Features.Users.GetByNicknameHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUserByNicknameQuery 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketCommand 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketCommandValidator 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUserQuery 100%
Duely.Application.UseCases.Features.Users.GetUsersHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUsersQuery 100%
Duely.Application.UseCases.Features.Users.LoginCommand 100%
Duely.Application.UseCases.Features.Users.LoginHandler 100% 100%
Duely.Application.UseCases.Features.Users.RefreshTokenCommand 100%
Duely.Application.UseCases.Features.Users.RefreshTokenHandler 100% 100%
Duely.Application.UseCases.Features.Users.RegisterCommand 100%
Duely.Application.UseCases.Features.Users.RegisterCommandValidator 100%
Duely.Application.UseCases.Features.Users.RegisterHandler 100% 100%
Duely.Application.UseCases.Helpers.DuelDtoMapper 96% 87.5%
Duely.Application.UseCases.Helpers.GroupStageTournamentDetailsMapper 0% 0%
Duely.Application.UseCases.Helpers.SingleEliminationBracketTournamentDetail
sMapper
100% 100%
Duely.Application.UseCases.Helpers.TournamentDetailsMapperResolver 100%
Duely.Application.UseCases.Helpers.TournamentDtoMapper 100% 100%
Duely.Domain.Models - 89%
Name Line Branch
Duely.Domain.Models 89% ****
Duely.Domain.Models.AnticheatScore 100%
Duely.Domain.Models.CodeRun 100%
Duely.Domain.Models.Duels.Duel 100%
Duely.Domain.Models.Duels.DuelConfiguration 100%
Duely.Domain.Models.Duels.DuelTask 100%
Duely.Domain.Models.Duels.DuelTaskConfiguration 100%
Duely.Domain.Models.Duels.DuelTaskSolution 100%
Duely.Domain.Models.Duels.Pending.FriendlyPendingDuel 100%
Duely.Domain.Models.Duels.Pending.GroupPendingDuel 100%
Duely.Domain.Models.Duels.Pending.PendingDuel 100%
Duely.Domain.Models.Duels.Pending.RankedPendingDuel 100%
Duely.Domain.Models.Duels.Pending.TournamentPendingDuel 100%
Duely.Domain.Models.Groups.Group 100%
Duely.Domain.Models.Groups.GroupDuel 100%
Duely.Domain.Models.Groups.GroupMembership 100%
Duely.Domain.Models.Messages.CodeRunStatusUpdatedMessage 100%
Duely.Domain.Models.Messages.DuelChangedMessage 100%
Duely.Domain.Models.Messages.DuelFinishedMessage 100%
Duely.Domain.Models.Messages.DuelInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.DuelInvitationDeniedMessage 100%
Duely.Domain.Models.Messages.DuelInvitationMessage 100%
Duely.Domain.Models.Messages.DuelStartedMessage 100%
Duely.Domain.Models.Messages.GroupDuelInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.GroupDuelInvitationMessage 100%
Duely.Domain.Models.Messages.GroupInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.GroupInvitationMessage 100%
Duely.Domain.Models.Messages.OpponentSolutionUpdatedMessage 100%
Duely.Domain.Models.Messages.SubmissionStatusUpdatedMessage 100%
Duely.Domain.Models.Messages.TournamentDuelInvitationMessage 100%
Duely.Domain.Models.Outbox.OutboxMessage 71.4%
Duely.Domain.Models.Outbox.Payloads.RunCodePayload 100%
Duely.Domain.Models.Outbox.Payloads.SendMessagePayload 100%
Duely.Domain.Models.Outbox.Payloads.TestSolutionPayload 100%
Duely.Domain.Models.Submission 100%
Duely.Domain.Models.Tournaments.GroupStageTournament 100%
Duely.Domain.Models.Tournaments.SingleEliminationBracketNode 100%
Duely.Domain.Models.Tournaments.SingleEliminationBracketTournament 100%
Duely.Domain.Models.Tournaments.Tournament 100%
Duely.Domain.Models.Tournaments.TournamentParticipant 100%
Duely.Domain.Models.User 100%
Duely.Domain.Models.UserActions.ChooseLanguageUserAction 50%
Duely.Domain.Models.UserActions.CutCodeUserAction 0%
Duely.Domain.Models.UserActions.DeleteCodeUserAction 0%
Duely.Domain.Models.UserActions.MoveCursorUserAction 75%
Duely.Domain.Models.UserActions.PasteCodeUserAction 0%
Duely.Domain.Models.UserActions.RunCustomTestUserAction 0%
Duely.Domain.Models.UserActions.RunSampleTestUserAction 0%
Duely.Domain.Models.UserActions.SubmitSolutionUserAction 0%
Duely.Domain.Models.UserActions.UserAction 85.7%
Duely.Domain.Models.UserActions.WriteCodeUserAction 66.6%
Duely.Domain.Services - 93.1%
Name Line Branch
Duely.Domain.Services 93.1% 83.5%
Duely.Domain.Services.Duels.DuelManager 95.9% 91.3%
Duely.Domain.Services.Duels.DuelOptions 100%
Duely.Domain.Services.Duels.DuelPair 100%
Duely.Domain.Services.Duels.RatingManager 96.3% 86.3%
Duely.Domain.Services.Duels.RatingToTaskLevelMappingItem 100%
Duely.Domain.Services.Duels.TaskService 84.5% 86.7%
Duely.Domain.Services.Groups.GroupPermissionsService 97.1% 82.6%
Duely.Domain.Services.Tournaments.GroupStageMatchmakingStrategy 95.1% 80%
Duely.Domain.Services.Tournaments.SingleEliminationBracketMatchmakingStrate
gy
93.6% 77.4%
Duely.Domain.Services.Tournaments.TournamentMatchmakingStrategyResolver 100%
Duely.Domain.Services.Tournaments.TournamentPendingDuelCandidate 100%
Duely.Domain.Services.Users.JwtTokenOptions 100%
Duely.Domain.Services.Users.TokenService 100%

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7d1ceed961

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +30 to +34
.Select(submission => new SubmissionListItemDto
{
SubmissionId = submission.Id,
Status = submission.Status,
Language = submission.Language,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include the duel identifier in global submission rows

When an administrator selects a row returned by either new global submissions endpoint, the response contains only the globally unique submission ID and no duel ID, while the only details route is GET /duels/{duelId}/submissions/{submissionId}. The existing DTO worked for the scoped list because the caller already supplied the duel and task, but these global results cannot be linked back to their duel through any returned data, so the client cannot open the newly enabled full submission view without guessing IDs; include at least duel_id (and preferably task_key for context) in this projection.

Useful? React with 👍 / 👎.

@DIvanCode
DIvanCode marked this pull request as draft August 9, 2026 16:18
@DIvanCode
DIvanCode marked this pull request as ready for review August 9, 2026 16:21
@DIvanCode
DIvanCode marked this pull request as draft August 9, 2026 16:27
@DIvanCode
DIvanCode marked this pull request as ready for review August 9, 2026 16:31
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown

Summary

Summary
Generated on: 08/09/2026 - 16:32:41
Coverage date: 08/09/2026 - 16:31:55 - 08/09/2026 - 16:32:39
Parser: MultiReport (3x Cobertura)
Assemblies: 4
Classes: 252
Files: 169
Line coverage: 92.2% (4058 of 4399)
Covered lines: 4058
Uncovered lines: 341
Coverable lines: 4399
Total lines: 8949
Branch coverage: 84.8% (848 of 999)
Covered branches: 848
Total branches: 999
Method coverage: Feature is only available for sponsors
Tag: 153_31324000804

Coverage

Duely.Application.Services - 88.3%
Name Line Branch
Duely.Application.Services 88.3% 100%
Duely.Application.Services.Errors.AuthenticationError 100%
Duely.Application.Services.Errors.EntityAlreadyExistsError 33.3%
Duely.Application.Services.Errors.EntityNotFoundError 33.3%
Duely.Application.Services.Errors.ForbiddenError 66.6%
Duely.Application.Services.Errors.RateLimitExceededError 100%
Duely.Application.Services.Outbox.ExecuteOutboxMessageCommand 100%
Duely.Application.Services.Outbox.ExecuteOutboxMessageHandler 100%
Duely.Application.Services.Outbox.Handlers.RunCodeOutboxHandler 100% 100%
Duely.Application.Services.Outbox.Handlers.SendMessageOutboxHandler 100%
Duely.Application.Services.Outbox.Handlers.TestSolutionHandler 100%
Duely.Application.Services.Outbox.Relay.OutboxDispatcher 100% 100%
Duely.Application.Services.RateLimiting.RateLimitingOptions 100%
Duely.Application.Services.RateLimiting.RunUserCodeLimiter 100%
Duely.Application.Services.RateLimiting.SubmissionRateLimiter 100%
Duely.Application.UseCases - 92.4%
Name Line Branch
Duely.Application.UseCases 92.4% 85.3%
Duely.Application.UseCases.Dtos.AdminSubmissionListItemDto 100%
Duely.Application.UseCases.Dtos.CodeRunDto 100%
Duely.Application.UseCases.Dtos.DuelConfigurationDto 100%
Duely.Application.UseCases.Dtos.DuelDto 100%
Duely.Application.UseCases.Dtos.DuelInvitationDto 100%
Duely.Application.UseCases.Dtos.DuelTaskConfigurationDto 100%
Duely.Application.UseCases.Dtos.DuelTaskDto 100%
Duely.Application.UseCases.Dtos.DuelTaskSolutionDto 100%
Duely.Application.UseCases.Dtos.GroupDto 100%
Duely.Application.UseCases.Dtos.GroupDuelDto 100%
Duely.Application.UseCases.Dtos.GroupDuelInvitationDto 100%
Duely.Application.UseCases.Dtos.GroupInvitationDto 100%
Duely.Application.UseCases.Dtos.GroupListItemDto 100%
Duely.Application.UseCases.Dtos.GroupStageDto 0%
Duely.Application.UseCases.Dtos.GroupStageDuelDto 0%
Duely.Application.UseCases.Dtos.GroupStageStandingDto 0%
Duely.Application.UseCases.Dtos.GroupUserDto 100%
Duely.Application.UseCases.Dtos.PendingDuelDto 100%
Duely.Application.UseCases.Dtos.RankedDuelSearcherDto 100%
Duely.Application.UseCases.Dtos.SingleEliminationBracketDto 100%
Duely.Application.UseCases.Dtos.SingleEliminationBracketNodeDto 100%
Duely.Application.UseCases.Dtos.SubmissionDto 100%
Duely.Application.UseCases.Dtos.SubmissionListItemDto 100%
Duely.Application.UseCases.Dtos.TicketDto 100%
Duely.Application.UseCases.Dtos.TokenDto 100%
Duely.Application.UseCases.Dtos.TournamentDetailsDto 66.6%
Duely.Application.UseCases.Dtos.TournamentDto 100%
Duely.Application.UseCases.Dtos.TournamentDuelInvitationDto 100%
Duely.Application.UseCases.Dtos.UserDto 100%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunCommand 100%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunCommandValidator 0% 0%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunHandler 100% 100%
Duely.Application.UseCases.Features.CodeRuns.GetCodeRunHandler 100% 100%
Duely.Application.UseCases.Features.CodeRuns.GetCodeRunQuery 100%
Duely.Application.UseCases.Features.CodeRuns.UpdateCodeRunCommand 100%
Duely.Application.UseCases.Features.CodeRuns.UpdateCodeRunHandler 98.1% 94.7%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionCommandValidator
96.7% 66.6%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.DeleteDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.DeleteDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.GetDuelConfiguration
Handler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.GetDuelConfiguration
Query
100%
Duely.Application.UseCases.Features.DuelConfigurations.GetUserDuelConfigura
tionsHandler
100%
Duely.Application.UseCases.Features.DuelConfigurations.GetUserDuelConfigura
tionsQuery
100%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionCommandValidator
96.7% 50%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.CancelPendingDuelsCommand 100%
Duely.Application.UseCases.Features.Duels.CancelPendingDuelsHandler 97.3% 80%
Duely.Application.UseCases.Features.Duels.CheckDuelsForAnticheatCommand 100%
Duely.Application.UseCases.Features.Duels.CheckDuelsForAnticheatHandler 89.7% 75%
Duely.Application.UseCases.Features.Duels.CheckDuelsForFinishHandler 100% 89.2%
Duely.Application.UseCases.Features.Duels.GetActiveDuelHandler 100% 100%
Duely.Application.UseCases.Features.Duels.GetActiveDuelQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelHandler 95% 77.2%
Duely.Application.UseCases.Features.Duels.GetDuelQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelsByStatusHandler 100%
Duely.Application.UseCases.Features.Duels.GetDuelsByStatusQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelsHistoryHandler 100% 100%
Duely.Application.UseCases.Features.Duels.GetDuelsHistoryQuery 100%
Duely.Application.UseCases.Features.Duels.GetGroupDuelsHandler 98.3% 75%
Duely.Application.UseCases.Features.Duels.GetGroupDuelsQuery 100%
Duely.Application.UseCases.Features.Duels.GetPendingDuelsHandler 100%
Duely.Application.UseCases.Features.Duels.GetRankedDuelSearchersHandler 100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptDuelInvitationH
andler
100% 92.8%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptGroupDuelInvita
tionHandler
100% 92.8%
Duely.Application.UseCases.Features.Duels.Invitations.CancelDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelDuelInvitationH
andler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelGroupDuelInvita
tionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateDuelInvitationH
andler
100% 91.6%
Duely.Application.UseCases.Features.Duels.Invitations.CreateGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateGroupDuelInvita
tionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.DenyDuelInvitationCom
mand
100%
Duely.Application.UseCases.Features.Duels.Invitations.DenyDuelInvitationHan
dler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingDuelInvita
tionsHandler
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingDuelInvita
tionsQuery
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingGroupDuelI
nvitationsHandler
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingGroupDuelI
nvitationsQuery
100%
Duely.Application.UseCases.Features.Duels.Search.AddInactiveBotsToRankedSea
rchHandler
0% 0%
Duely.Application.UseCases.Features.Duels.Search.StartDuelSearchCommand 100%
Duely.Application.UseCases.Features.Duels.Search.StartDuelSearchHandler 100% 83.3%
Duely.Application.UseCases.Features.Duels.TryCreateDuelHandler 94.6% 90.9%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionCommand 100%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionCommandVali
dator
0%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionHandler 83.6% 85.7%
Duely.Application.UseCases.Features.Groups.AcceptInviteCommand 100%
Duely.Application.UseCases.Features.Groups.AcceptInviteHandler 100% 100%
Duely.Application.UseCases.Features.Groups.CancelInviteCommand 100%
Duely.Application.UseCases.Features.Groups.CancelInviteHandler 96.6% 75%
Duely.Application.UseCases.Features.Groups.ChangeRoleCommand 100%
Duely.Application.UseCases.Features.Groups.ChangeRoleHandler 90.4% 78.5%
Duely.Application.UseCases.Features.Groups.CreateGroupCommand 100%
Duely.Application.UseCases.Features.Groups.CreateGroupCommandValidator 0%
Duely.Application.UseCases.Features.Groups.CreateGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.DenyInviteCommand 100%
Duely.Application.UseCases.Features.Groups.DenyInviteHandler 100% 100%
Duely.Application.UseCases.Features.Groups.ExcludeUserCommand 100%
Duely.Application.UseCases.Features.Groups.ExcludeUserHandler 88.8% 75%
Duely.Application.UseCases.Features.Groups.GetAllGroupsHandler 100%
Duely.Application.UseCases.Features.Groups.GetGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.GetGroupInvitationsHandler 100%
Duely.Application.UseCases.Features.Groups.GetGroupInvitationsQuery 100%
Duely.Application.UseCases.Features.Groups.GetGroupQuery 100%
Duely.Application.UseCases.Features.Groups.GetGroupUsersHandler 97.6% 91.6%
Duely.Application.UseCases.Features.Groups.GetGroupUsersQuery 100%
Duely.Application.UseCases.Features.Groups.GetUserGroupsHandler 100%
Duely.Application.UseCases.Features.Groups.GetUserGroupsQuery 100%
Duely.Application.UseCases.Features.Groups.InviteUserCommand 100%
Duely.Application.UseCases.Features.Groups.InviteUserHandler 95.9% 83.3%
Duely.Application.UseCases.Features.Groups.LeaveGroupCommand 100%
Duely.Application.UseCases.Features.Groups.LeaveGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.UpdateGroupCommand 100%
Duely.Application.UseCases.Features.Groups.UpdateGroupCommandValidator 0%
Duely.Application.UseCases.Features.Groups.UpdateGroupHandler 100% 100%
Duely.Application.UseCases.Features.Submissions.GetAllSubmissionsHandler 100% 100%
Duely.Application.UseCases.Features.Submissions.GetAllSubmissionsQuery 100%
Duely.Application.UseCases.Features.Submissions.GetSubmissionHandler 95.2% 87.5%
Duely.Application.UseCases.Features.Submissions.GetSubmissionQuery 100%
Duely.Application.UseCases.Features.Submissions.GetUserSubmissionsHandler 100% 94.4%
Duely.Application.UseCases.Features.Submissions.GetUserSubmissionsQuery 100%
Duely.Application.UseCases.Features.Submissions.SendSubmissionCommand 83.3%
Duely.Application.UseCases.Features.Submissions.SendSubmissionHandler 92.8% 56.2%
Duely.Application.UseCases.Features.Submissions.UpdateSubmissionStatusComma
nd
100%
Duely.Application.UseCases.Features.Submissions.UpdateSubmissionStatusHandl
er
96% 80%
Duely.Application.UseCases.Features.Tournaments.AcceptTournamentDuelCommand 100%
Duely.Application.UseCases.Features.Tournaments.AcceptTournamentDuelHandler 100% 92.8%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentCommand 100%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentCommandVali
dator
100%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentHandler 87.8% 81.2%
Duely.Application.UseCases.Features.Tournaments.GetGroupTournamentsHandler 96.2% 90%
Duely.Application.UseCases.Features.Tournaments.GetGroupTournamentsQuery 100%
Duely.Application.UseCases.Features.Tournaments.GetIncomingTournamentDuelIn
vitationsHandler
100%
Duely.Application.UseCases.Features.Tournaments.GetIncomingTournamentDuelIn
vitationsQuery
100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentHandler 94.2% 62.5%
Duely.Application.UseCases.Features.Tournaments.GetTournamentQuery 100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentsByStateHandle
r
100% 100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentsByStateQuery 100%
Duely.Application.UseCases.Features.Tournaments.StartTournamentCommand 100%
Duely.Application.UseCases.Features.Tournaments.StartTournamentHandler 95% 87.5%
Duely.Application.UseCases.Features.Tournaments.SyncActiveTournamentsHandle
r
99.3% 83.3%
Duely.Application.UseCases.Features.UserActions.GetUserActionsHandler 100%
Duely.Application.UseCases.Features.UserActions.GetUserActionsQuery 75%
Duely.Application.UseCases.Features.UserActions.GetUserActionsQueryValidato
r
0%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsCommand 66.6%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsCommandValid
ator
0%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsHandler 100% 100%
Duely.Application.UseCases.Features.UserActions.UserActionValidator 0%
Duely.Application.UseCases.Features.Users.CreateTicketCommand 100%
Duely.Application.UseCases.Features.Users.CreateTicketHandler 94.7% 66.6%
Duely.Application.UseCases.Features.Users.GetByNicknameHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUserByNicknameQuery 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketCommand 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketCommandValidator 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUserQuery 100%
Duely.Application.UseCases.Features.Users.GetUsersHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUsersQuery 100%
Duely.Application.UseCases.Features.Users.LoginCommand 100%
Duely.Application.UseCases.Features.Users.LoginHandler 100% 100%
Duely.Application.UseCases.Features.Users.RefreshTokenCommand 100%
Duely.Application.UseCases.Features.Users.RefreshTokenHandler 100% 100%
Duely.Application.UseCases.Features.Users.RegisterCommand 100%
Duely.Application.UseCases.Features.Users.RegisterCommandValidator 100%
Duely.Application.UseCases.Features.Users.RegisterHandler 100% 100%
Duely.Application.UseCases.Helpers.DuelDtoMapper 96% 87.5%
Duely.Application.UseCases.Helpers.GroupStageTournamentDetailsMapper 0% 0%
Duely.Application.UseCases.Helpers.SingleEliminationBracketTournamentDetail
sMapper
100% 100%
Duely.Application.UseCases.Helpers.TournamentDetailsMapperResolver 100%
Duely.Application.UseCases.Helpers.TournamentDtoMapper 100% 100%
Duely.Domain.Models - 89%
Name Line Branch
Duely.Domain.Models 89% ****
Duely.Domain.Models.AnticheatScore 100%
Duely.Domain.Models.CodeRun 100%
Duely.Domain.Models.Duels.Duel 100%
Duely.Domain.Models.Duels.DuelConfiguration 100%
Duely.Domain.Models.Duels.DuelTask 100%
Duely.Domain.Models.Duels.DuelTaskConfiguration 100%
Duely.Domain.Models.Duels.DuelTaskSolution 100%
Duely.Domain.Models.Duels.Pending.FriendlyPendingDuel 100%
Duely.Domain.Models.Duels.Pending.GroupPendingDuel 100%
Duely.Domain.Models.Duels.Pending.PendingDuel 100%
Duely.Domain.Models.Duels.Pending.RankedPendingDuel 100%
Duely.Domain.Models.Duels.Pending.TournamentPendingDuel 100%
Duely.Domain.Models.Groups.Group 100%
Duely.Domain.Models.Groups.GroupDuel 100%
Duely.Domain.Models.Groups.GroupMembership 100%
Duely.Domain.Models.Messages.CodeRunStatusUpdatedMessage 100%
Duely.Domain.Models.Messages.DuelChangedMessage 100%
Duely.Domain.Models.Messages.DuelFinishedMessage 100%
Duely.Domain.Models.Messages.DuelInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.DuelInvitationDeniedMessage 100%
Duely.Domain.Models.Messages.DuelInvitationMessage 100%
Duely.Domain.Models.Messages.DuelStartedMessage 100%
Duely.Domain.Models.Messages.GroupDuelInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.GroupDuelInvitationMessage 100%
Duely.Domain.Models.Messages.GroupInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.GroupInvitationMessage 100%
Duely.Domain.Models.Messages.OpponentSolutionUpdatedMessage 100%
Duely.Domain.Models.Messages.SubmissionStatusUpdatedMessage 100%
Duely.Domain.Models.Messages.TournamentDuelInvitationMessage 100%
Duely.Domain.Models.Outbox.OutboxMessage 71.4%
Duely.Domain.Models.Outbox.Payloads.RunCodePayload 100%
Duely.Domain.Models.Outbox.Payloads.SendMessagePayload 100%
Duely.Domain.Models.Outbox.Payloads.TestSolutionPayload 100%
Duely.Domain.Models.Submission 100%
Duely.Domain.Models.Tournaments.GroupStageTournament 100%
Duely.Domain.Models.Tournaments.SingleEliminationBracketNode 100%
Duely.Domain.Models.Tournaments.SingleEliminationBracketTournament 100%
Duely.Domain.Models.Tournaments.Tournament 100%
Duely.Domain.Models.Tournaments.TournamentParticipant 100%
Duely.Domain.Models.User 100%
Duely.Domain.Models.UserActions.ChooseLanguageUserAction 50%
Duely.Domain.Models.UserActions.CutCodeUserAction 0%
Duely.Domain.Models.UserActions.DeleteCodeUserAction 0%
Duely.Domain.Models.UserActions.MoveCursorUserAction 75%
Duely.Domain.Models.UserActions.PasteCodeUserAction 0%
Duely.Domain.Models.UserActions.RunCustomTestUserAction 0%
Duely.Domain.Models.UserActions.RunSampleTestUserAction 0%
Duely.Domain.Models.UserActions.SubmitSolutionUserAction 0%
Duely.Domain.Models.UserActions.UserAction 85.7%
Duely.Domain.Models.UserActions.WriteCodeUserAction 66.6%
Duely.Domain.Services - 93.1%
Name Line Branch
Duely.Domain.Services 93.1% 83.5%
Duely.Domain.Services.Duels.DuelManager 95.9% 91.3%
Duely.Domain.Services.Duels.DuelOptions 100%
Duely.Domain.Services.Duels.DuelPair 100%
Duely.Domain.Services.Duels.RatingManager 96.3% 86.3%
Duely.Domain.Services.Duels.RatingToTaskLevelMappingItem 100%
Duely.Domain.Services.Duels.TaskService 84.5% 86.7%
Duely.Domain.Services.Groups.GroupPermissionsService 97.1% 82.6%
Duely.Domain.Services.Tournaments.GroupStageMatchmakingStrategy 95.1% 80%
Duely.Domain.Services.Tournaments.SingleEliminationBracketMatchmakingStrate
gy
93.6% 77.4%
Duely.Domain.Services.Tournaments.TournamentMatchmakingStrategyResolver 100%
Duely.Domain.Services.Tournaments.TournamentPendingDuelCandidate 100%
Duely.Domain.Services.Users.JwtTokenOptions 100%
Duely.Domain.Services.Users.TokenService 100%

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 56f9f0c2a5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


[JsonPropertyName("user_role"), JsonConverter(typeof(JsonStringEnumConverter))]
public required GroupRole UserRole { get; init; }
public GroupRole? UserRole { get; init; }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Remove the enum converter from the nullable role

Changing UserRole to GroupRole? makes the property-level JsonStringEnumConverter incompatible with its declared type because that converter factory accepts enum types, not Nullable<T> wrappers. ASP.NET will therefore throw while constructing serialization metadata for any GroupDto, causing group endpoints to return 500 even when the role is non-null; remove the property-level converter and let the globally registered enum converter handle the underlying enum, or provide a nullable-aware converter.

Useful? React with 👍 / 👎.

Comment on lines +34 to +35
.Include(duel => duel.Submissions)
.ThenInclude(submission => submission.User)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Stop loading submissions for the global duel list

When /duels/admin/finished is called after submission history has accumulated, this include materializes every submission—including its potentially large solution and diagnostic message—for every returned duel. DuelDtoMapper.Map never reads duel.Submissions, so these payloads are transferred from PostgreSQL and retained in memory without appearing in the response; remove this include chain to prevent the global history request from becoming increasingly expensive.

Useful? React with 👍 / 👎.

@DIvanCode
DIvanCode marked this pull request as draft August 9, 2026 16:37
@DIvanCode
DIvanCode marked this pull request as ready for review August 9, 2026 16:44
@DIvanCode
DIvanCode merged commit d493779 into master Aug 9, 2026
8 checks passed
@DIvanCode
DIvanCode deleted the codex/issue-331-admin-queries branch August 9, 2026 16:44
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown

Summary

Summary
Generated on: 08/09/2026 - 16:45:22
Coverage date: 08/09/2026 - 16:44:59 - 08/09/2026 - 16:45:20
Parser: MultiReport (3x Cobertura)
Assemblies: 4
Classes: 252
Files: 169
Line coverage: 92.2% (4058 of 4399)
Covered lines: 4058
Uncovered lines: 341
Coverable lines: 4399
Total lines: 8949
Branch coverage: 84.8% (848 of 999)
Covered branches: 848
Total branches: 999
Method coverage: Feature is only available for sponsors
Tag: 154_31324574537

Coverage

Duely.Application.Services - 88.3%
Name Line Branch
Duely.Application.Services 88.3% 100%
Duely.Application.Services.Errors.AuthenticationError 100%
Duely.Application.Services.Errors.EntityAlreadyExistsError 33.3%
Duely.Application.Services.Errors.EntityNotFoundError 33.3%
Duely.Application.Services.Errors.ForbiddenError 66.6%
Duely.Application.Services.Errors.RateLimitExceededError 100%
Duely.Application.Services.Outbox.ExecuteOutboxMessageCommand 100%
Duely.Application.Services.Outbox.ExecuteOutboxMessageHandler 100%
Duely.Application.Services.Outbox.Handlers.RunCodeOutboxHandler 100% 100%
Duely.Application.Services.Outbox.Handlers.SendMessageOutboxHandler 100%
Duely.Application.Services.Outbox.Handlers.TestSolutionHandler 100%
Duely.Application.Services.Outbox.Relay.OutboxDispatcher 100% 100%
Duely.Application.Services.RateLimiting.RateLimitingOptions 100%
Duely.Application.Services.RateLimiting.RunUserCodeLimiter 100%
Duely.Application.Services.RateLimiting.SubmissionRateLimiter 100%
Duely.Application.UseCases - 92.4%
Name Line Branch
Duely.Application.UseCases 92.4% 85.3%
Duely.Application.UseCases.Dtos.AdminSubmissionListItemDto 100%
Duely.Application.UseCases.Dtos.CodeRunDto 100%
Duely.Application.UseCases.Dtos.DuelConfigurationDto 100%
Duely.Application.UseCases.Dtos.DuelDto 100%
Duely.Application.UseCases.Dtos.DuelInvitationDto 100%
Duely.Application.UseCases.Dtos.DuelTaskConfigurationDto 100%
Duely.Application.UseCases.Dtos.DuelTaskDto 100%
Duely.Application.UseCases.Dtos.DuelTaskSolutionDto 100%
Duely.Application.UseCases.Dtos.GroupDto 100%
Duely.Application.UseCases.Dtos.GroupDuelDto 100%
Duely.Application.UseCases.Dtos.GroupDuelInvitationDto 100%
Duely.Application.UseCases.Dtos.GroupInvitationDto 100%
Duely.Application.UseCases.Dtos.GroupListItemDto 100%
Duely.Application.UseCases.Dtos.GroupStageDto 0%
Duely.Application.UseCases.Dtos.GroupStageDuelDto 0%
Duely.Application.UseCases.Dtos.GroupStageStandingDto 0%
Duely.Application.UseCases.Dtos.GroupUserDto 100%
Duely.Application.UseCases.Dtos.PendingDuelDto 100%
Duely.Application.UseCases.Dtos.RankedDuelSearcherDto 100%
Duely.Application.UseCases.Dtos.SingleEliminationBracketDto 100%
Duely.Application.UseCases.Dtos.SingleEliminationBracketNodeDto 100%
Duely.Application.UseCases.Dtos.SubmissionDto 100%
Duely.Application.UseCases.Dtos.SubmissionListItemDto 100%
Duely.Application.UseCases.Dtos.TicketDto 100%
Duely.Application.UseCases.Dtos.TokenDto 100%
Duely.Application.UseCases.Dtos.TournamentDetailsDto 66.6%
Duely.Application.UseCases.Dtos.TournamentDto 100%
Duely.Application.UseCases.Dtos.TournamentDuelInvitationDto 100%
Duely.Application.UseCases.Dtos.UserDto 100%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunCommand 100%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunCommandValidator 0% 0%
Duely.Application.UseCases.Features.CodeRuns.CreateCodeRunHandler 100% 100%
Duely.Application.UseCases.Features.CodeRuns.GetCodeRunHandler 100% 100%
Duely.Application.UseCases.Features.CodeRuns.GetCodeRunQuery 100%
Duely.Application.UseCases.Features.CodeRuns.UpdateCodeRunCommand 100%
Duely.Application.UseCases.Features.CodeRuns.UpdateCodeRunHandler 98.1% 94.7%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionCommandValidator
96.7% 66.6%
Duely.Application.UseCases.Features.DuelConfigurations.CreateDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.DeleteDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.DeleteDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.GetDuelConfiguration
Handler
100% 100%
Duely.Application.UseCases.Features.DuelConfigurations.GetDuelConfiguration
Query
100%
Duely.Application.UseCases.Features.DuelConfigurations.GetUserDuelConfigura
tionsHandler
100%
Duely.Application.UseCases.Features.DuelConfigurations.GetUserDuelConfigura
tionsQuery
100%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionCommand
100%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionCommandValidator
96.7% 50%
Duely.Application.UseCases.Features.DuelConfigurations.UpdateDuelConfigurat
ionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.CancelPendingDuelsCommand 100%
Duely.Application.UseCases.Features.Duels.CancelPendingDuelsHandler 97.3% 80%
Duely.Application.UseCases.Features.Duels.CheckDuelsForAnticheatCommand 100%
Duely.Application.UseCases.Features.Duels.CheckDuelsForAnticheatHandler 89.7% 75%
Duely.Application.UseCases.Features.Duels.CheckDuelsForFinishHandler 100% 89.2%
Duely.Application.UseCases.Features.Duels.GetActiveDuelHandler 100% 100%
Duely.Application.UseCases.Features.Duels.GetActiveDuelQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelHandler 95% 77.2%
Duely.Application.UseCases.Features.Duels.GetDuelQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelsByStatusHandler 100%
Duely.Application.UseCases.Features.Duels.GetDuelsByStatusQuery 100%
Duely.Application.UseCases.Features.Duels.GetDuelsHistoryHandler 100% 100%
Duely.Application.UseCases.Features.Duels.GetDuelsHistoryQuery 100%
Duely.Application.UseCases.Features.Duels.GetGroupDuelsHandler 98.3% 75%
Duely.Application.UseCases.Features.Duels.GetGroupDuelsQuery 100%
Duely.Application.UseCases.Features.Duels.GetPendingDuelsHandler 100%
Duely.Application.UseCases.Features.Duels.GetRankedDuelSearchersHandler 100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptDuelInvitationH
andler
100% 92.8%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.AcceptGroupDuelInvita
tionHandler
100% 92.8%
Duely.Application.UseCases.Features.Duels.Invitations.CancelDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelDuelInvitationH
andler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CancelGroupDuelInvita
tionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateDuelInvitationC
ommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateDuelInvitationH
andler
100% 91.6%
Duely.Application.UseCases.Features.Duels.Invitations.CreateGroupDuelInvita
tionCommand
100%
Duely.Application.UseCases.Features.Duels.Invitations.CreateGroupDuelInvita
tionHandler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.DenyDuelInvitationCom
mand
100%
Duely.Application.UseCases.Features.Duels.Invitations.DenyDuelInvitationHan
dler
100% 100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingDuelInvita
tionsHandler
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingDuelInvita
tionsQuery
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingGroupDuelI
nvitationsHandler
100%
Duely.Application.UseCases.Features.Duels.Invitations.GetIncomingGroupDuelI
nvitationsQuery
100%
Duely.Application.UseCases.Features.Duels.Search.AddInactiveBotsToRankedSea
rchHandler
0% 0%
Duely.Application.UseCases.Features.Duels.Search.StartDuelSearchCommand 100%
Duely.Application.UseCases.Features.Duels.Search.StartDuelSearchHandler 100% 83.3%
Duely.Application.UseCases.Features.Duels.TryCreateDuelHandler 94.6% 90.9%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionCommand 100%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionCommandVali
dator
0%
Duely.Application.UseCases.Features.Duels.UpdateDuelTaskSolutionHandler 83.6% 85.7%
Duely.Application.UseCases.Features.Groups.AcceptInviteCommand 100%
Duely.Application.UseCases.Features.Groups.AcceptInviteHandler 100% 100%
Duely.Application.UseCases.Features.Groups.CancelInviteCommand 100%
Duely.Application.UseCases.Features.Groups.CancelInviteHandler 96.6% 75%
Duely.Application.UseCases.Features.Groups.ChangeRoleCommand 100%
Duely.Application.UseCases.Features.Groups.ChangeRoleHandler 90.4% 78.5%
Duely.Application.UseCases.Features.Groups.CreateGroupCommand 100%
Duely.Application.UseCases.Features.Groups.CreateGroupCommandValidator 0%
Duely.Application.UseCases.Features.Groups.CreateGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.DenyInviteCommand 100%
Duely.Application.UseCases.Features.Groups.DenyInviteHandler 100% 100%
Duely.Application.UseCases.Features.Groups.ExcludeUserCommand 100%
Duely.Application.UseCases.Features.Groups.ExcludeUserHandler 88.8% 75%
Duely.Application.UseCases.Features.Groups.GetAllGroupsHandler 100%
Duely.Application.UseCases.Features.Groups.GetGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.GetGroupInvitationsHandler 100%
Duely.Application.UseCases.Features.Groups.GetGroupInvitationsQuery 100%
Duely.Application.UseCases.Features.Groups.GetGroupQuery 100%
Duely.Application.UseCases.Features.Groups.GetGroupUsersHandler 97.6% 91.6%
Duely.Application.UseCases.Features.Groups.GetGroupUsersQuery 100%
Duely.Application.UseCases.Features.Groups.GetUserGroupsHandler 100%
Duely.Application.UseCases.Features.Groups.GetUserGroupsQuery 100%
Duely.Application.UseCases.Features.Groups.InviteUserCommand 100%
Duely.Application.UseCases.Features.Groups.InviteUserHandler 95.9% 83.3%
Duely.Application.UseCases.Features.Groups.LeaveGroupCommand 100%
Duely.Application.UseCases.Features.Groups.LeaveGroupHandler 100% 100%
Duely.Application.UseCases.Features.Groups.UpdateGroupCommand 100%
Duely.Application.UseCases.Features.Groups.UpdateGroupCommandValidator 0%
Duely.Application.UseCases.Features.Groups.UpdateGroupHandler 100% 100%
Duely.Application.UseCases.Features.Submissions.GetAllSubmissionsHandler 100% 100%
Duely.Application.UseCases.Features.Submissions.GetAllSubmissionsQuery 100%
Duely.Application.UseCases.Features.Submissions.GetSubmissionHandler 95.2% 87.5%
Duely.Application.UseCases.Features.Submissions.GetSubmissionQuery 100%
Duely.Application.UseCases.Features.Submissions.GetUserSubmissionsHandler 100% 94.4%
Duely.Application.UseCases.Features.Submissions.GetUserSubmissionsQuery 100%
Duely.Application.UseCases.Features.Submissions.SendSubmissionCommand 83.3%
Duely.Application.UseCases.Features.Submissions.SendSubmissionHandler 92.8% 56.2%
Duely.Application.UseCases.Features.Submissions.UpdateSubmissionStatusComma
nd
100%
Duely.Application.UseCases.Features.Submissions.UpdateSubmissionStatusHandl
er
96% 80%
Duely.Application.UseCases.Features.Tournaments.AcceptTournamentDuelCommand 100%
Duely.Application.UseCases.Features.Tournaments.AcceptTournamentDuelHandler 100% 92.8%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentCommand 100%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentCommandVali
dator
100%
Duely.Application.UseCases.Features.Tournaments.CreateTournamentHandler 87.8% 81.2%
Duely.Application.UseCases.Features.Tournaments.GetGroupTournamentsHandler 96.2% 90%
Duely.Application.UseCases.Features.Tournaments.GetGroupTournamentsQuery 100%
Duely.Application.UseCases.Features.Tournaments.GetIncomingTournamentDuelIn
vitationsHandler
100%
Duely.Application.UseCases.Features.Tournaments.GetIncomingTournamentDuelIn
vitationsQuery
100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentHandler 94.2% 62.5%
Duely.Application.UseCases.Features.Tournaments.GetTournamentQuery 100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentsByStateHandle
r
100% 100%
Duely.Application.UseCases.Features.Tournaments.GetTournamentsByStateQuery 100%
Duely.Application.UseCases.Features.Tournaments.StartTournamentCommand 100%
Duely.Application.UseCases.Features.Tournaments.StartTournamentHandler 95% 87.5%
Duely.Application.UseCases.Features.Tournaments.SyncActiveTournamentsHandle
r
99.3% 83.3%
Duely.Application.UseCases.Features.UserActions.GetUserActionsHandler 100%
Duely.Application.UseCases.Features.UserActions.GetUserActionsQuery 75%
Duely.Application.UseCases.Features.UserActions.GetUserActionsQueryValidato
r
0%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsCommand 66.6%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsCommandValid
ator
0%
Duely.Application.UseCases.Features.UserActions.SaveUserActionsHandler 100% 100%
Duely.Application.UseCases.Features.UserActions.UserActionValidator 0%
Duely.Application.UseCases.Features.Users.CreateTicketCommand 100%
Duely.Application.UseCases.Features.Users.CreateTicketHandler 94.7% 66.6%
Duely.Application.UseCases.Features.Users.GetByNicknameHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUserByNicknameQuery 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketCommand 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketCommandValidator 100%
Duely.Application.UseCases.Features.Users.GetUserByTicketHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUserQuery 100%
Duely.Application.UseCases.Features.Users.GetUsersHandler 100% 100%
Duely.Application.UseCases.Features.Users.GetUsersQuery 100%
Duely.Application.UseCases.Features.Users.LoginCommand 100%
Duely.Application.UseCases.Features.Users.LoginHandler 100% 100%
Duely.Application.UseCases.Features.Users.RefreshTokenCommand 100%
Duely.Application.UseCases.Features.Users.RefreshTokenHandler 100% 100%
Duely.Application.UseCases.Features.Users.RegisterCommand 100%
Duely.Application.UseCases.Features.Users.RegisterCommandValidator 100%
Duely.Application.UseCases.Features.Users.RegisterHandler 100% 100%
Duely.Application.UseCases.Helpers.DuelDtoMapper 96% 87.5%
Duely.Application.UseCases.Helpers.GroupStageTournamentDetailsMapper 0% 0%
Duely.Application.UseCases.Helpers.SingleEliminationBracketTournamentDetail
sMapper
100% 100%
Duely.Application.UseCases.Helpers.TournamentDetailsMapperResolver 100%
Duely.Application.UseCases.Helpers.TournamentDtoMapper 100% 100%
Duely.Domain.Models - 89%
Name Line Branch
Duely.Domain.Models 89% ****
Duely.Domain.Models.AnticheatScore 100%
Duely.Domain.Models.CodeRun 100%
Duely.Domain.Models.Duels.Duel 100%
Duely.Domain.Models.Duels.DuelConfiguration 100%
Duely.Domain.Models.Duels.DuelTask 100%
Duely.Domain.Models.Duels.DuelTaskConfiguration 100%
Duely.Domain.Models.Duels.DuelTaskSolution 100%
Duely.Domain.Models.Duels.Pending.FriendlyPendingDuel 100%
Duely.Domain.Models.Duels.Pending.GroupPendingDuel 100%
Duely.Domain.Models.Duels.Pending.PendingDuel 100%
Duely.Domain.Models.Duels.Pending.RankedPendingDuel 100%
Duely.Domain.Models.Duels.Pending.TournamentPendingDuel 100%
Duely.Domain.Models.Groups.Group 100%
Duely.Domain.Models.Groups.GroupDuel 100%
Duely.Domain.Models.Groups.GroupMembership 100%
Duely.Domain.Models.Messages.CodeRunStatusUpdatedMessage 100%
Duely.Domain.Models.Messages.DuelChangedMessage 100%
Duely.Domain.Models.Messages.DuelFinishedMessage 100%
Duely.Domain.Models.Messages.DuelInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.DuelInvitationDeniedMessage 100%
Duely.Domain.Models.Messages.DuelInvitationMessage 100%
Duely.Domain.Models.Messages.DuelStartedMessage 100%
Duely.Domain.Models.Messages.GroupDuelInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.GroupDuelInvitationMessage 100%
Duely.Domain.Models.Messages.GroupInvitationCanceledMessage 100%
Duely.Domain.Models.Messages.GroupInvitationMessage 100%
Duely.Domain.Models.Messages.OpponentSolutionUpdatedMessage 100%
Duely.Domain.Models.Messages.SubmissionStatusUpdatedMessage 100%
Duely.Domain.Models.Messages.TournamentDuelInvitationMessage 100%
Duely.Domain.Models.Outbox.OutboxMessage 71.4%
Duely.Domain.Models.Outbox.Payloads.RunCodePayload 100%
Duely.Domain.Models.Outbox.Payloads.SendMessagePayload 100%
Duely.Domain.Models.Outbox.Payloads.TestSolutionPayload 100%
Duely.Domain.Models.Submission 100%
Duely.Domain.Models.Tournaments.GroupStageTournament 100%
Duely.Domain.Models.Tournaments.SingleEliminationBracketNode 100%
Duely.Domain.Models.Tournaments.SingleEliminationBracketTournament 100%
Duely.Domain.Models.Tournaments.Tournament 100%
Duely.Domain.Models.Tournaments.TournamentParticipant 100%
Duely.Domain.Models.User 100%
Duely.Domain.Models.UserActions.ChooseLanguageUserAction 50%
Duely.Domain.Models.UserActions.CutCodeUserAction 0%
Duely.Domain.Models.UserActions.DeleteCodeUserAction 0%
Duely.Domain.Models.UserActions.MoveCursorUserAction 75%
Duely.Domain.Models.UserActions.PasteCodeUserAction 0%
Duely.Domain.Models.UserActions.RunCustomTestUserAction 0%
Duely.Domain.Models.UserActions.RunSampleTestUserAction 0%
Duely.Domain.Models.UserActions.SubmitSolutionUserAction 0%
Duely.Domain.Models.UserActions.UserAction 85.7%
Duely.Domain.Models.UserActions.WriteCodeUserAction 66.6%
Duely.Domain.Services - 93.1%
Name Line Branch
Duely.Domain.Services 93.1% 83.5%
Duely.Domain.Services.Duels.DuelManager 95.9% 91.3%
Duely.Domain.Services.Duels.DuelOptions 100%
Duely.Domain.Services.Duels.DuelPair 100%
Duely.Domain.Services.Duels.RatingManager 96.3% 86.3%
Duely.Domain.Services.Duels.RatingToTaskLevelMappingItem 100%
Duely.Domain.Services.Duels.TaskService 84.5% 86.7%
Duely.Domain.Services.Groups.GroupPermissionsService 97.1% 82.6%
Duely.Domain.Services.Tournaments.GroupStageMatchmakingStrategy 95.1% 80%
Duely.Domain.Services.Tournaments.SingleEliminationBracketMatchmakingStrate
gy
93.6% 77.4%
Duely.Domain.Services.Tournaments.TournamentMatchmakingStrategyResolver 100%
Duely.Domain.Services.Tournaments.TournamentPendingDuelCandidate 100%
Duely.Domain.Services.Users.JwtTokenOptions 100%
Duely.Domain.Services.Users.TokenService 100%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[observe][Duely] Реализовать все запросы для админки

1 participant