Explorar el Código

Simple query for all tracks

Lukas Angerer hace 3 años
padre
commit
71ad7a0e9e

+ 2 - 0
.gitignore

@@ -452,3 +452,5 @@ $RECYCLE.BIN/
 ## Configs & Secrets
 ##
 auth_config.json
+/src/RunnersMeet.Server/data/
+/src/RunnersMeet.Server/wwwroot/

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

@@ -1,3 +1,5 @@
+using RunnersMeet.Server.Persistence;
+
 namespace RunnersMeet.Server;
 
 public class AppServer
@@ -32,6 +34,7 @@ public class AppServer
 
 	private void ConfigureServices(IServiceCollection services)
 	{
-
+		services.AddSingleton<IDatabase>(new Database());
+		services.AddScoped<QueryFactory, QueryFactory>();
 	}
 }

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

@@ -1,4 +1,6 @@
 using Microsoft.AspNetCore.Mvc;
+using RunnersMeet.Server.Domain;
+using RunnersMeet.Server.Persistence;
 
 namespace RunnersMeet.Server.Controllers;
 
@@ -6,9 +8,16 @@ namespace RunnersMeet.Server.Controllers;
 [ApiController]
 public class TracksController : ControllerBase
 {
+	private readonly QueryFactory _queryFactory;
+
+	public TracksController(QueryFactory queryFactory)
+	{
+		_queryFactory = queryFactory;
+	}
+
 	[HttpGet]
-	public ActionResult<IEnumerable<string>> GetTracks()
+	public ActionResult<IEnumerable<Track>> GetTracks()
 	{
-		return new string[] { "OK" };
+		return Ok(_queryFactory.TracksQuery().Get());
 	}
 }

+ 6 - 0
src/RunnersMeet.Server/Domain/IUserData.cs

@@ -0,0 +1,6 @@
+namespace RunnersMeet.Server.Domain;
+
+public interface IUserData
+{
+	public string Owner { get; set; }
+}

+ 11 - 0
src/RunnersMeet.Server/Domain/Track.cs

@@ -0,0 +1,11 @@
+namespace RunnersMeet.Server.Domain;
+
+public class Track : IUserData
+{
+	public string Owner { get; set; }
+	public string FileName { get; set; }
+	public string DisplayName { get; set; }
+	public double Distance { get; set; }
+	public double ElevationUp { get; set; }
+	public double ElevationDown { get; set; }
+}

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

@@ -0,0 +1,19 @@
+using LiteDB;
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Persistence;
+
+public class Database : IDatabase
+{
+	private readonly ILiteDatabase _db;
+
+	public ILiteCollection<Track> Tracks { get; }
+
+	public Database()
+	{
+		_db = new LiteDatabase(@"./data/tracks.db");
+
+		Tracks = _db.GetCollection<Track>("tracks");
+		Tracks.EnsureIndex(t => t.FileName);
+	}
+}

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

@@ -0,0 +1,9 @@
+using LiteDB;
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Persistence;
+
+public interface IDatabase
+{
+	ILiteCollection<Track> Tracks { get; }
+}

+ 8 - 0
src/RunnersMeet.Server/Persistence/ITracksQuery.cs

@@ -0,0 +1,8 @@
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Persistence;
+
+public interface ITracksQuery
+{
+	IEnumerable<Track> Get();
+}

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

@@ -0,0 +1,16 @@
+namespace RunnersMeet.Server.Persistence;
+
+public class QueryFactory
+{
+	private readonly IDatabase _database;
+
+	public QueryFactory(IDatabase database)
+	{
+		_database = database;
+	}
+
+	public TracksQuery TracksQuery()
+	{
+		return new TracksQuery(_database);
+	}
+}

+ 18 - 0
src/RunnersMeet.Server/Persistence/TracksQuery.cs

@@ -0,0 +1,18 @@
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Persistence;
+
+public class TracksQuery : ITracksQuery
+{
+	private readonly IDatabase _database;
+
+	public TracksQuery(IDatabase database)
+	{
+		_database = database;
+	}
+
+	public IEnumerable<Track> Get()
+	{
+		return _database.Tracks.Query().OrderBy(t => t.FileName).ToEnumerable();
+	}
+}

+ 1 - 0
src/RunnersMeet.Server/RunnersMeet.Server.csproj

@@ -8,6 +8,7 @@
     </PropertyGroup>
 
     <ItemGroup>
+        <PackageReference Include="LiteDB" Version="5.0.15" />
         <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.1" />
         <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
     </ItemGroup>