Help wanted #23
|
@ -4,6 +4,7 @@
|
||||||
<RazorPage_SelectedScaffolderID>RazorPageScaffolder</RazorPage_SelectedScaffolderID>
|
<RazorPage_SelectedScaffolderID>RazorPageScaffolder</RazorPage_SelectedScaffolderID>
|
||||||
<RazorPage_SelectedScaffolderCategoryPath>root/Common/RazorPage</RazorPage_SelectedScaffolderCategoryPath>
|
<RazorPage_SelectedScaffolderCategoryPath>root/Common/RazorPage</RazorPage_SelectedScaffolderCategoryPath>
|
||||||
<ActiveDebugProfile>JobsJobsJobs</ActiveDebugProfile>
|
<ActiveDebugProfile>JobsJobsJobs</ActiveDebugProfile>
|
||||||
|
<ShowAllFiles>true</ShowAllFiles>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
|
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
|
||||||
|
|
25
src/JobsJobsJobs/Client/Pages/Listings/Mine.razor
Normal file
25
src/JobsJobsJobs/Client/Pages/Listings/Mine.razor
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
@page "/listings/mine"
|
||||||
|
@inject HttpClient http
|
||||||
|
@inject NavigationManager nav
|
||||||
|
@inject AppState state
|
||||||
|
|
||||||
|
<PageTitle Title="My Job Listings" />
|
||||||
|
<h3>My Job Listings</h3>
|
||||||
|
|
||||||
|
<ErrorList Errors=@ErrorMessages>
|
||||||
|
@if (Loading)
|
||||||
|
{
|
||||||
|
<p>Loading job listings…</p>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@if (Listings.Any())
|
||||||
|
{
|
||||||
|
<p>TODO: list them</p>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<p><em>No job listings found</em></p>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</ErrorList>
|
41
src/JobsJobsJobs/Client/Pages/Listings/Mine.razor.cs
Normal file
41
src/JobsJobsJobs/Client/Pages/Listings/Mine.razor.cs
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
using JobsJobsJobs.Shared;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace JobsJobsJobs.Client.Pages.Listings
|
||||||
|
{
|
||||||
|
public partial class Mine : ComponentBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Whether the page is loading data
|
||||||
|
/// </summary>
|
||||||
|
private bool Loading { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Error messages encountered while searching for profiles
|
||||||
|
/// </summary>
|
||||||
|
private IList<string> ErrorMessages { get; } = new List<string>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The job listings entered by the current user
|
||||||
|
/// </summary>
|
||||||
|
private IEnumerable<Listing> Listings { get; set; } = Enumerable.Empty<Listing>();
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
var listings = await ServerApi.RetrieveMany<Listing>(http, "listing/mine");
|
||||||
|
|
||||||
|
if (listings.IsOk)
|
||||||
|
{
|
||||||
|
Listings = listings.Ok;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ErrorMessages.Add(listings.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
using JobsJobsJobs.Server.Data;
|
||||||
|
using JobsJobsJobs.Shared;
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using NodaTime;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.Claims;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace JobsJobsJobs.Server.Areas.Api.Controllers
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// API controller for job listings
|
||||||
|
/// </summary>
|
||||||
|
[Route("api/listings")]
|
||||||
|
[Authorize]
|
||||||
|
[ApiController]
|
||||||
|
public class ListingController : ControllerBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The data context
|
||||||
|
/// </summary>
|
||||||
|
private readonly JobsDbContext _db;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The NodaTime clock instance
|
||||||
|
/// </summary>
|
||||||
|
private readonly IClock _clock;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="db">The data context to use for this request</param>
|
||||||
|
/// <param name="clock">The clock instance to use for this request</param>
|
||||||
|
public ListingController(JobsDbContext db, IClock clock)
|
||||||
|
{
|
||||||
|
_db = db;
|
||||||
|
_clock = clock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The current citizen ID
|
||||||
|
/// </summary>
|
||||||
|
private CitizenId CurrentCitizenId => CitizenId.Parse(User.FindFirst(ClaimTypes.NameIdentifier)!.Value);
|
||||||
|
|
||||||
|
[HttpGet("mine")]
|
||||||
|
public async Task<IActionResult> Mine() =>
|
||||||
|
Ok(await _db.FindListingsByCitizen(CurrentCitizenId));
|
||||||
|
}
|
||||||
|
}
|
25
src/JobsJobsJobs/Server/Data/ListingExtensions.cs
Normal file
25
src/JobsJobsJobs/Server/Data/ListingExtensions.cs
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
using JobsJobsJobs.Shared;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace JobsJobsJobs.Server.Data
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Extensions to JobsDbContext to support manipulation of job listings
|
||||||
|
/// </summary>
|
||||||
|
public static class ListingExtensions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Find all job listings for the given citizen ID
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="citizenId">The citizen ID for which job listings should be retrieved</param>
|
||||||
|
/// <returns>The job listings entered by the given citizen</returns>
|
||||||
|
public static async Task<IEnumerable<Listing>> FindListingsByCitizen(this JobsDbContext db, CitizenId citizenId)
|
||||||
|
=> await db.Listings.AsNoTracking()
|
||||||
|
.Where(l => l.CitizenId == citizenId)
|
||||||
|
.ToListAsync().ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user