Преглед изворни кода

Proper user profile reference and inclusion in the tracks query

Lukas Angerer пре 3 година
родитељ
комит
99d456bd2f

+ 1 - 1
src/RunnersMeet.Client/src/app/tracks/track-edit/track-edit.component.html

@@ -3,7 +3,7 @@
 		<label>ID:</label> {{ track.trackId }}
 	</div>
 	<div>
-		<label>Owner:</label> {{ track.owner }}
+		<label>Owner:</label> {{ track.owner.userId }} / {{ track.owner.displayName }}
 	</div>
 	<div>
 		<label>File Hash:</label> {{ track.fileHash }}

+ 1 - 1
src/RunnersMeet.Client/src/app/tracks/track-view/track-view.component.html

@@ -2,7 +2,7 @@
 	<label>ID:</label> {{ track.trackId }}
 </div>
 <div>
-	<label>Owner:</label> {{ track.owner }}
+	<label>Owner:</label> {{ track.owner.userId }} / {{ track.owner.displayName }}
 </div>
 <div>
 	<label>File Hash:</label> {{ track.fileHash }}

+ 3 - 1
src/RunnersMeet.Client/src/app/tracks/track.ts

@@ -1,6 +1,8 @@
+import { UserProfile } from "../users/user-profile";
+
 export class Track {
 	public trackId: string = '';
-	public owner: string = '';
+	public owner: UserProfile = new UserProfile();
 	public fileHash: string = '';
 	public displayName: string = '';
 	public distance: number = 0;

+ 2 - 1
src/RunnersMeet.Server/Controllers/TracksController.cs

@@ -64,7 +64,8 @@ public class TracksController : ControllerBase
 		{
 			var gpxSummary = _gpxParser.ExtractSummary(_fileStorage.OpenFileRead(fileName));
 			var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? "<unknown>";
-			var track = _queryFactory.CreateTrackCommand().Create(userId, fileName, gpxSummary);
+			var user = _queryFactory.GetUserQuery().Get(userId);
+			var track = _queryFactory.CreateTrackCommand().Create(user, fileName, gpxSummary);
 			return Ok(track);
 		}
 		catch (Exception e)

+ 1 - 1
src/RunnersMeet.Server/Domain/IUserData.cs

@@ -2,5 +2,5 @@ namespace RunnersMeet.Server.Domain;
 
 public interface IUserData
 {
-	public string Owner { get; set; }
+	public UserProfile Owner { get; set; }
 }

+ 2 - 1
src/RunnersMeet.Server/Domain/Track.cs

@@ -7,7 +7,8 @@ namespace RunnersMeet.Server.Domain;
 public class Track : IUserData
 {
 	public ObjectId TrackId { get; set; } = ObjectId.Empty;
-	public string Owner { get; set; } = String.Empty;
+	[BsonRef("users")]
+	public UserProfile Owner { get; set; } = new UserProfile();
 	public string FileHash { get; set; } = String.Empty;
 	public string DisplayName { get; set; } = String.Empty;
 	public double Distance { get; set; }

+ 4 - 0
src/RunnersMeet.Server/Domain/UserProfile.cs

@@ -1,9 +1,13 @@
 // ReSharper disable UnusedAutoPropertyAccessor.Global
 // ReSharper disable PropertyCanBeMadeInitOnly.Global
+
+using LiteDB;
+
 namespace RunnersMeet.Server.Domain;
 
 public class UserProfile
 {
+	public ObjectId UserProfileId { get; set; } = ObjectId.Empty;
 	public string UserId { get; set; } = String.Empty;
 	public string DisplayName { get; set; } = String.Empty;
 }

+ 1 - 1
src/RunnersMeet.Server/Persistence/CreateTrackCommand.cs

@@ -12,7 +12,7 @@ public class CreateTrackCommand
 		_database = database;
 	}
 
-	public Track Create(string owner, FileName fileName, GpxSummary gpxSummary)
+	public Track Create(UserProfile owner, FileName fileName, GpxSummary gpxSummary)
 	{
 		var track = new Track
 		{

+ 3 - 2
src/RunnersMeet.Server/Persistence/Database.cs

@@ -15,8 +15,9 @@ public class Database : IDatabase
 	{
 		_db = new LiteDatabase(persistenceOptions.DataFilePath);
 
-		Tracks = _db.GetCollection<Track>("tracks");
-		Tracks.EnsureIndex(t => t.Owner);
+		Tracks = _db.GetCollection<Track>("tracks")
+			.Include(t => t.Owner);
+		Tracks.EnsureIndex(t => t.Owner.UserId);
 		Tracks.EnsureIndex(t => t.FileHash);
 
 		Users = _db.GetCollection<UserProfile>("users");

+ 1 - 1
src/RunnersMeet.Server/Persistence/DeleteTrackCommand.cs

@@ -21,7 +21,7 @@ public class DeleteTrackCommand
 			throw new ArgumentException($"Track with OID {trackId} does not exist", nameof(trackId));
 		}
 
-		if (dbTrack.Owner != owner)
+		if (dbTrack.Owner.UserId != owner)
 		{
 			throw new SecurityException("Trying to delete a track owned by somebody else");
 		}

+ 24 - 0
src/RunnersMeet.Server/Persistence/GetUserQuery.cs

@@ -0,0 +1,24 @@
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Persistence;
+
+public class GetUserQuery
+{
+	private readonly IDatabase _database;
+
+	public GetUserQuery(IDatabase database)
+	{
+		_database = database;
+	}
+
+	public UserProfile Get(string userId)
+	{
+		var user = _database.Users.FindOne(user => user.UserId == userId);
+		if (user == null)
+		{
+			throw new ApiException($"User with ID {userId} does not exist");
+		}
+
+		return user;
+	}
+}

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

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

+ 1 - 1
src/RunnersMeet.Server/Persistence/TracksQuery.cs

@@ -16,7 +16,7 @@ public class TracksQuery : ITracksQuery
 
 	public TracksQuery ForOwner(string owner)
 	{
-		_query.Where(track => track.Owner == owner);
+		_query.Where(track => track.Owner.UserId == owner);
 		return this;
 	}
 

+ 1 - 1
src/RunnersMeet.Server/Persistence/UpdateTrackCommand.cs

@@ -21,7 +21,7 @@ public class UpdateTrackCommand
 			throw new ArgumentException($"Track with OID {track.TrackId} does not exist", nameof(track));
 		}
 
-		if (dbTrack.Owner != owner)
+		if (dbTrack.Owner.UserId != owner)
 		{
 			throw new SecurityException("Trying to modify a track owned by somebody else");
 		}

+ 1 - 1
src/RunnersMeet.Server/appsettings.json

@@ -14,7 +14,7 @@
 		}
 	},
 	"Persistence": {
-		"DataFilePath": "./data/tracks.db",
+		"DataFilePath": "./data/runners.db",
 		"FileStorageRootPath": "./data/files"
 	},
 	"ApiSettings": {