diff --git a/src/Portfolio.Api/Controller/TimelineController.cs b/src/Portfolio.Api/Controller/TimelineController.cs index 4a405ce..b2a6597 100644 --- a/src/Portfolio.Api/Controller/TimelineController.cs +++ b/src/Portfolio.Api/Controller/TimelineController.cs @@ -12,5 +12,11 @@ public class TimelineController(ITimelineRepository repository) : ControllerBase var timeline = await repository.GetTimeline(type, ct); return Ok(timeline); } + + [HttpGet("featured")] + public async Task GetFeaturedTimeline(CancellationToken ct) { + var timeline = await repository.GetFeaturedTimeline(ct); + return Ok(timeline); + } } \ No newline at end of file diff --git a/src/Portfolio.Api/Services/TimelineRepository.cs b/src/Portfolio.Api/Services/TimelineRepository.cs index 2a8428c..60d7b6f 100644 --- a/src/Portfolio.Api/Services/TimelineRepository.cs +++ b/src/Portfolio.Api/Services/TimelineRepository.cs @@ -11,5 +11,10 @@ internal sealed class TimelineRepository(DatabaseContext context) : ITimelineRep .Where(entry => entry.Type == type) .ToArrayAsync(ct); } - + + public async Task> GetFeaturedTimeline(CancellationToken ct) { + return await context.Timeline + .Where(entry => entry.Featured) + .ToArrayAsync(ct); + } } \ No newline at end of file diff --git a/src/Portfolio.Shared/Services/ITimelineRepository.cs b/src/Portfolio.Shared/Services/ITimelineRepository.cs index 561f075..2c9ae1c 100644 --- a/src/Portfolio.Shared/Services/ITimelineRepository.cs +++ b/src/Portfolio.Shared/Services/ITimelineRepository.cs @@ -6,4 +6,6 @@ public interface ITimelineRepository { Task> GetTimeline(TimelineEntryType type, CancellationToken ct); + Task> GetFeaturedTimeline(CancellationToken ct); + } \ No newline at end of file diff --git a/src/Portfolio.Web/Components/Pages/Home.razor b/src/Portfolio.Web/Components/Pages/Home.razor index 67ba4bc..6bc41ca 100644 --- a/src/Portfolio.Web/Components/Pages/Home.razor +++ b/src/Portfolio.Web/Components/Pages/Home.razor @@ -104,12 +104,7 @@ var technologies = await TechnologyRepository.GetTechnologies(TokenSource.Token); _technologies = technologies.Where(t => t.Featured); - var carrierTimeline = await TimelineRepository.GetTimeline(TimelineEntryType.Carrier, TokenSource.Token); - var experienceTimeline = await TimelineRepository.GetTimeline(TimelineEntryType.Experience, TokenSource.Token); - _timeline = experienceTimeline - .Aggregate(carrierTimeline, (current, entry) => current.Append(entry)) - .Where(t => t.Featured) - .OrderBy(t => t.Date); + _timeline = await TimelineRepository.GetFeaturedTimeline(TokenSource.Token); } } diff --git a/src/Portfolio.Web/Services/TimelineRepository.cs b/src/Portfolio.Web/Services/TimelineRepository.cs index 0057e61..1e178c1 100644 --- a/src/Portfolio.Web/Services/TimelineRepository.cs +++ b/src/Portfolio.Web/Services/TimelineRepository.cs @@ -12,4 +12,13 @@ internal sealed class TimelineRepository(IHttpClientFactory factory) : ITimeline var data = await result.Content.ReadFromJsonAsync>(ct); return data ?? []; } + + public async Task> GetFeaturedTimeline(CancellationToken ct) { + var client = factory.CreateClient("api"); + var result = await client.GetAsync("api/timeline/featured", ct); + if (!result.IsSuccessStatusCode) return []; + + var data = await result.Content.ReadFromJsonAsync>(ct); + return data ?? []; + } } \ No newline at end of file