public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context) { if (context.Object is SerializableError error) { var errorOutput = JsonSerializer.Serialize(error); context.HttpContext.Response.ContentType = SupportedMediaTypes.First(); await context.HttpContext.Response.WriteAsync(errorOutput); return; } _resourceFactory ??= context.HttpContext.RequestServices.GetRequiredService <IResourceFactory>(); _hateoasSerializer ??= context.HttpContext.RequestServices.GetRequiredService <IHateoasSerializer>(); Resource resource = context.Object switch { IPagination pagination => _resourceFactory.Create(pagination, context.ObjectType), IEnumerable enumerable => _resourceFactory.Create(enumerable, context.ObjectType), _ => _resourceFactory.Create(context.Object, context.ObjectType) }; var formattedResponse = _hateoasSerializer.SerializeResource(resource); context.HttpContext.Response.ContentType = SupportedMediaTypes.Last(); await context.HttpContext.Response.WriteAsync(formattedResponse); } }
public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context) { if (context.Object is SerializableError error) { var errorOutput = JsonConvert.SerializeObject(error); context.HttpContext.Response.ContentType = SupportedMediaTypes.First(); return(context.HttpContext.Response.WriteAsync(errorOutput)); } string hateoasOutput; if (context.ObjectType.GetGenericTypeDefinition() == typeof(Pagination <>)) { var items = context.Object.GetPropertyAsValue <IEnumerable <object> >(nameof(Pagination <object> .Data)); var count = context.Object.GetPropertyAsValue <long>(nameof(Pagination <object> .Count)); var pageSize = context.Object.GetPropertyAsValue <int>(nameof(Pagination <object> .PageSize)); var page = context.Object.GetPropertyAsValue <int>(nameof(Pagination <object> .Page)); var pagination = new Pagination <object>(items, count, pageSize, page); hateoasOutput = GeneratePaginatedHateoasOutput(context.HttpContext, context.ObjectType, pagination); } else { hateoasOutput = GenerateHateoasOutput(context.HttpContext, context.ObjectType, context.Object); } context.HttpContext.Response.ContentType = SupportedMediaTypes.Last(); return(context.HttpContext.Response.WriteAsync(hateoasOutput)); }