Skip to content

Commit ef2f5c1

Browse files
authored
Feature/aggregate report (#57)
* added get submissions by evaluation * always return the submission categories with submissions
1 parent 9454b9c commit ef2f5c1

File tree

3 files changed

+63
-25
lines changed

3 files changed

+63
-25
lines changed

Cite.Api/Cite.Api.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk.Web">
22
<PropertyGroup>
3-
<Version>1.7.1</Version>
3+
<Version>1.8.0</Version>
44
<TargetFramework>net8.0</TargetFramework>
55
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
66
<NoWarn>CS1591</NoWarn>

Cite.Api/Controllers/SubmissionController.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,24 @@ public async Task<IActionResult> Get([FromQuery] SubmissionGet queryParameters,
4646
return Ok(list);
4747
}
4848

49+
/// <summary>
50+
/// Gets Submissions by evaluation
51+
/// </summary>
52+
/// <remarks>
53+
/// Returns a list of Submissions for the evaluation.
54+
/// </remarks>
55+
/// <param name="evaluationId"></param>
56+
/// <param name="ct"></param>
57+
/// <returns></returns>
58+
[HttpGet("evaluations/{evaluationId}/submissions")]
59+
[ProducesResponseType(typeof(IEnumerable<Submission>), (int)HttpStatusCode.OK)]
60+
[SwaggerOperation(OperationId = "getByEvaluation")]
61+
public async Task<IActionResult> GetByEvaluation(Guid evaluationId, CancellationToken ct)
62+
{
63+
var list = await _submissionService.GetByEvaluationAsync(evaluationId, ct);
64+
return Ok(list);
65+
}
66+
4967
/// <summary>
5068
/// Gets Submissions by evaluation for current user
5169
/// </summary>
@@ -295,4 +313,3 @@ public async Task<IActionResult> RemoveSubmissionComment([FromRoute] Guid submis
295313

296314
}
297315
}
298-

Cite.Api/Services/SubmissionService.cs

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020
using Cite.Api.Infrastructure.Options;
2121
using Cite.Api.Infrastructure.QueryParameters;
2222
using Cite.Api.ViewModels;
23-
using Cite.Api.Migrations.PostgreSQL.Migrations;
2423

