Răsfoiți Sursa

Mothods to get a single track and upadte a track

Lukas Angerer 3 ani în urmă
părinte
comite
611d321265

+ 3 - 1
src/RunnersMeet.Server/AppServer.cs

@@ -1,3 +1,4 @@
+using System.Net.Http.Headers;
 using Microsoft.AspNetCore.Authentication.JwtBearer;
 using Microsoft.IdentityModel.Tokens;
 using RunnersMeet.Server.GpxFormat;
@@ -25,7 +26,8 @@ public class AppServer
 			options.AddDefaultPolicy(policy  =>
 			{
 				policy.WithOrigins("http://localhost:4200");
-				policy.WithHeaders("Authorization");
+				policy.WithHeaders("Authorization", "Content-Type");
+				policy.AllowAnyMethod();
 			});
 		});
 

+ 22 - 0
src/RunnersMeet.Server/Controllers/TracksController.cs

@@ -1,4 +1,5 @@
 using System.Security.Claims;
+using LiteDB;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using RunnersMeet.Server.Domain;
@@ -40,4 +41,25 @@ public class TracksController : ControllerBase
 
 		return Ok(track);
 	}
+
+	[HttpGet("{id}")]
+	public ActionResult<Track> GetTrack(string id)
+	{
+		var track = _queryFactory.TrackQuery().Get(new ObjectId(id));
+
+		return Ok(track);
+	}
+
+	[HttpPut("{id}")]
+	public ActionResult<Track> UpdateTrack([FromRoute] string id, [FromBody] Track track)
+	{
+		if (id != track.TrackId.ToString())
+		{
+			throw new ArgumentException("Object ID in URL does not match track ID");
+		}
+		var userId = HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? "<unknown>";
+		var result = _queryFactory.UpdateTrackCommand().Update(userId, track);
+
+		return Ok(result);
+	}
 }

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

@@ -18,4 +18,14 @@ public class QueryFactory
 	{
 		return new CreateTrackCommand(_database);
 	}
+
+	public TrackQuery TrackQuery()
+	{
+		return new TrackQuery(_database);
+	}
+
+	public UpdateTrackCommand UpdateTrackCommand()
+	{
+		return new UpdateTrackCommand(_database);
+	}
 }

+ 19 - 0
src/RunnersMeet.Server/Persistence/TrackQuery.cs

@@ -0,0 +1,19 @@
+using LiteDB;
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Persistence;
+
+public class TrackQuery
+{
+	private readonly IDatabase _database;
+
+	public TrackQuery(IDatabase database)
+	{
+		_database = database;
+	}
+
+	public Track Get(ObjectId trackId)
+	{
+		return _database.Tracks.FindById(trackId);
+	}
+}

+ 35 - 0
src/RunnersMeet.Server/Persistence/UpdateTrackCommand.cs

@@ -0,0 +1,35 @@
+using System.Security;
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Persistence;
+
+public class UpdateTrackCommand
+{
+	private readonly IDatabase _database;
+
+	public UpdateTrackCommand(IDatabase database)
+	{
+		_database = database;
+	}
+
+	public Track Update(string owner, Track track)
+	{
+		var dbTrack = _database.Tracks.FindById(track.TrackId);
+
+		if (dbTrack == null)
+		{
+			throw new ArgumentException($"Track with OID {track.TrackId} does not exist", nameof(track));
+		}
+
+		if (dbTrack.Owner != owner)
+		{
+			throw new SecurityException("Trying to modify a track owned by somebody else");
+		}
+
+		dbTrack.DisplayName = track.DisplayName;
+
+		_database.Tracks.Update(dbTrack);
+
+		return dbTrack;
+	}
+}