public ChallengeModel createModelFrom(Challenge challenge) {
    ChallengeModel challengeModel = new ChallengeModel();

    challengeModel.setChallengeId(challenge.getId());

    challengeModel.setChallengeType(challenge.getChallengeType());

    for (Map.Entry<Lingo, String> eachTitle : challenge.getTitles().entrySet()) {
      challengeModel
          .getTitles()
          .add(new ChallengeModel.MultiLingoText(eachTitle.getKey(), eachTitle.getValue()));
    }

    for (Map.Entry<Lingo, String> eachDescription : challenge.getDescriptions().entrySet()) {
      challengeModel
          .getDescriptions()
          .add(
              new ChallengeModel.MultiLingoText(
                  eachDescription.getKey(), eachDescription.getValue()));
    }

    for (Map.Entry<Lingo, String> eachSignature : challenge.getSignatures().entrySet()) {
      challengeModel
          .getSignatures()
          .add(new ChallengeModel.MultiLingoText(eachSignature.getKey(), eachSignature.getValue()));
    }

    for (ChallengeInputType eachInputType : challenge.getInputTypes()) {
      challengeModel.getInputTypes().add(eachInputType.getInputType());
    }

    for (TestCase eachTestCase : challenge.getTestCases()) {
      ChallengeModel.TestCase testCase = new ChallengeModel.TestCase();
      for (TestCaseInputValue eachInputValue : eachTestCase.getInputs()) {
        testCase.getInputValues().add(eachInputValue.getInputValue());
      }
      testCase.setOutputValue(eachTestCase.getOutput());
      challengeModel.getTestCases().add(testCase);
    }

    challengeModel.setOutputType(challenge.getOutputType());

    challengeModel.setApproved(challenge.isApproved());

    if (challenge.hasLevel()) {
      challengeModel.setLevel(challenge.getLevelId());
    }

    return challengeModel;
  }
  public void mergeChallengeWithModel(ChallengeModel challengeModel, Challenge challenge) {
    challenge.setChallengeType(challengeModel.getChallengeType());

    challenge.getTitles().clear();
    for (ChallengeModel.MultiLingoText title : challengeModel.getTitles()) {
      challenge.getTitles().put(title.getLingo(), title.getText());
    }

    challenge.getDescriptions().clear();
    for (ChallengeModel.MultiLingoText description : challengeModel.getDescriptions()) {
      challenge.getDescriptions().put(description.getLingo(), description.getText());
    }

    challenge.getSignatures().clear();
    for (ChallengeModel.MultiLingoText signature : challengeModel.getSignatures()) {
      challenge.getSignatures().put(signature.getLingo(), signature.getText());
    }

    challenge.getInputTypes().clear();
    challenge.setInputTypes(ChallengeInputType.createFrom(challengeModel.getInputTypes()));

    challenge.setOutputType(challengeModel.getOutputType());

    challenge.getTestCases().clear();
    for (ChallengeModel.TestCase testCase : challengeModel.getTestCases()) {
      challenge.addTestCase(testCase.getInputValues(), testCase.getOutputValue());
    }
    TestCase.prioritize(challenge.getTestCases());

    if (challengeModel.getApproved() != null) {
      challenge.setApproved(challengeModel.getApproved());
    }

    Long levelId = challengeModel.getLevel();
    if (levelId != null) {
      challenge.setLevel(levelService.findById(levelId));
    } else if (authenticationService.isCurrentUserAdmin()) {
      challenge.setLevel(null);
    }
  }