Skip to content

Commit 042d9c6

Browse files
calin-lupas_dsamcapscalin-lupas_dsamcaps
authored andcommitted
Enhance issue request handling and state management
- Added `FindByIssueNumberAsync` method to retrieve issue requests by repository name and issue number. - Updated issue state management to use `ItemState` enumeration for improved type safety. - Centralized state update logic into `UpdateIssueRequestStateAsync` method in `RepositoryService.cs` and `TeamService.cs`. - Improved error handling and logging for better operational insights. - Integrated `Octokit` more thoroughly for GitHub interactions. - Overall improvements to maintainability, readability, and functionality of the codebase.
1 parent 1e6b23c commit 042d9c6

3 files changed

Lines changed: 109 additions & 35 deletions

File tree

src/DevExcelerateApi/Data/IssueRequestRepository.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using DevExcelerateApi.Models;
2+
using Octokit;
23

34
namespace DevExcelerateApi.Data
45
{
@@ -39,7 +40,7 @@ public async Task<IssueRequestEntity> CreateIssueRequestAsync(
3940
Title = title,
4041
Body = body,
4142
CreatedBy = createdBy,
42-
State = "open"
43+
State = ItemState.Open.ToString()
4344
};
4445

4546
await CreateAsync(issueRequest);
@@ -55,8 +56,8 @@ public async Task<IEnumerable<IssueRequestEntity>> FindByRepositoryAsync(string
5556
{
5657
return await StorageContext.QueryEntitiesAsync(entity =>
5758
entity.RepositoryName?.Equals(repositoryName, StringComparison.OrdinalIgnoreCase) == true);
58-
}
59-
59+
}
60+
6061
/// <summary>
6162
/// Finds issue requests by state.
6263
/// </summary>
@@ -68,6 +69,21 @@ public async Task<IEnumerable<IssueRequestEntity>> FindByStateAsync(string state
6869
entity.State?.Equals(state, StringComparison.OrdinalIgnoreCase) == true);
6970
}
7071

72+
/// <summary>
73+
/// Finds an issue request by repository name and issue number.
74+
/// </summary>
75+
/// <param name="repositoryName">The repository name</param>
76+
/// <param name="issueNumber">The issue number</param>
77+
/// <returns>The issue request entity if found, null otherwise</returns>
78+
public async Task<IssueRequestEntity?> FindByIssueNumberAsync(string repositoryName, long issueNumber)
79+
{
80+
var issueRequests = await StorageContext.QueryEntitiesAsync(entity =>
81+
entity.RepositoryName?.Equals(repositoryName, StringComparison.OrdinalIgnoreCase) == true &&
82+
entity.IssueNumber == issueNumber);
83+
84+
return issueRequests.FirstOrDefault();
85+
}
86+
7187
/// <summary>
7288
/// Updates the state of an issue request.
7389
/// </summary>

