fixed running exam cache
This commit is contained in:
parent
fcef3c08df
commit
2a5a243759
4 changed files with 17 additions and 20 deletions
|
@ -24,11 +24,19 @@ public interface ExamDAO extends ActivatableEntityDAO<Exam, Exam>, BulkActionSup
|
||||||
|
|
||||||
/** Get a GrantEntity for the exam of specified id (PK)
|
/** Get a GrantEntity for the exam of specified id (PK)
|
||||||
* This is actually a Exam instance but with no course data loaded.
|
* This is actually a Exam instance but with no course data loaded.
|
||||||
*
|
*
|
||||||
* @param id The id of the exam (PK)
|
* @param id The id of the exam (PK)
|
||||||
* @return Result referring to the GrantEntity of the exam or to an error when happened */
|
* @return Result referring to the GrantEntity of the exam or to an error when happened */
|
||||||
Result<GrantEntity> examGrantEntityByPK(final Long id);
|
Result<GrantEntity> examGrantEntityByPK(final Long id);
|
||||||
|
|
||||||
|
/** Get an Exam GrantEntity by a given ClientConnection id.
|
||||||
|
* This is actually a Exam instance but with no course data loaded.
|
||||||
|
*
|
||||||
|
* @param connectionId the connection identifier
|
||||||
|
* @return a Result containing the Exam GrantEntity by a given ClientConnection id or refer to an error if
|
||||||
|
* happened */
|
||||||
|
Result<GrantEntity> examGrantEntityByClientConnection(Long connectionId);
|
||||||
|
|
||||||
/** Get all active Exams for a given institution.
|
/** Get all active Exams for a given institution.
|
||||||
*
|
*
|
||||||
* @param institutionId the identifier of the institution
|
* @param institutionId the identifier of the institution
|
||||||
|
@ -56,12 +64,6 @@ public interface ExamDAO extends ActivatableEntityDAO<Exam, Exam>, BulkActionSup
|
||||||
key = "#exam.id")
|
key = "#exam.id")
|
||||||
Result<Exam> save(Exam exam);
|
Result<Exam> save(Exam exam);
|
||||||
|
|
||||||
/** Get an Exam by a given ClientConnection id.
|
|
||||||
*
|
|
||||||
* @param connectionId the connection identifier
|
|
||||||
* @return a Result containing the Exam by a given ClientConnection id or refer to an error if happened */
|
|
||||||
Result<Exam> byClientConnection(Long connectionId);
|
|
||||||
|
|
||||||
/** Use this to get identifiers of all exams in a specified state for a specified institution.
|
/** Use this to get identifiers of all exams in a specified state for a specified institution.
|
||||||
*
|
*
|
||||||
* @param institutionId the institution identifier. May be null for all institutions
|
* @param institutionId the institution identifier. May be null for all institutions
|
||||||
|
|
|
@ -92,12 +92,11 @@ public class ExamDAOImpl implements ExamDAO {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
public Result<Exam> byClientConnection(final Long connectionId) {
|
public Result<GrantEntity> examGrantEntityByClientConnection(final Long connectionId) {
|
||||||
return Result.tryCatch(() -> this.clientConnectionRecordMapper
|
return Result.tryCatch(() -> this.clientConnectionRecordMapper
|
||||||
.selectByPrimaryKey(connectionId))
|
.selectByPrimaryKey(connectionId))
|
||||||
.flatMap(ccRecord -> recordById(ccRecord.getExamId()))
|
.flatMap(ccRecord -> recordById(ccRecord.getExamId()))
|
||||||
.flatMap(this::toDomainModelCached)
|
.map(record -> toDomainModel(record, null).getOrThrow());
|
||||||
.onError(TransactionHandler::rollback);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -671,14 +670,6 @@ public class ExamDAOImpl implements ExamDAO {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private Result<Exam> toDomainModelCached(final ExamRecord record) {
|
|
||||||
return Result.tryCatch(() -> this.lmsAPIService
|
|
||||||
.getLmsAPITemplate(record.getLmsSetupId())
|
|
||||||
.getOrThrow())
|
|
||||||
.flatMap(template -> template.getQuizFromCache(record.getExternalId()))
|
|
||||||
.flatMap(quizData -> this.toDomainModel(record, quizData));
|
|
||||||
}
|
|
||||||
|
|
||||||
private Result<Exam> toDomainModel(final ExamRecord record) {
|
private Result<Exam> toDomainModel(final ExamRecord record) {
|
||||||
return toDomainModel(
|
return toDomainModel(
|
||||||
record.getLmsSetupId(),
|
record.getLmsSetupId(),
|
||||||
|
|
|
@ -239,9 +239,13 @@ public class ExamSessionServiceImpl implements ExamSessionService {
|
||||||
.putIfAbsent(Exam.FILTER_ATTR_ACTIVE, Constants.TRUE_STRING)
|
.putIfAbsent(Exam.FILTER_ATTR_ACTIVE, Constants.TRUE_STRING)
|
||||||
.putIfAbsent(Exam.FILTER_ATTR_STATUS, ExamStatus.RUNNING.name());
|
.putIfAbsent(Exam.FILTER_ATTR_STATUS, ExamStatus.RUNNING.name());
|
||||||
|
|
||||||
|
// NOTE: we evict the exam from the cache (if present) to ensure user is seeing always the current state of the Exam
|
||||||
return this.examDAO.allMatching(filterMap, predicate)
|
return this.examDAO.allMatching(filterMap, predicate)
|
||||||
.map(col -> col.stream()
|
.map(col -> col.stream()
|
||||||
.map(exam -> this.examSessionCacheService.getRunningExam(exam.id))
|
.map(exam -> {
|
||||||
|
this.examSessionCacheService.evict(exam);
|
||||||
|
return this.examSessionCacheService.getRunningExam(exam.id);
|
||||||
|
})
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.collect(Collectors.toList()));
|
.collect(Collectors.toList()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,7 +126,7 @@ public class ClientEventController extends ReadonlyEntityController<ClientEvent,
|
||||||
@Override
|
@Override
|
||||||
protected GrantEntity toGrantEntity(final ClientEvent entity) {
|
protected GrantEntity toGrantEntity(final ClientEvent entity) {
|
||||||
return this.examDAO
|
return this.examDAO
|
||||||
.byClientConnection(entity.connectionId)
|
.examGrantEntityByClientConnection(entity.connectionId)
|
||||||
.get();
|
.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue