add hour window

This commit is contained in:
2025-12-16 21:47:49 +01:00
parent bd31fb6eb0
commit dc22000c79
10 changed files with 638 additions and 62 deletions

View File

@@ -5,7 +5,7 @@ namespace Blueberry.Redmine
{
public class RedmineManager
{
private readonly TimeSpan DEFAULT_CACHE_DURATION = TimeSpan.FromHours(1);
private readonly TimeSpan DEFAULT_CACHE_DURATION = TimeSpan.FromHours(3);
private readonly RedmineConfig _config;
private readonly ILogger _logger;
private readonly RedmineApiClient _apiClient;
@@ -13,6 +13,7 @@ namespace Blueberry.Redmine
private readonly RedmineCache<PriorityList.IssuePriority> _priorityCache;
private readonly RedmineCache<CustomFieldList.CustomField> _customFieldCache;
private readonly RedmineCache<ProjectList.Project> _projectCache;
private readonly RedmineCache<UserInfo.User> _userCache;
public RedmineManager(RedmineConfig config, HttpClient client, ILoggerFactory loggerFactory)
{
@@ -31,6 +32,9 @@ namespace Blueberry.Redmine
_projectCache = new RedmineCache<ProjectList.Project>(
DEFAULT_CACHE_DURATION, loggerFactory.CreateLogger<RedmineCache<ProjectList.Project>>(), cacheFilePath: $"{_config.CacheFilePath}Projects.json");
_userCache = new RedmineCache<UserInfo.User>(
DEFAULT_CACHE_DURATION, loggerFactory.CreateLogger<RedmineCache<UserInfo.User>>(), cacheFilePath: $"{_config.CacheFilePath}Users.json");
_logger = loggerFactory.CreateLogger<RedmineManager>();
_logger.LogDebug("Initialized caches");
}
@@ -87,11 +91,22 @@ namespace Blueberry.Redmine
{
return await _projectCache.GetItemsAsync();
}
var projects = await _apiClient.GetProjects(limit, progress, token);
var projects = await _apiClient.GetProjectsAsync(limit, progress, token);
await _projectCache.RefreshCacheAsync(projects);
return projects;
}
public async Task<IReadOnlyList<UserInfo.User>> GetUsersAsync(int limit = 50, IProgress<(int, int)>? progress = null, CancellationToken? token = null)
{
if (_userCache.IsCacheValid())
{
return await _userCache.GetItemsAsync();
}
var users = await _apiClient.GetUsersAsync(limit, progress, token);
await _userCache.RefreshCacheAsync(users);
return users;
}
public async Task<UserInfo.User> GetCurrentUserAsync(CancellationToken? token = null)
{
var user = await _apiClient.GetUserAsync(token: token);
@@ -104,42 +119,74 @@ namespace Blueberry.Redmine
return user;
}
public async Task<List<IssueList.Issue>> GetCurrentUserIssuesAsync(int limit = 50, IProgress<(int, int)>? progress = null, CancellationToken? token = null)
public async Task<List<IssueList.Issue>> GetCurrentUserOpenIssuesAsync(int limit = 50, IProgress<(int, int)>? progress = null, CancellationToken? token = null)
{
var user = await GetCurrentUserAsync(token);
return await _apiClient.GetOpenIssuesByAssignee(user.Id, limit, progress, token);
return await _apiClient.GetOpenIssuesByAssigneeAsync(user.Id, limit, progress, token);
}
public async Task<List<IssueList.Issue>> GetUserOpenIssuesAsync(int userId, int limit = 50, IProgress<(int, int)>? progress = null, CancellationToken? token = null)
{
return await _apiClient.GetOpenIssuesByAssigneeAsync(userId, limit, progress, token);
}
public async Task<List<IssueList.Issue>> GetIssuesAsync(
int? userId = null,
string? projectId = null,
int? statusId = null,
bool? isOpen = null,
// Changed single dates to From/To pairs
DateTime? createdFrom = null,
DateTime? createdTo = null,
DateTime? updatedFrom = null,
DateTime? updatedTo = null,
int limit = 50,
IProgress<(int, int)>? progress = null,
CancellationToken? token = null)
{
return await _apiClient.GetIssuesAsync(userId, projectId, statusId, isOpen, createdFrom, createdTo, updatedFrom, updatedTo, limit, progress, token);
}
public async Task AddComment(int issueId, string comment, bool isPrivate = false, CancellationToken? token = null)
{
await _apiClient.AddCommentToIssueAsync(issueId, comment, isPrivate, token);
}
public async Task<double> GetCurrentUserTimeAsync(DateTime start, DateTime end, int limit = 50, IProgress<(int, int)>? progress = null, CancellationToken? token = null)
{
var user = await GetCurrentUserAsync(token);
return await _apiClient.GetTotalTimeForUser(user.Id, start, end, limit, progress, token);
return await _apiClient.GetTotalTimeForUserAsync(user.Id, start, end, limit, progress, token);
}
public async Task<double> GetUserTimeAsync(int userId, DateTime start, DateTime end, int limit = 50, IProgress<(int, int)>? progress = null, CancellationToken? token = null)
{
return await _apiClient.GetTotalTimeForUserAsync(userId, start, end, limit, progress, token);
}
public async Task<DetailedIssue.Issue> GetIssueAsync(int issueId, CancellationToken? token = null)
{
return await _apiClient.GetIssue(issueId, token);
return await _apiClient.GetIssueAsync(issueId, token);
}
public async Task<IssueList.Issue> GetSimpleIssueAsync(int issueId, CancellationToken? token = null)
{
return await _apiClient.GetSimpleIssue(issueId, token);
return await _apiClient.GetSimpleIssueAsync(issueId, token);
}
public async Task<List<ProjectTrackers.Tracker>> GetProjectTrackersAsync(int projectId, CancellationToken? token = null)
{
return await _apiClient.GetTrackersForProject(projectId.ToString(), token);
return await _apiClient.GetTrackersForProjectAsync(projectId.ToString(), token);
}
public async Task<List<TimeOnIssue.TimeEntry>> GetTimeOnIssue(int issueId, int limit = 25, IProgress<(int, int)>? progress = null, CancellationToken? token = null)
{
var result = await _apiClient.GetTimeOnIssue(issueId, limit, progress, token);
var result = await _apiClient.GetTimeOnIssueAsync(issueId, limit, progress, token);
return result;
}
public async Task SetIssueStatusAsync(int issueId, int statusId, CancellationToken? token = null)
{
await _apiClient.SetIssueStatus(issueId, statusId, token);
await _apiClient.SetIssueStatusAsync(issueId, statusId, token);
}
public async Task LogTimeAsync(int issueId, double hours, string comments, DateTime? date = null, int? activityId = null, CancellationToken? token = null)
@@ -150,7 +197,7 @@ namespace Blueberry.Redmine
public async Task<int> CreateIssueAsync(int projectId, int trackerId, string subject, string description,
double estimatedHours, int priorityId, int? assigneeId = null, int? parentIssueId = null, CancellationToken? token = null)
{
return await _apiClient.CreateNewIssue(projectId, trackerId, subject, description, estimatedHours, priorityId, assigneeId, parentIssueId, token);
return await _apiClient.CreateNewIssueAsync(projectId, trackerId, subject, description, estimatedHours, priorityId, assigneeId, parentIssueId, token);
}
public async Task<double> GetCurrentUserTimeTodayAsync(int limit = 50, IProgress<(int, int)>? progress = null, CancellationToken? token = null)
@@ -169,5 +216,10 @@ namespace Blueberry.Redmine
var end = start.AddMonths(1).AddDays(-1);
return await GetCurrentUserTimeAsync(start, end, limit, progress, token);
}
public async Task<List<UserTime.TimeEntry>> GetTimeForUserAsync(int userId, DateTime start, DateTime end, int limit = 50, IProgress<(int, int)>? progress = null, CancellationToken? token = null)
{
return await _apiClient.GetTimeForUserAsync(userId, start, end, limit, progress, token);
}
}
}