ShiftScheduler/Server/Controllers/ConfigurationController.cs
Copilot e8db13191e
Add Google OAuth authentication with configurable authorized emails (#29)
* Initial plan

* Add Google authentication with authorized email configuration

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Complete Google authentication implementation with documentation

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Fix CORS error by removing [Authorize] from auth user endpoint

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Add authorization attribute to ConfigurationController for security

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Fix JavaScript error in login button by correcting window.location.href usage

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Fix Google OAuth redirect URI configuration to resolve authentication error

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Fix OAuth state validation error by specifying authentication scheme in callback

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Fix OAuth state validation error by improving authentication configuration

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Fix authentication setup documentation with correct redirect URI

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Fix navigation buttons overlapping with authentication header

Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>

* Remove unused unsing

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com>
Co-authored-by: Claudio Schaad <clayschaad@users.noreply.github.com>
Co-authored-by: Claudio Schaad <c.schaad@pog.ch>
2025-08-27 21:18:50 +02:00

75 lines
No EOL
2.2 KiB
C#

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using ShiftScheduler.Services;
using ShiftScheduler.Shared;
using System.Text;
namespace ShiftScheduler.Server.Controllers
{
[ApiController]
[Route("api/[controller]")]
[Authorize(Policy = "AllowedEmails")]
public class ConfigurationController : ControllerBase
{
private readonly IConfigurationService _configurationService;
public ConfigurationController(IConfigurationService configurationService)
{
_configurationService = configurationService;
}
[HttpGet]
public IActionResult GetConfiguration()
{
return Ok(_configurationService.GetConfiguration());
}
[HttpPut]
public IActionResult UpdateConfiguration([FromBody] ApplicationConfiguration configuration)
{
try
{
_configurationService.UpdateConfiguration(configuration);
return Ok();
}
catch (Exception ex)
{
return BadRequest($"Failed to update configuration: {ex.Message}");
}
}
[HttpGet("export")]
public async Task<IActionResult> ExportConfiguration()
{
try
{
var json = await _configurationService.ExportConfigurationAsync();
var bytes = Encoding.UTF8.GetBytes(json);
return File(bytes, "application/json", "ShiftScheduler-Configuration.json");
}
catch (Exception ex)
{
return BadRequest($"Failed to export configuration: {ex.Message}");
}
}
[HttpPost("import")]
public async Task<IActionResult> ImportConfiguration([FromBody] ImportConfigurationRequest request)
{
try
{
await _configurationService.ImportConfigurationAsync(request.JsonContent);
return Ok();
}
catch (Exception ex)
{
return BadRequest($"Failed to import configuration: {ex.Message}");
}
}
}
public class ImportConfigurationRequest
{
public string JsonContent { get; set; } = string.Empty;
}
}