diff --git a/RazorPagesMovie/Api/V1/Contact/ContactDto.cs b/RazorPagesMovie/Api/V1/Contact/ContactDto.cs new file mode 100644 index 0000000..55d50e0 --- /dev/null +++ b/RazorPagesMovie/Api/V1/Contact/ContactDto.cs @@ -0,0 +1,3 @@ +namespace RazorPagesMovie.Api.V1.Contact; + +public record ContactDto(string? Name, string? Email, string? Phone, string? Subject, string? Message); diff --git a/RazorPagesMovie/Controllers/Api/V1/ContactController.cs b/RazorPagesMovie/Controllers/Api/V1/ContactController.cs new file mode 100644 index 0000000..50be768 --- /dev/null +++ b/RazorPagesMovie/Controllers/Api/V1/ContactController.cs @@ -0,0 +1,36 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using RazorPagesMovie.Api.V1.Contact; +using RazorPagesMovie.Data; +using RazorPagesMovie.Models; + +namespace RazorPagesMovie.Controllers.Api.V1; + +[ApiController] +[Route("api/v1/[controller]")] +public class ContactController(RazorPagesMovieContext context) : ControllerBase +{ + [HttpPost] + public async Task Post(ContactDto request) + { + var contactMessage = new ContactMessage + { + Name = request.Name ?? string.Empty, + Email = request.Email ?? string.Empty, + Phone = request.Phone, + Subject = request.Subject, + Message = request.Message ?? string.Empty + }; + + var validationResults = new List(); + if (!Validator.TryValidateObject(contactMessage, new ValidationContext(contactMessage), validationResults, validateAllProperties: true)) + { + return BadRequest(new { error = "Bitte alle Pflichtfelder korrekt ausfüllen." }); + } + + context.ContactMessage.Add(contactMessage); + await context.SaveChangesAsync(); + + return Ok(new { success = true }); + } +} diff --git a/RazorPagesMovie/Program.cs b/RazorPagesMovie/Program.cs index 8bad920..36cb4f0 100644 --- a/RazorPagesMovie/Program.cs +++ b/RazorPagesMovie/Program.cs @@ -1,4 +1,3 @@ -using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.EntityFrameworkCore; using RazorPagesMovie.Data; @@ -6,7 +5,12 @@ using RazorPagesMovie.Models; using RazorPagesMovie.Services; var builder = WebApplication.CreateBuilder(args); -builder.Configuration.AddJsonFile("appsettings.Local.json", optional: true, reloadOnChange: true); + +if (builder.Environment.IsDevelopment()) +{ + builder.Configuration.AddJsonFile("appsettings.Local.json", optional: true, reloadOnChange: true); +} + builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found."))); @@ -22,6 +26,7 @@ builder.Services.AddRazorPages(options => { options.Conventions.AuthorizeFolder("/Admin"); }); +builder.Services.AddControllers(); builder.Services.AddHttpClient(); builder.Services.AddHostedService(); @@ -32,7 +37,9 @@ using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; var context = services.GetRequiredService(); + context.Database.Migrate(); + SeedData.Initialize(services); } @@ -48,30 +55,6 @@ app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages(); - -app.MapPost("/api/contact", async (ContactMessageRequest request, RazorPagesMovieContext context) => -{ - var contactMessage = new ContactMessage - { - Name = request.Name ?? string.Empty, - Email = request.Email ?? string.Empty, - Phone = request.Phone, - Subject = request.Subject, - Message = request.Message ?? string.Empty - }; - - var validationResults = new List(); - if (!Validator.TryValidateObject(contactMessage, new ValidationContext(contactMessage), validationResults, validateAllProperties: true)) - { - return Results.BadRequest(new { error = "Bitte alle Pflichtfelder korrekt ausfüllen." }); - } - - context.ContactMessage.Add(contactMessage); - await context.SaveChangesAsync(); - - return Results.Ok(new { success = true }); -}); +app.MapControllers(); app.Run(); - -record ContactMessageRequest(string? Name, string? Email, string? Phone, string? Subject, string? Message);