src/DevExcelerateApi/Services/RepositoryService.cs

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -243,23 +243,19 @@ public async Task SaveRepository(IssuesEvent issuesEvent)
243243
var repoRequest = RepositoryRequestModel.Parse(issueBodyParsed.Body);
244244
repoRequest.RepositoryOwner = issuesEvent?.Organization?.Login;
245245
repoRequest.RequestIssue = issueNumber;
246-
repoRequest.RequestUser = issuesEvent?.Issue.User.Login;
247-
246+
repoRequest.RequestUser = issuesEvent?.Issue.User.Login;
247+
248248
try
249249
{
250250
// Save the repo
251251
Repository? savedRepo = await SaveRepositoryInternal(issuesEvent?.Installation?.Id, repoRequest);
252-
252+
253253
// Last step: Add a comment to the issue and close the issue
254254
await _issueService.ChangeIssueLabel([_localizationService.GetLocalizedString(TicketStatus.COMPLETED.ToString())], issuesEvent!);
255255
await _issueService.AddIssueComment($"{_localizationService.GetLocalizedString(Constants.ISSUE_COMPLETED)}\n- Repository: {savedRepo?.HtmlUrl}", issuesEvent!);
256-
await gitHubClient.Issue.Update(issuesEvent?.Repository?.Owner.Login,
257-
issuesEvent?.Repository?.Name,
258-
issueNumber,
259-
new IssueUpdate
260-
{
261-
State = ItemState.Closed
262-
});
256+
await gitHubClient.Issue.Update(issuesEvent?.Repository?.Owner.Login, issuesEvent?.Repository?.Name, issueNumber, new IssueUpdate { State = ItemState.Closed });
257+
258+
await UpdateIssueRequestStateAsync(issuesEvent?.Repository?.Name, issueNumber, ItemState.Closed.ToString());
263259
}
264260
catch (Exception ex)
265261
{
@@ -296,14 +292,14 @@ public async Task SaveRepository(PullRequestEvent pullRequestEvent)
296292
completeMessage = $"{_localizationService.GetLocalizedString(Constants.ISSUE_COMPLETED)}\n- Repository: {savedRepo?.HtmlUrl}";
297293
}
298294
}
299-
}
300-
295+
}
296+
301297
// Last step: Add a comment to the issue and close the issue
302298
await _issueService.ChangeIssueLabel(_gitHubOptions.RepoOnboarding, issueNumber, [LocalizationExtensions.GetLocalizedString(TicketStatus.COMPLETED.ToString())], pullRequestEvent!);
303-
304299
await AddCommentToIssueAndPullRequest(issueNumber, completeMessage, pullRequestEvent!);
305-
306300
await gitHubClient.Issue.Update(owner, _gitHubOptions.RepoOnboarding, issueNumber, new IssueUpdate { State = ItemState.Closed });
301+
302+
await UpdateIssueRequestStateAsync(_gitHubOptions.RepoOnboarding, issueNumber, ItemState.Closed.ToString());
307303
}
308304
catch (Exception ex)
309305
{
@@ -584,9 +580,7 @@ public async Task SaveRepository(PullRequestEvent pullRequestEvent)
584580
}
585581

586582
return null;
587-
}
588-
589-
private async Task AddCommentToIssueAndPullRequest(long issueNumber, string comment, PullRequestEvent pullRequestEvent)
583+
} private async Task AddCommentToIssueAndPullRequest(long issueNumber, string comment, PullRequestEvent pullRequestEvent)
590584
{
591585
var installationClient = await _gitHubClientFactory.GetInstallationAsync(pullRequestEvent?.Installation?.Id);
592586
var prNumber = (pullRequestEvent?.PullRequest.Number).GetValueOrDefault();
@@ -602,6 +596,40 @@ await installationClient.PullRequest.Review.Create(owner, repo, (int)prNumber,
602596
Body = comment,
603597
Event = Octokit.PullRequestReviewEvent.Comment
604598
});
605-
}
599+
}
600+
601+
/// <summary>
602+
/// Updates the state of an IssueRequestEntity for the given repository and issue number.
603+
/// </summary>
604+
/// <param name="repositoryName">The repository name</param>
605+
/// <param name="issueNumber">The issue number</param>
606+
/// <param name="newState">The new state (e.g., "closed")</param>
607+
private async Task UpdateIssueRequestStateAsync(string? repositoryName, long issueNumber, string newState)
608+
{
609+
if (string.IsNullOrEmpty(repositoryName))
610+
return;
611+
612+
try
613+
{
614+
// Find the specific issue request by repository name and issue number
615+
var issueRequest = await _issueRequestRepository.FindByIssueNumberAsync(repositoryName, issueNumber);
616+
617+
if (issueRequest != null)
618+
{
619+
// Update the state using the repository method
620+
await _issueRequestRepository.UpdateStateAsync(issueRequest.Id, newState, issueRequest.Partition);
621+
622+
_logger.LogInformation("Updated IssueRequestEntity {IssueRequestId} state to '{NewState}' for Repository={Repository}, Issue={Issue}", issueRequest.Id, newState, repositoryName, issueNumber);
623+
}
624+
else
625+
{
626+
_logger.LogWarning("No IssueRequestEntity found for Repository={Repository}, Issue={Issue}", repositoryName, issueNumber);
627+
}
628+
}
629+
catch (Exception ex)
630+
{
631+
_logger.LogError(ex, "Failed to update IssueRequestEntity state for Repository={Repository}, Issue={Issue}", repositoryName, issueNumber);
632+
}
633+
}
606634
}
607635
}

src/DevExcelerateApi/Services/TeamService.cs

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -225,20 +225,16 @@ public async Task SaveTeam(IssuesEvent issuesEvent)
225225
teamRequest.RequestUser = issuesEvent?.Issue.User.Login;
226226

