Add real name col / citizen name prop (#12)
Still need to work on allowing the column to be edited
This commit is contained in:
parent
21ba35408e
commit
1b2540e5d2
|
@ -11,6 +11,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JobsJobsJobs.Shared", "Jobs
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{50B51580-9F09-41E2-BC78-DAD38C37B583}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{50B51580-9F09-41E2-BC78-DAD38C37B583}"
|
||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
database\12-add-real-name.sql = database\12-add-real-name.sql
|
||||||
JobsJobsJobs\Directory.Build.props = JobsJobsJobs\Directory.Build.props
|
JobsJobsJobs\Directory.Build.props = JobsJobsJobs\Directory.Build.props
|
||||||
database\tables.sql = database\tables.sql
|
database\tables.sql = database\tables.sql
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
@inject AppState state
|
@inject AppState state
|
||||||
|
|
||||||
<Loading OnLoad=@RetrieveProfile>
|
<Loading OnLoad=@RetrieveProfile>
|
||||||
<PageTitle Title=@($"Employment Profile for {Citizen.DisplayName}") />
|
<PageTitle Title=@($"Employment Profile for {Citizen.CitizenName}") />
|
||||||
<h2><a href="@Citizen.ProfileUrl" target="_blank">@Citizen.DisplayName</a></h2>
|
<h2><a href="@Citizen.ProfileUrl" target="_blank">@Citizen.CitizenName</a></h2>
|
||||||
<h4>@Profile.Continent!.Name, @Profile.Region</h4>
|
<h4>@Profile.Continent!.Name, @Profile.Region</h4>
|
||||||
<p>@WorkTypes</p>
|
<p>@WorkTypes</p>
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<PageTitle Title="Success Story" />
|
<PageTitle Title="Success Story" />
|
||||||
|
|
||||||
<Loading OnLoad=@RetrieveStory>
|
<Loading OnLoad=@RetrieveStory>
|
||||||
<h3>@Citizen.DisplayName’s Success Story</h3>
|
<h3>@Citizen.CitizenName’s Success Story</h3>
|
||||||
<h4><FullDateTime TheDate=@Story.RecordedOn /></h4>
|
<h4><FullDateTime TheDate=@Story.RecordedOn /></h4>
|
||||||
@if (Story.FromHere)
|
@if (Story.FromHere)
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,7 +65,8 @@ namespace JobsJobsJobs.Server.Areas.Api.Controllers
|
||||||
var citizen = await _db.FindCitizenByNAUser(account.Username);
|
var citizen = await _db.FindCitizenByNAUser(account.Username);
|
||||||
if (citizen == null)
|
if (citizen == null)
|
||||||
{
|
{
|
||||||
citizen = new Citizen(await CitizenId.Create(), account.Username, account.DisplayName, account.Url,
|
citizen = new Citizen(await CitizenId.Create(), account.Username,
|
||||||
|
string.IsNullOrWhiteSpace(account.DisplayName) ? null : account.DisplayName, null, account.Url,
|
||||||
now, now);
|
now, now);
|
||||||
await _db.AddCitizen(citizen);
|
await _db.AddCitizen(citizen);
|
||||||
}
|
}
|
||||||
|
@ -73,7 +74,7 @@ namespace JobsJobsJobs.Server.Areas.Api.Controllers
|
||||||
{
|
{
|
||||||
citizen = citizen with
|
citizen = citizen with
|
||||||
{
|
{
|
||||||
DisplayName = account.DisplayName,
|
DisplayName = string.IsNullOrWhiteSpace(account.DisplayName) ? null : account.DisplayName,
|
||||||
LastSeenOn = now
|
LastSeenOn = now
|
||||||
};
|
};
|
||||||
_db.UpdateCitizen(citizen);
|
_db.UpdateCitizen(citizen);
|
||||||
|
@ -83,7 +84,7 @@ namespace JobsJobsJobs.Server.Areas.Api.Controllers
|
||||||
// Step 3 - Generate JWT
|
// Step 3 - Generate JWT
|
||||||
var jwt = Auth.CreateJwt(citizen, _config);
|
var jwt = Auth.CreateJwt(citizen, _config);
|
||||||
|
|
||||||
return new JsonResult(new LogOnSuccess(jwt, citizen.Id.ToString(), citizen.DisplayName));
|
return new JsonResult(new LogOnSuccess(jwt, citizen.Id.ToString(), citizen.CitizenName));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Authorize]
|
[Authorize]
|
||||||
|
|
|
@ -80,13 +80,6 @@ namespace JobsJobsJobs.Server
|
||||||
$"Profiles must be from noagendasocial.com; yours is {profileResponse.AccountName}");
|
$"Profiles must be from noagendasocial.com; yours is {profileResponse.AccountName}");
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the user hasn't filled in a display name, use the username as the display name.
|
|
||||||
// (this is what Mastodon does)
|
|
||||||
if (string.IsNullOrWhiteSpace(profileResponse.DisplayName))
|
|
||||||
{
|
|
||||||
profileResponse.DisplayName = profileResponse.Username;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Result<MastodonAccount>.AsOk(profileResponse);
|
return Result<MastodonAccount>.AsOk(profileResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +97,7 @@ namespace JobsJobsJobs.Server
|
||||||
Subject = new ClaimsIdentity(new[]
|
Subject = new ClaimsIdentity(new[]
|
||||||
{
|
{
|
||||||
new Claim(ClaimTypes.NameIdentifier, citizen.Id.ToString()),
|
new Claim(ClaimTypes.NameIdentifier, citizen.Id.ToString()),
|
||||||
new Claim(ClaimTypes.Name, citizen.DisplayName),
|
new Claim(ClaimTypes.Name, citizen.CitizenName),
|
||||||
}),
|
}),
|
||||||
Expires = DateTime.UtcNow.AddHours(2),
|
Expires = DateTime.UtcNow.AddHours(2),
|
||||||
Issuer = "https://noagendacareers.com",
|
Issuer = "https://noagendacareers.com",
|
||||||
|
|
|
@ -49,11 +49,13 @@ namespace JobsJobsJobs.Server.Data
|
||||||
m.Property(e => e.Id).HasColumnName("id").IsRequired().HasMaxLength(12)
|
m.Property(e => e.Id).HasColumnName("id").IsRequired().HasMaxLength(12)
|
||||||
.HasConversion(Converters.CitizenIdConverter);
|
.HasConversion(Converters.CitizenIdConverter);
|
||||||
m.Property(e => e.NaUser).HasColumnName("na_user").IsRequired().HasMaxLength(50);
|
m.Property(e => e.NaUser).HasColumnName("na_user").IsRequired().HasMaxLength(50);
|
||||||
m.Property(e => e.DisplayName).HasColumnName("display_name").IsRequired().HasMaxLength(255);
|
m.Property(e => e.DisplayName).HasColumnName("display_name").HasMaxLength(255);
|
||||||
m.Property(e => e.ProfileUrl).HasColumnName("profile_url").IsRequired().HasMaxLength(1_024);
|
m.Property(e => e.ProfileUrl).HasColumnName("profile_url").IsRequired().HasMaxLength(1_024);
|
||||||
m.Property(e => e.JoinedOn).HasColumnName("joined_on").IsRequired();
|
m.Property(e => e.JoinedOn).HasColumnName("joined_on").IsRequired();
|
||||||
m.Property(e => e.LastSeenOn).HasColumnName("last_seen_on").IsRequired();
|
m.Property(e => e.LastSeenOn).HasColumnName("last_seen_on").IsRequired();
|
||||||
|
m.Property(e => e.RealName).HasColumnName("real_name").HasMaxLength(255);
|
||||||
m.HasIndex(e => e.NaUser).IsUnique();
|
m.HasIndex(e => e.NaUser).IsUnique();
|
||||||
|
m.Ignore(e => e.CitizenName);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity<Continent>(m =>
|
modelBuilder.Entity<Continent>(m =>
|
||||||
|
|
|
@ -156,7 +156,7 @@ namespace JobsJobsJobs.Server.Data
|
||||||
query = query.Where(it => citizenIds.Contains(it.Citizen.Id));
|
query = query.Where(it => citizenIds.Contains(it.Citizen.Id));
|
||||||
}
|
}
|
||||||
|
|
||||||
return await query.Select(x => new ProfileSearchResult(x.Citizen.Id, x.Citizen.DisplayName,
|
return await query.Select(x => new ProfileSearchResult(x.Citizen.Id, x.Citizen.CitizenName,
|
||||||
x.Profile.SeekingEmployment, x.Profile.RemoteWork, x.Profile.FullTime, x.Profile.LastUpdatedOn))
|
x.Profile.SeekingEmployment, x.Profile.RemoteWork, x.Profile.FullTime, x.Profile.LastUpdatedOn))
|
||||||
.ToListAsync().ConfigureAwait(false);
|
.ToListAsync().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ namespace JobsJobsJobs.Server.Data
|
||||||
await db.Successes
|
await db.Successes
|
||||||
.Join(db.Citizens, s => s.CitizenId, c => c.Id, (s, c) => new { Success = s, Citizen = c })
|
.Join(db.Citizens, s => s.CitizenId, c => c.Id, (s, c) => new { Success = s, Citizen = c })
|
||||||
.OrderByDescending(it => it.Success.RecordedOn)
|
.OrderByDescending(it => it.Success.RecordedOn)
|
||||||
.Select(it => new StoryEntry(it.Success.Id, it.Citizen.Id, it.Citizen.DisplayName,
|
.Select(it => new StoryEntry(it.Success.Id, it.Citizen.Id, it.Citizen.CitizenName,
|
||||||
it.Success.RecordedOn, it.Success.FromHere, it.Success.Story != null))
|
it.Success.RecordedOn, it.Success.FromHere, it.Success.Story != null))
|
||||||
.ToListAsync().ConfigureAwait(false);
|
.ToListAsync().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,8 +8,15 @@ namespace JobsJobsJobs.Shared
|
||||||
public record Citizen(
|
public record Citizen(
|
||||||
CitizenId Id,
|
CitizenId Id,
|
||||||
string NaUser,
|
string NaUser,
|
||||||
string DisplayName,
|
string? DisplayName,
|
||||||
|
string? RealName,
|
||||||
string ProfileUrl,
|
string ProfileUrl,
|
||||||
Instant JoinedOn,
|
Instant JoinedOn,
|
||||||
Instant LastSeenOn);
|
Instant LastSeenOn)
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The user's name by which they should be known
|
||||||
|
/// </summary>
|
||||||
|
public string CitizenName => RealName ?? DisplayName ?? NaUser;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
8
src/database/12-add-real-name.sql
Normal file
8
src/database/12-add-real-name.sql
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
ALTER TABLE jjj.citizen ALTER COLUMN display_name DROP NOT NULL;
|
||||||
|
ALTER TABLE jjj.citizen ADD COLUMN real_name VARCHAR(255);
|
||||||
|
|
||||||
|
COMMENT ON COLUMN jjj.citizen.real_name
|
||||||
|
IS 'The real name of the user';
|
||||||
|
|
||||||
|
-- This can be run as often as needed
|
||||||
|
UPDATE jjj.citizen SET display_name = NULL WHERE display_name = na_user;
|
Loading…
Reference in New Issue
Block a user