Commit f3352b0e authored by Grzegorz Pietrusza's avatar Grzegorz Pietrusza

make flag submitting dependent on task level

parent d32c1cb0
......@@ -18,8 +18,6 @@ import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@Singleton
......@@ -92,50 +90,21 @@ public class TasksRepository implements Repository
}
//todo: refactor with the function below
private Optional<Pair<Task, Flag>> getTaskFlagPairByHashValue(User user, String userHash)
private Optional<Pair<Task, Flag>> getTaskFlagPairByHashValue(User user, String userHash, int taskLevel)
{
//todo: find TASK by level
//todo: inline
String username = user.getName();
//todo: collapse lambdas
Optional<Pair<Task, Flag>> matched = this.getAll().stream()
.collect(Collectors.toMap(
task -> task,
Task::getFlags
))
.entrySet()
.stream()
.map((Function<Map.Entry<Task, List<Flag>>, Pair<Task, Optional<Flag>>>) taskFlagsEntry -> {
Task task = taskFlagsEntry.getKey();
Optional<Flag> matchedFlag = taskFlagsEntry.getValue().stream()
.filter(new Predicate<Flag>()
{
@Override
public boolean test(Flag flag1)
{
return calculateHashValue(username, flag1.getValue()).equals(userHash);
}
})
.findFirst();
return new Pair<Task, Optional<Flag>>(task, matchedFlag);
})
.filter(new Predicate<Pair<Task, Optional<Flag>>>()
{
@Override
public boolean test(Pair<Task, Optional<Flag>> taskOptionalPair)
{
return taskOptionalPair.getValue().isPresent();
}
})
.map(new Function<Pair<Task, Optional<Flag>>, Pair<Task, Flag>>()
{
@Override
public Pair<Task, Flag> apply(Pair<Task, Optional<Flag>> taskOptionalPair)
{
return new Pair<Task, Flag>(taskOptionalPair.getKey(), taskOptionalPair.getValue().get());
}
})
Task task = getByLevel(taskLevel);
List<Flag> flags = task.getFlags();
Optional<Flag> matchedFlag = flags.stream()
.filter(flag -> calculateHashValue(username, flag.getValue()).equals(userHash))
.findFirst();
return matched;
//todo: refactor
//todo: use orElse
if(matchedFlag.isPresent()) {
return Optional.of(new Pair<>(task, matchedFlag.get()));
}
return Optional.empty();
}
public String calculateHashValue(String username, String flagValue)
......@@ -156,10 +125,10 @@ public class TasksRepository implements Repository
return solutionsRepository.exists(solution);
}
public boolean checkHash(User user, String hashValue)
public boolean checkHash(User user, String hashValue, int taskLevel)
{
//todo: refactor
Optional<Pair<Task, Flag>> taskFlagPairOptional = getTaskFlagPairByHashValue(user, hashValue);
Optional<Pair<Task, Flag>> taskFlagPairOptional = getTaskFlagPairByHashValue(user, hashValue, taskLevel);
if (!taskFlagPairOptional.isPresent()) {
return false;
}
......
......@@ -9,10 +9,7 @@ import io.dropwizard.auth.Auth;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.List;
......@@ -39,10 +36,12 @@ public class SolutionsResource
}
@POST
@Path("/{task_level}")
public Response submitSolution(@Auth User user,
@PathParam("task_level") int taskLevel,
String hash) throws Exception
{
if (tasksRepository.checkHash(user, hash)) {
if (tasksRepository.checkHash(user, hash, taskLevel)) {
return Response.ok().build();
}
return Response.status(Response.Status.NOT_ACCEPTABLE).build();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment