using AutoMapper;
using EnvelopeGenerator.Application.EmailTemplates;
using EnvelopeGenerator.Application.EmailTemplates.Commands.Update;
using EnvelopeGenerator.Application.EmailTemplates.Commands.Reset;
using EnvelopeGenerator.Application.EmailTemplates.Queries.Read;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using EnvelopeGenerator.Application.Contracts.Repositories;
using EnvelopeGenerator.Application.DTOs;
using MediatR;
using System.Threading.Tasks;
using DigitalData.UserManager.Application.Services;
using EnvelopeGenerator.Application.Exceptions;
namespace EnvelopeGenerator.GeneratorAPI.Controllers;
///
/// Controller for managing email templates.
/// Steuerung zur Verwaltung von E-Mail-Vorlagen.
///
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class EmailTemplateController : ControllerBase
{
private readonly ILogger _logger;
private readonly IMapper _mapper;
private readonly IEmailTemplateRepository _repository;
private readonly IMediator _mediator;
///
/// Initialisiert eine neue Instanz der -Klasse.
///
///
///
/// Die AutoMapper-Instanz, die zum Zuordnen von Objekten verwendet wird.
///
public EmailTemplateController(IMapper mapper, IEmailTemplateRepository repository, ILogger logger, IMediator mediator)
{
_mapper = mapper;
_repository = repository;
_logger = logger;
_mediator = mediator;
}
///
/// Ruft E-Mail-Vorlagen basierend auf der angegebenen Abfrage ab.
/// Gibt alles zurück, wenn keine Id- oder Typ-Informationen eingegeben wurden.
///
/// Die Abfrageparameter zum Abrufen von E-Mail-Vorlagen.
/// Gibt HTTP-Antwort zurück
///
/// Sample request:
/// GET /api/EmailTemplate?emailTemplateId=123
///
/// Wenn die E-Mail-Vorlagen erfolgreich abgerufen werden.
/// Wenn die Abfrageparameter ungültig sind.
/// Wenn der Benutzer nicht authentifiziert ist.
/// Wenn die gesuchte Abfrage nicht gefunden wird.
[HttpGet]
public async Task Get([FromQuery] ReadEmailTemplateQuery? emailTemplate = null)
{
try
{
if (emailTemplate is null || (emailTemplate.Id is null && emailTemplate.Type is null))
{
var temps = await _repository.ReadAllAsync();
return Ok(_mapper.Map>(temps));
}
else
{
var temp = await _mediator.Send(emailTemplate);
return temp is null ? NotFound() : Ok(temp);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
///
/// Updates an email template or resets it if no update command is provided.
/// Aktualisiert eine E-Mail-Vorlage oder setzt sie zurück, wenn kein Aktualisierungsbefehl angegeben ist.
///
/// Die E-Mail-Vorlagenabfrage.
/// Der Aktualisierungsbefehl für die E-Mail-Vorlage.
/// Wird auf Standardwert aktualisiert, wenn die Anfrage ohne http-Body gesendet wird.
///
/// Gibt HTTP-Antwort zurück
///
/// Sample request:
/// PUT /api/EmailTemplate
/// {
/// "emailTemplateId": 123,
/// "newContent": "Updated content"
/// }
///
/// Wenn die E-Mail-Vorlage erfolgreich aktualisiert oder zurückgesetzt wird.
/// Wenn die Abfrage ohne einen String gesendet wird.
/// Wenn der Benutzer nicht authentifiziert ist.
/// Wenn die gesuchte Abfrage nicht gefunden wird.
[HttpPut]
public async Task Update([FromQuery] EmailTemplateQuery email, [FromBody] UpdateEmailTemplateCommand? update = null)
{
try
{
if (update is null)
{
var reset = _mapper.Map(email);
await _mediator.Send(new ResetEnvelopeTemplateCommand(email?.Id, email?.Type));
return Ok();
}
else
{
var reset = _mapper.Map(email);
await _mediator.Send(update);
return Ok();
}
}
catch(NotFoundException)
{
return BadRequest();
}
catch (Exception ex)
{
_logger.LogError(ex, "An unexpected error occurred. {message}", ex.Message);
return new StatusCodeResult(StatusCodes.Status500InternalServerError);
}
}
}