Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 0 additions & 26 deletions api/src/Feature.UserPreferences/Get/Endpoint.cs

This file was deleted.

35 changes: 35 additions & 0 deletions api/src/Feature.UserPreferences/GetMe/Endpoint.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Vote.Monitor.Domain.Entities.ApplicationUserAggregate;
using Vote.Monitor.Domain.Repository;

namespace Feature.UserPreferences.GetMe;

public class Endpoint(IReadRepository<ApplicationUser> repository)
: Endpoint<Request, Results<Ok<UserModel>, NotFound<string>>>
{
public override void Configure()
{
Get("/api/users/me");
}

public override async Task<Results<Ok<UserModel>, NotFound<string>>> ExecuteAsync(Request req, CancellationToken ct)
{
var user = await repository.GetByIdAsync(req.Id, ct);
if (user is null)
{
return TypedResults.NotFound("User not found");
}

return TypedResults.Ok(new UserModel
{
Id = user.Id,
Email = user.Email!,
FirstName = user.FirstName,
LastName = user.LastName,
DisplayName = user.DisplayName ?? $"{user.FirstName} {user.LastName}",
PhoneNumber = user.PhoneNumber,
Role = user.Role,
Status = user.Status,
Preferences = user.Preferences
});
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using Vote.Monitor.Core.Security;
using Vote.Monitor.Core.Security;

namespace Feature.UserPreferences.Get;
namespace Feature.UserPreferences.GetMe;

public class Request
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Feature.UserPreferences.Get;
namespace Feature.UserPreferences.GetMe;

public class Validator : Validator<Request>
{
Expand Down
2 changes: 1 addition & 1 deletion api/src/Feature.UserPreferences/Update/Endpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public override async Task<Results<NoContent, NotFound<string>>> ExecuteAsync(Re
return TypedResults.NotFound("User not found");
}

user.Preferences.Update(req.LanguageCode);
user.UpdatePreferences(req.Preferences);

await repository.SaveChangesAsync(ct);

Expand Down
3 changes: 2 additions & 1 deletion api/src/Feature.UserPreferences/Update/Request.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ public class Request
{
[FromClaim(ApplicationClaimTypes.UserId)]
public Guid Id { get; set; }
public string LanguageCode { get; set; }

public Dictionary<string, string> Preferences { get; set; } = new();
}
9 changes: 2 additions & 7 deletions api/src/Feature.UserPreferences/Update/Validator.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
using Vote.Monitor.Core.Constants;

namespace Feature.UserPreferences.Update;
namespace Feature.UserPreferences.Update;

public class Validator : Validator<Request>
{
public Validator()
{
RuleFor(x => x.Id).NotEmpty();
RuleFor(x => x.LanguageCode)
.NotEmpty()
.Must(LanguagesList.IsKnownLanguage)
.WithMessage("Unknown language id.");
RuleFor(x => x.Preferences).NotNull();
}
}
24 changes: 24 additions & 0 deletions api/src/Feature.UserPreferences/UserModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System.Text.Json.Serialization;
using Ardalis.SmartEnum.SystemTextJson;
using Vote.Monitor.Core.Security;
using Vote.Monitor.Domain.Entities.ApplicationUserAggregate;

namespace Feature.UserPreferences;

public record UserModel
{
public required Guid Id { get; init; }
public required string Email { get; init; }
public required string FirstName { get; init; }
public required string LastName { get; init; }
public required string DisplayName { get; init; }
public required string? PhoneNumber { get; init; }

[JsonConverter(typeof(SmartEnumNameConverter<UserRole, string>))]
public required UserRole Role { get; init; }

[JsonConverter(typeof(SmartEnumNameConverter<UserStatus, string>))]
public required UserStatus Status { get; init; }

public required Dictionary<string, string> Preferences { get; init; }
}
6 changes: 0 additions & 6 deletions api/src/Feature.UserPreferences/UserPreferencesModel.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ protected ApplicationUser()
public string? RefreshToken { get; private set; }
public DateTime RefreshTokenExpiryTime { get; private set; }
public UserStatus Status { get; private set; }
public UserPreferences Preferences { get; private set; }
public Dictionary<string, string> Preferences { get; private set; } = new();
public string? InvitationToken { get; private set; } = null;

private ApplicationUser(UserRole role, string firstName, string lastName, string email, string? phoneNumber,
Expand All @@ -34,7 +34,6 @@ private ApplicationUser(UserRole role, string firstName, string lastName, string
PhoneNumber = phoneNumber?.Trim();

Status = UserStatus.Pending;
Preferences = UserPreferences.Defaults;

if (string.IsNullOrEmpty(password.Trim()))
{
Expand Down Expand Up @@ -115,4 +114,9 @@ public void UpdateStatus(UserStatus status)
Deactivate();
}
}

public void UpdatePreferences(Dictionary<string, string> preferences)
{
Preferences = preferences ?? new Dictionary<string, string>();
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Vote.Monitor.Domain.ValueComparers;
using Vote.Monitor.Domain.ValueConverters;

namespace Vote.Monitor.Domain.EntitiesConfiguration;

Expand All @@ -17,10 +19,9 @@ public void Configure(EntityTypeBuilder<ApplicationUser> builder)
.Property(p => p.DisplayName)
.HasComputedColumnSql("\"FirstName\" || ' ' || \"LastName\"", stored: true)
.ValueGeneratedOnAddOrUpdate();

builder.OwnsOne(u => u.Preferences, b =>
{
b.ToJson();
});

builder.Property(u => u.Preferences)
.HasConversion<DictionaryToJsonConverter, DictionaryValueComparer>()
.HasColumnType("jsonb");
}
}
Loading
Loading