using System;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
using AWS.Lambda.Powertools.Logging;
using AWS.Lambda.Powertools.Tracing;
using KinesisEventHandler.Handlers;
using KinesisEventHandler.Models;
using KinesisEventHandler.Repositories;
using KinesisEventHandler.Repositories.Models;
using Microsoft.Extensions.DependencyInjection;
using KinesisEventHandler.Infrastructure;
namespace KinesisEventHandler.Functions;
///
/// This class implements the business logic of the function. The function handler can be found in
/// the base abstract class KinesisEventHandler::Handler
///
public class ProcessEmployeeFunction : KinesisEventHandler
{
private readonly IDynamoDbRepository _employeeRepository;
public ProcessEmployeeFunction()
{
_employeeRepository = ServiceProvider.GetRequiredService>();
}
public ProcessEmployeeFunction(IDynamoDbRepository employeeRepository)
{
_employeeRepository = employeeRepository;
}
[Tracing(SegmentName = "ProcessKinesisRecord")]
public override async Task ProcessKinesisRecord(Employee record, ILambdaContext lambdaContext)
{
using var cts = lambdaContext.GetCancellationTokenSource();
var response = await _employeeRepository.PutItemAsync(record.AsDto(), cts.Token);
Logger.LogInformation($"{response}, {record}");
}
[Tracing(SegmentName = "ValidateKinesisRecord")]
public override Task ValidateKinesisRecord(Employee record)
{
if (record == null)
throw new ArgumentNullException(nameof(record));
if (string.IsNullOrEmpty(record.EmployeeId))
throw new ValidationException($"'{nameof(record.EmployeeId)}' cannot be null or empty");
return Task.FromResult(true);
}
}