diff --git a/src/Portfolio.Api/Controller/ProjectController.cs b/src/Portfolio.Api/Controller/ProjectController.cs index 2a74271..16af81e 100644 --- a/src/Portfolio.Api/Controller/ProjectController.cs +++ b/src/Portfolio.Api/Controller/ProjectController.cs @@ -12,5 +12,11 @@ public class ProjectController(IProjectRepository repository) : ControllerBase { var projects = await repository.GetProjects(ct); return Ok(projects); } + + [HttpGet("featured")] + public async Task GetFeaturedProjects(CancellationToken ct) { + var projects = await repository.GetFeaturedProjects(ct); + return Ok(projects); + } } \ No newline at end of file diff --git a/src/Portfolio.Api/Controller/TechnologyController.cs b/src/Portfolio.Api/Controller/TechnologyController.cs index 33a997f..3390613 100644 --- a/src/Portfolio.Api/Controller/TechnologyController.cs +++ b/src/Portfolio.Api/Controller/TechnologyController.cs @@ -12,5 +12,11 @@ public class TechnologyController(ITechnologyRepository repository) : Controller var technologies = await repository.GetTechnologies(ct); return Ok(technologies); } + + [HttpGet("featured")] + public async Task GetFeaturedTechnologies(CancellationToken ct) { + var technologies = await repository.GetFeaturedTechnologies(ct); + return Ok(technologies); + } } \ No newline at end of file diff --git a/src/Portfolio.Api/Portfolio.Api.csproj b/src/Portfolio.Api/Portfolio.Api.csproj index c033bcd..1147fad 100644 --- a/src/Portfolio.Api/Portfolio.Api.csproj +++ b/src/Portfolio.Api/Portfolio.Api.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/Portfolio.Api/Program.cs b/src/Portfolio.Api/Program.cs index a3bd274..16515ce 100644 --- a/src/Portfolio.Api/Program.cs +++ b/src/Portfolio.Api/Program.cs @@ -60,6 +60,8 @@ builder.Services.AddHopFrame(options => { .IsTextArea(true); }); }); + + options.AddExporters(); }); var app = builder.Build(); diff --git a/src/Portfolio.Api/Services/ProjectRepository.cs b/src/Portfolio.Api/Services/ProjectRepository.cs index 06e5aa6..60dd047 100644 --- a/src/Portfolio.Api/Services/ProjectRepository.cs +++ b/src/Portfolio.Api/Services/ProjectRepository.cs @@ -12,5 +12,13 @@ internal sealed class ProjectRepository(DatabaseContext context) : IProjectRepos .OrderByDescending(p => p.OrderIndex) .ToArrayAsync(ct); } + + public async Task> GetFeaturedProjects(CancellationToken ct) { + return await context.Projects + .Include(p => p.Languages) + .Where(p => p.Featured) + .OrderByDescending(p => p.OrderIndex) + .ToArrayAsync(ct); + } } \ No newline at end of file diff --git a/src/Portfolio.Api/Services/TechnologyRepository.cs b/src/Portfolio.Api/Services/TechnologyRepository.cs index 9f599ef..e976276 100644 --- a/src/Portfolio.Api/Services/TechnologyRepository.cs +++ b/src/Portfolio.Api/Services/TechnologyRepository.cs @@ -9,5 +9,11 @@ internal sealed class TechnologyRepository(DatabaseContext context) : ITechnolog public async Task> GetTechnologies(CancellationToken ct) { return await context.Technologies.ToArrayAsync(ct); } + + public async Task> GetFeaturedTechnologies(CancellationToken ct) { + return await context.Technologies + .Where(t => t.Featured) + .ToArrayAsync(ct); + } } \ No newline at end of file diff --git a/src/Portfolio.Shared/Services/IProjectRepository.cs b/src/Portfolio.Shared/Services/IProjectRepository.cs index 11b17d1..f2e5446 100644 --- a/src/Portfolio.Shared/Services/IProjectRepository.cs +++ b/src/Portfolio.Shared/Services/IProjectRepository.cs @@ -6,4 +6,6 @@ public interface IProjectRepository { Task> GetProjects(CancellationToken ct); + Task> GetFeaturedProjects(CancellationToken ct); + } \ No newline at end of file diff --git a/src/Portfolio.Shared/Services/ITechnologyRepository.cs b/src/Portfolio.Shared/Services/ITechnologyRepository.cs index fb34e75..86a3726 100644 --- a/src/Portfolio.Shared/Services/ITechnologyRepository.cs +++ b/src/Portfolio.Shared/Services/ITechnologyRepository.cs @@ -6,4 +6,6 @@ public interface ITechnologyRepository { Task> GetTechnologies(CancellationToken ct); + Task> GetFeaturedTechnologies(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 6bc41ca..180ad45 100644 --- a/src/Portfolio.Web/Components/Pages/Home.razor +++ b/src/Portfolio.Web/Components/Pages/Home.razor @@ -82,7 +82,6 @@ if (displayElement.innerText !== jobs.display) displayElement.innerText = jobs.display; }, 50) - @inherits CancellableComponent @@ -98,13 +97,15 @@ private IEnumerable _timeline = []; protected override async Task OnInitializedAsync() { - var projects = await ProjectRepository.GetProjects(TokenSource.Token); - _projects = projects.Where(p => p.Featured); + var projectsTask = ProjectRepository.GetFeaturedProjects(TokenSource.Token); + var technologiesTask = TechnologyRepository.GetFeaturedTechnologies(TokenSource.Token); + var timelineTask = TimelineRepository.GetFeaturedTimeline(TokenSource.Token); - var technologies = await TechnologyRepository.GetTechnologies(TokenSource.Token); - _technologies = technologies.Where(t => t.Featured); + await Task.WhenAll(projectsTask, technologiesTask, timelineTask); - _timeline = await TimelineRepository.GetFeaturedTimeline(TokenSource.Token); + _projects = projectsTask.Result; + _technologies = technologiesTask.Result; + _timeline = timelineTask.Result; } } diff --git a/src/Portfolio.Web/Services/ProjectRepository.cs b/src/Portfolio.Web/Services/ProjectRepository.cs index f765321..979161e 100644 --- a/src/Portfolio.Web/Services/ProjectRepository.cs +++ b/src/Portfolio.Web/Services/ProjectRepository.cs @@ -12,4 +12,13 @@ internal sealed class ProjectRepository(IHttpClientFactory factory) : IProjectRe var data = await response.Content.ReadFromJsonAsync>(ct); return data?.OrderByDescending(p => p.OrderIndex) ?? Enumerable.Empty(); } + + public async Task> GetFeaturedProjects(CancellationToken ct) { + var client = factory.CreateClient("api"); + var response = await client.GetAsync("api/projects/featured", ct); + if (!response.IsSuccessStatusCode) return []; + + var data = await response.Content.ReadFromJsonAsync>(ct); + return data?.OrderByDescending(p => p.OrderIndex) ?? Enumerable.Empty(); + } } \ No newline at end of file diff --git a/src/Portfolio.Web/Services/TechnologyRepository.cs b/src/Portfolio.Web/Services/TechnologyRepository.cs index d723a6d..11412b7 100644 --- a/src/Portfolio.Web/Services/TechnologyRepository.cs +++ b/src/Portfolio.Web/Services/TechnologyRepository.cs @@ -12,4 +12,13 @@ internal sealed class TechnologyRepository(IHttpClientFactory factory) : ITechno var data = await response.Content.ReadFromJsonAsync>(ct); return data ?? []; } + + public async Task> GetFeaturedTechnologies(CancellationToken ct) { + var client = factory.CreateClient("api"); + var response = await client.GetAsync("api/technologies/featured", ct); + if (!response.IsSuccessStatusCode) return []; + + var data = await response.Content.ReadFromJsonAsync>(ct); + return data ?? []; + } } \ No newline at end of file