Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@
import org.jboss.resteasy.annotations.GZIP;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.DuplicateAssignmentException;
import uk.ac.cam.cl.dtg.isaac.api.managers.AssignmentManager;
import uk.ac.cam.cl.dtg.isaac.api.managers.DuplicateAssignmentException;
import uk.ac.cam.cl.dtg.isaac.api.managers.GameManager;
import uk.ac.cam.cl.dtg.isaac.api.services.AssignmentService;
import uk.ac.cam.cl.dtg.isaac.dos.LightweightQuestionValidationResponse;
Expand Down
14 changes: 7 additions & 7 deletions src/main/java/uk/ac/cam/cl/dtg/isaac/api/EventsFacade.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,14 +92,14 @@
import org.jboss.resteasy.annotations.GZIP;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.cam.cl.dtg.isaac.api.managers.DuplicateBookingException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.DuplicateBookingException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventBookingUpdateException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventDeadlineException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventGroupReservationLimitException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventIsCancelledException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventIsFullException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventIsNotFullException;
import uk.ac.cam.cl.dtg.isaac.api.managers.EventBookingManager;
import uk.ac.cam.cl.dtg.isaac.api.managers.EventBookingUpdateException;
import uk.ac.cam.cl.dtg.isaac.api.managers.EventDeadlineException;
import uk.ac.cam.cl.dtg.isaac.api.managers.EventGroupReservationLimitException;
import uk.ac.cam.cl.dtg.isaac.api.managers.EventIsCancelledException;
import uk.ac.cam.cl.dtg.isaac.api.managers.EventIsFullException;
import uk.ac.cam.cl.dtg.isaac.api.managers.EventIsNotFullException;
import uk.ac.cam.cl.dtg.isaac.dos.EventStatus;
import uk.ac.cam.cl.dtg.isaac.dos.eventbookings.BookingStatus;
import uk.ac.cam.cl.dtg.isaac.dos.users.Role;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@
import org.jboss.resteasy.annotations.GZIP;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.cam.cl.dtg.isaac.api.managers.DuplicateGameboardException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.DuplicateGameboardException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.InvalidGameboardException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.NoWildcardException;
import uk.ac.cam.cl.dtg.isaac.api.managers.GameManager;
import uk.ac.cam.cl.dtg.isaac.api.managers.InvalidGameboardException;
import uk.ac.cam.cl.dtg.isaac.api.managers.NoWildcardException;
import uk.ac.cam.cl.dtg.isaac.dos.GameboardCreationMethod;
import uk.ac.cam.cl.dtg.isaac.dos.IsaacWildcard;
import uk.ac.cam.cl.dtg.isaac.dos.QuestionValidationResponse;
Expand Down
35 changes: 34 additions & 1 deletion src/main/java/uk/ac/cam/cl/dtg/isaac/api/IsaacController.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,10 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.DefaultValue;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
Expand All @@ -65,7 +67,10 @@
import org.jboss.resteasy.annotations.GZIP;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.InvalidTimestampException;
import uk.ac.cam.cl.dtg.isaac.api.requests.PrivacyPolicyRequest;
import uk.ac.cam.cl.dtg.isaac.api.services.ContentSummarizerService;
import uk.ac.cam.cl.dtg.isaac.api.services.PrivacyPolicyService;
import uk.ac.cam.cl.dtg.isaac.dos.IUserStreaksManager;
import uk.ac.cam.cl.dtg.isaac.dto.ResultsWrapper;
import uk.ac.cam.cl.dtg.isaac.dto.SegueErrorResponse;
Expand All @@ -85,6 +90,7 @@
import uk.ac.cam.cl.dtg.segue.dao.content.GitContentManager;
import uk.ac.cam.cl.dtg.util.PropertiesLoader;


