using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Amazon.Lambda.APIGatewayEvents;
using Amazon.Lambda.Core;
using Amazon.Lambda.RuntimeSupport;
using Amazon.Lambda.Serialization.SystemTextJson;
using Amazon.XRay.Recorder.Handlers.AwsSdk;
using Shared;
using Shared.DataAccess;
public class Function
{
private static ProductsDAO dataAccess;
static Function()
{
AWSSDKHandler.RegisterXRayForAllServices();
dataAccess = new DynamoDbProducts();
}
///
/// The main entry point for the custom runtime.
///
///
private static async Task Main()
{
Func> handler = FunctionHandler;
await LambdaBootstrapBuilder.Create(handler, new SourceGeneratorLambdaJsonSerializer(options => {
options.PropertyNameCaseInsensitive = true;
}))
.Build()
.RunAsync();
}
public static async Task FunctionHandler(APIGatewayHttpApiV2ProxyRequest apigProxyEvent, ILambdaContext context)
{
if (!apigProxyEvent.RequestContext.Http.Method.Equals(HttpMethod.Get.Method))
{
return new APIGatewayHttpApiV2ProxyResponse
{
Body = "Only GET allowed",
StatusCode = (int)HttpStatusCode.MethodNotAllowed,
};
}
try
{
var id = apigProxyEvent.PathParameters["id"];
var product = await dataAccess.GetProduct(id);
if (product == null)
{
return new APIGatewayHttpApiV2ProxyResponse
{
Body = "Not Found",
StatusCode = (int)HttpStatusCode.NotFound,
};
}
return new APIGatewayHttpApiV2ProxyResponse
{
StatusCode = (int)HttpStatusCode.OK,
Body = JsonSerializer.Serialize(product, CustomJsonSerializerContext.Default.Product),
Headers = new Dictionary { { "Content-Type", "application/json" } }
};
}
catch (Exception e)
{
context.Logger.LogError($"Error getting product {e.Message} {e.StackTrace}");
return new APIGatewayHttpApiV2ProxyResponse
{
Body = "Not Found",
StatusCode = (int)HttpStatusCode.InternalServerError,
};
}
}
}