SEBSERV-417 skeleton
This commit is contained in:
parent
1c0cf3285b
commit
d09bc1f95c
5 changed files with 114 additions and 17 deletions
|
@ -157,8 +157,16 @@ public final class API {
|
||||||
+ LMS_SETUP_TEST_PATH_SEGMENT
|
+ LMS_SETUP_TEST_PATH_SEGMENT
|
||||||
+ LMS_SETUP_TEST_AD_HOC_PATH_SEGMENT;
|
+ LMS_SETUP_TEST_AD_HOC_PATH_SEGMENT;
|
||||||
|
|
||||||
public static final String LMS_FULL_INTEGRATION_REFRESH_TOKEN_ENDPOINT = "/refresh-access-token";
|
public static final String LMS_FULL_INTEGRATION_EXAM_ENDPOINT = "/exam";
|
||||||
public static final String LMS_FULL_INTEGRATION_LMS_UUID = "lms_uuid";
|
public static final String LMS_FULL_INTEGRATION_CONNECTION_CONFIG_ENDPOINT = "/seb_config";
|
||||||
|
public static final String LMS_FULL_INTEGRATION_LOGIN_TOKEN_ENDPOINT = "/login_token";
|
||||||
|
public static final String LMS_FULL_INTEGRATION_LMS_UUID = "id";
|
||||||
|
public static final String LMS_FULL_INTEGRATION_COURSE_ID = "course_id";
|
||||||
|
public static final String LMS_FULL_INTEGRATION_QUIZ_ID = "quiz_id";
|
||||||
|
public static final String LMS_FULL_INTEGRATION_EXAM_TEMPLATE_ID = "exam_template_id";
|
||||||
|
public static final String LMS_FULL_INTEGRATION_QUIT_PASSWORD = "quit_password";
|
||||||
|
public static final String LMS_FULL_INTEGRATION_QUIT_LINK = "quit_link";
|
||||||
|
|
||||||
|
|
||||||
public static final String USER_ACCOUNT_ENDPOINT = "/useraccount";
|
public static final String USER_ACCOUNT_ENDPOINT = "/useraccount";
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,10 @@
|
||||||
|
|
||||||
package ch.ethz.seb.sebserver.webservice.servicelayer.lms;
|
package ch.ethz.seb.sebserver.webservice.servicelayer.lms;
|
||||||
|
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.exam.Exam;
|
import ch.ethz.seb.sebserver.gbl.model.exam.Exam;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||||
|
|
||||||
|
@ -19,13 +21,28 @@ public interface FullLmsIntegrationService {
|
||||||
|
|
||||||
Result<Void> refreshAccessToken(String lmsUUID);
|
Result<Void> refreshAccessToken(String lmsUUID);
|
||||||
|
|
||||||
Result<Void> applyFullLmsIntegration(Long lmsSetupId, boolean refreshToken);
|
Result<Void> applyFullLmsIntegration(Long lmsSetupId);
|
||||||
|
|
||||||
Result<Void> deleteFullLmsIntegration(Long lmsSetupId);
|
Result<Void> deleteFullLmsIntegration(Long lmsSetupId);
|
||||||
|
|
||||||
Result<Map<String, String>> getExamTemplateSelection();
|
Result<Map<String, String>> getExamTemplateSelection();
|
||||||
|
|
||||||
Result<Exam> importExam(String lmsUUID, String courseId, String quizId, String examTemplateId);
|
Result<Exam> importExam(
|
||||||
|
String lmsUUID,
|
||||||
|
String courseId,
|
||||||
|
String quizId,
|
||||||
|
String examTemplateId,
|
||||||
|
String quitPassword,
|
||||||
|
String quitLink);
|
||||||
|
|
||||||
|
Result<EntityKey> deleteExam(
|
||||||
|
String lmsUUID,
|
||||||
|
String courseId,
|
||||||
|
String quizId);
|
||||||
|
|
||||||
|
Result<Void> streamConnectionConfiguration(
|
||||||
|
String lmsUUID,
|
||||||
|
String courseId,
|
||||||
|
String quizId,
|
||||||
|
OutputStream out);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,9 +8,12 @@
|
||||||
|
|
||||||
package ch.ethz.seb.sebserver.webservice.servicelayer.lms.impl;
|
package ch.ethz.seb.sebserver.webservice.servicelayer.lms.impl;
|
||||||
|
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.exam.Exam;
|
import ch.ethz.seb.sebserver.gbl.model.exam.Exam;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetup;
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
|
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.lms.FullLmsIntegrationService;
|
import ch.ethz.seb.sebserver.webservice.servicelayer.lms.FullLmsIntegrationService;
|
||||||
|
@ -33,7 +36,7 @@ public class FullLmsIntegrationServiceImpl implements FullLmsIntegrationService
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Result<Void> applyFullLmsIntegration(final Long lmsSetupId, final boolean refreshToken) {
|
public Result<Void> applyFullLmsIntegration(final Long lmsSetupId) {
|
||||||
return Result.ofRuntimeError("TODO");
|
return Result.ofRuntimeError("TODO");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +55,31 @@ public class FullLmsIntegrationServiceImpl implements FullLmsIntegrationService
|
||||||
final String lmsUUID,
|
final String lmsUUID,
|
||||||
final String courseId,
|
final String courseId,
|
||||||
final String quizId,
|
final String quizId,
|
||||||
final String examTemplateId) {
|
final String examTemplateId,
|
||||||
|
final String quitPassword,
|
||||||
|
final String quitLink) {
|
||||||
return Result.ofRuntimeError("TODO");
|
return Result.ofRuntimeError("TODO");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Result<EntityKey> deleteExam(
|
||||||
|
final String lmsUUID,
|
||||||
|
final String courseId,
|
||||||
|
final String quizId) {
|
||||||
|
return Result.ofRuntimeError("TODO");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Result<Void> streamConnectionConfiguration(
|
||||||
|
final String lmsUUID,
|
||||||
|
final String courseId,
|
||||||
|
final String quizId,
|
||||||
|
final OutputStream out) {
|
||||||
|
return Result.ofRuntimeError("TODO");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Long findLMSSetup(final String lmsUUID) {
|
||||||
|
// TODO
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,12 @@ package ch.ethz.seb.sebserver.webservice.weblayer.api;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import ch.ethz.seb.sebserver.gbl.api.API;
|
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||||
import ch.ethz.seb.sebserver.gbl.model.Entity;
|
import ch.ethz.seb.sebserver.gbl.model.Entity;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
||||||
|
import ch.ethz.seb.sebserver.gbl.model.exam.Exam;
|
||||||
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
|
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
|
||||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||||
import ch.ethz.seb.sebserver.webservice.servicelayer.lms.FullLmsIntegrationService;
|
import ch.ethz.seb.sebserver.webservice.servicelayer.lms.FullLmsIntegrationService;
|
||||||
|
@ -39,20 +43,62 @@ public class LmsIntegrationController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping(
|
@RequestMapping(
|
||||||
path = API.LMS_FULL_INTEGRATION_REFRESH_TOKEN_ENDPOINT,
|
path = API.LMS_FULL_INTEGRATION_EXAM_ENDPOINT,
|
||||||
method = RequestMethod.POST,
|
method = RequestMethod.POST,
|
||||||
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
|
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
|
||||||
public void refreshAccessToken(
|
public void createExam(
|
||||||
@RequestParam(name = API.LMS_FULL_INTEGRATION_LMS_UUID, required = true) final String lmsUUID,
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_LMS_UUID, required = true) final String lmsUUId,
|
||||||
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_COURSE_ID, required = true) final String courseId,
|
||||||
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_QUIZ_ID, required = true) final String quizId,
|
||||||
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_EXAM_TEMPLATE_ID, required = true) final String templateId,
|
||||||
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_QUIT_PASSWORD, required = false) final String quitPassword,
|
||||||
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_QUIT_LINK, required = false) final String quitLink,
|
||||||
final HttpServletResponse response) {
|
final HttpServletResponse response) {
|
||||||
|
|
||||||
final Result<Void> result = fullLmsIntegrationService.refreshAccessToken(lmsUUID)
|
final Exam exam = fullLmsIntegrationService.importExam(lmsUUId, courseId, quizId, templateId, quitPassword, quitLink)
|
||||||
.onError(e -> log.error("Failed to refresh access token for LMS Setup: {}", lmsUUID, e));
|
.onError(e -> log.error(
|
||||||
|
"Failed to create/import exam: lmsId:{}, courseId: {}, quizId: {}, templateId: {}",
|
||||||
|
lmsUUId, courseId, quizId, templateId, e))
|
||||||
|
.getOrThrow();
|
||||||
|
|
||||||
|
log.info("Auto import of exam successful: {}", exam);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(
|
||||||
|
path = API.LMS_FULL_INTEGRATION_EXAM_ENDPOINT,
|
||||||
|
method = RequestMethod.DELETE,
|
||||||
|
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
|
||||||
|
public void deleteExam(
|
||||||
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_LMS_UUID, required = true) final String lmsUUId,
|
||||||
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_COURSE_ID, required = true) final String courseId,
|
||||||
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_QUIZ_ID, required = true) final String quizId,
|
||||||
|
final HttpServletResponse response) {
|
||||||
|
|
||||||
|
final EntityKey examID = fullLmsIntegrationService.deleteExam(lmsUUId, courseId, quizId)
|
||||||
|
.onError(e -> log.error(
|
||||||
|
"Failed to delete exam: lmsId:{}, courseId: {}, quizId: {}",
|
||||||
|
lmsUUId, courseId, quizId, e))
|
||||||
|
.getOrThrow();
|
||||||
|
|
||||||
|
log.info("Auto delete of exam successful: {}", examID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(
|
||||||
|
path = API.LMS_FULL_INTEGRATION_EXAM_ENDPOINT,
|
||||||
|
method = RequestMethod.DELETE,
|
||||||
|
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
|
||||||
|
produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
|
||||||
|
public void getConnectionConfiguration(
|
||||||
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_LMS_UUID, required = true) final String lmsUUId,
|
||||||
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_COURSE_ID, required = true) final String courseId,
|
||||||
|
@RequestParam(name = API.LMS_FULL_INTEGRATION_QUIZ_ID, required = true) final String quizId,
|
||||||
|
final HttpServletResponse response) throws IOException {
|
||||||
|
|
||||||
|
fullLmsIntegrationService.streamConnectionConfiguration(lmsUUId, courseId, quizId, response.getOutputStream())
|
||||||
|
.onError(e -> log.error(
|
||||||
|
"Failed to stream connection configuration for exam: lmsId:{}, courseId: {}, quizId: {}",
|
||||||
|
lmsUUId, courseId, quizId, e))
|
||||||
|
.getOrThrow();
|
||||||
|
|
||||||
if (result.hasError()) {
|
|
||||||
response.setStatus(HttpStatus.NOT_FOUND.value());
|
|
||||||
} else {
|
|
||||||
response.setStatus(HttpStatus.OK.value());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,6 @@ public abstract class WebserviceResourceConfiguration extends ResourceServerConf
|
||||||
.antMatchers(configurerAdapter.apiEndpoint + API.INFO_ENDPOINT + API.LOGO_PATH_SEGMENT + "/**").permitAll()
|
.antMatchers(configurerAdapter.apiEndpoint + API.INFO_ENDPOINT + API.LOGO_PATH_SEGMENT + "/**").permitAll()
|
||||||
.antMatchers(configurerAdapter.apiEndpoint + API.INFO_ENDPOINT + API.INFO_INST_PATH_SEGMENT + "/**").permitAll()
|
.antMatchers(configurerAdapter.apiEndpoint + API.INFO_ENDPOINT + API.INFO_INST_PATH_SEGMENT + "/**").permitAll()
|
||||||
.antMatchers(configurerAdapter.apiEndpoint + API.REGISTER_ENDPOINT).permitAll()
|
.antMatchers(configurerAdapter.apiEndpoint + API.REGISTER_ENDPOINT).permitAll()
|
||||||
.antMatchers(this.lmsAPIEndpoint + API.LMS_FULL_INTEGRATION_REFRESH_TOKEN_ENDPOINT).permitAll()
|
|
||||||
|
|
||||||
.and()
|
.and()
|
||||||
.antMatcher(configurerAdapter.apiEndpoint + "/**")
|
.antMatcher(configurerAdapter.apiEndpoint + "/**")
|
||||||
|
|
Loading…
Reference in a new issue