86 lines
2.5 KiB
C#
86 lines
2.5 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
|
|
var builder = WebApplication.CreateBuilder(args);
|
|
|
|
// Datenbank-Pfad: /app/data im Container (Volume) - überlebt Container-Neustarts!
|
|
var dbPath = Path.Combine("/app/data", "fitness.db");
|
|
builder.Services.AddDbContext<AppDbContext>(options =>
|
|
options.UseSqlite($"Data Source={dbPath}"));
|
|
|
|
builder.Services.AddEndpointsApiExplorer();
|
|
builder.Services.AddOpenApiDocument();
|
|
builder.Services.AddSwaggerGen();
|
|
|
|
var app = builder.Build();
|
|
|
|
// Datenbank automatisch erstellen, falls sie nicht existiert
|
|
using (var scope = app.Services.CreateScope())
|
|
{
|
|
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
|
|
db.Database.EnsureCreated();
|
|
}
|
|
|
|
if (app.Environment.IsDevelopment())
|
|
{
|
|
app.UseOpenApi();
|
|
app.UseSwaggerUI();
|
|
}
|
|
|
|
app.UseHttpsRedirection();
|
|
|
|
// ===================================================================
|
|
// CRUD ENDPUNKTE (minimal, ohne Auth)
|
|
// ===================================================================
|
|
|
|
// CREATE
|
|
app.MapPost("/api/workouts", async (Workout workout, AppDbContext db) =>
|
|
{
|
|
workout.Id = Guid.NewGuid();
|
|
db.Workouts.Add(workout);
|
|
await db.SaveChangesAsync();
|
|
return Results.Created($"/api/workouts/{workout.Id}", workout);
|
|
});
|
|
|
|
// READ ALL
|
|
app.MapGet("/api/workouts", async (AppDbContext db) =>
|
|
await db.Workouts.OrderByDescending(w => w.Date).ToListAsync());
|
|
|
|
// READ BY ID
|
|
app.MapGet("/api/workouts/{id:guid}", async (Guid id, AppDbContext db) =>
|
|
await db.Workouts.FindAsync(id) is Workout w ? Results.Ok(w) : Results.NotFound());
|
|
|
|
// UPDATE
|
|
app.MapPut("/api/workouts/{id:guid}", async (Guid id, Workout input, AppDbContext db) =>
|
|
{
|
|
var workout = await db.Workouts.FindAsync(id);
|
|
if (workout is null) return Results.NotFound();
|
|
|
|
workout.Name = input.Name;
|
|
workout.Date = input.Date;
|
|
workout.DurationMinutes = input.DurationMinutes;
|
|
workout.Notes = input.Notes;
|
|
await db.SaveChangesAsync();
|
|
return Results.Ok(workout);
|
|
});
|
|
|
|
// DELETE
|
|
app.MapDelete("/api/workouts/{id:guid}", async (Guid id, AppDbContext db) =>
|
|
{
|
|
var workout = await db.Workouts.FindAsync(id);
|
|
if (workout is null) return Results.NotFound();
|
|
|
|
db.Workouts.Remove(workout);
|
|
await db.SaveChangesAsync();
|
|
return Results.NoContent();
|
|
});
|
|
|
|
app.MapGet("/", () => "🏋️ Fitness API läuft!");
|
|
app.Run();
|
|
|
|
public class AppDbContext : DbContext
|
|
{
|
|
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
|
|
public DbSet<Workout> Workouts => Set<Workout>();
|
|
}
|
|
|