Bladeren bron

User profile creation

Lukas Angerer 3 jaren geleden
bovenliggende
commit
a2e50baf32

+ 1 - 1
src/RunnersMeet.Client/src/app/users/users-api.service.ts

@@ -16,7 +16,7 @@ export class UsersApiService {
 	) { }
 
 	public validatePermissions(user: User): Promise<UserValidationResult> {
-		return lastValueFrom(this.http.get<UserValidationResult>(this.config.apiUri(`/api/users/validate`)))
+		return lastValueFrom(this.http.get<UserValidationResult>(this.config.apiUri(`/api/users/validate?nickname=${user.nickname}`)))
 			.then(result => {
 				result.user = user;
 				return result;

+ 18 - 5
src/RunnersMeet.Server/Controllers/UsersController.cs

@@ -2,6 +2,7 @@ using System.Security.Claims;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using RunnersMeet.Server.Domain;
+using RunnersMeet.Server.Persistence;
 
 namespace RunnersMeet.Server.Controllers;
 
@@ -10,15 +11,27 @@ namespace RunnersMeet.Server.Controllers;
 [Authorize]
 public class UsersController : ControllerBase
 {
+	private readonly QueryFactory _queryFactory;
+
+	public UsersController(QueryFactory queryFactory)
+	{
+		_queryFactory = queryFactory;
+	}
+
 	[HttpGet("validate")]
-	public ActionResult<UserValidationResult> Validate()
+	public ActionResult<UserValidationResult> Validate([FromQuery] string? nickname)
 	{
+		var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
+		if (userId == null)
+		{
+			throw new ApiException("UsersController.Validate call without a User / authentication token");
+		}
+
+		var userProfile = _queryFactory.ValidateUserCommand().Validate(userId, nickname);
+
 		return new UserValidationResult
 		{
-			UserProfile = new UserProfile {
-				UserId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? "<unknown>",
-				DisplayName = "TODO",
-			},
+			UserProfile = userProfile,
 			Claims = User.FindAll("permissions").Select(claim => claim.Value),
 		};
 	}

+ 5 - 0
src/RunnersMeet.Server/Persistence/Database.cs

@@ -9,6 +9,8 @@ public class Database : IDatabase
 
 	public ILiteCollection<Track> Tracks { get; }
 
+	public ILiteCollection<UserProfile> Users { get; }
+
 	public Database(IPersistenceOptions persistenceOptions)
 	{
 		_db = new LiteDatabase(persistenceOptions.DataFilePath);
@@ -16,5 +18,8 @@ public class Database : IDatabase
 		Tracks = _db.GetCollection<Track>("tracks");
 		Tracks.EnsureIndex(t => t.Owner);
 		Tracks.EnsureIndex(t => t.FileHash);
+
+		Users = _db.GetCollection<UserProfile>("users");
+		Users.EnsureIndex(u => u.UserId);
 	}
 }

+ 1 - 0
src/RunnersMeet.Server/Persistence/IDatabase.cs

@@ -6,4 +6,5 @@ namespace RunnersMeet.Server.Persistence;
 public interface IDatabase
 {
 	ILiteCollection<Track> Tracks { get; }
+	ILiteCollection<UserProfile> Users { get; }
 }

+ 5 - 0
src/RunnersMeet.Server/Persistence/QueryFactory.cs

@@ -33,4 +33,9 @@ public class QueryFactory
 	{
 		return new DeleteTrackCommand(_database);
 	}
+
+	public ValidateUserCommand ValidateUserCommand()
+	{
+		return new ValidateUserCommand(_database);
+	}
 }

+ 29 - 0
src/RunnersMeet.Server/Persistence/ValidateUserCommand.cs

@@ -0,0 +1,29 @@
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Persistence;
+
+public class ValidateUserCommand
+{
+	private readonly IDatabase _database;
+
+	public ValidateUserCommand(IDatabase database)
+	{
+		_database = database;
+	}
+
+	public UserProfile Validate(string userId, string? displayName)
+	{
+		var user = _database.Users.FindOne(user => user.UserId == userId);
+		if (user == null)
+		{
+			user = new UserProfile
+			{
+				UserId = userId,
+				DisplayName = displayName ?? userId,
+			};
+			_database.Users.Insert(user);
+		}
+
+		return user;
+	}
+}