2524
namespace Cite.Api.Services
2625
{
2726
public interface ISubmissionService
2827
{
2928
Task<IEnumerable<ViewModels.Submission>> GetAsync(SubmissionGet queryParameters, CancellationToken ct);
29+
Task<IEnumerable<ViewModels.Submission>> GetByEvaluationAsync(Guid evaluationId, CancellationToken ct);
3030
Task<IEnumerable<ViewModels.Submission>> GetMineByEvaluationAsync(Guid evaluationId, CancellationToken ct);
3131
Task<IEnumerable<ViewModels.Submission>> GetByEvaluationTeamAsync(Guid evaluationId, Guid teamId, CancellationToken ct);
3232
Task<ViewModels.Submission> GetAsync(Guid id, CancellationToken ct);
@@ -137,6 +137,25 @@ public SubmissionService(
137137
return _mapper.Map<IEnumerable<Submission>>(await submissions.ToListAsync());
138138
}
139139

140+
public async Task<IEnumerable<ViewModels.Submission>> GetByEvaluationAsync(Guid evaluationId, CancellationToken ct)
141+
{
142+
if (!(await _authorizationService.AuthorizeAsync(_user, null, new ContentDeveloperRequirement())).Succeeded)
143+
throw new ForbiddenException();
144+
145+
var currentMoveNumber = (await _context.Evaluations.FindAsync(evaluationId)).CurrentMoveNumber;
146+
var scoringModel = (await _context.Evaluations.Include(e => e.ScoringModel).SingleOrDefaultAsync(e => e.Id == evaluationId)).ScoringModel;
147+
var submissionEntities = _context.Submissions
148+
.Include(sm => sm.SubmissionCategories)
149+
.ThenInclude(sc => sc.SubmissionOptions)
150+
.ThenInclude(so => so.SubmissionComments)
151+
.Where(sm => sm.EvaluationId == evaluationId && sm.MoveNumber <= currentMoveNumber);
152+
var submissionEntityList = await submissionEntities
153+
.ToListAsync();
154+
var submissions = _mapper.Map<IEnumerable<Submission>>(submissionEntityList).ToList();
155+
156+
return submissions;
157+
}
158+
140159
public async Task<IEnumerable<ViewModels.Submission>> GetMineByEvaluationAsync(Guid evaluationId, CancellationToken ct)
141160
{
142161
if (!(await _authorizationService.AuthorizeAsync(_user, null, new BaseUserRequirement())).Succeeded)
@@ -151,11 +170,16 @@ public SubmissionService(
151170
var isContributor = team.TeamType.IsOfficialScoreContributor;
152171
var currentMoveNumber = (await _context.Evaluations.FindAsync(evaluationId)).CurrentMoveNumber;
153172
var scoringModel = (await _context.Evaluations.Include(e => e.ScoringModel).SingleOrDefaultAsync(e => e.Id == evaluationId)).ScoringModel;
154-
var submissionEntities = _context.Submissions.Where(sm =>
155-
(sm.UserId == userId && sm.TeamId == teamId && sm.EvaluationId == evaluationId) ||
156-
(sm.UserId == null && sm.TeamId == teamId && sm.EvaluationId == evaluationId) ||
157-
(sm.UserId == null && sm.TeamId == null && sm.EvaluationId == evaluationId && sm.MoveNumber < currentMoveNumber) ||
158-
(sm.UserId == null && sm.TeamId == null && sm.EvaluationId == evaluationId && sm.MoveNumber == currentMoveNumber && isContributor));
173+
var submissionEntities = _context.Submissions
174+
.Include(sm => sm.SubmissionCategories)
175+
.ThenInclude(sc => sc.SubmissionOptions)
176+
.ThenInclude(so => so.SubmissionComments)
177+
.Where(sm =>
178+
(sm.UserId == userId && sm.TeamId == teamId && sm.EvaluationId == evaluationId) ||
179+
(sm.UserId == null && sm.TeamId == teamId && sm.EvaluationId == evaluationId) ||
180+
(sm.UserId == null && sm.TeamId == null && sm.EvaluationId == evaluationId && sm.MoveNumber < currentMoveNumber) ||
181+
(sm.UserId == null && sm.TeamId == null && sm.EvaluationId == evaluationId && sm.MoveNumber == currentMoveNumber && isContributor)
182+
);
159183
if (!scoringModel.UseUserScore)
160184
{
161185
submissionEntities = submissionEntities.Where(sm => !(sm.UserId == userId));
@@ -173,9 +197,6 @@ public SubmissionService(
173197
submissionEntities = submissionEntities.Where(sm => !(sm.UserId == null && sm.TeamId == null));
174198
}
175199
var submissionEntityList = await submissionEntities
176-
.Include(sm => sm.SubmissionCategories)
177-
.ThenInclude(sc => sc.SubmissionOptions)
178-
.ThenInclude(so => so.SubmissionComments)
179200
.ToListAsync();
180201
var submissions = _mapper.Map<IEnumerable<Submission>>(submissionEntityList).ToList();
181202
var averageSubmissions = await GetTeamAndTypeAveragesAsync(evaluationId, team, currentMoveNumber, scoringModel.UseTeamAverageScore, scoringModel.UseTypeAverageScore, ct);
@@ -317,7 +338,7 @@ public SubmissionService(
317338
{
318339
throw new ForbiddenException("TeamType " + teamType.Name + " cannot view the average score for the TeamType.");
319340
}
320-
var isObserver = (await _authorizationService.AuthorizeAsync(_user, null, new EvaluationObserverRequirement(submission.EvaluationId, _context))).Succeeded;
341+
var isObserver = (await _authorizationService.AuthorizeAsync(_user, null, new EvaluationObserverRequirement(submission.EvaluationId, _context))).Succeeded;
321342
var userId = _user.GetId();
322343
var teamIdList = await _context.Teams.Where(t => t.EvaluationId == submission.EvaluationId && t.TeamTypeId == submission.GroupId).Select(t => t.Id).ToListAsync(ct);
323344
var canSeeTeamTypeAverage = await _context.TeamUsers.Where(tu => teamIdList.Contains(tu.TeamId) && tu.UserId == userId).AnyAsync(ct);
@@ -468,19 +489,20 @@ public async Task<Submission> GetTypeAverageAsync(Submission submission, Cancell
468489
{
469490
_logger.LogDebug("Requested submission was created before this call could create it");
470491
// find the requested submission entity
471-
requestedSubmissionEntity = await _context.Submissions.FirstOrDefaultAsync(s =>
472-
s.UserId == submission.UserId &&
473-
s.TeamId == submission.TeamId &&
474-
s.EvaluationId == submission.EvaluationId &&
475-
s.MoveNumber == submission.MoveNumber
476-
);
492+
requestedSubmissionEntity = await _context.Submissions
493+
.FirstOrDefaultAsync(s =>
494+
s.UserId == submission.UserId &&
495+
s.TeamId == submission.TeamId &&
496+
s.EvaluationId == submission.EvaluationId &&
497+
s.MoveNumber == submission.MoveNumber
498+
);
477499
}
478500

479501
// create and send xapi statement
480502
var verb = new Uri("https://w3id.org/xapi/dod-isd/verbs/initiated");
481503
await LogXApiAsync(verb, submission, null, ct);
482504

483-
return _mapper.Map<ViewModels.Submission>(requestedSubmissionEntity);
505+
return await GetAsync(requestedSubmissionEntity.Id, ct);
484506
}
485507

486508
public async Task<ViewModels.Submission> UpdateAsync(Guid id, ViewModels.Submission submission, CancellationToken ct)
@@ -587,7 +609,7 @@ public async Task<Submission> GetTypeAverageAsync(Submission submission, Cancell
587609
}
588610
await LogXApiAsync(verb, null, _mapper.Map<SubmissionOption>(submissionOptionToUpdate), ct);
589611

590-
return _mapper.Map<Submission>(submissionEntity);
612+
return await GetAsync(submissionEntity.Id, ct);
591613
}
592614

593615
private async Task<SubmissionEntity> createRequestedSubmissionAndOthers(ViewModels.Submission submission, CancellationToken ct)
@@ -836,7 +858,7 @@ public async Task<bool> DeleteAsync(Guid id, CancellationToken ct)
836858
submissionEntity.DateModified = submissionComment.DateCreated;
837859
submissionEntity.ModifiedBy = submissionComment.CreatedBy;
838860
await _context.SaveChangesAsync(ct);
839-
861+
840862
return await GetAsync(submissionId, ct);
841863
}
842864

@@ -864,7 +886,7 @@ public async Task<bool> DeleteAsync(Guid id, CancellationToken ct)
864886
submissionEntity.DateModified = submissionComment.DateCreated;
865887
submissionEntity.ModifiedBy = submissionComment.CreatedBy;
866888
await _context.SaveChangesAsync(ct);
867-
889+
868890
return await GetAsync(submissionId, ct);
869891
}
870892

@@ -886,7 +908,7 @@ public async Task<bool> DeleteAsync(Guid id, CancellationToken ct)
886908
submissionEntity.DateModified = DateTime.UtcNow;
887909
submissionEntity.ModifiedBy = _user.GetId();
888910
await _context.SaveChangesAsync(ct);
889-
911+
890912
return await GetAsync(submissionId, ct);
891913
}
892914

@@ -1182,7 +1204,7 @@ private async Task<bool> HasOptionAccess(SubmissionEntity submissionEntity, Canc
11821204

11831205

11841206

1185-
1207+
11861208
}
11871209

11881210
}
@@ -1196,4 +1218,3 @@ public class CategoryScore
11961218
}
11971219

11981220
}
1199-

0 commit comments

Comments
 (0)