Skip to content

Commit fc7a3be

Browse files
MilosMilos
Milos
authored and
Milos
committed
Sparse fields with Repository override
1 parent b25ea1b commit fc7a3be

File tree

4 files changed

+52
-4
lines changed

4 files changed

+52
-4
lines changed

src/JsonApiDotNetCore/Data/DefaultEntityRepository.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,15 @@ public DefaultEntityRepository(
7979
}
8080

8181
/// <inheritdoc />
82-
public virtual IQueryable<TEntity> Get()
82+
public virtual IQueryable<TEntity> Get()
83+
=> _dbSet;
84+
85+
public virtual IQueryable<TEntity> Select(IQueryable<TEntity> entities, List<string> fields)
8386
{
84-
if (_jsonApiContext.QuerySet?.Fields != null && _jsonApiContext.QuerySet.Fields.Count > 0)
85-
return _dbSet.Select(_jsonApiContext.QuerySet?.Fields);
87+
if (fields?.Count > 0)
88+
return entities.Select(fields);
8689

87-
return _dbSet;
90+
return entities;
8891
}
8992

9093
/// <inheritdoc />

src/JsonApiDotNetCore/Data/IEntityReadRepository.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ public interface IEntityReadRepository<TEntity, in TId>
2020
/// </summary>
2121
IQueryable<TEntity> Get();
2222

23+
/// <summary>
24+
/// Apply fields to the provided queryable
25+
/// </summary>
26+
IQueryable<TEntity> Select(IQueryable<TEntity> entities,List<string> fields);
27+
2328
/// <summary>
2429
/// Include a relationship in the query
2530
/// </summary>

src/JsonApiDotNetCore/Services/EntityResourceService.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ public virtual async Task<IEnumerable<TResource>> GetAsync()
108108
if (_jsonApiContext.Options.IncludeTotalRecordCount)
109109
_jsonApiContext.PageManager.TotalRecords = await _entities.CountAsync(entities);
110110

111+
if (_jsonApiContext.QuerySet?.Fields?.Count > 0)
112+
entities = _entities.Select(entities, _jsonApiContext.QuerySet.Fields);
113+
111114
// pagination should be done last since it will execute the query
112115
var pagedEntities = await ApplyPageQueryAsync(entities);
113116
return pagedEntities;

test/JsonApiDotNetCoreExampleTests/Acceptance/Extensibility/RepositoryOverrideTests.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,42 @@ public async Task Total_Record_Count_Included()
6161
foreach(var item in deserializedBody)
6262
Assert.Equal(person.Id, item.OwnerId);
6363
}
64+
65+
[Fact]
66+
public async Task Sparse_Fields_Works_With_Get_Override()
67+
{
68+
// arrange
69+
var builder = new WebHostBuilder()
70+
.UseStartup<AuthorizedStartup>();
71+
var server = new TestServer(builder);
72+
var client = server.CreateClient();
73+
var context = (AppDbContext)server.Host.Services.GetService(typeof(AppDbContext));
74+
var jsonApiContext = (IJsonApiContext)server.Host.Services.GetService(typeof(IJsonApiContext));
75+
76+
var person = new Person();
77+
context.People.Add(person);
78+
var todoItem = new TodoItem();
79+
todoItem.Owner = person;
80+
context.TodoItems.Add(todoItem);
81+
context.SaveChanges();
82+
83+
var authService = (IAuthorizationService)server.Host.Services.GetService(typeof(IAuthorizationService));
84+
authService.CurrentUserId = person.Id;
85+
86+
var httpMethod = new HttpMethod("GET");
87+
var route = $"/api/v1/todo-items/{todoItem.Id}?fields[todo-items]=description";
88+
89+
var request = new HttpRequestMessage(httpMethod, route);
90+
91+
// act
92+
var response = await client.SendAsync(request);
93+
var responseBody = await response.Content.ReadAsStringAsync();
94+
var deserializedBody = _fixture.GetService<IJsonApiDeSerializer>().Deserialize<TodoItem>(responseBody);
95+
96+
// assert
97+
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
98+
Assert.Equal(todoItem.Description, deserializedBody.Description);
99+
100+
}
64101
}
65102
}

0 commit comments

Comments
 (0)