227227
try
228-
{
228+
{
229229
// Save the team
230230
Team? savedTeam = await SaveTeamInternal(issuesEvent?.Installation?.Id, teamRequest);
231-
231+
232232
// Last step: Add a comment to the issue and close the issue
233233
await _issueService.ChangeIssueLabel([_localizationService.GetLocalizedString(TicketStatus.COMPLETED.ToString())], issuesEvent!);
234234
await _issueService.AddIssueComment($"{_localizationService.GetLocalizedString(Constants.ISSUE_COMPLETED)}\n- Team: {savedTeam?.HtmlUrl}", issuesEvent!);
235-
await gitHubClient.Issue.Update(issuesEvent?.Repository?.Owner.Login,
236-
issuesEvent?.Repository?.Name,
237-
issueNumber,
238-
new IssueUpdate
239-
{
240-
State = ItemState.Closed
241-
});
235+
await gitHubClient.Issue.Update(issuesEvent?.Repository?.Owner.Login, issuesEvent?.Repository?.Name, issueNumber, new IssueUpdate { State = ItemState.Closed });
236+
237+
await UpdateIssueRequestStateAsync(issuesEvent?.Repository?.Name, issueNumber, ItemState.Closed.ToString());
242238
}
243239
catch (Exception ex)
244240
{
@@ -275,14 +271,14 @@ public async Task SaveTeam(PullRequestEvent pullRequestEvent)
275271
completeMessage = $"{_localizationService.GetLocalizedString(Constants.ISSUE_COMPLETED)}\n- Team: {savedTeam?.HtmlUrl}";
276272
}
277273
}
278-
}
279-
274+
}
275+
280276
// Last step: Add a comment to the issue and close the issue
281277
await _issueService.ChangeIssueLabel(_gitHubOptions.RepoOnboarding, issueNumber, [LocalizationExtensions.GetLocalizedString(TicketStatus.COMPLETED.ToString())], pullRequestEvent!);
282-
283278
await AddCommentToIssueAndPullRequest(issueNumber, completeMessage, pullRequestEvent!);
284-
285279
await gitHubClient.Issue.Update(owner, _gitHubOptions.RepoOnboarding, issueNumber, new IssueUpdate { State = ItemState.Closed });
280+
281+
await UpdateIssueRequestStateAsync(_gitHubOptions.RepoOnboarding, issueNumber, ItemState.Closed.ToString());
286282
}
287283
catch (Exception ex)
288284
{
@@ -502,8 +498,42 @@ await installationClient.PullRequest.Review.Create(owner, repo, (int)prNumber,
502498
new PullRequestReviewCreate
503499
{
504500
Body = comment,
505-
Event = Octokit.PullRequestReviewEvent.Comment
501+
Event = Octokit.PullRequestReviewEvent.Comment
506502
});
507503
}
504+
505+
/// <summary>
506+
/// Updates the state of an IssueRequestEntity for the given repository and issue number.
507+
/// </summary>
508+
/// <param name="repositoryName">The repository name</param>
509+
/// <param name="issueNumber">The issue number</param>
510+
/// <param name="newState">The new state (e.g., "closed")</param>
511+
private async Task UpdateIssueRequestStateAsync(string? repositoryName, long issueNumber, string newState)
512+
{
513+
if (string.IsNullOrEmpty(repositoryName))
514+
return;
515+
516+
try
517+
{
518+
// Find the specific issue request by repository name and issue number
519+
var issueRequest = await _issueRequestRepository.FindByIssueNumberAsync(repositoryName, issueNumber);
520+
521+
if (issueRequest != null)
522+
{
523+
// Update the state using the repository method
524+
await _issueRequestRepository.UpdateStateAsync(issueRequest.Id, newState, issueRequest.Partition);
525+
526+
_logger.LogInformation("Updated IssueRequestEntity {IssueRequestId} state to '{NewState}' for Repository={Repository}, Issue={Issue}", issueRequest.Id, newState, repositoryName, issueNumber);
527+
}
528+
else
529+
{
530+
_logger.LogWarning("No IssueRequestEntity found for Repository={Repository}, Issue={Issue}", repositoryName, issueNumber);
531+
}
532+
}
533+
catch (Exception ex)
534+
{
535+
_logger.LogError(ex, "Failed to update IssueRequestEntity state for Repository={Repository}, Issue={Issue}", repositoryName, issueNumber);
536+
}
537+
}
508538
}
509539
}

0 commit comments

Comments
 (0)