/**
* Isaac Controller
* <br>
Expand All @@ -107,6 +113,7 @@ public class IsaacController extends AbstractIsaacFacade {
private final UserBadgeManager userBadgeManager;
private final IUserStreaksManager userStreaksManager;
private final ContentSummarizerService contentSummarizerService;
private final PrivacyPolicyService privacyPolicyService;

private static long lastQuestionCount = 0L;

Expand Down Expand Up @@ -152,7 +159,8 @@ public IsaacController(final PropertiesLoader propertiesLoader, final ILogManage
final GitContentManager contentManager, final UserAssociationManager associationManager,
@Named(CONTENT_INDEX) final String contentIndex, final IUserStreaksManager userStreaksManager,
final UserBadgeManager userBadgeManager,
final ContentSummarizerService contentSummarizerService) {
final ContentSummarizerService contentSummarizerService,
final PrivacyPolicyService privacyPolicyService) {
super(propertiesLoader, logManager);
this.statsManager = statsManager;
this.userManager = userManager;
Expand All @@ -162,6 +170,7 @@ public IsaacController(final PropertiesLoader propertiesLoader, final ILogManage
this.userBadgeManager = userBadgeManager;
this.userStreaksManager = userStreaksManager;
this.contentSummarizerService = contentSummarizerService;
this.privacyPolicyService = privacyPolicyService;
}

/**
Expand Down Expand Up @@ -489,6 +498,30 @@ public final Response getCurrentUserSnapshot(@Context final HttpServletRequest r
return Response.ok(userSnapshot).cacheControl(getCacheControl(NEVER_CACHE_WITHOUT_ETAG_CHECK, false)).build();
}

@POST
@Path("/users/accept-privacy-policy")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Operation(summary = "Accept the privacy policy for the current user.")
public Response acceptPrivacyPolicy(@Context final HttpServletRequest request,
PrivacyPolicyRequest privacyPolicyRequest) {
try {
privacyPolicyService.acceptPrivacyPolicy(request, privacyPolicyRequest);
return Response.ok().build();

} catch (NoUserLoggedInException e) {
return SegueErrorResponse.getNotLoggedInResponse();

} catch (InvalidTimestampException e) {
log.warn("Invalid timestamp provided: {}", e.getMessage());
return new SegueErrorResponse(Status.BAD_REQUEST, "Invalid timestamp: " + e.getMessage()).toResponse();

} catch (SegueDatabaseException e) {
log.error("Database error during privacy policy acceptance", e);
return new SegueErrorResponse(Status.INTERNAL_SERVER_ERROR, "Database error").toResponse();
}
}

/**
* Get some statistics out of how many questions the user has completed.
* <br>
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/uk/ac/cam/cl/dtg/isaac/api/QuizFacade.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,10 @@
import org.jboss.resteasy.annotations.GZIP;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.cam.cl.dtg.isaac.api.managers.AssignmentCancelledException;
import uk.ac.cam.cl.dtg.isaac.api.managers.AttemptCompletedException;
import uk.ac.cam.cl.dtg.isaac.api.managers.DueBeforeNowException;
import uk.ac.cam.cl.dtg.isaac.api.managers.DuplicateAssignmentException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.AssignmentCancelledException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.AttemptCompletedException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.DueBeforeNowException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.DuplicateAssignmentException;
import uk.ac.cam.cl.dtg.isaac.api.managers.QuizAssignmentManager;
import uk.ac.cam.cl.dtg.isaac.api.managers.QuizAttemptManager;
import uk.ac.cam.cl.dtg.isaac.api.managers.QuizManager;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

public class AssignmentCancelledException extends Exception {
private static final long serialVersionUID = 4862878947772927260L;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

public class AttemptCompletedException extends Exception {
private static final long serialVersionUID = -1062901117738824285L;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

import uk.ac.cam.cl.dtg.segue.dao.SegueDatabaseException;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

import uk.ac.cam.cl.dtg.segue.dao.SegueDatabaseException;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

/**
* DuplicateBookingException
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

/**
* An exception that indicates a gameboard already exists with the id provided.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

/**
* Created by sac92 on 07/06/2016.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

/**
* Indicates the event booking deadline has passed.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

/**
* Indicates that the user is trying to request reservations exceeding the limit specified.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

/**
* EventCancelledException.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

/**
* Indicates the event is full.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

/**
* Indicates the event is NOT full.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

/**
* An exception that indicates an invalid gameboard has been provided.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

public class InvalidTimestampException extends Exception {
public InvalidTimestampException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package uk.ac.cam.cl.dtg.isaac.api.managers;
package uk.ac.cam.cl.dtg.isaac.api.exceptions;

/**
* Exception for when an IsaacWildcard cannot be found/provided.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.DuplicateAssignmentException;
import uk.ac.cam.cl.dtg.isaac.api.services.EmailService;
import uk.ac.cam.cl.dtg.isaac.dao.IAssignmentPersistenceManager;
import uk.ac.cam.cl.dtg.isaac.dto.AssignmentDTO;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,13 @@
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.DuplicateBookingException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventBookingUpdateException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventDeadlineException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventGroupReservationLimitException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventIsCancelledException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventIsFullException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.EventIsNotFullException;
import uk.ac.cam.cl.dtg.isaac.dao.EventBookingPersistenceManager;
import uk.ac.cam.cl.dtg.isaac.dos.AssociationToken;
import uk.ac.cam.cl.dtg.isaac.dos.EventStatus;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.cam.cl.dtg.isaac.api.Constants;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.DuplicateGameboardException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.InvalidGameboardException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.NoWildcardException;
import uk.ac.cam.cl.dtg.isaac.dao.GameboardPersistenceManager;
import uk.ac.cam.cl.dtg.isaac.dos.AudienceContext;
import uk.ac.cam.cl.dtg.isaac.dos.GameboardContentDescriptor;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.AssignmentCancelledException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.DueBeforeNowException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.DuplicateAssignmentException;
import uk.ac.cam.cl.dtg.isaac.api.services.EmailService;
import uk.ac.cam.cl.dtg.isaac.dao.IQuizAssignmentPersistenceManager;
import uk.ac.cam.cl.dtg.isaac.dto.IAssignmentLike;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.AttemptCompletedException;
import uk.ac.cam.cl.dtg.isaac.dao.IQuizAttemptPersistenceManager;
import uk.ac.cam.cl.dtg.isaac.dto.IsaacQuizDTO;
import uk.ac.cam.cl.dtg.isaac.dto.QuizAssignmentDTO;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package uk.ac.cam.cl.dtg.isaac.api.requests;

import java.time.Instant;


public class PrivacyPolicyRequest {
private long privacyPolicyAcceptedTime;

public Instant getPrivacyPolicyAcceptedTimeInstant() {
return Instant.ofEpochMilli(privacyPolicyAcceptedTime);
}

public long getPrivacyPolicyAcceptedTime() {
return privacyPolicyAcceptedTime;
}

public void setPrivacyPolicyAcceptedTime(long privacyPolicyAcceptedTime) {
this.privacyPolicyAcceptedTime = privacyPolicyAcceptedTime;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package uk.ac.cam.cl.dtg.isaac.api.services;

import com.google.inject.Inject;
import jakarta.servlet.http.HttpServletRequest;
import java.time.Instant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.InvalidTimestampException;
import uk.ac.cam.cl.dtg.isaac.api.requests.PrivacyPolicyRequest;
import uk.ac.cam.cl.dtg.isaac.dto.users.RegisteredUserDTO;
import uk.ac.cam.cl.dtg.segue.api.managers.UserAccountManager;
import uk.ac.cam.cl.dtg.segue.auth.exceptions.NoUserLoggedInException;
import uk.ac.cam.cl.dtg.segue.dao.SegueDatabaseException;

public class PrivacyPolicyService {

private static final Logger log = LoggerFactory.getLogger(PrivacyPolicyService.class);

private final UserAccountManager userManager;

@Inject
public PrivacyPolicyService(UserAccountManager userManager) {
this.userManager = userManager;
}

/**
* Accept privacy policy with timestamp validation.
*
* @param request HTTP request to get current user
* @param privacyPolicyRequest Request containing the timestamp
* @throws NoUserLoggedInException if no user is logged in
* @throws SegueDatabaseException if database error occurs
* @throws InvalidTimestampException if timestamp is too far from current time
*/
public void acceptPrivacyPolicy(HttpServletRequest request, PrivacyPolicyRequest privacyPolicyRequest)
throws NoUserLoggedInException, SegueDatabaseException, InvalidTimestampException {

RegisteredUserDTO user = userManager.getCurrentRegisteredUser(request);

Instant providedTime = privacyPolicyRequest.getPrivacyPolicyAcceptedTimeInstant();

Instant now = Instant.now();
Instant privacyPolicyTime = providedTime.isAfter(now) ? now : providedTime;

userManager.updatePrivacyPolicyAcceptedTime(user, privacyPolicyTime);

log.info("User {} accepted privacy policy at {}", user.getEmail(), privacyPolicyTime);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
package uk.ac.cam.cl.dtg.isaac.dao;

import java.util.List;
import uk.ac.cam.cl.dtg.isaac.api.managers.AssignmentCancelledException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.AssignmentCancelledException;
import uk.ac.cam.cl.dtg.isaac.dto.QuizAssignmentDTO;
import uk.ac.cam.cl.dtg.segue.dao.SegueDatabaseException;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.cam.cl.dtg.isaac.api.managers.AssignmentCancelledException;
import uk.ac.cam.cl.dtg.isaac.api.exceptions.AssignmentCancelledException;
import uk.ac.cam.cl.dtg.isaac.dos.QuizAssignmentDO;
import uk.ac.cam.cl.dtg.isaac.dos.QuizFeedbackMode;
import uk.ac.cam.cl.dtg.isaac.dto.QuizAssignmentDTO;
Expand Down
Loading