Files
YesChef/src/backend/YesChef.Api.IntegrationTests/Builders/UserBuilder.cs
T
Josh Rogers 09bec105f6 Collapse migrations, require email at registration
No deployed environments yet, so consolidate the entire migration history
into a single Initial migration and tighten the schema accordingly.

- User.Email is now non-nullable (required); the partial unique index
  used to tolerate legacy null emails is gone in favor of a plain
  unique index.
- Both register paths require an email up front. Invite-path
  registrations must match the invited address (server ignores any
  mismatched client value); family-code registrations bind whatever the
  user supplies but stay unconfirmed (EmailConfirmedAt = null) since
  the family code does not prove email ownership.
- Validation order in /register reworked: invite/family-code resolution
  runs before duplicate-name/email checks so a consumed token surfaces
  a clean "invitation invalid" error instead of getting masked by the
  duplicate-email response.
- All 14 prior migrations replaced with a single Initial migration.
- Test fixtures, builders, and unit tests updated to supply emails.
- Login page register form now collects an email field; invite-bound
  registrations show the invited address as a read-only input.

Local dev DBs need to be recreated (drop the yeschef-pgdata volume or
the yeschef Postgres database). No production data exists yet.
2026-05-08 22:58:27 -05:00

39 lines
1.1 KiB
C#

using Microsoft.AspNetCore.Identity;
using YesChef.Api.Data;
using YesChef.Api.Entities;
namespace YesChef.Api.IntegrationTests.Builders;
public sealed class UserBuilder
{
private string _name = $"user-{Guid.NewGuid():N}"[..16];
private string _password = "correct-horse-battery-staple";
private string? _email;
public UserBuilder Named(string name) { _name = name; return this; }
public UserBuilder WithPassword(string password) { _password = password; return this; }
public UserBuilder WithEmail(string email) { _email = email; return this; }
public string PlaintextPassword => _password;
public User Build()
{
var user = new User
{
Name = _name,
PasswordHash = "",
Email = _email ?? $"{_name}@example.test",
};
user.PasswordHash = new PasswordHasher<User>().HashPassword(user, _password);
return user;
}
public async Task<User> PersistAsync(YesChefDb db)
{
var user = Build();
db.Users.Add(user);
await db.SaveChangesAsync();
return user;
}
}