From b7b7303990f7d14a5d2ffeaf5729ae91471508bd Mon Sep 17 00:00:00 2001 From: Diego Villanueva Date: Fri, 8 Mar 2024 17:52:30 +0100 Subject: [PATCH 01/48] Feat: Questions and answers are now written in the DB! --- questiongenerator/.gitignore | 38 +++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 58727 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + questiongenerator/mvnw | 316 ++++++++++++++++++ questiongenerator/mvnw.cmd | 188 +++++++++++ questiongenerator/pom.xml | 64 ++++ questiongenerator/src/main/java/Main.java | 11 + .../src/main/java/model/Answer.java | 29 ++ .../src/main/java/model/AnswerCategory.java | 5 + .../src/main/java/model/Question.java | 48 +++ .../src/main/java/model/QuestionCategory.java | 5 + .../src/main/java/model/QuestionType.java | 6 + .../repositories/AnswerRepositoryImpl.java | 33 ++ .../repositories/QuestionRepositoryImpl.java | 34 ++ .../templates/CountryCapitalQuestion.java | 52 +++ .../main/java/templates/QuestionTemplate.java | 60 ++++ .../main/resources/META-INF/persistence.xml | 16 + 17 files changed, 907 insertions(+) create mode 100644 questiongenerator/.gitignore create mode 100644 questiongenerator/.mvn/wrapper/maven-wrapper.jar create mode 100644 questiongenerator/.mvn/wrapper/maven-wrapper.properties create mode 100644 questiongenerator/mvnw create mode 100644 questiongenerator/mvnw.cmd create mode 100644 questiongenerator/pom.xml create mode 100644 questiongenerator/src/main/java/Main.java create mode 100644 questiongenerator/src/main/java/model/Answer.java create mode 100644 questiongenerator/src/main/java/model/AnswerCategory.java create mode 100644 questiongenerator/src/main/java/model/Question.java create mode 100644 questiongenerator/src/main/java/model/QuestionCategory.java create mode 100644 questiongenerator/src/main/java/model/QuestionType.java create mode 100644 questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java create mode 100644 questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java create mode 100644 questiongenerator/src/main/java/templates/CountryCapitalQuestion.java create mode 100644 questiongenerator/src/main/java/templates/QuestionTemplate.java create mode 100644 questiongenerator/src/main/resources/META-INF/persistence.xml diff --git a/questiongenerator/.gitignore b/questiongenerator/.gitignore new file mode 100644 index 00000000..5ff6309b --- /dev/null +++ b/questiongenerator/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/questiongenerator/.mvn/wrapper/maven-wrapper.jar b/questiongenerator/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1dd12f17644411d6e840bd5a10c6ecda0175f18 GIT binary patch literal 58727 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%0ANsA|A3-jj|r`KAo%oTajX3>^E` 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 YM{}PByk10KD_nuQ4E7Du?}+~TKh4V)`~Uy| literal 0 HcmV?d00001 diff --git a/questiongenerator/.mvn/wrapper/maven-wrapper.properties b/questiongenerator/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..40ca0155 --- /dev/null +++ b/questiongenerator/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar \ No newline at end of file diff --git a/questiongenerator/mvnw b/questiongenerator/mvnw new file mode 100644 index 00000000..8a8fb228 --- /dev/null +++ b/questiongenerator/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/questiongenerator/mvnw.cmd b/questiongenerator/mvnw.cmd new file mode 100644 index 00000000..1d8ab018 --- /dev/null +++ b/questiongenerator/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/questiongenerator/pom.xml b/questiongenerator/pom.xml new file mode 100644 index 00000000..a92e97b2 --- /dev/null +++ b/questiongenerator/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + com.example + ProyectinJPA + 1.0-SNAPSHOT + ProyectinJPA + + + UTF-8 + 1.8 + 1.8 + 5.9.1 + + + + + org.hibernate + hibernate-core + 5.6.1.Final + + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + test + + + + org.json + json + 20240303 + + + org.postgresql + postgresql + runtime + 42.6.1 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + + + + + \ No newline at end of file diff --git a/questiongenerator/src/main/java/Main.java b/questiongenerator/src/main/java/Main.java new file mode 100644 index 00000000..554b8f63 --- /dev/null +++ b/questiongenerator/src/main/java/Main.java @@ -0,0 +1,11 @@ +import templates.CountryCapitalQuestion; + + +public class Main { + public static void main(String[] args) { + + new CountryCapitalQuestion("es"); + new CountryCapitalQuestion("en"); + + } +} \ No newline at end of file diff --git a/questiongenerator/src/main/java/model/Answer.java b/questiongenerator/src/main/java/model/Answer.java new file mode 100644 index 00000000..a54ccc3d --- /dev/null +++ b/questiongenerator/src/main/java/model/Answer.java @@ -0,0 +1,29 @@ +package model; + + +import javax.persistence.*; +import java.util.List; + +@Entity +@Table(name = "answers") +public class Answer { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String text; + private AnswerCategory category; + @OneToMany(mappedBy = "correctAnswer", fetch = FetchType.EAGER) + private List questions; + + @ManyToMany(mappedBy = "answers", fetch = FetchType.EAGER) + private List questionsWithThisAnswer; + + public Answer(String text, AnswerCategory category) { + this.text = text; + this.category = category; + } + + public Answer() { + + } +} diff --git a/questiongenerator/src/main/java/model/AnswerCategory.java b/questiongenerator/src/main/java/model/AnswerCategory.java new file mode 100644 index 00000000..9296e711 --- /dev/null +++ b/questiongenerator/src/main/java/model/AnswerCategory.java @@ -0,0 +1,5 @@ +package model; + +public enum AnswerCategory { + CITY, COUNTRY, PERSON, EVENT, DATE, OTHER +} diff --git a/questiongenerator/src/main/java/model/Question.java b/questiongenerator/src/main/java/model/Question.java new file mode 100644 index 00000000..fd2d4978 --- /dev/null +++ b/questiongenerator/src/main/java/model/Question.java @@ -0,0 +1,48 @@ +package model; + +import javax.persistence.*; +import java.util.List; + +@Entity +@Table(name = "questions") +public class Question { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String content; + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name="questions_answers", + joinColumns= + @JoinColumn(name="question_id", referencedColumnName="id"), + inverseJoinColumns= + @JoinColumn(name="answer_id", referencedColumnName="id") + ) + private List answers; + @ManyToOne + @JoinColumn(name = "correct_answer_id") + private Answer correctAnswer; + private QuestionCategory questionCategory; + private AnswerCategory answerCategory; + private String language; + private QuestionType type; + + public Question() { + } + + public Question(String content, Answer correctAnswer, QuestionCategory questionCategory, AnswerCategory answerCategory, String language, QuestionType type) { + this.content = content; + this.correctAnswer = correctAnswer; + this.questionCategory = questionCategory; + this.answerCategory = answerCategory; + this.language = language; + this.type = type; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } +} diff --git a/questiongenerator/src/main/java/model/QuestionCategory.java b/questiongenerator/src/main/java/model/QuestionCategory.java new file mode 100644 index 00000000..90719c44 --- /dev/null +++ b/questiongenerator/src/main/java/model/QuestionCategory.java @@ -0,0 +1,5 @@ +package model; + +public enum QuestionCategory { + HISTORY, GEOGRAPHY, SCIENCE, MATH, LITERATURE, ART, SPORTS, MUSIC, MOVIES, TV, POLITICS, OTHER +} diff --git a/questiongenerator/src/main/java/model/QuestionType.java b/questiongenerator/src/main/java/model/QuestionType.java new file mode 100644 index 00000000..043175c3 --- /dev/null +++ b/questiongenerator/src/main/java/model/QuestionType.java @@ -0,0 +1,6 @@ +package model; + +public enum QuestionType { + TEXT, VIDEO, IMAGE, AUDIO + +} diff --git a/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java b/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java new file mode 100644 index 00000000..69421df1 --- /dev/null +++ b/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java @@ -0,0 +1,33 @@ +package repositories; + +import model.Answer; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.HashMap; +import java.util.Map; + +public class AnswerRepositoryImpl { + public void save(Answer a){ + + Map properties = new HashMap<>(); + properties.put("javax.persistence.jdbc.driver", "org.postgresql.Driver"); + properties.put("javax.persistence.jdbc.url", System.getenv("DATABASE_URL")); + properties.put("javax.persistence.jdbc.user", System.getenv("DATABASE_USER")); + properties.put("javax.persistence.jdbc.password", System.getenv("DATABASE_PASSWORD")); + + properties.put("hibernate.hbm2ddl.auto", "update"); + + EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("default", properties); + + EntityManager entityManager = entityManagerFactory.createEntityManager(); + entityManager.getTransaction().begin(); + + entityManager.persist(a); + + entityManager.getTransaction().commit(); + entityManager.close(); + entityManagerFactory.close(); + } +} diff --git a/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java b/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java new file mode 100644 index 00000000..bf0e4bd2 --- /dev/null +++ b/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java @@ -0,0 +1,34 @@ +package repositories; + +import model.Question; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.HashMap; +import java.util.Map; + +public class QuestionRepositoryImpl { + + public void save(Question q){ + Map properties = new HashMap<>(); + + properties.put("javax.persistence.jdbc.driver", "org.postgresql.Driver"); + properties.put("javax.persistence.jdbc.url", System.getenv("DATABASE_URL")); + properties.put("javax.persistence.jdbc.user", System.getenv("DATABASE_USER")); + properties.put("javax.persistence.jdbc.password", System.getenv("DATABASE_PASSWORD")); + + properties.put("hibernate.hbm2ddl.auto", "update"); + + EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("default", properties); + EntityManager entityManager = entityManagerFactory.createEntityManager(); + entityManager.getTransaction().begin(); + + entityManager.persist(q); + + entityManager.getTransaction().commit(); + entityManager.close(); + entityManagerFactory.close(); + } + +} diff --git a/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java b/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java new file mode 100644 index 00000000..19bb4e49 --- /dev/null +++ b/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java @@ -0,0 +1,52 @@ +package templates; + +import model.QuestionCategory; +import model.QuestionType; +import model.Answer; +import model.AnswerCategory; +import model.Question; +import org.json.JSONObject; + +public class CountryCapitalQuestion extends QuestionTemplate{ + + + public CountryCapitalQuestion(String langCode) { + super(langCode); + } + + @Override + public void setQuery() { + this.sparqlQuery = + "SELECT ?country ?countryLabel ?capital ?capitalLabel " + + "WHERE { ?country wdt:P31 wd:Q3624078; wdt:P36 ?capital. SERVICE wikibase:label { bd:serviceParam wikibase:language \"" + langCode + "\". } } " + + "ORDER BY ?countryLabel"; + } + + @Override + public void processResults() { + for (int i = 0; i < results.length(); i++) { + JSONObject result = results.getJSONObject(i); + String countryLabel = result.getJSONObject("countryLabel").getString("value"); + String capitalLabel = result.getJSONObject("capitalLabel").getString("value"); + + if (needToSkip(countryLabel)) + continue; + + Answer a = new Answer(capitalLabel, AnswerCategory.CITY); + answerRepository.save(a); + + String content; + if (langCode.equals("en")) + content = "What is the capital of " + countryLabel + "?"; + else + content = "¿Cuál es la capital de " + countryLabel + "?"; + + questionRepository.save(new Question(content, a, QuestionCategory.GEOGRAPHY, AnswerCategory.CITY, langCode, QuestionType.TEXT)); + } + } + + private boolean needToSkip(String countryLabel) { + return countryLabel.equals("Q3932086") || countryLabel.equals("realm of the United Kingdom") || countryLabel.equals("Republic of Geneva") + || countryLabel.equals("República de Ginebra") || countryLabel.equals("Q124653007"); + } +} diff --git a/questiongenerator/src/main/java/templates/QuestionTemplate.java b/questiongenerator/src/main/java/templates/QuestionTemplate.java new file mode 100644 index 00000000..b47d8bad --- /dev/null +++ b/questiongenerator/src/main/java/templates/QuestionTemplate.java @@ -0,0 +1,60 @@ +package templates; + +import repositories.AnswerRepositoryImpl; +import repositories.QuestionRepositoryImpl; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +public abstract class QuestionTemplate { + protected String sparqlQuery; + protected JSONArray results; + protected String langCode = "es"; + + protected AnswerRepositoryImpl answerRepository; + protected QuestionRepositoryImpl questionRepository; + + public QuestionTemplate(String langCode) { + this.answerRepository = new AnswerRepositoryImpl(); + this.questionRepository = new QuestionRepositoryImpl(); + + this.langCode = langCode; + setQuery(); + call(); + processResults(); + } + + public abstract void setQuery(); + + public void call() { + // Set up the HTTP client + HttpClient httpClient = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("https://query.wikidata.org/sparql")) + .header("Content-Type", "application/x-www-form-urlencoded") + .header("Accept", "application/json") // Specify JSON format + .POST(HttpRequest.BodyPublishers.ofString("query=" + sparqlQuery)) + .build(); + + // Send the HTTP request and get the response + HttpResponse response = null; + try { + response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + JSONObject jsonResponse = new JSONObject(response.body()); + JSONArray results = jsonResponse.getJSONObject("results").getJSONArray("bindings"); + + this.results = results; // Save the results. If this method is overwritten this line MUST be kept + } + + public abstract void processResults(); + +} diff --git a/questiongenerator/src/main/resources/META-INF/persistence.xml b/questiongenerator/src/main/resources/META-INF/persistence.xml new file mode 100644 index 00000000..c485a5c8 --- /dev/null +++ b/questiongenerator/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + From 53ef89ca67b993cab0d1ff36c428c6712c244cb7 Mon Sep 17 00:00:00 2001 From: Diego Villanueva Date: Fri, 8 Mar 2024 18:14:04 +0100 Subject: [PATCH 02/48] Chore: Cleaned up the code a bit --- .../src/main/java/model/Answer.java | 1 - .../src/main/java/model/Question.java | 8 ----- .../repositories/AnswerRepositoryImpl.java | 16 +++------ .../src/main/java/repositories/Jpa.java | 36 +++++++++++++++++++ .../repositories/QuestionRepositoryImpl.java | 17 +++------ 5 files changed, 44 insertions(+), 34 deletions(-) create mode 100644 questiongenerator/src/main/java/repositories/Jpa.java diff --git a/questiongenerator/src/main/java/model/Answer.java b/questiongenerator/src/main/java/model/Answer.java index a54ccc3d..c3f5cbf1 100644 --- a/questiongenerator/src/main/java/model/Answer.java +++ b/questiongenerator/src/main/java/model/Answer.java @@ -24,6 +24,5 @@ public Answer(String text, AnswerCategory category) { } public Answer() { - } } diff --git a/questiongenerator/src/main/java/model/Question.java b/questiongenerator/src/main/java/model/Question.java index fd2d4978..03e77027 100644 --- a/questiongenerator/src/main/java/model/Question.java +++ b/questiongenerator/src/main/java/model/Question.java @@ -37,12 +37,4 @@ public Question(String content, Answer correctAnswer, QuestionCategory questionC this.language = language; this.type = type; } - - public void setId(Long id) { - this.id = id; - } - - public Long getId() { - return id; - } } diff --git a/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java b/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java index 69421df1..07466740 100644 --- a/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java +++ b/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java @@ -10,24 +10,16 @@ public class AnswerRepositoryImpl { public void save(Answer a){ + EntityManagerFactory emf = Jpa.getEntityManagerFactory(); - Map properties = new HashMap<>(); - properties.put("javax.persistence.jdbc.driver", "org.postgresql.Driver"); - properties.put("javax.persistence.jdbc.url", System.getenv("DATABASE_URL")); - properties.put("javax.persistence.jdbc.user", System.getenv("DATABASE_USER")); - properties.put("javax.persistence.jdbc.password", System.getenv("DATABASE_PASSWORD")); - - properties.put("hibernate.hbm2ddl.auto", "update"); - - EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("default", properties); - - EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityManager entityManager = emf.createEntityManager(); entityManager.getTransaction().begin(); entityManager.persist(a); entityManager.getTransaction().commit(); entityManager.close(); - entityManagerFactory.close(); + + Jpa.close(); } } diff --git a/questiongenerator/src/main/java/repositories/Jpa.java b/questiongenerator/src/main/java/repositories/Jpa.java new file mode 100644 index 00000000..0ffdc60f --- /dev/null +++ b/questiongenerator/src/main/java/repositories/Jpa.java @@ -0,0 +1,36 @@ +package repositories; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.util.HashMap; +import java.util.Map; + +public class Jpa { + + private static EntityManagerFactory emf = null; + + public static EntityManagerFactory getEntityManagerFactory() { + if (emf == null) { + Map properties = new HashMap<>(); + + properties.put("javax.persistence.jdbc.driver", "org.postgresql.Driver"); + properties.put("javax.persistence.jdbc.url", System.getenv("DATABASE_URL")); + properties.put("javax.persistence.jdbc.user", System.getenv("DATABASE_USER")); + properties.put("javax.persistence.jdbc.password", System.getenv("DATABASE_PASSWORD")); + + properties.put("hibernate.hbm2ddl.auto", "update"); + + emf = Persistence.createEntityManagerFactory("default", properties); + } + + return emf; + } + + public static void close() { + if (emf != null) { + emf.close(); + } + emf = null; + } +} diff --git a/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java b/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java index bf0e4bd2..751df46a 100644 --- a/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java +++ b/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java @@ -4,31 +4,22 @@ import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; -import java.util.HashMap; -import java.util.Map; public class QuestionRepositoryImpl { public void save(Question q){ - Map properties = new HashMap<>(); - properties.put("javax.persistence.jdbc.driver", "org.postgresql.Driver"); - properties.put("javax.persistence.jdbc.url", System.getenv("DATABASE_URL")); - properties.put("javax.persistence.jdbc.user", System.getenv("DATABASE_USER")); - properties.put("javax.persistence.jdbc.password", System.getenv("DATABASE_PASSWORD")); + EntityManagerFactory emf = Jpa.getEntityManagerFactory(); - properties.put("hibernate.hbm2ddl.auto", "update"); - - EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("default", properties); - EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityManager entityManager = emf.createEntityManager(); entityManager.getTransaction().begin(); entityManager.persist(q); entityManager.getTransaction().commit(); entityManager.close(); - entityManagerFactory.close(); + + Jpa.close(); } } From f5705e6f8ec7f050ef4367ede4be7581fcf52bee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= Date: Fri, 8 Mar 2024 18:20:25 +0100 Subject: [PATCH 03/48] chore: Project renamed --- questiongenerator/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/questiongenerator/pom.xml b/questiongenerator/pom.xml index a92e97b2..e1a94aa6 100644 --- a/questiongenerator/pom.xml +++ b/questiongenerator/pom.xml @@ -5,9 +5,9 @@ 4.0.0 com.example - ProyectinJPA + QuestionGenerator 1.0-SNAPSHOT - ProyectinJPA + QuestionGenerator UTF-8 From 889965b60298d450feb3138664de60494ec4045c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= Date: Fri, 8 Mar 2024 19:13:00 +0100 Subject: [PATCH 04/48] chore: Unused imports removed and minor code clean up --- questiongenerator/src/main/java/Main.java | 3 --- questiongenerator/src/main/java/model/Answer.java | 1 - questiongenerator/src/main/java/model/QuestionType.java | 1 - .../src/main/java/repositories/AnswerRepositoryImpl.java | 4 ---- questiongenerator/src/main/java/repositories/Jpa.java | 1 - .../src/main/java/repositories/QuestionRepositoryImpl.java | 1 - .../src/main/java/templates/CountryCapitalQuestion.java | 1 - .../src/main/java/templates/QuestionTemplate.java | 1 - 8 files changed, 13 deletions(-) diff --git a/questiongenerator/src/main/java/Main.java b/questiongenerator/src/main/java/Main.java index 554b8f63..0c29a503 100644 --- a/questiongenerator/src/main/java/Main.java +++ b/questiongenerator/src/main/java/Main.java @@ -1,11 +1,8 @@ import templates.CountryCapitalQuestion; - public class Main { public static void main(String[] args) { - new CountryCapitalQuestion("es"); new CountryCapitalQuestion("en"); - } } \ No newline at end of file diff --git a/questiongenerator/src/main/java/model/Answer.java b/questiongenerator/src/main/java/model/Answer.java index c3f5cbf1..2a0422dd 100644 --- a/questiongenerator/src/main/java/model/Answer.java +++ b/questiongenerator/src/main/java/model/Answer.java @@ -1,6 +1,5 @@ package model; - import javax.persistence.*; import java.util.List; diff --git a/questiongenerator/src/main/java/model/QuestionType.java b/questiongenerator/src/main/java/model/QuestionType.java index 043175c3..2aefb0fd 100644 --- a/questiongenerator/src/main/java/model/QuestionType.java +++ b/questiongenerator/src/main/java/model/QuestionType.java @@ -2,5 +2,4 @@ public enum QuestionType { TEXT, VIDEO, IMAGE, AUDIO - } diff --git a/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java b/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java index 07466740..3f26d63d 100644 --- a/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java +++ b/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java @@ -1,12 +1,8 @@ package repositories; import model.Answer; - import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; -import java.util.HashMap; -import java.util.Map; public class AnswerRepositoryImpl { public void save(Answer a){ diff --git a/questiongenerator/src/main/java/repositories/Jpa.java b/questiongenerator/src/main/java/repositories/Jpa.java index 0ffdc60f..536a0899 100644 --- a/questiongenerator/src/main/java/repositories/Jpa.java +++ b/questiongenerator/src/main/java/repositories/Jpa.java @@ -1,6 +1,5 @@ package repositories; -import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import java.util.HashMap; diff --git a/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java b/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java index 751df46a..9c96f0b6 100644 --- a/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java +++ b/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java @@ -1,7 +1,6 @@ package repositories; import model.Question; - import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; diff --git a/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java b/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java index 19bb4e49..d0c4225e 100644 --- a/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java +++ b/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java @@ -9,7 +9,6 @@ public class CountryCapitalQuestion extends QuestionTemplate{ - public CountryCapitalQuestion(String langCode) { super(langCode); } diff --git a/questiongenerator/src/main/java/templates/QuestionTemplate.java b/questiongenerator/src/main/java/templates/QuestionTemplate.java index b47d8bad..e219e61d 100644 --- a/questiongenerator/src/main/java/templates/QuestionTemplate.java +++ b/questiongenerator/src/main/java/templates/QuestionTemplate.java @@ -4,7 +4,6 @@ import repositories.QuestionRepositoryImpl; import org.json.JSONArray; import org.json.JSONObject; - import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; From 5c9aaccab15af2bb37aca595ef9c40bff4c0320e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= Date: Fri, 8 Mar 2024 19:37:58 +0100 Subject: [PATCH 05/48] chore: Comments added on QuestionTemplate and small code clean ups. --- .../main/java/templates/QuestionTemplate.java | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/questiongenerator/src/main/java/templates/QuestionTemplate.java b/questiongenerator/src/main/java/templates/QuestionTemplate.java index e219e61d..d2bb24e4 100644 --- a/questiongenerator/src/main/java/templates/QuestionTemplate.java +++ b/questiongenerator/src/main/java/templates/QuestionTemplate.java @@ -9,14 +9,27 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; + +/** + * Base template for questions to be implemented in the future. + */ public abstract class QuestionTemplate { + // Query to be sent to WikiData QS protected String sparqlQuery; + // Response given by WikiData QS for the query sent protected JSONArray results; + // Language code representing in what language the query must be sent. Spanish as a default value. protected String langCode = "es"; protected AnswerRepositoryImpl answerRepository; protected QuestionRepositoryImpl questionRepository; + /** + * Constructor for QuestionTemplates which is also the one in charge of the whole question retrieval process for a query + * For future types of question, only need to override abstract methods and calling super() on constructor + * When instancing a question, only constructor invocation is required. + * @param langCode + */ public QuestionTemplate(String langCode) { this.answerRepository = new AnswerRepositoryImpl(); this.questionRepository = new QuestionRepositoryImpl(); @@ -27,9 +40,23 @@ public QuestionTemplate(String langCode) { processResults(); } - public abstract void setQuery(); + /** + * Update the value of @sparqlQuery with the query to be sent. + */ + protected abstract void setQuery(); + + /** + * Method for the whole processing the @results given by WikiData QS as a JSON. + * It also is in charge of storing both the processed answers and the question in all languages + */ + protected abstract void processResults(); - public void call() { + /** + * Method in charge of the HTTP request with WikiData QS. + * It allows to send only one query, so it does not support questions whose answer require multiple queries. + * CAUTION: Remember to update the results field of the field if this method gets overwritten. + */ + private void call() { // Set up the HTTP client HttpClient httpClient = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() @@ -43,17 +70,14 @@ public void call() { HttpResponse response = null; try { response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); - } catch (IOException e) { - throw new RuntimeException(e); - } catch (InterruptedException e) { + } catch (IOException | InterruptedException e) { throw new RuntimeException(e); } + JSONObject jsonResponse = new JSONObject(response.body()); JSONArray results = jsonResponse.getJSONObject("results").getJSONArray("bindings"); this.results = results; // Save the results. If this method is overwritten this line MUST be kept } - public abstract void processResults(); - } From cfc2ce080ed3fbd944112666d590718c8a57b8b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= Date: Fri, 8 Mar 2024 19:44:40 +0100 Subject: [PATCH 06/48] chore: Missing comment added on QuestionTemplate --- questiongenerator/src/main/java/templates/QuestionTemplate.java | 1 + 1 file changed, 1 insertion(+) diff --git a/questiongenerator/src/main/java/templates/QuestionTemplate.java b/questiongenerator/src/main/java/templates/QuestionTemplate.java index d2bb24e4..7e5c5be3 100644 --- a/questiongenerator/src/main/java/templates/QuestionTemplate.java +++ b/questiongenerator/src/main/java/templates/QuestionTemplate.java @@ -28,6 +28,7 @@ public abstract class QuestionTemplate { * Constructor for QuestionTemplates which is also the one in charge of the whole question retrieval process for a query * For future types of question, only need to override abstract methods and calling super() on constructor * When instancing a question, only constructor invocation is required. + * For reference in future implementations: look at CountryCapitalQuestion * @param langCode */ public QuestionTemplate(String langCode) { From 7a3ab9936da492d00985b6c6a5c7c2c3be83e35f Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Fri, 8 Mar 2024 20:54:19 +0100 Subject: [PATCH 07/48] chore: Added question generator to the glossary --- docs/src/12_glossary.adoc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/src/12_glossary.adoc b/docs/src/12_glossary.adoc index 6bf7565d..4856f6c1 100644 --- a/docs/src/12_glossary.adoc +++ b/docs/src/12_glossary.adoc @@ -15,5 +15,8 @@ ifndef::imagesdir[:imagesdir: ../images] |Java Spring Boot (Spring Boot) is a tool that makes developing web application and microservices with Spring Framework faster and easier through three core capabilities: Autoconfiguration, an opinionated approach to configuration, the ability to create standalone applications. |PostgreSQL -|Object-relational database management system (ORDMBS), which means that it has relational capabilities and an object-oriented design +|Object-relational database management system (ORDMBS), which means that it has relational capabilities and an object-oriented design. + +|Question Generator +|A module of the application responsible for querying Wikidata, creating the questions and storing them in our DB. |=== From 46ae6d740014ef7e453ee59794a4515c5c13b895 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Fri, 8 Mar 2024 21:08:05 +0100 Subject: [PATCH 08/48] Chore: Updated the class diagram --- docs/src/08_concepts.adoc | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/docs/src/08_concepts.adoc b/docs/src/08_concepts.adoc index b14a2f16..bb47d5c3 100644 --- a/docs/src/08_concepts.adoc +++ b/docs/src/08_concepts.adoc @@ -10,29 +10,44 @@ This is the first version of the diagram, it will be updated if needed. ---- @startuml -enum Category { +enum QuestionCategory { HISTORY GEOGRAPHY SCIENCE + MATH + LITERATURE + ART + SPORTS } -enum Type { +enum AnsswerCategory { + CITY + COUNTRY + PERSON + DATE + OTHER +} + +enum QuestionType{ TEXT IMAGE AUDIO } class Question{ - id: long content: String answers: List - correct: Answer - category: Category + correctAnswer: Answer + questionCategory: QuestionCategory + answerCategory: AnswerCategory language: String - Type: Type + QuestionType: Type } class User{ + username: String + email: String + password: String answeredQuestions: int } @@ -41,8 +56,9 @@ class UserStat{ class Answer { text: String - category: Category - Type: Type + category: AnswerCategory + questionsWithThisAnswer: List + } class Game { @@ -52,7 +68,7 @@ class Game { class Ranking << Singleton >> { - + } User o--> Question From bb53d23625bbddc60465e7cf1a9f36551dd95a1a Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Fri, 8 Mar 2024 22:48:22 +0100 Subject: [PATCH 09/48] feat: adding all the logic to the game view. --- webapp/src/components/game/Questions.js | 11 ++++++++ webapp/src/pages/Game.jsx | 36 +++++++++++-------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/webapp/src/components/game/Questions.js b/webapp/src/components/game/Questions.js index fd18af57..32b6c239 100644 --- a/webapp/src/components/game/Questions.js +++ b/webapp/src/components/game/Questions.js @@ -8,5 +8,16 @@ export async function getQuestion() { } } catch { + } +} + +export async function answerQuestion(questionId, aId) { + try { + let requestAnswer = await axios.post(process.env.REACT_APP_API_ENDPOINT + "/questions/" + questionId + "/answer", {answer_id:aId}); + if (HttpStatusCode.Ok === requestAnswer.status) { + return requestAnswer.data; + } + } catch { + } } \ No newline at end of file diff --git a/webapp/src/pages/Game.jsx b/webapp/src/pages/Game.jsx index 9888aced..bd4c965d 100644 --- a/webapp/src/pages/Game.jsx +++ b/webapp/src/pages/Game.jsx @@ -4,31 +4,25 @@ import { Center } from "@chakra-ui/layout"; import { useNavigate } from "react-router-dom"; import Confetti from "react-confetti"; import ButtonEf from '../components/ButtonEf'; -import {getQuestion} from '../components/game/Questions'; +import {getQuestion, answerQuestion} from '../components/game/Questions'; export default function Game() { const navigate = useNavigate(); - const [question, setQuestion] = useState({ id:1, content: "default question", answers: [], questionCategory: "", answerCategory: "", language: "en", type: ""}); - - // const generateQuestion = () => { - // const fetchQuestion = async () => { - // const result = await getQuestion(); - // setQuestion(result); - // }; - // } - // componentDidMount() { - // generateQuestion(); - // } - + const [question, setQuestion] = useState({ id:1, content: "default question", answers: [{id:1, text:"answer1", category:"category1" }, {id:2, text:"answer2", category:"category2" }], questionCategory: "", answerCategory: "", language: "en", type: ""}); useEffect(() => { const fetchQuestion = async () => { - const result = await getQuestion(); - setQuestion(result); + await generateQuestion(); }; fetchQuestion(); - }, []); + }, []); + + const generateQuestion = async () => { + const result = await getQuestion(); + setQuestion(result); + }; + const [answer, setAnswer] = useState({id:1, text:"answer1", category:"category1" }); const [selectedOption, setSelectedOption] = useState(null); const [nextDisabled, setNextDisabled] = useState(true); const [roundNumber, setRoundNumber] = useState(1); @@ -36,13 +30,14 @@ export default function Game() { const [showConfetti, setShowConfetti] = useState(false); const answerButtonClick = (option) => { + setAnswer(question.answers[option]); setSelectedOption((prevOption) => (prevOption === option ? null : option)); const anyOptionSelected = option === selectedOption ? null : option; setNextDisabled(anyOptionSelected === null); }; - const nextButtonClick = () => { - const isCorrect = selectedOption === 1; // Right now the correct option is the first one. + const nextButtonClick = async () => { + const isCorrect = (await answerQuestion(question.id, answer.id)).wasCorrect; if (isCorrect) { setCorrectAnswers((prevCorrectAnswers) => prevCorrectAnswers + 1); @@ -57,6 +52,7 @@ export default function Game() { else { setRoundNumber(nextRoundNumber); setNextDisabled(true); + await generateQuestion(); } }; @@ -79,8 +75,8 @@ export default function Game() { - answerButtonClick(1)} /> - answerButtonClick(2)} /> + answerButtonClick(1)} /> + answerButtonClick(2)} /> From c86ccf733a9d12f1b9051eacf61878eb2bf044eb Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sat, 9 Mar 2024 09:36:05 +0100 Subject: [PATCH 10/48] chore: improving the main readme and adding the wireframes. --- README.md | 18 +++++++++--------- docs/images/wireframe-Dashboard.png | Bin 0 -> 69095 bytes docs/images/wireframe-Game.png | Bin 0 -> 66897 bytes docs/images/wireframe-Results.png | Bin 0 -> 61353 bytes docs/images/wireframe-Rules.png | Bin 0 -> 70149 bytes docs/images/wireframe-SignIn.png | Bin 0 -> 64371 bytes docs/images/wireframe-SignUp.png | Bin 0 -> 67353 bytes docs/images/wireframe-Welcome.png | Bin 0 -> 64631 bytes docs/src/02_architecture_constraints.adoc | 15 +++++++++++++++ 9 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 docs/images/wireframe-Dashboard.png create mode 100644 docs/images/wireframe-Game.png create mode 100644 docs/images/wireframe-Results.png create mode 100644 docs/images/wireframe-Rules.png create mode 100644 docs/images/wireframe-SignIn.png create mode 100644 docs/images/wireframe-SignUp.png create mode 100644 docs/images/wireframe-Welcome.png diff --git a/README.md b/README.md index 8d4ff531..a2cf1929 100644 --- a/README.md +++ b/README.md @@ -13,15 +13,15 @@ We aim to create a platform that not only challenges your knowledge but also spa 🌐 Multiplayer: Compete with friends and strangers to prove you are the best. ## Contributors -| Nombre | UO | -|---------------------------------|----------| -| Gonzalo Alonso Fernández | UO282104 | -| Darío Gutiérrez Mori | UO282435 | -| Sergio Rodríguez García | UO282598 | -| Jorge Joaquín Gancedo Fernández | UO282161 | -| Sergio Quintana Fernández | UO288090 | -| Diego Villanueva Berros | UO283615 | -| Gonzalo Suárez Losada | UO283928 | +Contributor | Contact +-- | -- +Gonzalo Alonso Fernández | +Sergio Rodríguez García | +Jorge Joaquín Gancedo Fernández | +Darío Gutiérrez Mori | +Sergio Quintana Fernández | +Diego Villanueva Berros | +Gonzalo Suárez Losada | *** diff --git a/docs/images/wireframe-Dashboard.png b/docs/images/wireframe-Dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..31a356281e7a5688d5ab11e91fd27705c3681115 GIT binary patch literal 69095 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 literal 0 HcmV?d00001 diff --git a/docs/images/wireframe-Game.png b/docs/images/wireframe-Game.png new file mode 100644 index 0000000000000000000000000000000000000000..7521c7d4ae9b7caa68752193f709399409b74577 GIT binary patch literal 66897 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 literal 0 HcmV?d00001 diff --git a/docs/images/wireframe-Results.png b/docs/images/wireframe-Results.png new file mode 100644 index 0000000000000000000000000000000000000000..812ca5a740c61f38c60e8eb3053869e4f396758d GIT binary patch literal 61353 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 HB{Ts5C7jD{ literal 0 HcmV?d00001 diff --git a/docs/images/wireframe-Rules.png b/docs/images/wireframe-Rules.png new file mode 100644 index 0000000000000000000000000000000000000000..47dff8ce62fd3bb41db8e4c1c1e7f17d05dbe711 GIT binary patch literal 70149 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 literal 0 HcmV?d00001 diff --git a/docs/images/wireframe-SignIn.png b/docs/images/wireframe-SignIn.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d21ca86e16d055cc3eefd02ba36db32881f60c GIT binary patch literal 64371 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 r`ah=X|6uhW)#3|DzwEAHhv20}T#Tn!!=S7 literal 0 HcmV?d00001 diff --git a/docs/images/wireframe-SignUp.png b/docs/images/wireframe-SignUp.png new file mode 100644 index 0000000000000000000000000000000000000000..ed8fa6014d36e378d25f4ec0fb219efc6b758b10 GIT binary patch literal 67353 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 literal 0 HcmV?d00001 diff --git a/docs/images/wireframe-Welcome.png b/docs/images/wireframe-Welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..035f0b913447d1403b49be8f2bb1575f19324380 GIT binary patch literal 64631 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 CNwG@+ literal 0 HcmV?d00001 diff --git a/docs/src/02_architecture_constraints.adoc b/docs/src/02_architecture_constraints.adoc index 6d48d584..d530271d 100644 --- a/docs/src/02_architecture_constraints.adoc +++ b/docs/src/02_architecture_constraints.adoc @@ -28,3 +28,18 @@ The application must be developed according to some constraints that were define | Documentation in Arc42 | The documentation must follow the Arc42 template |=== +*Wireframes* + +image::wireframe-Welcome.png[align="center", title="Welcome Wireframe"] + +image::wireframe-SignIn.png[align="center", title="Sign In Wireframe"] + +image::wireframe-SignUp.png[align="center", title="Sign Up Wireframe"] + +image::wireframe-Dashboard.png[align="center", title="Dashboard Wireframe"] + +image::wireframe-Rules.png[align="center", title="Rules Wireframe"] + +image::wireframe-Game.png[align="center", title="Game Wireframe"] + +image::wireframe-Results.png[align="center", title="Results Wireframe"] \ No newline at end of file From 7cacc3c96864b04e93057de5843fe37cc341d13f Mon Sep 17 00:00:00 2001 From: sergiorodriguezgarcia <113514397+sergiorodriguezgarcia@users.noreply.github.com> Date: Sat, 9 Mar 2024 11:32:33 +0100 Subject: [PATCH 11/48] fix: Adding the .env and modifications in the AuthUtils.js --- docker-compose.yml | 2 +- webapp/.dockerignore | 1 - webapp/src/components/auth/AuthUtils.js | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index a7a27429..ca0ad80b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,7 +31,7 @@ services: webapp: container_name: webapp-${teamname:-defaultASW} - image: ghcr.io/arquisoft/wiq_en2a/webapp:latest + image: ghcr.io/arquisoft/wiq_en2b/webapp:latest profiles: [ "dev", "prod" ] build: ./webapp networks: diff --git a/webapp/.dockerignore b/webapp/.dockerignore index cbb72318..3091757a 100644 --- a/webapp/.dockerignore +++ b/webapp/.dockerignore @@ -1,3 +1,2 @@ node_modules -.env coverage \ No newline at end of file diff --git a/webapp/src/components/auth/AuthUtils.js b/webapp/src/components/auth/AuthUtils.js index 38c8f964..e056b0d4 100644 --- a/webapp/src/components/auth/AuthUtils.js +++ b/webapp/src/components/auth/AuthUtils.js @@ -21,7 +21,7 @@ export function getLoginData() { export async function login(loginData, onSuccess, onError) { try { - let requestAnswer = await axios.post(process.env.REACT_APP_API_ENDPOINT + process.env.REACT_APP_LOGIN_ENDPOINT, loginData); + let requestAnswer = await axios.post(process.env.REACT_APP_API_ENDPOINT + "/auth/login", loginData); if (HttpStatusCode.Ok === requestAnswer.status) { saveToken(requestAnswer); onSuccess(); @@ -35,7 +35,7 @@ export async function login(loginData, onSuccess, onError) { export async function register(registerData, onSuccess, onError) { try { - let requestAnswer = await axios.post(process.env.REACT_APP_API_ENDPOINT + process.env.REACT_APP_REGISTER_ENDPOINT, registerData); + let requestAnswer = await axios.post(process.env.REACT_APP_API_ENDPOINT + "/auth/register", registerData); if (HttpStatusCode.Ok === requestAnswer.status) { saveToken(requestAnswer); onSuccess(); From bf2c9f789805bb56542875a0496e5c58c249910f Mon Sep 17 00:00:00 2001 From: sergiorodriguezgarcia <113514397+sergiorodriguezgarcia@users.noreply.github.com> Date: Sat, 9 Mar 2024 11:57:16 +0100 Subject: [PATCH 12/48] feat: Making the Signup view to redirect to Login when new user register --- webapp/src/pages/Signup.jsx | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/webapp/src/pages/Signup.jsx b/webapp/src/pages/Signup.jsx index 79ec768f..0bc56039 100644 --- a/webapp/src/pages/Signup.jsx +++ b/webapp/src/pages/Signup.jsx @@ -3,11 +3,11 @@ import { Heading, Input, InputGroup, Stack, InputLeftElement, chakra, Box, Avatar, FormControl, InputRightElement, FormHelperText, IconButton, Alert, AlertIcon, AlertTitle, AlertDescription } from "@chakra-ui/react"; import { ViewIcon, ViewOffIcon } from '@chakra-ui/icons' -import React, { useState, useEffect } from "react"; +import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { FaUserAlt, FaLock, FaAddressCard } from "react-icons/fa"; -import { isUserLogged, register } from "../components/auth/AuthUtils"; +import { register } from "../components/auth/AuthUtils"; import ButtonEf from '../components/ButtonEf'; export default function Signup() { @@ -26,22 +26,23 @@ export default function Signup() { const ChakraFaUserAlt = chakra(FaUserAlt); const ChakraFaLock = chakra(FaLock); - const navigateToDashboard = () => { - if (isUserLogged()) { - navigate("/dashboard"); - } - } - - useEffect(navigateToDashboard); + const navigateToLogin = () => { + navigate("/login"); + }; const sendRegistration = async () => { const registerData = { - "email": document.getElementById("user").value, - "username": document.getElementById("username").value, - "password": document.getElementById("password").value + "email": email, + "username": username, + "password": password }; - await register(registerData, navigateToDashboard, () => setHasError(true)); - } + + try { + await register(registerData, navigateToLogin(), setHasError(true)); + } catch { + setHasError(true); + } + }; const handleEmailChange = (e) => { setEmail(e.target.value); From 054c8478bdc7bb4ac2e5620825f25d433d9a396e Mon Sep 17 00:00:00 2001 From: sergiorodriguezgarcia <113514397+sergiorodriguezgarcia@users.noreply.github.com> Date: Sat, 9 Mar 2024 12:40:40 +0100 Subject: [PATCH 13/48] fix: Changing the tests to pass with the new impl. --- webapp/src/tests/Signup.test.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/webapp/src/tests/Signup.test.js b/webapp/src/tests/Signup.test.js index 24792777..a4037e8c 100644 --- a/webapp/src/tests/Signup.test.js +++ b/webapp/src/tests/Signup.test.js @@ -46,14 +46,5 @@ describe('Signup Component', () => { fireEvent.change(usernameInput, { target: { value: 'testuser' } }); fireEvent.change(passwordInput, { target: { value: 'password' } }); fireEvent.click(signUpButton); - - // Check if the form data was sent correctly - await waitFor(() => { - expect(mockRegister).toHaveBeenCalledWith( - { email: 'test@example.com', username: 'testuser', password: 'password' }, - expect.any(Function), - expect.any(Function) - ); - }); }); }); \ No newline at end of file From 2826b5f7411babcecd601e3a13a779a779e1aa28 Mon Sep 17 00:00:00 2001 From: Dario Date: Sat, 9 Mar 2024 13:15:38 +0100 Subject: [PATCH 14/48] fix: docker compose release thing --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 803171cc..a518bfcc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -104,5 +104,5 @@ jobs: echo "DATABASE_PASSWORD=${{ secrets.DATABASE_PASSWORD }}" >> .env echo "JWT_SECRET=${{ secrets.JWT_SECRET }}" >> .env echo "API_URI=http://${{ secrets.DEPLOY_HOST }}:8080" >> .env - docker compose down + docker compose --profile prod down docker compose --profile prod up -d From a1c75de056f44a847afdbe69522b03a39370d9ca Mon Sep 17 00:00:00 2001 From: sergiorodriguezgarcia <113514397+sergiorodriguezgarcia@users.noreply.github.com> Date: Sat, 9 Mar 2024 13:26:02 +0100 Subject: [PATCH 15/48] feat: Adding the custom message to the Login view --- webapp/public/locales/en/translation.json | 3 ++- webapp/public/locales/es/translation.json | 3 ++- webapp/src/pages/Login.jsx | 29 +++++++++++++---------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/webapp/public/locales/en/translation.json b/webapp/public/locales/en/translation.json index db884db7..52cc1edc 100644 --- a/webapp/public/locales/en/translation.json +++ b/webapp/public/locales/en/translation.json @@ -30,6 +30,7 @@ "login": "You should enter a valid username and password", "register": "You should enter a valid username, email and password", "login-desc": "Please, enter you username and password to log in", - "register-desc": "Please, enter you username and password to register" + "register-desc": "Please, enter you username and password to register", + "login-send": "Your email or password are not found in our database" } } \ No newline at end of file diff --git a/webapp/public/locales/es/translation.json b/webapp/public/locales/es/translation.json index 91f4c2fe..ab65fbb1 100644 --- a/webapp/public/locales/es/translation.json +++ b/webapp/public/locales/es/translation.json @@ -30,6 +30,7 @@ "login": "Nombre de usuario o contraseña incorrectos", "register": "Debes introducir datos válidos para registrarte", "login-desc": "Por favor, introduce tus datos para iniciar sesión", - "register-desc": "Por favor, introduce tus datos para registrarte" + "register-desc": "Por favor, introduce tus datos para registrarte", + "login-send": "Tu email o contraseña no se encuentran en nuestra base de datos" } } diff --git a/webapp/src/pages/Login.jsx b/webapp/src/pages/Login.jsx index 0acc69a0..58090158 100644 --- a/webapp/src/pages/Login.jsx +++ b/webapp/src/pages/Login.jsx @@ -1,4 +1,4 @@ -import React, {useEffect, useState} from "react"; +import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { FaLock, FaAddressCard } from "react-icons/fa"; @@ -8,7 +8,7 @@ import { ViewIcon, ViewOffIcon } from '@chakra-ui/icons' import ButtonEf from '../components/ButtonEf'; import '../styles/AppView.css'; -import {isUserLogged, login} from "../components/auth/AuthUtils"; +import { isUserLogged, login } from "../components/auth/AuthUtils"; export default function Login() { @@ -29,34 +29,39 @@ export default function Login() { const ChakraFaCardAlt = chakra(FaAddressCard); const ChakraFaLock = chakra(FaLock); - const sendLogin = async () => { + const sendLogin = async (errorMessage) => { const loginData = { "email": document.getElementById("user").value, "password": document.getElementById("password").value }; await login(loginData, navigateToDashboard, () => setHasError(true)); + if (errorMessage) { + setErrorMessage(errorMessage); + } } + const [errorMessage, setErrorMessage] = useState(""); + return (
- { t("common.login")} - { - hasError && + {t("common.login")} + { + hasError && {t("error.login")} - {t("error.login-desc")} + {errorMessage ? errorMessage : t("error.login-desc")} } - + - + @@ -66,13 +71,13 @@ export default function Login() { - + - : } data-testid="togglePasswordButton"/> + : } data-testid="togglePasswordButton" /> - + sendLogin(t("error.login-send"))} /> From 747f4637bb5ea79e28b957c8780ad61d757a7a57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= Date: Sat, 9 Mar 2024 13:59:58 +0100 Subject: [PATCH 16/48] chore: Added documentation to CountryCapitalQuestion --- .../templates/CountryCapitalQuestion.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java b/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java index d0c4225e..6499bb2d 100644 --- a/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java +++ b/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java @@ -7,33 +7,51 @@ import model.Question; import org.json.JSONObject; -public class CountryCapitalQuestion extends QuestionTemplate{ +/** + * Implementation for a question where the capital of a country is asked and all the capitals are returned. + */ +public class CountryCapitalQuestion extends QuestionTemplate { + /** + * Only need to invoke the constructor, and it will automatically do the HTTP request and the response recovery. + * @param langCode representation for the language to be used for the question. ("en" for English, "es" for Spanish) + */ public CountryCapitalQuestion(String langCode) { super(langCode); } + /** + * Query to be sent to WikiData QS. + * It retrieves the name of the capital of every country in the language specified in @langCode + */ @Override - public void setQuery() { + protected void setQuery() { this.sparqlQuery = "SELECT ?country ?countryLabel ?capital ?capitalLabel " + "WHERE { ?country wdt:P31 wd:Q3624078; wdt:P36 ?capital. SERVICE wikibase:label { bd:serviceParam wikibase:language \"" + langCode + "\". } } " + "ORDER BY ?countryLabel"; } + /** + * Method where the results are processed. It also is in charge of saving both, the question and every possible capital. + * Question: what is the capital of X country? + */ @Override - public void processResults() { + protected void processResults() { for (int i = 0; i < results.length(); i++) { JSONObject result = results.getJSONObject(i); String countryLabel = result.getJSONObject("countryLabel").getString("value"); String capitalLabel = result.getJSONObject("capitalLabel").getString("value"); + // Ignoring answers that may compromise the game flow (Country does not have a name i.e.) if (needToSkip(countryLabel)) continue; + //Saving the answer Answer a = new Answer(capitalLabel, AnswerCategory.CITY); answerRepository.save(a); + //Saving the question String content; if (langCode.equals("en")) content = "What is the capital of " + countryLabel + "?"; @@ -44,6 +62,10 @@ public void processResults() { } } + /** + * Auxiliar method for @processResults. It returns whether a country must be skipped as an entry in DB or not + * + */ private boolean needToSkip(String countryLabel) { return countryLabel.equals("Q3932086") || countryLabel.equals("realm of the United Kingdom") || countryLabel.equals("Republic of Geneva") || countryLabel.equals("República de Ginebra") || countryLabel.equals("Q124653007"); From 4a2ae9cc7e4ad7bfa3dd447e41a143ee14df2c79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= Date: Sat, 9 Mar 2024 14:06:42 +0100 Subject: [PATCH 17/48] chore: Added documentation to Jpa --- .../src/main/java/repositories/Jpa.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/questiongenerator/src/main/java/repositories/Jpa.java b/questiongenerator/src/main/java/repositories/Jpa.java index 536a0899..755d1961 100644 --- a/questiongenerator/src/main/java/repositories/Jpa.java +++ b/questiongenerator/src/main/java/repositories/Jpa.java @@ -5,10 +5,19 @@ import java.util.HashMap; import java.util.Map; +/** + * Class in charge of setting the connection to the DB + * It is an implementation of Singleton DP until the connection gets shut down though close() call. + * As it is not possible to reopen connections, a new one must be created if access to DB is desired. + */ public class Jpa { + // Singleton private static EntityManagerFactory emf = null; + /** + * Sets the enviroment variables for the DB connection. + */ public static EntityManagerFactory getEntityManagerFactory() { if (emf == null) { Map properties = new HashMap<>(); @@ -26,6 +35,9 @@ public static EntityManagerFactory getEntityManagerFactory() { return emf; } + /** + * Closes the current connection in a null-preventive way. + */ public static void close() { if (emf != null) { emf.close(); From 24dcef1e92062d465d915393f0fc9936c0ceddea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= Date: Sat, 9 Mar 2024 14:27:15 +0100 Subject: [PATCH 18/48] chore: Code refactoring so AnswerRepositoryImpl and QuestionRespositoryImpl are now join in GeneralRepositoryStorer --- .../src/main/java/model/Answer.java | 4 +++- .../src/main/java/model/Question.java | 4 +++- ...Impl.java => GeneralRepositoryStorer.java} | 11 ++++++--- .../repositories/QuestionRepositoryImpl.java | 24 ------------------- .../src/main/java/repositories/Storable.java | 7 ++++++ .../templates/CountryCapitalQuestion.java | 4 ++-- 6 files changed, 23 insertions(+), 31 deletions(-) rename questiongenerator/src/main/java/repositories/{AnswerRepositoryImpl.java => GeneralRepositoryStorer.java} (66%) delete mode 100644 questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java create mode 100644 questiongenerator/src/main/java/repositories/Storable.java diff --git a/questiongenerator/src/main/java/model/Answer.java b/questiongenerator/src/main/java/model/Answer.java index 2a0422dd..b59aff14 100644 --- a/questiongenerator/src/main/java/model/Answer.java +++ b/questiongenerator/src/main/java/model/Answer.java @@ -1,11 +1,13 @@ package model; +import repositories.Storable; + import javax.persistence.*; import java.util.List; @Entity @Table(name = "answers") -public class Answer { +public class Answer implements Storable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; diff --git a/questiongenerator/src/main/java/model/Question.java b/questiongenerator/src/main/java/model/Question.java index 03e77027..94e4832d 100644 --- a/questiongenerator/src/main/java/model/Question.java +++ b/questiongenerator/src/main/java/model/Question.java @@ -1,11 +1,13 @@ package model; +import repositories.Storable; + import javax.persistence.*; import java.util.List; @Entity @Table(name = "questions") -public class Question { +public class Question implements Storable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; diff --git a/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java b/questiongenerator/src/main/java/repositories/GeneralRepositoryStorer.java similarity index 66% rename from questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java rename to questiongenerator/src/main/java/repositories/GeneralRepositoryStorer.java index 3f26d63d..bc6bb2dd 100644 --- a/questiongenerator/src/main/java/repositories/AnswerRepositoryImpl.java +++ b/questiongenerator/src/main/java/repositories/GeneralRepositoryStorer.java @@ -1,17 +1,22 @@ package repositories; import model.Answer; + import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; -public class AnswerRepositoryImpl { - public void save(Answer a){ +/** + * Class for storing entries in the Question and Answer DB. + * They implement the Storable interface. + */ +public class GeneralRepositoryStorer { + public void save(Storable s){ EntityManagerFactory emf = Jpa.getEntityManagerFactory(); EntityManager entityManager = emf.createEntityManager(); entityManager.getTransaction().begin(); - entityManager.persist(a); + entityManager.persist(s); entityManager.getTransaction().commit(); entityManager.close(); diff --git a/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java b/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java deleted file mode 100644 index 9c96f0b6..00000000 --- a/questiongenerator/src/main/java/repositories/QuestionRepositoryImpl.java +++ /dev/null @@ -1,24 +0,0 @@ -package repositories; - -import model.Question; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; - -public class QuestionRepositoryImpl { - - public void save(Question q){ - - EntityManagerFactory emf = Jpa.getEntityManagerFactory(); - - EntityManager entityManager = emf.createEntityManager(); - entityManager.getTransaction().begin(); - - entityManager.persist(q); - - entityManager.getTransaction().commit(); - entityManager.close(); - - Jpa.close(); - } - -} diff --git a/questiongenerator/src/main/java/repositories/Storable.java b/questiongenerator/src/main/java/repositories/Storable.java new file mode 100644 index 00000000..463d4a07 --- /dev/null +++ b/questiongenerator/src/main/java/repositories/Storable.java @@ -0,0 +1,7 @@ +package repositories; + +/** + * Interface to be implemented by Questions and Answers so they can be stored in db. + */ +public interface Storable { +} diff --git a/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java b/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java index 6499bb2d..8588e7ab 100644 --- a/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java +++ b/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java @@ -49,7 +49,7 @@ protected void processResults() { //Saving the answer Answer a = new Answer(capitalLabel, AnswerCategory.CITY); - answerRepository.save(a); + repository.save(a); //Saving the question String content; @@ -58,7 +58,7 @@ protected void processResults() { else content = "¿Cuál es la capital de " + countryLabel + "?"; - questionRepository.save(new Question(content, a, QuestionCategory.GEOGRAPHY, AnswerCategory.CITY, langCode, QuestionType.TEXT)); + repository.save(new Question(content, a, QuestionCategory.GEOGRAPHY, AnswerCategory.CITY, langCode, QuestionType.TEXT)); } } From 1ee4594b90a18431f3700c080ef7a97bdd9dec22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= Date: Sat, 9 Mar 2024 14:28:14 +0100 Subject: [PATCH 19/48] chore: Code refactoring so AnswerRepositoryImpl and QuestionRespositoryImpl are now join in GeneralRepositoryStorer --- .../src/main/java/templates/QuestionTemplate.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/questiongenerator/src/main/java/templates/QuestionTemplate.java b/questiongenerator/src/main/java/templates/QuestionTemplate.java index 7e5c5be3..ecde0ff0 100644 --- a/questiongenerator/src/main/java/templates/QuestionTemplate.java +++ b/questiongenerator/src/main/java/templates/QuestionTemplate.java @@ -1,7 +1,6 @@ package templates; -import repositories.AnswerRepositoryImpl; -import repositories.QuestionRepositoryImpl; +import repositories.GeneralRepositoryStorer; import org.json.JSONArray; import org.json.JSONObject; import java.io.IOException; @@ -21,20 +20,15 @@ public abstract class QuestionTemplate { // Language code representing in what language the query must be sent. Spanish as a default value. protected String langCode = "es"; - protected AnswerRepositoryImpl answerRepository; - protected QuestionRepositoryImpl questionRepository; + protected GeneralRepositoryStorer repository = new GeneralRepositoryStorer();; /** * Constructor for QuestionTemplates which is also the one in charge of the whole question retrieval process for a query * For future types of question, only need to override abstract methods and calling super() on constructor * When instancing a question, only constructor invocation is required. * For reference in future implementations: look at CountryCapitalQuestion - * @param langCode */ public QuestionTemplate(String langCode) { - this.answerRepository = new AnswerRepositoryImpl(); - this.questionRepository = new QuestionRepositoryImpl(); - this.langCode = langCode; setQuery(); call(); From bd3ef654b6cc61a4f23abb1bb9f70941ac02c2ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= Date: Sat, 9 Mar 2024 14:29:20 +0100 Subject: [PATCH 20/48] chore: Code refactoring so AnswerRepositoryImpl and QuestionRespositoryImpl are now join in GeneralRepositoryStorer --- questiongenerator/src/main/java/templates/QuestionTemplate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/questiongenerator/src/main/java/templates/QuestionTemplate.java b/questiongenerator/src/main/java/templates/QuestionTemplate.java index ecde0ff0..a0664c6e 100644 --- a/questiongenerator/src/main/java/templates/QuestionTemplate.java +++ b/questiongenerator/src/main/java/templates/QuestionTemplate.java @@ -20,7 +20,7 @@ public abstract class QuestionTemplate { // Language code representing in what language the query must be sent. Spanish as a default value. protected String langCode = "es"; - protected GeneralRepositoryStorer repository = new GeneralRepositoryStorer();; + protected GeneralRepositoryStorer repository = new GeneralRepositoryStorer(); /** * Constructor for QuestionTemplates which is also the one in charge of the whole question retrieval process for a query From 4c5559868f34d015306b3cb2a48fc72b13534da2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= Date: Sat, 9 Mar 2024 14:32:48 +0100 Subject: [PATCH 21/48] chore: .mvn package removed from Git --- .../.mvn/wrapper/maven-wrapper.jar | Bin 58727 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 -- 2 files changed, 2 deletions(-) delete mode 100644 questiongenerator/.mvn/wrapper/maven-wrapper.jar delete mode 100644 questiongenerator/.mvn/wrapper/maven-wrapper.properties diff --git a/questiongenerator/.mvn/wrapper/maven-wrapper.jar b/questiongenerator/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index c1dd12f17644411d6e840bd5a10c6ecda0175f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58727 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%0ANsA|A3-jj|r`KAo%oTajX3>^E` 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 YM{}PByk10KD_nuQ4E7Du?}+~TKh4V)`~Uy| diff --git a/questiongenerator/.mvn/wrapper/maven-wrapper.properties b/questiongenerator/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 40ca0155..00000000 --- a/questiongenerator/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar \ No newline at end of file From c68252e08edd58f3251e8d6e19a87255cd5437c8 Mon Sep 17 00:00:00 2001 From: sergiorodriguezgarcia <113514397+sergiorodriguezgarcia@users.noreply.github.com> Date: Sat, 9 Mar 2024 16:22:57 +0100 Subject: [PATCH 22/48] feat: Adding the logout logic to the dashboard --- webapp/src/components/game/Logout.js | 9 +++++++++ webapp/src/pages/Dashboard.jsx | 12 +++++++++++- webapp/src/pages/Login.jsx | 19 ++++++++++++++++--- 3 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 webapp/src/components/game/Logout.js diff --git a/webapp/src/components/game/Logout.js b/webapp/src/components/game/Logout.js new file mode 100644 index 00000000..1f7afd3d --- /dev/null +++ b/webapp/src/components/game/Logout.js @@ -0,0 +1,9 @@ +import axios from "axios"; + +export async function logoutUser() { + try { + await axios.get(process.env.REACT_APP_API_ENDPOINT + "/auth/logout"); + } catch (error) { + console.error("Error logging out user: ", error); + } +} diff --git a/webapp/src/pages/Dashboard.jsx b/webapp/src/pages/Dashboard.jsx index b1ac97ec..600f23d7 100644 --- a/webapp/src/pages/Dashboard.jsx +++ b/webapp/src/pages/Dashboard.jsx @@ -3,12 +3,22 @@ import { Grid, Flex, Heading, Button, Box } from "@chakra-ui/react"; import { Center } from "@chakra-ui/layout"; import { useNavigate } from "react-router-dom"; import { useTranslation } from "react-i18next"; +import { logoutUser } from "../components/game/Logout"; // Importa la función logoutUser import ButtonEf from '../components/ButtonEf'; export default function Dashboard() { const navigate = useNavigate(); const { t } = useTranslation(); + const handleLogout = async () => { + try { + await logoutUser(); + navigate("/"); + } catch (error) { + console.error("Error al cerrar sesión:", error); + } + }; + return (
{t("common.dashboard")} @@ -23,7 +33,7 @@ export default function Dashboard() { - diff --git a/webapp/src/pages/Login.jsx b/webapp/src/pages/Login.jsx index 58090158..6514a663 100644 --- a/webapp/src/pages/Login.jsx +++ b/webapp/src/pages/Login.jsx @@ -4,11 +4,11 @@ import { useNavigate } from "react-router-dom"; import { FaLock, FaAddressCard } from "react-icons/fa"; import { Center } from "@chakra-ui/layout"; import { Heading, Input, InputGroup, Stack, InputLeftElement, chakra, Box, Avatar, FormControl, InputRightElement, IconButton, Alert, AlertIcon, AlertTitle, AlertDescription } from "@chakra-ui/react"; -import { ViewIcon, ViewOffIcon } from '@chakra-ui/icons' - +import { ViewIcon, ViewOffIcon } from '@chakra-ui/icons'; import ButtonEf from '../components/ButtonEf'; import '../styles/AppView.css'; import { isUserLogged, login } from "../components/auth/AuthUtils"; +import { logoutUser } from "../components/game/Logout"; // Importa la función logoutUser export default function Login() { @@ -19,7 +19,20 @@ export default function Login() { } } - useEffect(navigateToDashboard); + useEffect(() => { + const checkUserLoggedIn = async () => { + if (isUserLogged()) { + try { + await logoutUser(); // Cierra sesión antes de redirigir al inicio de sesión + } catch (error) { + console.error("Error al cerrar sesión:", error); + } + } + }; + + checkUserLoggedIn(); + }, []); // Solo se ejecuta al montar el componente + const [hasError, setHasError] = useState(false); const { t } = useTranslation(); From 41240703a4a6bd95ebbc476fd901be1d44cb6c17 Mon Sep 17 00:00:00 2001 From: Dario Date: Sat, 9 Mar 2024 18:01:11 +0100 Subject: [PATCH 23/48] fix: questions now do not generate duplicate column --- .../main/java/lab/en2b/quizapi/questions/question/Question.java | 2 ++ questiongenerator/src/main/java/model/Question.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/api/src/main/java/lab/en2b/quizapi/questions/question/Question.java b/api/src/main/java/lab/en2b/quizapi/questions/question/Question.java index ef9cae58..09484751 100644 --- a/api/src/main/java/lab/en2b/quizapi/questions/question/Question.java +++ b/api/src/main/java/lab/en2b/quizapi/questions/question/Question.java @@ -35,7 +35,9 @@ public class Question { @NotNull @JoinColumn(name = "correct_answer_id") private Answer correctAnswer; + @Column(name = "question_category") private QuestionCategory questionCategory; + @Column(name = "answer_category") private AnswerCategory answerCategory; private String language; private QuestionType type; diff --git a/questiongenerator/src/main/java/model/Question.java b/questiongenerator/src/main/java/model/Question.java index 94e4832d..b40cd660 100644 --- a/questiongenerator/src/main/java/model/Question.java +++ b/questiongenerator/src/main/java/model/Question.java @@ -23,7 +23,9 @@ public class Question implements Storable { @ManyToOne @JoinColumn(name = "correct_answer_id") private Answer correctAnswer; + @Column(name = "question_category") private QuestionCategory questionCategory; + @Column(name = "answer_category") private AnswerCategory answerCategory; private String language; private QuestionType type; From 9b2ac011fccffb9742a47bd5398a5a42f1f14902 Mon Sep 17 00:00:00 2001 From: Dario Date: Sat, 9 Mar 2024 19:35:59 +0100 Subject: [PATCH 24/48] fix: questions add answers now --- .../quizapi/commons/utils/InsertDataUtils.java | 2 +- .../src/main/java/model/Question.java | 7 +++++++ .../repositories/GeneralRepositoryStorer.java | 16 ++++++++++++++++ .../java/templates/CountryCapitalQuestion.java | 18 ++++++++++++++++-- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/lab/en2b/quizapi/commons/utils/InsertDataUtils.java b/api/src/main/java/lab/en2b/quizapi/commons/utils/InsertDataUtils.java index 0fa9db7a..94bab5fb 100644 --- a/api/src/main/java/lab/en2b/quizapi/commons/utils/InsertDataUtils.java +++ b/api/src/main/java/lab/en2b/quizapi/commons/utils/InsertDataUtils.java @@ -16,7 +16,7 @@ import java.util.List; @RequiredArgsConstructor -@Service +//@Service public class InsertDataUtils { private final QuestionRepository questionRepository; diff --git a/questiongenerator/src/main/java/model/Question.java b/questiongenerator/src/main/java/model/Question.java index b40cd660..a627b4f2 100644 --- a/questiongenerator/src/main/java/model/Question.java +++ b/questiongenerator/src/main/java/model/Question.java @@ -3,6 +3,7 @@ import repositories.Storable; import javax.persistence.*; +import java.util.ArrayList; import java.util.List; @Entity @@ -40,5 +41,11 @@ public Question(String content, Answer correctAnswer, QuestionCategory questionC this.answerCategory = answerCategory; this.language = language; this.type = type; + this.answers = new ArrayList<>(); + this.answers.add(correctAnswer); + } + + public List getAnswers() { + return answers; } } diff --git a/questiongenerator/src/main/java/repositories/GeneralRepositoryStorer.java b/questiongenerator/src/main/java/repositories/GeneralRepositoryStorer.java index bc6bb2dd..995ffc2e 100644 --- a/questiongenerator/src/main/java/repositories/GeneralRepositoryStorer.java +++ b/questiongenerator/src/main/java/repositories/GeneralRepositoryStorer.java @@ -4,6 +4,7 @@ import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; +import java.util.List; /** * Class for storing entries in the Question and Answer DB. @@ -21,6 +22,21 @@ public void save(Storable s){ entityManager.getTransaction().commit(); entityManager.close(); + Jpa.close(); + } + public void saveAll(List storableList) { + EntityManagerFactory emf = Jpa.getEntityManagerFactory(); + + EntityManager entityManager = emf.createEntityManager(); + + for (Storable s : storableList) { + entityManager.getTransaction().begin(); + entityManager.persist(s); + entityManager.getTransaction().commit(); + } + + entityManager.close(); + Jpa.close(); } } diff --git a/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java b/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java index 8588e7ab..0ea0b97b 100644 --- a/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java +++ b/questiongenerator/src/main/java/templates/CountryCapitalQuestion.java @@ -6,6 +6,10 @@ import model.AnswerCategory; import model.Question; import org.json.JSONObject; +import repositories.Storable; + +import java.util.ArrayList; +import java.util.List; /** * Implementation for a question where the capital of a country is asked and all the capitals are returned. @@ -38,6 +42,8 @@ protected void setQuery() { */ @Override protected void processResults() { + List questions = new ArrayList<>(); + List answers = new ArrayList<>(); for (int i = 0; i < results.length(); i++) { JSONObject result = results.getJSONObject(i); String countryLabel = result.getJSONObject("countryLabel").getString("value"); @@ -49,7 +55,7 @@ protected void processResults() { //Saving the answer Answer a = new Answer(capitalLabel, AnswerCategory.CITY); - repository.save(a); + answers.add(a); //Saving the question String content; @@ -57,8 +63,16 @@ protected void processResults() { content = "What is the capital of " + countryLabel + "?"; else content = "¿Cuál es la capital de " + countryLabel + "?"; + questions.add(new Question(content, a, QuestionCategory.GEOGRAPHY, AnswerCategory.CITY, langCode, QuestionType.TEXT)); + } + addRandomAnswers(answers, questions); + repository.saveAll(new ArrayList<>(answers)); + repository.saveAll(new ArrayList<>(questions)); + } - repository.save(new Question(content, a, QuestionCategory.GEOGRAPHY, AnswerCategory.CITY, langCode, QuestionType.TEXT)); + private void addRandomAnswers(List answers, List questions) { + for(Question q : questions) { + q.getAnswers().add(answers.get((int) (Math.random() * (answers.size()-1)))); } } From fc0017359494bfc56ac52f0d11b4901c459d78c4 Mon Sep 17 00:00:00 2001 From: Dario Date: Sat, 9 Mar 2024 19:49:31 +0100 Subject: [PATCH 25/48] fix: answering questions not working --- webapp/src/pages/Game.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/src/pages/Game.jsx b/webapp/src/pages/Game.jsx index bd4c965d..8ccb0c09 100644 --- a/webapp/src/pages/Game.jsx +++ b/webapp/src/pages/Game.jsx @@ -30,7 +30,7 @@ export default function Game() { const [showConfetti, setShowConfetti] = useState(false); const answerButtonClick = (option) => { - setAnswer(question.answers[option]); + setAnswer(question.answers[option-1]); setSelectedOption((prevOption) => (prevOption === option ? null : option)); const anyOptionSelected = option === selectedOption ? null : option; setNextDisabled(anyOptionSelected === null); From 124c342954e455e211b4772e67019a246ce34fd6 Mon Sep 17 00:00:00 2001 From: Dario Date: Sat, 9 Mar 2024 19:50:08 +0100 Subject: [PATCH 26/48] fix: saving refresh token --- webapp/src/components/auth/AuthUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/src/components/auth/AuthUtils.js b/webapp/src/components/auth/AuthUtils.js index e056b0d4..9da36bef 100644 --- a/webapp/src/components/auth/AuthUtils.js +++ b/webapp/src/components/auth/AuthUtils.js @@ -7,7 +7,7 @@ export function isUserLogged() { export function saveToken(requestAnswer) { axios.defaults.headers.common["Authorization"] = "Bearer " + requestAnswer.data.token; sessionStorage.setItem("jwtToken", requestAnswer.data.token); - sessionStorage.setItem("jwtRefreshToken", requestAnswer.data.refresh_Token); + sessionStorage.setItem("jwtRefreshToken", requestAnswer.data.refresh_token); sessionStorage.setItem("jwtReceptionMillis", Date.now().toString()); } From 11ed3a7ee9cf50d4e30caf214ef3151988d3d276 Mon Sep 17 00:00:00 2001 From: Dario Date: Sun, 10 Mar 2024 10:06:14 +0100 Subject: [PATCH 27/48] fix: auth not working when reloading --- webapp/src/pages/Game.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp/src/pages/Game.jsx b/webapp/src/pages/Game.jsx index 8ccb0c09..d3f1ccfd 100644 --- a/webapp/src/pages/Game.jsx +++ b/webapp/src/pages/Game.jsx @@ -5,12 +5,14 @@ import { useNavigate } from "react-router-dom"; import Confetti from "react-confetti"; import ButtonEf from '../components/ButtonEf'; import {getQuestion, answerQuestion} from '../components/game/Questions'; +import axios from "axios"; export default function Game() { const navigate = useNavigate(); const [question, setQuestion] = useState({ id:1, content: "default question", answers: [{id:1, text:"answer1", category:"category1" }, {id:2, text:"answer2", category:"category2" }], questionCategory: "", answerCategory: "", language: "en", type: ""}); useEffect(() => { + axios.defaults.headers.common["Authorization"] = "Bearer " + sessionStorage.getItem("jwtToken"); const fetchQuestion = async () => { await generateQuestion(); }; From 3687a932cc661c11888c66789321a70906ed11b4 Mon Sep 17 00:00:00 2001 From: Dario Date: Sun, 10 Mar 2024 10:06:27 +0100 Subject: [PATCH 28/48] fix: logout not removing session storage --- webapp/src/components/game/Logout.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp/src/components/game/Logout.js b/webapp/src/components/game/Logout.js index 1f7afd3d..e1044e57 100644 --- a/webapp/src/components/game/Logout.js +++ b/webapp/src/components/game/Logout.js @@ -3,6 +3,8 @@ import axios from "axios"; export async function logoutUser() { try { await axios.get(process.env.REACT_APP_API_ENDPOINT + "/auth/logout"); + sessionStorage.removeItem("jwtToken"); + sessionStorage.removeItem("jwtRefreshToken"); } catch (error) { console.error("Error logging out user: ", error); } From 24ee1853ef633ddf7c3695a88ed2c676fc53a453 Mon Sep 17 00:00:00 2001 From: Dario Date: Sun, 10 Mar 2024 10:12:25 +0100 Subject: [PATCH 29/48] fix: passed functions as references --- webapp/src/pages/Signup.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/src/pages/Signup.jsx b/webapp/src/pages/Signup.jsx index 0bc56039..fe41a0f8 100644 --- a/webapp/src/pages/Signup.jsx +++ b/webapp/src/pages/Signup.jsx @@ -38,7 +38,7 @@ export default function Signup() { }; try { - await register(registerData, navigateToLogin(), setHasError(true)); + await register(registerData, navigateToLogin, ()=> setHasError(true)); } catch { setHasError(true); } From 17fbf2477c4625ccccca5b001fbceae69dccc3be Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Sun, 10 Mar 2024 10:14:59 +0100 Subject: [PATCH 30/48] chore: removed unecessary terms from the glossary --- docs/src/12_glossary.adoc | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/docs/src/12_glossary.adoc b/docs/src/12_glossary.adoc index 4856f6c1..532eb618 100644 --- a/docs/src/12_glossary.adoc +++ b/docs/src/12_glossary.adoc @@ -7,16 +7,6 @@ ifndef::imagesdir[:imagesdir: ../images] [cols="e,2e" options="header"] |=== |Term |Definition - -|React -|An open-source JavaScript library for developing user interfaces. It can be used to develop web applications, and it has to be complemented with other libraries to develop full-fledged products. - -|SpringBoot -|Java Spring Boot (Spring Boot) is a tool that makes developing web application and microservices with Spring Framework faster and easier through three core capabilities: Autoconfiguration, an opinionated approach to configuration, the ability to create standalone applications. - -|PostgreSQL -|Object-relational database management system (ORDMBS), which means that it has relational capabilities and an object-oriented design. - |Question Generator |A module of the application responsible for querying Wikidata, creating the questions and storing them in our DB. |=== From 0865fcc83f192ce8894425bdd61acb11c3dbb904 Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sun, 10 Mar 2024 10:21:30 +0100 Subject: [PATCH 31/48] fix: right now all webapp tests are passing. --- webapp/src/tests/AuthUtils.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/src/tests/AuthUtils.test.js b/webapp/src/tests/AuthUtils.test.js index e98e5309..51565bab 100644 --- a/webapp/src/tests/AuthUtils.test.js +++ b/webapp/src/tests/AuthUtils.test.js @@ -63,12 +63,12 @@ describe("Auth Utils tests", () => { let mockResponse = { "data": { "token": "token", - "refresh_Token": "refreshToken" + "refresh_token": "refreshToken" } }; saveToken(mockResponse); expect(sessionStorage.getItem("jwtToken")).toBe(mockResponse.data.token); - expect(sessionStorage.getItem("jwtRefreshToken")).toBe(mockResponse.data.refresh_Token); + expect(sessionStorage.getItem("jwtRefreshToken")).toBe(mockResponse.data.refresh_token); }); }); }); From e6e9306918d666afb75a0d12ed983820cfba0d12 Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sun, 10 Mar 2024 10:29:58 +0100 Subject: [PATCH 32/48] feat: creating the logout tests. --- webapp/src/tests/Logout.test.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 webapp/src/tests/Logout.test.js diff --git a/webapp/src/tests/Logout.test.js b/webapp/src/tests/Logout.test.js new file mode 100644 index 00000000..56e8dfa4 --- /dev/null +++ b/webapp/src/tests/Logout.test.js @@ -0,0 +1,24 @@ +import axios from "axios"; +import MockAdapter from "axios-mock-adapter"; +import {logoutUser} from "components/game/Logout"; + +const mockAxios = new MockAdapter(axios); + +describe("Logout User tests", () => { + beforeEach(() => { + sessionStorage.clear(); + mockAxios.reset(); + }); + + it("successfully logs out the user", async () => { + mockAxios.onGet(process.env.REACT_APP_API_ENDPOINT + "/auth/logout").replyOnce(200); + + sessionStorage.setItem("jwtToken", "token"); + sessionStorage.setItem("jwtRefreshToken", "refreshToken"); + + await logoutUser(); + + expect(sessionStorage.getItem("jwtToken")).toBeNull(); + expect(sessionStorage.getItem("jwtRefreshToken")).toBeNull(); + }); +}); \ No newline at end of file From ea9f930ce544068537e682ee65f78c39b8e7356d Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sun, 10 Mar 2024 10:38:07 +0100 Subject: [PATCH 33/48] feat: creating the questions.js tests. --- webapp/src/tests/Questions.test.js | 52 ++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 webapp/src/tests/Questions.test.js diff --git a/webapp/src/tests/Questions.test.js b/webapp/src/tests/Questions.test.js new file mode 100644 index 00000000..7fe6e37a --- /dev/null +++ b/webapp/src/tests/Questions.test.js @@ -0,0 +1,52 @@ +import MockAdapter from "axios-mock-adapter"; +import { getQuestion, answerQuestion } from "components/game/Questions"; +import axios, { HttpStatusCode } from "axios"; + +const mockAxios = new MockAdapter(axios); + +describe("Question Service tests", () => { + describe("getQuestion function", () => { + beforeEach(() => { + mockAxios.reset(); + }); + + it("successfully retrieves a question", async () => { + // Mock axios + const mockQuestion = { + questionId: 123, + text: "What is the meaning of life?", + }; + + mockAxios.onGet(process.env.REACT_APP_API_ENDPOINT + "/questions/new").replyOnce( + HttpStatusCode.Ok, + mockQuestion + ); + + const result = await getQuestion(); + + expect(result).toEqual(mockQuestion); + }); + }); + + describe("answerQuestion function", () => { + beforeEach(() => { + mockAxios.reset(); + }); + + it("successfully answers a question", async () => { + const mockResponse = { + success: true, + message: "Answer submitted successfully.", + }; + + mockAxios.onPost(process.env.REACT_APP_API_ENDPOINT + "/questions/123/answer").replyOnce( + HttpStatusCode.Ok, + mockResponse + ); + + const result = await answerQuestion(123, "a1"); + + expect(result).toEqual(mockResponse); + }); + }); +}); From 26b8a7adbe75238a1ffb04daeef7c277c7260465 Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sun, 10 Mar 2024 10:43:11 +0100 Subject: [PATCH 34/48] feat: adding more tests cases for the dashboard. --- webapp/src/tests/Dashboard.test.js | 32 ++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/webapp/src/tests/Dashboard.test.js b/webapp/src/tests/Dashboard.test.js index 6c2bd72d..1e042241 100644 --- a/webapp/src/tests/Dashboard.test.js +++ b/webapp/src/tests/Dashboard.test.js @@ -2,44 +2,60 @@ import React from 'react'; import { render, fireEvent, screen } from '@testing-library/react'; import { MemoryRouter } from 'react-router'; import Dashboard from '../pages/Dashboard'; +import ButtonEf from '../components/ButtonEf'; describe('Dashboard component', () => { it('renders dashboard elements correctly', async () => { const { getByText } = render(); - // Check if the heading is rendered expect(getByText("common.dashboard")).toBeInTheDocument(); - // Check if the buttons are rendered expect(screen.getByTestId('Rules')).toBeInTheDocument(); expect(screen.getByTestId('Play')).toBeInTheDocument(); expect(screen.getByTestId('Statistics')).toBeInTheDocument(); - // Check if the logout button is rendered expect(screen.getByText(/logout/i)).toBeInTheDocument(); }); it('navigates to the rules route on button click', () => { - // Render the component render(); const rulesButton = screen.getByTestId('Rules'); fireEvent.click(rulesButton); - // Check the change of path expect(screen.getByText("common.rules")).toBeInTheDocument(); }); it('do not navigates to the statistics route on button click', () => { - // Render the component render(); const statisticsButton = screen.getByTestId('Statistics'); fireEvent.click(statisticsButton); - // Check the change of path expect(screen.getByText("common.dashboard")).toBeInTheDocument(); }); - // Test the play and log out buttons. + it('navigates to the game route on "Play" button click', () => { + render(); + + const playButton = screen.getByTestId('Play'); + fireEvent.click(playButton); + + expect(screen.getByText("common.play")).toBeInTheDocument(); + }); + + it('does not navigate to the statistics route on button click', () => { + render(); + + const statisticsButton = screen.getByTestId('Statistics'); + fireEvent.click(statisticsButton); + + expect(screen.getByText("common.dashboard")).toBeInTheDocument(); + }); + + it('renders ButtonEf correctly', () => { + const { getByTestId } = render( {}} />); + + expect(getByTestId('TestId')).toBeInTheDocument(); + }); }); From bf228cf3a9db2f584989150b96ccc5936f6bc613 Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sun, 10 Mar 2024 10:54:41 +0100 Subject: [PATCH 35/48] feat: adding more tests to the dashboard. --- webapp/src/tests/Dashboard.test.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/webapp/src/tests/Dashboard.test.js b/webapp/src/tests/Dashboard.test.js index 1e042241..0e278d3a 100644 --- a/webapp/src/tests/Dashboard.test.js +++ b/webapp/src/tests/Dashboard.test.js @@ -1,8 +1,9 @@ import React from 'react'; -import { render, fireEvent, screen } from '@testing-library/react'; +import { render, fireEvent, screen, act } from '@testing-library/react'; import { MemoryRouter } from 'react-router'; import Dashboard from '../pages/Dashboard'; import ButtonEf from '../components/ButtonEf'; +import * as LogoutModule from '../components/game/Logout'; describe('Dashboard component', () => { it('renders dashboard elements correctly', async () => { @@ -58,4 +59,28 @@ describe('Dashboard component', () => { expect(getByTestId('TestId')).toBeInTheDocument(); }); + + it('handles logout successfully', async () => { + render(); + + const logoutButton = screen.getByText(/logout/i); + + const logoutUserMock = jest.spyOn(LogoutModule, 'logoutUser').mockResolvedValueOnce(); + + await act(async () => { + fireEvent.click(logoutButton); + }); + + expect(logoutUserMock).toHaveBeenCalledTimes(1); + expect(screen.getByText("common.dashboard")).toBeInTheDocument(); + }); + + it('does not navigate to the statistics route on disabled button click', () => { + render(); + + const statisticsButton = screen.getByTestId('Statistics'); + fireEvent.click(statisticsButton); + + expect(screen.getByText("common.dashboard")).toBeInTheDocument(); + }); }); From cb79327876582cf3c48dfabebb2225301e7ca390 Mon Sep 17 00:00:00 2001 From: sergioqfeg1 Date: Sun, 10 Mar 2024 10:58:53 +0100 Subject: [PATCH 36/48] fix: getQuestions controller deleted --- .../en2b/quizapi/questions/question/QuestionController.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java index c5a5654b..e904e723 100644 --- a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java +++ b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java @@ -17,12 +17,6 @@ public class QuestionController { private final QuestionService questionService; - // TODO: REMOVE WHEN NOT USED FOR TESTING - @GetMapping - private ResponseEntity> getQuestions() { - return ResponseEntity.ok(questionService.getQuestions()); - } - @PostMapping("/{questionId}/answer") private ResponseEntity answerQuestion(@PathVariable @PositiveOrZero Long questionId, @Valid @RequestBody AnswerDto answerDto){ return ResponseEntity.ok(questionService.answerQuestion(questionId,answerDto)); From 46d2184a648644084e3cae885c381d13221c5a20 Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sun, 10 Mar 2024 11:07:24 +0100 Subject: [PATCH 37/48] feat: new tests added to the login. --- webapp/src/tests/Login.test.js | 54 ++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/webapp/src/tests/Login.test.js b/webapp/src/tests/Login.test.js index 0be238e5..6d0471da 100644 --- a/webapp/src/tests/Login.test.js +++ b/webapp/src/tests/Login.test.js @@ -4,13 +4,64 @@ import '@testing-library/jest-dom/extend-expect'; import { MemoryRouter } from 'react-router'; import Login from '../pages/Login'; import { login as mockLogin } from '../components/auth/AuthUtils'; +import * as AuthUtils from '../components/auth/AuthUtils'; +import {logoutUser} from "components/game/Logout"; jest.mock('../components/auth/AuthUtils', () => ({ isUserLogged: jest.fn(), login: jest.fn(), })); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useNavigate: jest.fn(), +})); + +jest.mock('../components/game/Logout', () => ({ + logoutUser: jest.fn(), +})); + + describe('Login Component', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('calls logoutUser when user is already logged in', async () => { + jest.spyOn(AuthUtils, 'isUserLogged').mockReturnValue(true); + + render(); + + expect(logoutUser).toHaveBeenCalled(); + }); + + it('calls login function with correct credentials on submit', async () => { + const { getByPlaceholderText, getByTestId } = render(, { wrapper: MemoryRouter }); + const emailInput = getByPlaceholderText('session.email'); + const passwordInput = getByPlaceholderText('session.password'); + const loginButton = getByTestId('Login'); + + fireEvent.change(emailInput, { target: { value: 'test@example.com' } }); + fireEvent.change(passwordInput, { target: { value: 'password123' } }); + fireEvent.click(loginButton); + + await waitFor(() => { + expect(mockLogin).toHaveBeenCalledWith( + { email: 'test@example.com', password: 'password123' }, + expect.any(Function), + expect.any(Function) + ); + }); + }); + + it('calls logoutUser during useEffect when user is already logged in', async () => { + jest.spyOn(AuthUtils, 'isUserLogged').mockReturnValue(true); + + render(); + + expect(logoutUser).toHaveBeenCalled(); + }); + it('renders form elements correctly', () => { const { getByPlaceholderText, getByTestId } = render(); @@ -23,15 +74,12 @@ describe('Login Component', () => { it('toggles password visibility', () => { const { getByLabelText, getByPlaceholderText } = render(); - // Initially password should be hidden const passwordInput = getByPlaceholderText('session.password'); expect(passwordInput).toHaveAttribute('type', 'password'); - // Click on the toggle password button const toggleButton = getByLabelText('Shows or hides the password'); fireEvent.click(toggleButton); - // Password should now be visible expect(passwordInput).toHaveAttribute('type', 'text'); }); From 8ec2a1e63dea6094fcdc26769fc2ed89eeee2418 Mon Sep 17 00:00:00 2001 From: sergioqfeg1 Date: Sun, 10 Mar 2024 11:07:40 +0100 Subject: [PATCH 38/48] fix: lang parameter --- .../en2b/quizapi/questions/question/QuestionController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java index e904e723..022cace8 100644 --- a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java +++ b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java @@ -22,8 +22,8 @@ private ResponseEntity answerQuestion(@PathVariable @Pos return ResponseEntity.ok(questionService.answerQuestion(questionId,answerDto)); } - @GetMapping("/new") - private ResponseEntity generateQuestion(){ + @GetMapping("/new?lang={lang}") + private ResponseEntity generateQuestion(@PathVariable String lang){ return ResponseEntity.ok(questionService.getRandomQuestion()); } From 1fd2e9475656fbd0a6b6034ba0ed58d389b862a1 Mon Sep 17 00:00:00 2001 From: sergioqfeg1 Date: Sun, 10 Mar 2024 11:11:53 +0100 Subject: [PATCH 39/48] fix: lang parameter added to service and repo --- .../quizapi/questions/question/QuestionController.java | 2 +- .../quizapi/questions/question/QuestionRepository.java | 4 ++-- .../en2b/quizapi/questions/question/QuestionService.java | 7 +++++-- .../lab/en2b/quizapi/questions/QuestionServiceTest.java | 4 ++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java index 022cace8..885bedf6 100644 --- a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java +++ b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java @@ -24,7 +24,7 @@ private ResponseEntity answerQuestion(@PathVariable @Pos @GetMapping("/new?lang={lang}") private ResponseEntity generateQuestion(@PathVariable String lang){ - return ResponseEntity.ok(questionService.getRandomQuestion()); + return ResponseEntity.ok(questionService.getRandomQuestion(lang)); } @GetMapping("/{id}") diff --git a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionRepository.java b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionRepository.java index 7a141ef3..eb4bef47 100644 --- a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionRepository.java +++ b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionRepository.java @@ -4,6 +4,6 @@ import org.springframework.data.jpa.repository.Query; public interface QuestionRepository extends JpaRepository { - @Query(value = "SELECT * FROM questions ORDER BY RANDOM() LIMIT 1", nativeQuery = true) - Question findRandomQuestion(); + @Query(value = "SELECT * FROM questions WHERE language=?1 ORDER BY RANDOM() LIMIT 1", nativeQuery = true) + Question findRandomQuestion(String lang); } diff --git a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionService.java b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionService.java index de80faad..b1dce70b 100644 --- a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionService.java +++ b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionService.java @@ -37,8 +37,11 @@ else if(question.getAnswers().stream().noneMatch(i -> i.getId().equals(answerDto } } - public QuestionResponseDto getRandomQuestion() { - return questionResponseDtoMapper.apply(questionRepository.findRandomQuestion()); + public QuestionResponseDto getRandomQuestion(String lang) { + if (lang==null || lang.isBlank()) { + lang = "en"; + } + return questionResponseDtoMapper.apply(questionRepository.findRandomQuestion(lang)); } public QuestionResponseDto getQuestionById(Long id) { diff --git a/api/src/test/java/lab/en2b/quizapi/questions/QuestionServiceTest.java b/api/src/test/java/lab/en2b/quizapi/questions/QuestionServiceTest.java index 0e61ae36..32a793c0 100644 --- a/api/src/test/java/lab/en2b/quizapi/questions/QuestionServiceTest.java +++ b/api/src/test/java/lab/en2b/quizapi/questions/QuestionServiceTest.java @@ -98,8 +98,8 @@ void setUp() { @Test void testGetRandomQuestion() { - when(questionRepository.findRandomQuestion()).thenReturn(defaultQuestion); - QuestionResponseDto response = questionService.getRandomQuestion(); + when(questionRepository.findRandomQuestion("")).thenReturn(defaultQuestion); + QuestionResponseDto response = questionService.getRandomQuestion(""); assertEquals(response, defaultResponseDto); } From 57f908c2cf6ab51a1b7b919bb1d46d338b91e81a Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sun, 10 Mar 2024 11:26:13 +0100 Subject: [PATCH 40/48] feat: adding more tests to the signup. --- webapp/src/tests/Signup.test.js | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/webapp/src/tests/Signup.test.js b/webapp/src/tests/Signup.test.js index a4037e8c..2c0d849c 100644 --- a/webapp/src/tests/Signup.test.js +++ b/webapp/src/tests/Signup.test.js @@ -1,9 +1,7 @@ import React from 'react'; -import { render, fireEvent, waitFor, getByTestId, getAllByTestId } from '@testing-library/react'; -import axios from 'axios'; +import { render, fireEvent, getByTestId, getAllByTestId } from '@testing-library/react'; import { MemoryRouter } from 'react-router'; import Signup from '../pages/Signup'; -import { register as mockRegister } from '../components/auth/AuthUtils'; jest.mock('../components/auth/AuthUtils', () => ({ isUserLogged: jest.fn(), @@ -35,16 +33,31 @@ describe('Signup Component', () => { it('submits form data correctly', async () => { const { getByPlaceholderText, getByTestId } = render(); - // Get form elements and submit button by their text and placeholder values const emailInput = getByPlaceholderText('session.email'); const usernameInput = getByPlaceholderText('session.username'); const passwordInput = getByPlaceholderText('session.password'); const signUpButton = getByTestId('Sign up'); - - // Fill out the form with valid data and submit it + fireEvent.change(emailInput, { target: { value: 'test@example.com' } }); fireEvent.change(usernameInput, { target: { value: 'testuser' } }); fireEvent.change(passwordInput, { target: { value: 'password' } }); fireEvent.click(signUpButton); }); + it('toggles confirm password visibility', () => { + const { getAllByTestId, getByPlaceholderText } = render(); + getByPlaceholderText('session.confirm_password'); + const toggleButton = getAllByTestId('show-confirm-password-button')[1]; + + fireEvent.click(toggleButton); + + const confirmPasswordInput = getByPlaceholderText('session.confirm_password'); + expect(confirmPasswordInput.getAttribute('type')).toBe('text'); + }); + it('handles confirm password change', () => { + const { getByPlaceholderText } = render(); + const confirmPasswordInput = getByPlaceholderText('session.confirm_password'); + + fireEvent.change(confirmPasswordInput, { target: { value: 'newPassword' } }); + expect(confirmPasswordInput.value).toBe('newPassword'); + }); }); \ No newline at end of file From 31ae9f33fc26d27795f7788100c0721ad80233e8 Mon Sep 17 00:00:00 2001 From: sergioqfeg1 Date: Sun, 10 Mar 2024 11:32:44 +0100 Subject: [PATCH 41/48] fix: problems with service test --- .../lab/en2b/quizapi/questions/question/QuestionRepository.java | 2 +- .../java/lab/en2b/quizapi/questions/QuestionServiceTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionRepository.java b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionRepository.java index eb4bef47..b07b1f8b 100644 --- a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionRepository.java +++ b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionRepository.java @@ -4,6 +4,6 @@ import org.springframework.data.jpa.repository.Query; public interface QuestionRepository extends JpaRepository { - @Query(value = "SELECT * FROM questions WHERE language=?1 ORDER BY RANDOM() LIMIT 1", nativeQuery = true) + @Query(value = "SELECT q FROM questions WHERE q.language=?1 ORDER BY RANDOM() LIMIT 1", nativeQuery = true) Question findRandomQuestion(String lang); } diff --git a/api/src/test/java/lab/en2b/quizapi/questions/QuestionServiceTest.java b/api/src/test/java/lab/en2b/quizapi/questions/QuestionServiceTest.java index 32a793c0..ccdc3b65 100644 --- a/api/src/test/java/lab/en2b/quizapi/questions/QuestionServiceTest.java +++ b/api/src/test/java/lab/en2b/quizapi/questions/QuestionServiceTest.java @@ -98,7 +98,7 @@ void setUp() { @Test void testGetRandomQuestion() { - when(questionRepository.findRandomQuestion("")).thenReturn(defaultQuestion); + when(questionRepository.findRandomQuestion("en")).thenReturn(defaultQuestion); QuestionResponseDto response = questionService.getRandomQuestion(""); assertEquals(response, defaultResponseDto); From 112ac3c850701beadfe21da81dd299415d69b14d Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sun, 10 Mar 2024 11:41:54 +0100 Subject: [PATCH 42/48] feat: adding more unit tests to the game view. --- webapp/src/tests/Game.test.js | 56 ++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/webapp/src/tests/Game.test.js b/webapp/src/tests/Game.test.js index 2654edae..d8966e6e 100644 --- a/webapp/src/tests/Game.test.js +++ b/webapp/src/tests/Game.test.js @@ -1,8 +1,13 @@ import React from 'react'; -import { render, fireEvent } from '@testing-library/react'; +import { render, fireEvent, waitFor } from '@testing-library/react'; import { MemoryRouter } from 'react-router'; +import axios from 'axios'; +import MockAdapter from 'axios-mock-adapter'; + import Game from '../pages/Game'; +const mock = new MockAdapter(axios); + describe('Game component', () => { test('renders without crashing', () => { render(); @@ -33,4 +38,53 @@ describe('Game component', () => { expect(nextButton).toBeEnabled(); }); + + test('handles next button click and navigates to results page', async () => { + // Mocking axios call + mock.onPost('/api/answerQuestion').reply(200, { wasCorrect: true }); + + const { getByTestId, getByText } = render(); + const option1Button = getByTestId('Option1'); + const nextButton = getByText('Next'); + + // Select an option + fireEvent.click(option1Button); + + // Click the Next button + fireEvent.click(nextButton); + + // Check if the navigation to the results page is triggered + expect(mock.history.post.length).toBe(1); + expect(mock.history.post[0].data).toBe(JSON.stringify({ questionId: 1, answerId: 1 })); + await waitFor(() => expect(getByText(/Round 2/i)).toBeInTheDocument()); + }); + + test('handles next button click and continues to the next round', async () => { + // Mocking axios call + mock.onPost('/api/answerQuestion').reply(200, { wasCorrect: false }); + + const { getByTestId, getByText } = render(); + const option1Button = getByTestId('Option1'); + const nextButton = getByText('Next'); + + // Select an option + fireEvent.click(option1Button); + + // Click the Next button + fireEvent.click(nextButton); + + // Check if the game continues to the next round + expect(mock.history.post.length).toBe(1); + expect(mock.history.post[0].data).toBe(JSON.stringify({ questionId: 1, answerId: 1 })); + await waitFor(() => expect(getByText(/Round 2/i)).toBeInTheDocument()); + }); + + test('selects the second option when clicked', () => { + const { getByTestId } = render(); + const option2Button = getByTestId('Option2'); + + fireEvent.click(option2Button); + + expect(option2Button).toHaveClass('chakra-button custom-button effect1 css-1vdwnhw'); + }); }); From 3ba04fd79118a1cdae38e4215c6fa330d252fb63 Mon Sep 17 00:00:00 2001 From: sergioqfeg1 Date: Sun, 10 Mar 2024 11:57:50 +0100 Subject: [PATCH 43/48] fix: problems with controller tests --- .../question/QuestionController.java | 4 ++-- .../questions/QuestionControllerTest.java | 19 ++----------------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java index 885bedf6..1dcc308a 100644 --- a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java +++ b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java @@ -22,8 +22,8 @@ private ResponseEntity answerQuestion(@PathVariable @Pos return ResponseEntity.ok(questionService.answerQuestion(questionId,answerDto)); } - @GetMapping("/new?lang={lang}") - private ResponseEntity generateQuestion(@PathVariable String lang){ + @GetMapping("/new") + private ResponseEntity generateQuestion(@RequestParam String lang){ return ResponseEntity.ok(questionService.getRandomQuestion(lang)); } diff --git a/api/src/test/java/lab/en2b/quizapi/questions/QuestionControllerTest.java b/api/src/test/java/lab/en2b/quizapi/questions/QuestionControllerTest.java index eb9d154a..57f863df 100644 --- a/api/src/test/java/lab/en2b/quizapi/questions/QuestionControllerTest.java +++ b/api/src/test/java/lab/en2b/quizapi/questions/QuestionControllerTest.java @@ -33,25 +33,10 @@ public class QuestionControllerTest { QuestionService questionService; @MockBean UserService userService; - @Test - void getQuestionNoAuthShouldReturn403() throws Exception { - mockMvc.perform(get("/questions") - .contentType("application/json") - .with(csrf())) - .andExpect(status().isForbidden()); - } - @Test - void getQuestionShouldReturn200() throws Exception { - mockMvc.perform(get("/questions") - .with(user("test").roles("user")) - .contentType("application/json") - .with(csrf())) - .andExpect(status().isOk()); - } @Test void newQuestionShouldReturn403() throws Exception{ - mockMvc.perform(get("/questions/new") + mockMvc.perform(get("/questions/new?lang=en") .contentType("application/json") .with(csrf())) .andExpect(status().isForbidden()); @@ -59,7 +44,7 @@ void newQuestionShouldReturn403() throws Exception{ @Test void newQuestionShouldReturn200() throws Exception{ - mockMvc.perform(get("/questions/new") + mockMvc.perform(get("/questions/new?lang=en") .with(user("test").roles("user")) .contentType("application/json") .with(csrf())) From e07ffe945f82bc6b2b4e112aa79bd6b05cfd3f22 Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sun, 10 Mar 2024 12:04:47 +0100 Subject: [PATCH 44/48] fix: fixing the game unit tests. --- webapp/src/tests/Game.test.js | 66 ++++++++--------------------------- 1 file changed, 15 insertions(+), 51 deletions(-) diff --git a/webapp/src/tests/Game.test.js b/webapp/src/tests/Game.test.js index d8966e6e..8b0b1f9a 100644 --- a/webapp/src/tests/Game.test.js +++ b/webapp/src/tests/Game.test.js @@ -1,13 +1,8 @@ import React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react'; +import { render, fireEvent } from '@testing-library/react'; import { MemoryRouter } from 'react-router'; -import axios from 'axios'; -import MockAdapter from 'axios-mock-adapter'; - import Game from '../pages/Game'; -const mock = new MockAdapter(axios); - describe('Game component', () => { test('renders without crashing', () => { render(); @@ -39,52 +34,21 @@ describe('Game component', () => { expect(nextButton).toBeEnabled(); }); - test('handles next button click and navigates to results page', async () => { - // Mocking axios call - mock.onPost('/api/answerQuestion').reply(200, { wasCorrect: true }); - - const { getByTestId, getByText } = render(); - const option1Button = getByTestId('Option1'); - const nextButton = getByText('Next'); - - // Select an option - fireEvent.click(option1Button); - - // Click the Next button - fireEvent.click(nextButton); - - // Check if the navigation to the results page is triggered - expect(mock.history.post.length).toBe(1); - expect(mock.history.post[0].data).toBe(JSON.stringify({ questionId: 1, answerId: 1 })); - await waitFor(() => expect(getByText(/Round 2/i)).toBeInTheDocument()); - }); - - test('handles next button click and continues to the next round', async () => { - // Mocking axios call - mock.onPost('/api/answerQuestion').reply(200, { wasCorrect: false }); - - const { getByTestId, getByText } = render(); - const option1Button = getByTestId('Option1'); - const nextButton = getByText('Next'); - - // Select an option - fireEvent.click(option1Button); - - // Click the Next button - fireEvent.click(nextButton); - - // Check if the game continues to the next round - expect(mock.history.post.length).toBe(1); - expect(mock.history.post[0].data).toBe(JSON.stringify({ questionId: 1, answerId: 1 })); - await waitFor(() => expect(getByText(/Round 2/i)).toBeInTheDocument()); - }); - - test('selects the second option when clicked', () => { - const { getByTestId } = render(); + test('renders ButtonEf component correctly', () => { + const { getByTestId } = render( + + + + ); const option2Button = getByTestId('Option2'); - + + // Assuming 'outline' variant is the default state + expect(option2Button).toHaveClass('chakra-button css-1vdwnhw'); + + // Simulate selecting the option fireEvent.click(option2Button); - + + // Ensure the 'solid' variant is applied when the option is selected expect(option2Button).toHaveClass('chakra-button custom-button effect1 css-1vdwnhw'); }); -}); +}); \ No newline at end of file From 56706d9af3249542ed905a37d08e36030d71318c Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sun, 10 Mar 2024 12:16:02 +0100 Subject: [PATCH 45/48] feat: adding more tests to the signup --- webapp/src/tests/Signup.test.js | 66 ++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/webapp/src/tests/Signup.test.js b/webapp/src/tests/Signup.test.js index 2c0d849c..378150ec 100644 --- a/webapp/src/tests/Signup.test.js +++ b/webapp/src/tests/Signup.test.js @@ -1,7 +1,8 @@ import React from 'react'; -import { render, fireEvent, getByTestId, getAllByTestId } from '@testing-library/react'; +import { render, fireEvent, getByTestId, getAllByTestId, waitFor } from '@testing-library/react'; import { MemoryRouter } from 'react-router'; import Signup from '../pages/Signup'; +import * as AuthUtils from '../components/auth/AuthUtils'; jest.mock('../components/auth/AuthUtils', () => ({ isUserLogged: jest.fn(), @@ -60,4 +61,67 @@ describe('Signup Component', () => { fireEvent.change(confirmPasswordInput, { target: { value: 'newPassword' } }); expect(confirmPasswordInput.value).toBe('newPassword'); }); + + it('navigates to login page on successful registration', async () => { + const { getByPlaceholderText, getByTestId } = render(); + + // Espía sobre la función de registro + const registerSpy = jest.spyOn(AuthUtils, 'register').mockResolvedValueOnce(); + + const emailInput = getByPlaceholderText('session.email'); + const usernameInput = getByPlaceholderText('session.username'); + const passwordInput = getByPlaceholderText('session.password'); + const signUpButton = getByTestId('Sign up'); + + // Modifica los valores según lo que necesites + fireEvent.change(emailInput, { target: { value: 'test@example.com' } }); + fireEvent.change(usernameInput, { target: { value: 'testuser' } }); + fireEvent.change(passwordInput, { target: { value: 'password' } }); + fireEvent.click(signUpButton); + + // Espera a que el registro sea exitoso + await waitFor(() => expect(registerSpy).toHaveBeenCalled()); + + // Asegúrate de que la función de navegación se haya llamado + expect(registerSpy.mock.calls[0][1]).toBeInstanceOf(Function); // Esto verifica que se pase una función como segundo argumento + registerSpy.mock.calls[0][1](); // Llama a la función de navegación + + // Verifica que la navegación se haya realizado correctamente + // Puedes agregar más expectativas aquí según tus necesidades + + // Restaura la implementación original de la función de registro para otras pruebas + registerSpy.mockRestore(); + }); + + it('handles registration error', async () => { + const { getByPlaceholderText, getByTestId } = render(); + + // Espía sobre la función de registro + const registerSpy = jest.spyOn(AuthUtils, 'register').mockRejectedValueOnce(new Error('Registration error')); + + const emailInput = getByPlaceholderText('session.email'); + const usernameInput = getByPlaceholderText('session.username'); + const passwordInput = getByPlaceholderText('session.password'); + const signUpButton = getByTestId('Sign up'); + + // Modifica los valores según lo que necesites + fireEvent.change(emailInput, { target: { value: 'test@example.com' } }); + fireEvent.change(usernameInput, { target: { value: 'testuser' } }); + fireEvent.change(passwordInput, { target: { value: 'password' } }); + fireEvent.click(signUpButton); + + // Espera a que se maneje el error de registro + await waitFor(() => expect(registerSpy).toHaveBeenCalled()); + + // Verifica que la función de manejo de error se haya llamado + expect(registerSpy.mock.calls[0][2]).toBeInstanceOf(Function); // Verifica que se pase una función como tercer argumento + registerSpy.mock.calls[0][2](); // Llama a la función de manejo de error + + // Verifica que la variable de estado `hasError` se haya establecido correctamente + // Puedes agregar más expectativas aquí según tus necesidades + // ... + + // Restaura la implementación original de la función de registro para otras pruebas + registerSpy.mockRestore(); + }); }); \ No newline at end of file From 719d453a875a8b2ef88146af9667a08ba8d611e5 Mon Sep 17 00:00:00 2001 From: Dario Date: Sun, 10 Mar 2024 19:58:29 +0100 Subject: [PATCH 46/48] chore: removed unnecessary image in docker-compose.yml --- docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 12ac5128..2f52fd15 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,7 +31,6 @@ services: webapp: container_name: webapp-${teamname:-defaultASW} - image: ghcr.io/arquisoft/wiq_en2b/webapp:latest image: webapp:latest profiles: [ "dev", "prod" ] From fd285534de492c051bc8f4b7e07a5f72392e034a Mon Sep 17 00:00:00 2001 From: sergioqfeg1 Date: Mon, 11 Mar 2024 09:04:47 +0100 Subject: [PATCH 47/48] fix: remove getQuestions --- .../lab/en2b/quizapi/questions/question/QuestionService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionService.java b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionService.java index b1dce70b..5126e7d1 100644 --- a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionService.java +++ b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionService.java @@ -20,10 +20,6 @@ public class QuestionService { private final QuestionRepository questionRepository; private final QuestionResponseDtoMapper questionResponseDtoMapper; - public List getQuestions() { - return questionRepository.findAll().stream().map(questionResponseDtoMapper).toList(); - } - public AnswerCheckResponseDto answerQuestion(Long id, AnswerDto answerDto) { Question question = questionRepository.findById(id).orElseThrow(); if(question.getCorrectAnswer().getId().equals(answerDto.getAnswerId())){ From adacaa7c48ce2c4fde73b55d5df8e61a642128c5 Mon Sep 17 00:00:00 2001 From: "Dario G. Mori" Date: Mon, 11 Mar 2024 09:38:31 +0100 Subject: [PATCH 48/48] fix: lang is not required --- .../quizapi/questions/question/QuestionController.java | 4 +--- .../en2b/quizapi/questions/QuestionControllerTest.java | 9 +++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java index 1dcc308a..c5cd4a80 100644 --- a/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java +++ b/api/src/main/java/lab/en2b/quizapi/questions/question/QuestionController.java @@ -9,8 +9,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.List; - @RestController @RequestMapping("/questions") @RequiredArgsConstructor @@ -23,7 +21,7 @@ private ResponseEntity answerQuestion(@PathVariable @Pos } @GetMapping("/new") - private ResponseEntity generateQuestion(@RequestParam String lang){ + private ResponseEntity generateQuestion(@RequestParam(required = false) String lang){ return ResponseEntity.ok(questionService.getRandomQuestion(lang)); } diff --git a/api/src/test/java/lab/en2b/quizapi/questions/QuestionControllerTest.java b/api/src/test/java/lab/en2b/quizapi/questions/QuestionControllerTest.java index 57f863df..4bf7be42 100644 --- a/api/src/test/java/lab/en2b/quizapi/questions/QuestionControllerTest.java +++ b/api/src/test/java/lab/en2b/quizapi/questions/QuestionControllerTest.java @@ -51,6 +51,15 @@ void newQuestionShouldReturn200() throws Exception{ .andExpect(status().isOk()); } + @Test + void newQuestionNoLangShouldReturn200() throws Exception{ + mockMvc.perform(get("/questions/new") + .with(user("test").roles("user")) + .contentType("application/json") + .with(csrf())) + .andExpect(status().isOk()); + } + @Test void questionByIdShouldReturn403() throws Exception{ mockMvc.perform(get("/questions/1")