[
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: maven\n    directory: \"/\"\n    schedule:\n      interval: daily\n      time: '21:00'\n      timezone: Asia/Jakarta\n    open-pull-requests-limit: 10\n"
  },
  {
    "path": ".github/workflows/maven.yml",
    "content": "# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time\n# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven\n\n# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n# separate terms of service, privacy policy, and support\n# documentation.\n\nname: Java CI with Maven\n\non:\n  push:\n    branches: [ \"master\" ]\n  pull_request:\n    branches: [ \"master\" ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v4\n    - name: Set up JDK 21\n      uses: actions/setup-java@v4\n      with:\n        java-version: '21'\n        distribution: 'temurin'\n        cache: maven\n    - name: Build with Maven\n      run: mvn -B package --file pom.xml\n\n    # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive\n#    - name: Update dependency graph\n#      uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6\n"
  },
  {
    "path": ".gitignore",
    "content": "target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n\n### IntelliJ IDEA ###\n.idea\nlogs\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\nnbproject/private/\nbuild/\nnbbuild/\ndist/\nnbdist/\n.nb-gradle/\n"
  },
  {
    "path": ".mvn/wrapper/maven-wrapper.properties",
    "content": "distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "// Use IntelliSense to learn about possible attributes.\n// Hover to view descriptions of existing attributes.\n// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"name\": \"Launch Chrome 127.0.0.1\",\n      \"type\": \"chrome\",\n      \"request\": \"launch\",\n      \"port\": 9249,\n      \"webRoot\": \"${workspaceFolder}\",\n      \"url\": \"http://127.0.0.1:2331/p/Bookstore/src/main/resources/templates/index.html?_cmAuth\\u003drewvcqiueo\"\n    }\n  ]\n}"
  },
  {
    "path": "README.md",
    "content": "# E-Commerce\nComplete E-Commerce Project using Spring, Hibernate, Bootstrap &amp; MySQL\n\n> [!WARNING]  \n> **Note Regarding This Project:**\n>\n> It has been a long time (3+ years) since I transitioned to JavaScript, and I have mostly forgotten a lot of things about Spring Boot. As a result, it is now very difficult for me to answer project-related questions regarding this technology.\n\n> [!TIP]  \n> There are two separate projects in this repository:  \n> - <span style=\"color: blue;\">**🔮 Admin Panel**</span>  \n> - <span style=\"color: blue;\">**🍄 Main Ecommerce**</span>\n>\n> Download the repository and move the projects to different folders to run them separately.\n> 📹 You can find video demo of this 2 projects in \"𝐷𝑒𝑚𝑜 𝑉𝑖𝑑𝑒𝑜\" folder.\n\n<h1 align=\"center\" style=\"font-size: 72px; color: #FFA500; text-shadow: 2px 2px 4px #000000;\">🎉 Thank You! 🎉</h1>\n\n<br />\n\n## Project Demo video : In \"Demo Video\" folder\n\n## Home Page:\n![Project Snapsort1](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook1.png) \n\n![Project Snapsort2](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook2.png)\n\n![Project Snapsort3](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook3.png)\n\n\n\n## Book Details Page:\n![Project Snapsort4](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook4.png) \n\n![Project Snapsort5](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook5.png)\n\n\n\n## Login and Registation:\n![Project Snapsort6](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook6.png) \n\n![Project Snapsort7](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook7.png)\n\n![Project Snapsort8](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook8.png)\n\n![Project Snapsort9](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook9.png)\n\n![Project Snapsort10](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook10.png)\n\n![Project Snapsort11](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook11.png)\n\n![Project Snapsort12](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook12.png)\n\n![Project Snapsort13](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook13.png)\n\n![Project Snapsort14](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook14.png)\n\n![Project Snapsort15](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook15.png)\n\n![Project Snapsort16](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook16.png)\n\n\n\n## Billing Address:\n![Project Snapsort17](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook17.png)\n\n![Project Snapsort18](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook18.png) \n\n![Project Snapsort19](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook19.png) \n\n\n\n## Shipping Address:\n![Project Snapsort21](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook21.png)\n\n![Project Snapsort22](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook22.png)\n\n![Project Snapsort23](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook23.png)\n\n\n\n## Shopping Cart:\n![Project Snapsort23](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook23copy.png)\n\n![Project Snapsort24](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook24.png)\n\n![Project Snapsort25](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook25.png)\n\n![Project Snapsort26](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook26.png)\n\n\n\n## Checkout:\n![Project Snapsort27](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook27.png)\n\n![Project Snapsort28](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook28.png)\n\n![Project Snapsort29](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook29.png)\n\n![Project Snapsort30](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook30.png)\n\n![Project Snapsort32](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook32.png)\n\n\n## Order Confirmation:\n![Project Snapsort33](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook33.png)\n\n![Project Snapsort34](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook34.png)\n\n![Project Snapsort35](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook35.png)\n\n![Project Snapsort36](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook36.png)\n\n![Project Snapsort37](https://github.com/foysal-mahmud/E-Commerce/blob/master/screensort/ebook37.png)\n\n\n\n## --------------- The End -------------------\n\n\n\n\n"
  },
  {
    "path": "adminportal/mvnw",
    "content": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements.  See the NOTICE file\n# distributed with this work for additional information\n# regarding copyright ownership.  The ASF licenses this file\n# to you under the Apache License, Version 2.0 (the\n# \"License\"); you may not use this file except in compliance\n# with the License.  You may obtain a copy of the License at\n#\n#    http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing,\n# software distributed under the License is distributed on an\n# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n# KIND, either express or implied.  See the License for the\n# specific language governing permissions and limitations\n# under the License.\n# ----------------------------------------------------------------------------\n\n# ----------------------------------------------------------------------------\n# Maven2 Start Up Batch script\n#\n# Required ENV vars:\n# ------------------\n#   JAVA_HOME - location of a JDK home dir\n#\n# Optional ENV vars\n# -----------------\n#   M2_HOME - location of maven2's installed home dir\n#   MAVEN_OPTS - parameters passed to the Java VM when running Maven\n#     e.g. to debug Maven itself, use\n#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000\n#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files\n# ----------------------------------------------------------------------------\n\nif [ -z \"$MAVEN_SKIP_RC\" ] ; then\n\n  if [ -f /etc/mavenrc ] ; then\n    . /etc/mavenrc\n  fi\n\n  if [ -f \"$HOME/.mavenrc\" ] ; then\n    . \"$HOME/.mavenrc\"\n  fi\n\nfi\n\n# OS specific support.  $var _must_ be set to either true or false.\ncygwin=false;\ndarwin=false;\nmingw=false\ncase \"`uname`\" in\n  CYGWIN*) cygwin=true ;;\n  MINGW*) mingw=true;;\n  Darwin*) darwin=true\n           #\n           # Look for the Apple JDKs first to preserve the existing behaviour, and then look\n           # for the new JDKs provided by Oracle.\n           #\n           if [ -z \"$JAVA_HOME\" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then\n             #\n             # Apple JDKs\n             #\n             export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home\n           fi\n\n           if [ -z \"$JAVA_HOME\" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then\n             #\n             # Apple JDKs\n             #\n             export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home\n           fi\n\n           if [ -z \"$JAVA_HOME\" ] && [ -L \"/Library/Java/JavaVirtualMachines/CurrentJDK\" ] ; then\n             #\n             # Oracle JDKs\n             #\n             export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home\n           fi\n\n           if [ -z \"$JAVA_HOME\" ] && [ -x \"/usr/libexec/java_home\" ]; then\n             #\n             # Apple JDKs\n             #\n             export JAVA_HOME=`/usr/libexec/java_home`\n           fi\n           ;;\nesac\n\nif [ -z \"$JAVA_HOME\" ] ; then\n  if [ -r /etc/gentoo-release ] ; then\n    JAVA_HOME=`java-config --jre-home`\n  fi\nfi\n\nif [ -z \"$M2_HOME\" ] ; then\n  ## resolve links - $0 may be a link to maven's home\n  PRG=\"$0\"\n\n  # need this for relative symlinks\n  while [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n      PRG=\"$link\"\n    else\n      PRG=\"`dirname \"$PRG\"`/$link\"\n    fi\n  done\n\n  saveddir=`pwd`\n\n  M2_HOME=`dirname \"$PRG\"`/..\n\n  # make it fully qualified\n  M2_HOME=`cd \"$M2_HOME\" && pwd`\n\n  cd \"$saveddir\"\n  # echo Using m2 at $M2_HOME\nfi\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched\nif $cygwin ; then\n  [ -n \"$M2_HOME\" ] &&\n    M2_HOME=`cygpath --unix \"$M2_HOME\"`\n  [ -n \"$JAVA_HOME\" ] &&\n    JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\n  [ -n \"$CLASSPATH\" ] &&\n    CLASSPATH=`cygpath --path --unix \"$CLASSPATH\"`\nfi\n\n# For Migwn, ensure paths are in UNIX format before anything is touched\nif $mingw ; then\n  [ -n \"$M2_HOME\" ] &&\n    M2_HOME=\"`(cd \"$M2_HOME\"; pwd)`\"\n  [ -n \"$JAVA_HOME\" ] &&\n    JAVA_HOME=\"`(cd \"$JAVA_HOME\"; pwd)`\"\n  # TODO classpath?\nfi\n\nif [ -z \"$JAVA_HOME\" ]; then\n  javaExecutable=\"`which javac`\"\n  if [ -n \"$javaExecutable\" ] && ! [ \"`expr \\\"$javaExecutable\\\" : '\\([^ ]*\\)'`\" = \"no\" ]; then\n    # readlink(1) is not available as standard on Solaris 10.\n    readLink=`which readlink`\n    if [ ! `expr \"$readLink\" : '\\([^ ]*\\)'` = \"no\" ]; then\n      if $darwin ; then\n        javaHome=\"`dirname \\\"$javaExecutable\\\"`\"\n        javaExecutable=\"`cd \\\"$javaHome\\\" && pwd -P`/javac\"\n      else\n        javaExecutable=\"`readlink -f \\\"$javaExecutable\\\"`\"\n      fi\n      javaHome=\"`dirname \\\"$javaExecutable\\\"`\"\n      javaHome=`expr \"$javaHome\" : '\\(.*\\)/bin'`\n      JAVA_HOME=\"$javaHome\"\n      export JAVA_HOME\n    fi\n  fi\nfi\n\nif [ -z \"$JAVACMD\" ] ; then\n  if [ -n \"$JAVA_HOME\"  ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n      # IBM's JDK on AIX uses strange locations for the executables\n      JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n      JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n  else\n    JAVACMD=\"`which java`\"\n  fi\nfi\n\nif [ ! -x \"$JAVACMD\" ] ; then\n  echo \"Error: JAVA_HOME is not defined correctly.\" >&2\n  echo \"  We cannot execute $JAVACMD\" >&2\n  exit 1\nfi\n\nif [ -z \"$JAVA_HOME\" ] ; then\n  echo \"Warning: JAVA_HOME environment variable is not set.\"\nfi\n\nCLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin; then\n  [ -n \"$M2_HOME\" ] &&\n    M2_HOME=`cygpath --path --windows \"$M2_HOME\"`\n  [ -n \"$JAVA_HOME\" ] &&\n    JAVA_HOME=`cygpath --path --windows \"$JAVA_HOME\"`\n  [ -n \"$CLASSPATH\" ] &&\n    CLASSPATH=`cygpath --path --windows \"$CLASSPATH\"`\nfi\n\n# traverses directory structure from process work directory to filesystem root\n# first directory with .mvn subdirectory is considered project base directory\nfind_maven_basedir() {\n  local basedir=$(pwd)\n  local wdir=$(pwd)\n  while [ \"$wdir\" != '/' ] ; do\n    if [ -d \"$wdir\"/.mvn ] ; then\n      basedir=$wdir\n      break\n    fi\n    wdir=$(cd \"$wdir/..\"; pwd)\n  done\n  echo \"${basedir}\"\n}\n\n# concatenates all lines of a file\nconcat_lines() {\n  if [ -f \"$1\" ]; then\n    echo \"$(tr -s '\\n' ' ' < \"$1\")\"\n  fi\n}\n\nexport MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}\nMAVEN_OPTS=\"$(concat_lines \"$MAVEN_PROJECTBASEDIR/.mvn/jvm.config\") $MAVEN_OPTS\"\n\n# Provide a \"standardized\" way to retrieve the CLI args that will\n# work with both Windows and non-Windows executions.\nMAVEN_CMD_LINE_ARGS=\"$MAVEN_CONFIG $@\"\nexport MAVEN_CMD_LINE_ARGS\n\nWRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain\n\nexec \"$JAVACMD\" \\\n  $MAVEN_OPTS \\\n  -classpath \"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar\" \\\n  \"-Dmaven.home=${M2_HOME}\" \"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}\" \\\n  ${WRAPPER_LAUNCHER} \"$@\"\n"
  },
  {
    "path": "adminportal/mvnw.cmd",
    "content": "@REM ----------------------------------------------------------------------------\n@REM Licensed to the Apache Software Foundation (ASF) under one\n@REM or more contributor license agreements.  See the NOTICE file\n@REM distributed with this work for additional information\n@REM regarding copyright ownership.  The ASF licenses this file\n@REM to you under the Apache License, Version 2.0 (the\n@REM \"License\"); you may not use this file except in compliance\n@REM with the License.  You may obtain a copy of the License at\n@REM\n@REM    http://www.apache.org/licenses/LICENSE-2.0\n@REM\n@REM Unless required by applicable law or agreed to in writing,\n@REM software distributed under the License is distributed on an\n@REM \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n@REM KIND, either express or implied.  See the License for the\n@REM specific language governing permissions and limitations\n@REM under the License.\n@REM ----------------------------------------------------------------------------\n\n@REM ----------------------------------------------------------------------------\n@REM Maven2 Start Up Batch script\n@REM\n@REM Required ENV vars:\n@REM JAVA_HOME - location of a JDK home dir\n@REM\n@REM Optional ENV vars\n@REM M2_HOME - location of maven2's installed home dir\n@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands\n@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending\n@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven\n@REM     e.g. to debug Maven itself, use\n@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000\n@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files\n@REM ----------------------------------------------------------------------------\n\n@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'\n@echo off\n@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'\n@if \"%MAVEN_BATCH_ECHO%\" == \"on\"  echo %MAVEN_BATCH_ECHO%\n\n@REM set %HOME% to equivalent of $HOME\nif \"%HOME%\" == \"\" (set \"HOME=%HOMEDRIVE%%HOMEPATH%\")\n\n@REM Execute a user defined script before this one\nif not \"%MAVEN_SKIP_RC%\" == \"\" goto skipRcPre\n@REM check for pre script, once with legacy .bat ending and once with .cmd ending\nif exist \"%HOME%\\mavenrc_pre.bat\" call \"%HOME%\\mavenrc_pre.bat\"\nif exist \"%HOME%\\mavenrc_pre.cmd\" call \"%HOME%\\mavenrc_pre.cmd\"\n:skipRcPre\n\n@setlocal\n\nset ERROR_CODE=0\n\n@REM To isolate internal variables from possible post scripts, we use another setlocal\n@setlocal\n\n@REM ==== START VALIDATION ====\nif not \"%JAVA_HOME%\" == \"\" goto OkJHome\n\necho.\necho Error: JAVA_HOME not found in your environment. >&2\necho Please set the JAVA_HOME variable in your environment to match the >&2\necho location of your Java installation. >&2\necho.\ngoto error\n\n:OkJHome\nif exist \"%JAVA_HOME%\\bin\\java.exe\" goto init\n\necho.\necho Error: JAVA_HOME is set to an invalid directory. >&2\necho JAVA_HOME = \"%JAVA_HOME%\" >&2\necho Please set the JAVA_HOME variable in your environment to match the >&2\necho location of your Java installation. >&2\necho.\ngoto error\n\n@REM ==== END VALIDATION ====\n\n:init\n\nset MAVEN_CMD_LINE_ARGS=%*\n\n@REM Find the project base dir, i.e. the directory that contains the folder \".mvn\".\n@REM Fallback to current working directory if not found.\n\nset MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%\nIF NOT \"%MAVEN_PROJECTBASEDIR%\"==\"\" goto endDetectBaseDir\n\nset EXEC_DIR=%CD%\nset WDIR=%EXEC_DIR%\n:findBaseDir\nIF EXIST \"%WDIR%\"\\.mvn goto baseDirFound\ncd ..\nIF \"%WDIR%\"==\"%CD%\" goto baseDirNotFound\nset WDIR=%CD%\ngoto findBaseDir\n\n:baseDirFound\nset MAVEN_PROJECTBASEDIR=%WDIR%\ncd \"%EXEC_DIR%\"\ngoto endDetectBaseDir\n\n:baseDirNotFound\nset MAVEN_PROJECTBASEDIR=%EXEC_DIR%\ncd \"%EXEC_DIR%\"\n\n:endDetectBaseDir\n\nIF NOT EXIST \"%MAVEN_PROJECTBASEDIR%\\.mvn\\jvm.config\" goto endReadAdditionalConfig\n\n@setlocal EnableExtensions EnableDelayedExpansion\nfor /F \"usebackq delims=\" %%a in (\"%MAVEN_PROJECTBASEDIR%\\.mvn\\jvm.config\") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a\n@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%\n\n:endReadAdditionalConfig\n\nSET MAVEN_JAVA_EXE=\"%JAVA_HOME%\\bin\\java.exe\"\n\nset WRAPPER_JAR=\"\".\\.mvn\\wrapper\\maven-wrapper.jar\"\"\nset WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain\n\n%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% \"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%\" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS%\nif ERRORLEVEL 1 goto error\ngoto end\n\n:error\nset ERROR_CODE=1\n\n:end\n@endlocal & set ERROR_CODE=%ERROR_CODE%\n\nif not \"%MAVEN_SKIP_RC%\" == \"\" goto skipRcPost\n@REM check for post script, once with legacy .bat ending and once with .cmd ending\nif exist \"%HOME%\\mavenrc_post.bat\" call \"%HOME%\\mavenrc_post.bat\"\nif exist \"%HOME%\\mavenrc_post.cmd\" call \"%HOME%\\mavenrc_post.cmd\"\n:skipRcPost\n\n@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'\nif \"%MAVEN_BATCH_PAUSE%\" == \"on\" pause\n\nif \"%MAVEN_TERMINATE_CMD%\" == \"on\" exit %ERROR_CODE%\n\nexit /B %ERROR_CODE%"
  },
  {
    "path": "adminportal/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n\t<modelVersion>4.0.0</modelVersion>\r\n\r\n\t<groupId>com.adminportal</groupId>\r\n\t<artifactId>adminportal</artifactId>\r\n\t<version>0.0.1-SNAPSHOT</version>\r\n\t<packaging>jar</packaging>\r\n\r\n\t<name>Bookstore</name>\r\n\t<description>frontend part for our bookstore project</description>\r\n\r\n\t<parent>\r\n\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\r\n\t\t<version>2.1.0.RELEASE</version>\r\n\t\t<relativePath/> <!-- lookup parent from repository -->\r\n\t</parent>\r\n\r\n\t<properties>\r\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r\n\t\t<java.version>1.8</java.version>\r\n\t</properties>\r\n\r\n\t<dependencies>\r\n\t\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\r\n\t\t</dependency>\r\n\t\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\r\n\t\t</dependency>\r\n\t\t\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-jdbc</artifactId>\r\n\t\t</dependency>\r\n\t\t\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\r\n\t\t</dependency>\r\n\t\t\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-security</artifactId>\r\n\t\t</dependency>\r\n\t\t\r\n\t\t<dependency>\r\n\t\t\t<groupId>mysql</groupId>\r\n\t\t\t<artifactId>mysql-connector-java</artifactId>\r\n\t\t</dependency>\r\n\t\t\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.thymeleaf.extras</groupId>\r\n\t\t\t<artifactId>thymeleaf-extras-springsecurity5</artifactId>\r\n\t\t</dependency>\r\n\t\t\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework</groupId>\r\n\t\t\t<artifactId>spring-context-support</artifactId>\r\n\t\t</dependency>\r\n\t\t\r\n\t\t<dependency>\r\n    \t\t<groupId>javax.mail</groupId>\r\n    \t\t<artifactId>mail</artifactId>\r\n    \t\t<version>1.4.7</version>\r\n\t\t</dependency>\r\n\t\t\r\n\r\n\t\t<dependency>\r\n\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\r\n\t\t\t<scope>test</scope>\r\n\t\t</dependency>\r\n\t</dependencies>\r\n\r\n\t<build>\r\n\t\t<plugins>\r\n\t\t\t<plugin>\r\n\t\t\t\t<groupId>org.springframework.boot</groupId>\r\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\r\n\t\t\t</plugin>\r\n\t\t</plugins>\r\n\t</build>\r\n\r\n\r\n</project>\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/AdminportalApplication.java",
    "content": "package com.adminportal;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\nimport com.adminportal.domain.User;\nimport com.adminportal.domain.security.Role;\nimport com.adminportal.domain.security.UserRole;\nimport com.adminportal.service.UserService;\nimport com.adminportal.utility.SecurityUtility;\n\n@SpringBootApplication\npublic class AdminportalApplication implements CommandLineRunner{\n\t\n\t@Autowired\n\tprivate UserService userService;\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(AdminportalApplication.class, args);\n\t}\n\t\n\t@Override\n\tpublic void run(String... args) throws Exception {\n\t\tUser user1 = new User();\n\t\tuser1.setUsername(\"admin\");\n\t\tuser1.setPassword(SecurityUtility.passwordEncoder().encode(\"admin\"));\n\t\tuser1.setEmail(\"admin@gmail.com\");\n\t\tSet<UserRole> userRoles = new HashSet<>();\n\t\tRole role1= new Role();\n\t\trole1.setRoleId(0);\n\t\trole1.setName(\"ROLE_ADMIN\");\n\t\tuserRoles.add(new UserRole(user1, role1));\n\t\t\n\t\tuserService.createUser(user1, userRoles);\n\t}\n}\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/config/SecurityConfig.java",
    "content": "package com.adminportal.config;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.context.annotation.Configuration;\r\nimport org.springframework.core.env.Environment;\r\nimport org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;\r\nimport org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;\r\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\r\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\r\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\r\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\r\nimport org.springframework.security.web.util.matcher.AntPathRequestMatcher;\r\n\r\nimport com.adminportal.service.impl.UserSecurityService;\r\nimport com.adminportal.utility.SecurityUtility;\r\n\r\n\r\n@Configuration\r\n@EnableWebSecurity\r\n@EnableGlobalMethodSecurity(prePostEnabled=true)\r\npublic class SecurityConfig extends WebSecurityConfigurerAdapter {\r\n\t@Autowired\r\n\tprivate Environment env;\r\n\r\n\t@Autowired\r\n\tprivate UserSecurityService userSecurityService;\r\n\r\n\tprivate BCryptPasswordEncoder passwordEncoder() {\r\n\t\treturn SecurityUtility.passwordEncoder();\r\n\t}\r\n\r\n\tprivate static final String[] PUBLIC_MATCHERS = {\r\n\t\t\t\"/css/**\",\r\n\t\t\t\"/js/**\",\r\n\t\t\t\"/image/**\",\r\n\t\t\t\"/newUser\",\r\n\t\t\t\"/forgetPassword\",\r\n\t\t\t\"/login\",\r\n\t\t\t\"/fonts/**\"\t\r\n\t};\r\n\r\n\t@Override\r\n\tprotected void configure(HttpSecurity http) throws Exception {\r\n\t\thttp\r\n\t\t\t.authorizeRequests().\r\n\t\t/*\tantMatchers(\"/**\").*/\r\n\t\t\tantMatchers(PUBLIC_MATCHERS).\r\n\t\t\tpermitAll().anyRequest().authenticated();\r\n\r\n\t\thttp\r\n\t\t\t.csrf().disable().cors().disable()\r\n\t\t\t.formLogin().failureUrl(\"/login?error\")\r\n\t\t\t.defaultSuccessUrl(\"/\")\r\n\t\t\t.loginPage(\"/login\").permitAll()\r\n\t\t\t.and()\r\n\t\t\t.logout().logoutRequestMatcher(new AntPathRequestMatcher(\"/logout\"))\r\n\t\t\t.logoutSuccessUrl(\"/?logout\").deleteCookies(\"remember-me\").permitAll()\r\n\t\t\t.and()\r\n\t\t\t.rememberMe();\r\n\t}\r\n\r\n\t@Autowired\r\n\tpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {\r\n\t\tauth.userDetailsService(userSecurityService).passwordEncoder(passwordEncoder());\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/controller/BookController.java",
    "content": "package com.adminportal.controller;\r\n\r\nimport java.io.BufferedOutputStream;\r\nimport java.io.File;\r\nimport java.io.FileOutputStream;\r\nimport java.nio.file.Files;\r\nimport java.nio.file.Paths;\r\nimport java.util.List;\r\n\r\nimport javax.servlet.http.HttpServletRequest;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Controller;\r\nimport org.springframework.ui.Model;\r\nimport org.springframework.web.bind.annotation.ModelAttribute;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\nimport org.springframework.web.bind.annotation.RequestMethod;\r\nimport org.springframework.web.bind.annotation.RequestParam;\r\nimport org.springframework.web.multipart.MultipartFile;\r\n\r\nimport com.adminportal.domain.Book;\r\nimport com.adminportal.service.BookService;\r\n\r\n@Controller\r\n@RequestMapping(\"/book\")\r\npublic class BookController {\r\n\r\n\t@Autowired\r\n\tprivate BookService bookService;\r\n\r\n\t@RequestMapping(value = \"/add\", method = RequestMethod.GET)\r\n\tpublic String addBook(Model model) {\r\n\t\tBook book = new Book();\r\n\t\tmodel.addAttribute(\"book\", book);\r\n\t\treturn \"addBook\";\r\n\t}\r\n\r\n\t@RequestMapping(value = \"/add\", method = RequestMethod.POST)\r\n\tpublic String addBookPost(@ModelAttribute(\"book\") Book book, HttpServletRequest request) {\r\n\t\tbookService.save(book);\r\n\r\n\t\tMultipartFile bookImage = book.getBookImage();\r\n\r\n\t\ttry {\r\n\t\t\tbyte[] bytes = bookImage.getBytes();\r\n\t\t\tString name = book.getId() + \".png\";\r\n\t\t\tBufferedOutputStream stream = new BufferedOutputStream(\r\n\t\t\t\t\tnew FileOutputStream(new File(\"src/main/resources/static/image/book/\" + name)));\r\n\t\t\tstream.write(bytes);\r\n\t\t\tstream.close();\r\n\t\t} catch (Exception e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\r\n\t\treturn \"redirect:bookList\";\r\n\t}\r\n\t\r\n\t@RequestMapping(\"/bookInfo\")\r\n\tpublic String bookInfo(@RequestParam(\"id\") Long id, Model model) {\r\n\t\tBook book = bookService.findById(id);\r\n\t\tmodel.addAttribute(\"book\", book);\r\n\t\t\r\n\t\treturn \"bookInfo\";\r\n\t}\r\n\t\r\n\t\r\n\t@RequestMapping(\"/updateBook\")\r\n\tpublic String updateBook(@RequestParam(\"id\") Long id, Model model) {\r\n\t\tBook book = bookService.findById(id);\r\n\t\tmodel.addAttribute(\"book\", book);\r\n\t\t\r\n\t\treturn \"updateBook\";\r\n\t}\r\n\t\r\n\t\r\n\t@RequestMapping(value=\"/updateBook\", method=RequestMethod.POST)\r\n\tpublic String updateBookPost(@ModelAttribute(\"book\") Book book, HttpServletRequest request) {\r\n\t\tbookService.save(book);\r\n\t\t\r\n\t\tMultipartFile bookImage = book.getBookImage();\r\n\t\t\r\n\t\tif(!bookImage.isEmpty()) {\r\n\t\t\ttry {\r\n\t\t\t\tbyte[] bytes = bookImage.getBytes();\r\n\t\t\t\tString name = book.getId() + \".png\";\r\n\t\t\t\t\r\n\t\t\t\tFiles.delete(Paths.get(\"src/main/resources/static/image/book/\"+name));\r\n\t\t\t\t\r\n\t\t\t\tBufferedOutputStream stream = new BufferedOutputStream(\r\n\t\t\t\t\t\tnew FileOutputStream(new File(\"src/main/resources/static/image/book/\" + name)));\r\n\t\t\t\tstream.write(bytes);\r\n\t\t\t\tstream.close();\r\n\t\t\t} catch (Exception e) {\r\n\t\t\t\te.printStackTrace();\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn \"redirect:/book/bookInfo?id=\"+book.getId();\r\n\t}\r\n\t\r\n\t@RequestMapping(\"/bookList\")\r\n\tpublic String bookList(Model model) {\r\n\t\tList<Book> bookList = bookService.findAll();\r\n\t\tmodel.addAttribute(\"bookList\", bookList);\t\t\r\n\t\treturn \"bookList\";\r\n\t\t\r\n\t}\r\n\t\r\n\t@RequestMapping(value=\"/remove\", method=RequestMethod.POST)\r\n\tpublic String remove(\r\n\t\t\t@ModelAttribute(\"id\") String id, Model model\r\n\t\t\t) {\r\n\t\tbookService.deleteById(Long.parseLong(id.substring(8)));\r\n\t\tList<Book> bookList = bookService.findAll();\r\n\t\tmodel.addAttribute(\"bookList\", bookList);\r\n\t\t\r\n\t\treturn \"redirect:/book/bookList\";\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/controller/HomeController.java",
    "content": "package com.adminportal.controller;\r\n\r\nimport org.springframework.stereotype.Controller;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\n\r\n@Controller\r\npublic class HomeController {\r\n\r\n\t@RequestMapping(\"/\")\r\n\tpublic String index(){\r\n\t\treturn \"redirect:/home\";\r\n\t}\r\n\t\r\n\t@RequestMapping(\"/home\")\r\n\tpublic String home(){\r\n\t\treturn \"home\";\r\n\t}\r\n\t\r\n\t@RequestMapping(\"/login\")\r\n\tpublic String login(){\r\n\t\treturn \"login\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/controller/ResourceController.java",
    "content": "package com.adminportal.controller;\r\n\r\nimport java.util.ArrayList;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.ui.Model;\r\nimport org.springframework.web.bind.annotation.RequestBody;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\nimport org.springframework.web.bind.annotation.RequestMethod;\r\nimport org.springframework.web.bind.annotation.RestController;\r\n\r\nimport com.adminportal.service.BookService;\r\n\r\n@RestController\r\npublic class ResourceController {\r\n\r\n\t@Autowired\r\n\tprivate BookService bookService;\r\n\t\r\n\t@RequestMapping(value=\"/book/removeList\", method=RequestMethod.POST)\r\n\tpublic String removeList(\r\n\t\t\t@RequestBody ArrayList<String> bookIdList, Model model\r\n\t\t\t){\r\n\t\t\r\n\t\tfor (String id : bookIdList) {\r\n\t\t\tString bookId =id.substring(8);\r\n\t\t\tbookService.deleteById(Long.parseLong(bookId));\r\n\t\t}\r\n\t\t\r\n\t\treturn \"delete success\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/domain/Book.java",
    "content": "package com.adminportal.domain;\r\n\r\nimport java.util.List;\r\n\r\nimport javax.persistence.Column;\r\nimport javax.persistence.Entity;\r\nimport javax.persistence.GeneratedValue;\r\nimport javax.persistence.GenerationType;\r\nimport javax.persistence.Id;\r\nimport javax.persistence.OneToMany;\r\nimport javax.persistence.Transient;\r\n\r\nimport org.springframework.web.multipart.MultipartFile;\r\n\r\nimport com.fasterxml.jackson.annotation.JsonIgnore;\r\n\r\n@Entity\r\npublic class Book {\r\n\r\n\t@Id\r\n\t@GeneratedValue(strategy=GenerationType.AUTO)\r\n\tprivate Long id;\r\n\tprivate String title;\r\n\tprivate String author;\r\n\tprivate String publisher;\r\n\tprivate String publicationDate;\r\n\tprivate String language;\r\n\tprivate String category;\r\n\tprivate int numberOfPages;\r\n\tprivate String format;\r\n\tprivate int isbn;\r\n\tprivate double shippingWeight;\r\n\tprivate double listPrice;\r\n\tprivate double ourPrice;\r\n\tprivate boolean active=true;\r\n\t\r\n\t@Column(columnDefinition=\"text\")\r\n\tprivate String description;\r\n\tprivate int inStockNumber;\r\n\t\r\n\t@Transient\r\n\tprivate MultipartFile bookImage;\r\n\t\r\n\t@OneToMany(mappedBy = \"book\")\r\n\t@JsonIgnore\r\n\tprivate List<BookToCartItem> bookToCartItemList;\r\n\t\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic String getTitle() {\r\n\t\treturn title;\r\n\t}\r\n\r\n\tpublic void setTitle(String title) {\r\n\t\tthis.title = title;\r\n\t}\r\n\r\n\tpublic String getAuthor() {\r\n\t\treturn author;\r\n\t}\r\n\r\n\tpublic void setAuthor(String author) {\r\n\t\tthis.author = author;\r\n\t}\r\n\r\n\tpublic String getPublisher() {\r\n\t\treturn publisher;\r\n\t}\r\n\r\n\tpublic void setPublisher(String publisher) {\r\n\t\tthis.publisher = publisher;\r\n\t}\r\n\r\n\tpublic String getPublicationDate() {\r\n\t\treturn publicationDate;\r\n\t}\r\n\r\n\tpublic void setPublicationDate(String publicationDate) {\r\n\t\tthis.publicationDate = publicationDate;\r\n\t}\r\n\r\n\tpublic String getLanguage() {\r\n\t\treturn language;\r\n\t}\r\n\r\n\tpublic void setLanguage(String language) {\r\n\t\tthis.language = language;\r\n\t}\r\n\r\n\tpublic String getCategory() {\r\n\t\treturn category;\r\n\t}\r\n\r\n\tpublic void setCategory(String category) {\r\n\t\tthis.category = category;\r\n\t}\r\n\r\n\tpublic int getNumberOfPages() {\r\n\t\treturn numberOfPages;\r\n\t}\r\n\r\n\tpublic void setNumberOfPages(int numberOfPages) {\r\n\t\tthis.numberOfPages = numberOfPages;\r\n\t}\r\n\r\n\tpublic String getFormat() {\r\n\t\treturn format;\r\n\t}\r\n\r\n\tpublic void setFormat(String format) {\r\n\t\tthis.format = format;\r\n\t}\r\n\r\n\tpublic int getIsbn() {\r\n\t\treturn isbn;\r\n\t}\r\n\r\n\tpublic void setIsbn(int isbn) {\r\n\t\tthis.isbn = isbn;\r\n\t}\r\n\r\n\tpublic double getShippingWeight() {\r\n\t\treturn shippingWeight;\r\n\t}\r\n\r\n\tpublic void setShippingWeight(double shippingWeight) {\r\n\t\tthis.shippingWeight = shippingWeight;\r\n\t}\r\n\r\n\tpublic double getListPrice() {\r\n\t\treturn listPrice;\r\n\t}\r\n\r\n\tpublic void setListPrice(double listPrice) {\r\n\t\tthis.listPrice = listPrice;\r\n\t}\r\n\r\n\tpublic double getOurPrice() {\r\n\t\treturn ourPrice;\r\n\t}\r\n\r\n\tpublic void setOurPrice(double ourPrice) {\r\n\t\tthis.ourPrice = ourPrice;\r\n\t}\r\n\r\n\tpublic boolean isActive() {\r\n\t\treturn active;\r\n\t}\r\n\r\n\tpublic void setActive(boolean active) {\r\n\t\tthis.active = active;\r\n\t}\r\n\r\n\tpublic String getDescription() {\r\n\t\treturn description;\r\n\t}\r\n\r\n\tpublic void setDescription(String description) {\r\n\t\tthis.description = description;\r\n\t}\r\n\r\n\tpublic int getInStockNumber() {\r\n\t\treturn inStockNumber;\r\n\t}\r\n\r\n\tpublic void setInStockNumber(int inStockNumber) {\r\n\t\tthis.inStockNumber = inStockNumber;\r\n\t}\r\n\r\n\tpublic MultipartFile getBookImage() {\r\n\t\treturn bookImage;\r\n\t}\r\n\r\n\tpublic void setBookImage(MultipartFile bookImage) {\r\n\t\tthis.bookImage = bookImage;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/domain/User.java",
    "content": "package com.adminportal.domain;\r\n\r\nimport java.util.Collection;\r\nimport java.util.HashSet;\r\nimport java.util.Set;\r\n\r\nimport javax.persistence.CascadeType;\r\nimport javax.persistence.Column;\r\nimport javax.persistence.Entity;\r\nimport javax.persistence.FetchType;\r\nimport javax.persistence.GeneratedValue;\r\nimport javax.persistence.GenerationType;\r\nimport javax.persistence.Id;\r\nimport javax.persistence.OneToMany;\r\n\r\nimport org.springframework.security.core.GrantedAuthority;\r\nimport org.springframework.security.core.userdetails.UserDetails;\r\n\r\nimport com.adminportal.domain.security.Authority;\r\nimport com.adminportal.domain.security.UserRole;\r\nimport com.fasterxml.jackson.annotation.JsonIgnore;\r\n\r\n@Entity\r\npublic class User implements UserDetails{\r\n\t\r\n\t@Id\r\n\t@GeneratedValue(strategy=GenerationType.AUTO)\r\n\t@Column(name=\"id\", nullable = false, updatable = false)\r\n\tprivate Long id;\r\n\tprivate String username;\r\n\tprivate String password;\r\n\tprivate String firstName;\r\n\tprivate String lastName;\r\n\t\r\n\t@Column(name=\"email\", nullable = false, updatable = false)\r\n\tprivate String email;\r\n\tprivate String phone;\r\n\tprivate boolean enabled=true;\r\n\t\r\n\t@OneToMany(mappedBy = \"user\", cascade = CascadeType.ALL, fetch = FetchType.EAGER)\r\n\t@JsonIgnore\r\n\tprivate Set<UserRole> userRoles = new HashSet<>();\r\n\t\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\tpublic String getUsername() {\r\n\t\treturn username;\r\n\t}\r\n\tpublic void setUsername(String username) {\r\n\t\tthis.username = username;\r\n\t}\r\n\tpublic String getPassword() {\r\n\t\treturn password;\r\n\t}\r\n\tpublic void setPassword(String password) {\r\n\t\tthis.password = password;\r\n\t}\r\n\tpublic String getFirstName() {\r\n\t\treturn firstName;\r\n\t}\r\n\tpublic void setFirstName(String firstName) {\r\n\t\tthis.firstName = firstName;\r\n\t}\r\n\tpublic String getLastName() {\r\n\t\treturn lastName;\r\n\t}\r\n\tpublic void setLastName(String lastName) {\r\n\t\tthis.lastName = lastName;\r\n\t}\r\n\tpublic String getEmail() {\r\n\t\treturn email;\r\n\t}\r\n\tpublic void setEmail(String email) {\r\n\t\tthis.email = email;\r\n\t}\r\n\tpublic String getPhone() {\r\n\t\treturn phone;\r\n\t}\r\n\tpublic void setPhone(String phone) {\r\n\t\tthis.phone = phone;\r\n\t}\r\n\t\r\n\tpublic void setEnabled(boolean enabled) {\r\n\t\tthis.enabled = enabled;\r\n\t}\r\n\tpublic Set<UserRole> getUserRoles() {\r\n\t\treturn userRoles;\r\n\t}\r\n\tpublic void setUserRoles(Set<UserRole> userRoles) {\r\n\t\tthis.userRoles = userRoles;\r\n\t}\r\n\t@Override\r\n\tpublic Collection<? extends GrantedAuthority> getAuthorities() {\r\n\t\tSet<GrantedAuthority> authorites = new HashSet<>();\r\n\t\tuserRoles.forEach(ur -> authorites.add(new Authority(ur.getRole().getName())));\r\n\t\t\r\n\t\treturn authorites;\r\n\t}\r\n\t@Override\r\n\tpublic boolean isAccountNonExpired() {\r\n\t\t// TODO Auto-generated method stub\r\n\t\treturn true;\r\n\t}\r\n\t@Override\r\n\tpublic boolean isAccountNonLocked() {\r\n\t\t// TODO Auto-generated method stub\r\n\t\treturn true;\r\n\t}\r\n\t@Override\r\n\tpublic boolean isCredentialsNonExpired() {\r\n\t\t// TODO Auto-generated method stub\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic boolean isEnabled() {\r\n\t\treturn enabled;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/domain/security/Authority.java",
    "content": "package com.adminportal.domain.security;\r\n\r\nimport org.springframework.security.core.GrantedAuthority;\r\n\r\npublic class Authority implements GrantedAuthority{\r\n\tprivate final String authority;\r\n\t\r\n\tpublic Authority(String authority) {\r\n\t\tthis.authority = authority;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic String getAuthority() {\r\n\t\treturn authority;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/domain/security/PasswordResetToken.java",
    "content": "package com.adminportal.domain.security;\r\n\r\nimport java.util.Calendar;\r\nimport java.util.Date;\r\n\r\nimport javax.persistence.Entity;\r\nimport javax.persistence.FetchType;\r\nimport javax.persistence.GeneratedValue;\r\nimport javax.persistence.GenerationType;\r\nimport javax.persistence.Id;\r\nimport javax.persistence.JoinColumn;\r\nimport javax.persistence.OneToOne;\r\n\r\nimport com.adminportal.domain.User;\r\n\r\n@Entity\r\npublic class PasswordResetToken {\r\n\r\n\tprivate static final int EXPIRATION = 60 * 24;\r\n\t\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\t\r\n\tprivate String token;\r\n\t\r\n\t@OneToOne(targetEntity = User.class, fetch = FetchType.EAGER)\r\n\t@JoinColumn(nullable=false, name=\"user_id\")\r\n\tprivate User user;\r\n\t\r\n\tprivate Date expiryDate;\r\n\t\r\n\tpublic PasswordResetToken(){}\r\n\t\r\n\tpublic PasswordResetToken(final String token, final User user) {\r\n\t\tsuper ();\r\n\t\t\r\n\t\tthis.token = token;\r\n\t\tthis.user = user;\r\n\t\tthis.expiryDate = calculateExpiryDate(EXPIRATION);\r\n\t}\r\n\t\r\n\tprivate Date calculateExpiryDate (final int expiryTimeInMinutes) {\r\n\t\tfinal Calendar cal = Calendar.getInstance();\r\n\t\tcal.setTimeInMillis(new Date().getTime());\r\n\t\tcal.add(Calendar.MINUTE, expiryTimeInMinutes);\r\n\t\treturn new Date(cal.getTime().getTime());\r\n\t}\r\n\t\r\n\tpublic void updateToken(final String token) {\r\n\t\tthis.token = token;\r\n\t\tthis.expiryDate = calculateExpiryDate(EXPIRATION);\r\n\t}\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic String getToken() {\r\n\t\treturn token;\r\n\t}\r\n\r\n\tpublic void setToken(String token) {\r\n\t\tthis.token = token;\r\n\t}\r\n\r\n\tpublic User getUser() {\r\n\t\treturn user;\r\n\t}\r\n\r\n\tpublic void setUser(User user) {\r\n\t\tthis.user = user;\r\n\t}\r\n\r\n\tpublic Date getExpiryDate() {\r\n\t\treturn expiryDate;\r\n\t}\r\n\r\n\tpublic void setExpiryDate(Date expiryDate) {\r\n\t\tthis.expiryDate = expiryDate;\r\n\t}\r\n\r\n\tpublic static int getExpiration() {\r\n\t\treturn EXPIRATION;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"PasswordResetToken [id=\" + id + \", token=\" + token + \", user=\" + user + \", expiryDate=\" + expiryDate\r\n\t\t\t\t+ \"]\";\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/domain/security/Role.java",
    "content": "package com.adminportal.domain.security;\r\n\r\nimport java.util.HashSet;\r\nimport java.util.Set;\r\n\r\nimport javax.persistence.CascadeType;\r\nimport javax.persistence.Entity;\r\nimport javax.persistence.FetchType;\r\nimport javax.persistence.Id;\r\nimport javax.persistence.OneToMany;\r\n\r\n@Entity\r\npublic class Role {\r\n\r\n\t@Id\r\n\tprivate int roleId;\r\n\tprivate String name;\r\n\t\r\n\t@OneToMany(mappedBy = \"role\", cascade = CascadeType.ALL, fetch=FetchType.LAZY)\r\n\tprivate Set<UserRole> userRoles = new HashSet<>();\r\n\r\n\tpublic int getRoleId() {\r\n\t\treturn roleId;\r\n\t}\r\n\r\n\tpublic void setRoleId(int roleId) {\r\n\t\tthis.roleId = roleId;\r\n\t}\r\n\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\r\n\tpublic void setName(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\r\n\tpublic Set<UserRole> getUserRoles() {\r\n\t\treturn userRoles;\r\n\t}\r\n\r\n\tpublic void setUserRoles(Set<UserRole> userRoles) {\r\n\t\tthis.userRoles = userRoles;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/domain/security/UserRole.java",
    "content": "package com.adminportal.domain.security;\r\n\r\nimport javax.persistence.Entity;\r\nimport javax.persistence.FetchType;\r\nimport javax.persistence.GeneratedValue;\r\nimport javax.persistence.GenerationType;\r\nimport javax.persistence.Id;\r\nimport javax.persistence.JoinColumn;\r\nimport javax.persistence.ManyToOne;\r\nimport javax.persistence.Table;\r\n\r\nimport com.adminportal.domain.User;\r\n\r\n@Entity\r\n@Table(name=\"user_role\")\r\npublic class UserRole {\r\n\r\n\t@Id\r\n\t@GeneratedValue(strategy=GenerationType.AUTO)\r\n\tprivate Long userRoleId;\r\n\t\r\n\t@ManyToOne(fetch = FetchType.EAGER)\r\n\t@JoinColumn(name=\"user_id\")\r\n\tprivate User user;\r\n\t\r\n\t@ManyToOne(fetch = FetchType.EAGER)\r\n\t@JoinColumn(name=\"role_id\")\r\n\tprivate Role role;\r\n\t\r\n\tpublic UserRole(){}\r\n\t\r\n\tpublic UserRole(User user, Role role) {\r\n\t\tthis.user = user;\r\n\t\tthis.role = role;\r\n\t}\r\n\r\n\r\n\tpublic Long getUserRoleId() {\r\n\t\treturn userRoleId;\r\n\t}\r\n\r\n\r\n\tpublic void setUserRoleId(Long userRoleId) {\r\n\t\tthis.userRoleId = userRoleId;\r\n\t}\r\n\r\n\r\n\tpublic User getUser() {\r\n\t\treturn user;\r\n\t}\r\n\r\n\r\n\tpublic void setUser(User user) {\r\n\t\tthis.user = user;\r\n\t}\r\n\r\n\r\n\tpublic Role getRole() {\r\n\t\treturn role;\r\n\t}\r\n\r\n\r\n\tpublic void setRole(Role role) {\r\n\t\tthis.role = role;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/repository/BookRepository.java",
    "content": "package com.adminportal.repository;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\n\r\nimport com.adminportal.domain.Book;\r\n\r\npublic interface BookRepository extends CrudRepository<Book, Long>{\r\n\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/repository/RoleRepository.java",
    "content": "package com.adminportal.repository;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\n\r\nimport com.adminportal.domain.security.Role;\r\n\r\n\r\npublic interface RoleRepository extends CrudRepository<Role, Long> {\r\n\tRole findByname(String name);\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/repository/UserRepository.java",
    "content": "package com.adminportal.repository;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\n\r\nimport com.adminportal.domain.User;\r\n\r\npublic interface UserRepository extends CrudRepository<User, Long> {\r\n\tUser findByUsername(String username);\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/service/BookService.java",
    "content": "package com.adminportal.service;\r\n\r\nimport java.util.List;\r\n\r\nimport com.adminportal.domain.Book;\r\n\r\npublic interface BookService {\r\n\t\r\n\tBook save(Book book);\r\n\r\n\tList<Book> findAll();\r\n\t\r\n\tBook findById(Long id);\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/service/UserService.java",
    "content": "package com.adminportal.service;\r\n\r\nimport java.util.Set;\r\n\r\nimport com.adminportal.domain.User;\r\nimport com.adminportal.domain.security.UserRole;\r\n\r\npublic interface UserService {\r\n\tUser createUser(User user, Set<UserRole> userRoles) throws Exception;\r\n\t\r\n\tUser save(User user);\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/service/impl/BookServiceImpl.java",
    "content": "package com.adminportal.service.impl;\r\n\r\nimport java.util.List;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.adminportal.domain.Book;\r\nimport com.adminportal.repository.BookRepository;\r\nimport com.adminportal.service.BookService;\r\n\r\n@Service\r\npublic class BookServiceImpl implements BookService{\r\n\t\r\n\t@Autowired\r\n\tprivate BookRepository bookRepository;\r\n\t\r\n\tpublic Book save(Book book) {\r\n\t\treturn bookRepository.save(book);\r\n\t}\r\n\t\r\n\tpublic List<Book> findAll() {\r\n\t\treturn (List<Book>) bookRepository.findAll();\r\n\t}\r\n\t\r\n\tpublic Book findById(Long id) {\r\n\t\treturn bookRepository.findById(id).orElse(null);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/service/impl/UserSecurityService.java",
    "content": "package com.adminportal.service.impl;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.security.core.userdetails.UserDetails;\r\nimport org.springframework.security.core.userdetails.UserDetailsService;\r\nimport org.springframework.security.core.userdetails.UsernameNotFoundException;\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.adminportal.domain.User;\r\nimport com.adminportal.repository.UserRepository;\r\n\r\n@Service\r\npublic class UserSecurityService implements UserDetailsService{\r\n\t\r\n\t@Autowired\r\n\tprivate UserRepository userRepository;\r\n\t\r\n\t@Override\r\n\tpublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {\r\n\t\tUser user = userRepository.findByUsername(username);\r\n\t\t\r\n\t\tif(null == user) {\r\n\t\t\tthrow new UsernameNotFoundException(\"Username not found\");\r\n\t\t}\r\n\t\t\r\n\t\treturn user;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/service/impl/UserServiceImpl.java",
    "content": "package com.adminportal.service.impl;\r\n\r\nimport java.util.Set;\r\n\r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.adminportal.domain.User;\r\nimport com.adminportal.domain.security.UserRole;\r\nimport com.adminportal.repository.RoleRepository;\r\nimport com.adminportal.repository.UserRepository;\r\nimport com.adminportal.service.UserService;\r\n\r\n@Service\r\npublic class UserServiceImpl implements UserService {\r\n\r\n\tprivate static final Logger LOG = LoggerFactory.getLogger(UserService.class);\r\n\t\r\n\t@Autowired\r\n\tprivate UserRepository userRepository;\r\n\t\r\n\t@Autowired\r\n\tprivate RoleRepository roleRepository;\r\n\r\n\t@Override\r\n\tpublic User createUser(User user, Set<UserRole> userRoles) {\r\n\t\tUser localUser = userRepository.findByUsername(user.getUsername());\r\n\r\n\t\tif (localUser != null) {\r\n\t\t\tLOG.info(\"user {} already exists. Nothing will be done.\", user.getUsername());\r\n\t\t} else {\r\n\t\t\tfor (UserRole ur : userRoles) {\r\n\t\t\t\troleRepository.save(ur.getRole());\r\n\t\t\t}\r\n\r\n\t\t\tuser.getUserRoles().addAll(userRoles);\r\n\r\n\t\t\tlocalUser = userRepository.save(user);\r\n\t\t}\r\n\r\n\t\treturn localUser;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic User save(User user) {\r\n\t\treturn userRepository.save(user);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/java/com/adminportal/utility/SecurityUtility.java",
    "content": "package com.adminportal.utility;\r\n\r\nimport java.security.SecureRandom;\r\nimport java.util.Random;\r\n\r\nimport org.springframework.context.annotation.Bean;\r\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\r\nimport org.springframework.stereotype.Component;\r\n\r\n@Component\r\npublic class SecurityUtility {\r\n\tprivate static final String SALT = \"salt\"; // Salt should be protected carefully\r\n\t\r\n\t@Bean\r\n\tpublic static BCryptPasswordEncoder passwordEncoder() {\r\n\t\treturn new BCryptPasswordEncoder(12, new SecureRandom(SALT.getBytes()));\r\n\t}\r\n\t\r\n\t@Bean\r\n\tpublic static String randomPassword() {\r\n\t\tString SALTCHARS = \"ABCEFGHIJKLMNOPQRSTUVWXYZ1234567890\";\r\n\t\tStringBuilder salt = new StringBuilder();\r\n\t\tRandom rnd = new Random();\r\n\t\t\r\n\t\twhile (salt.length()<18) {\r\n\t\t\tint index= (int) (rnd.nextFloat()*SALTCHARS.length());\r\n\t\t\tsalt.append(SALTCHARS.charAt(index));\r\n\t\t}\r\n\t\tString saltStr = salt.toString();\r\n\t\treturn saltStr;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "adminportal/src/main/resources/application.properties",
    "content": "server.port=8081\nserver.context-path=/adminportal\nspring.thymeleaf.cache=false\n\n# ===============================\n# = DATA SOURCE\n# ===============================\n\n# Set here configurations for the database connection\nspring.datasource.url=jdbc:mysql://localhost:3306/ecommercedatabase\n\n# Username and secret\nspring.datasource.username=root\nspring.datasource.password=foysal28\n\n# Keep the connection alive if idle for a long time (needed in production)\nspring.datasource.testWhileIdle = true\nspring.datasource.validationQuery = SELECT 1\n\n\n# ===============================\n# = JPA / HIBERNATE\n# ===============================\n\n# Use spring.jpa.properties.* for Hibernate native properties (the prefix is\n# stripped before adding them to the entity manager).\n\n# Show or not log for each sql query\nspring.jpa.show-sql=true\n\n# Hibernate ddl auto (create, create-drop, update): with \"update\" the database\n# schema will be automatically updated accordingly to java entities found in\n# the project\nspring.jpa.hibernate.ddl-auto = update\n\n# Allows Hibernate to generate SQL optimized for a particular DBMS\nspring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect"
  },
  {
    "path": "adminportal/src/main/resources/static/css/non-responsive.css",
    "content": "/* Template-specific stuff\n *\n * Customizations just for the template; these are not necessary for anything\n * with disabling the responsiveness.\n */\n\n/* Account for fixed navbar */\nbody {\n  padding-top: 70px;\n  padding-bottom: 30px;\n}\n\nbody,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  min-width: 970px;\n}\n\n/* Don't let the lead text change font-size. */\n.lead {\n  font-size: 16px;\n}\n\n/* Finesse the page header spacing */\n.page-header {\n  margin-bottom: 30px;\n}\n.page-header .lead {\n  margin-bottom: 10px;\n}\n\n\n/* Non-responsive overrides\n *\n * Utilize the following CSS to disable the responsive-ness of the container,\n * grid system, and navbar.\n */\n\n/* Reset the container */\n.container {\n  width: 970px;\n  max-width: none !important;\n}\n\n/* Demonstrate the grids */\n.col-xs-4 {\n  padding-top: 15px;\n  padding-bottom: 15px;\n  /*background-color: #eee;*/\n  /*background-color: rgba(86,61,124,.15);*/\n  /*border: 1px solid #ddd;*/\n  /*border: 1px solid rgba(86,61,124,.2);*/\n}\n\n.container .navbar-header,\n.container .navbar-collapse {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n/* Always float the navbar header */\n.navbar-header {\n  float: left;\n}\n\n/* Undo the collapsing navbar */\n.navbar-collapse {\n  display: block !important;\n  height: auto !important;\n  padding-bottom: 0;\n  overflow: visible !important;\n  visibility: visible !important;\n}\n\n.navbar-toggle {\n  display: none;\n}\n.navbar-collapse {\n  border-top: 0;\n}\n\n.navbar-brand {\n  margin-left: -15px;\n}\n\n/* Always apply the floated nav */\n.navbar-nav {\n  float: left;\n  margin: 0;\n}\n.navbar-nav > li {\n  float: left;\n}\n.navbar-nav > li > a {\n  padding: 15px;\n}\n\n/* Redeclare since we override the float above */\n.navbar-nav.navbar-right {\n  float: right;\n}\n\n/* Undo custom dropdowns */\n.navbar .navbar-nav .open .dropdown-menu {\n  position: absolute;\n  float: left;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-width: 0 1px 1px;\n  border-radius: 0 0 4px 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.navbar-default .navbar-nav .open .dropdown-menu > li > a {\n  color: #333;\n}\n.navbar .navbar-nav .open .dropdown-menu > li > a:hover,\n.navbar .navbar-nav .open .dropdown-menu > li > a:focus,\n.navbar .navbar-nav .open .dropdown-menu > .active > a,\n.navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n.navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n  color: #fff !important;\n  background-color: #428bca !important;\n}\n.navbar .navbar-nav .open .dropdown-menu > .disabled > a,\n.navbar .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n.navbar .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n  color: #999 !important;\n  background-color: transparent !important;\n}\n\n/* Undo form expansion */\n.navbar-form {\n  float: left;\n  width: auto;\n  padding-top: 0;\n  padding-bottom: 0;\n  margin-right: 0;\n  margin-left: 0;\n  border: 0;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n/* Copy-pasted from forms.less since we mixin the .form-inline styles. */\n.navbar-form .form-group {\n  display: inline-block;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.navbar-form .form-control {\n  display: inline-block;\n  width: auto;\n  vertical-align: middle;\n}\n\n.navbar-form .form-control-static {\n  display: inline-block;\n}\n\n.navbar-form .input-group {\n  display: inline-table;\n  vertical-align: middle;\n}\n\n.navbar-form .input-group .input-group-addon,\n.navbar-form .input-group .input-group-btn,\n.navbar-form .input-group .form-control {\n  width: auto;\n}\n\n.navbar-form .input-group > .form-control {\n  width: 100%;\n}\n\n.navbar-form .control-label {\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.navbar-form .radio,\n.navbar-form .checkbox {\n  display: inline-block;\n  margin-top: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.navbar-form .radio label,\n.navbar-form .checkbox label {\n  padding-left: 0;\n}\n\n.navbar-form .radio input[type=\"radio\"],\n.navbar-form .checkbox input[type=\"checkbox\"] {\n  position: relative;\n  margin-left: 0;\n}\n\n.navbar-form .has-feedback .form-control-feedback {\n  top: 0;\n}\n\n/* Undo inline form compaction on small screens */\n.form-inline .form-group {\n  display: inline-block;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.form-inline .form-control {\n  display: inline-block;\n  width: auto;\n  vertical-align: middle;\n}\n\n.form-inline .form-control-static {\n  display: inline-block;\n}\n\n.form-inline .input-group {\n  display: inline-table;\n  vertical-align: middle;\n}\n.form-inline .input-group .input-group-addon,\n.form-inline .input-group .input-group-btn,\n.form-inline .input-group .form-control {\n  width: auto;\n}\n\n.form-inline .input-group > .form-control {\n  width: 100%;\n}\n\n.form-inline .control-label {\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.form-inline .radio,\n.form-inline .checkbox {\n  display: inline-block;\n  margin-top: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.form-inline .radio label,\n.form-inline .checkbox label {\n  padding-left: 0;\n}\n\n.form-inline .radio input[type=\"radio\"],\n.form-inline .checkbox input[type=\"checkbox\"] {\n  position: relative;\n  margin-left: 0;\n}\n\n.form-inline .has-feedback .form-control-feedback {\n  top: 0;\n}"
  },
  {
    "path": "adminportal/src/main/resources/static/css/style.css",
    "content": "body {\n \n}\n\nhr {\n\tborder: none;\n\theight: 1px;\n\tcolor: #333;\n\tbackground-color: #333;\n}\n\n.container {\n\twidth: 90%;\n}\n\n.page-top {\n\tmargin-top: -70px;\n}\n\n.navbar {\n  margin-bottom: 20px;\n}\n\n.box {\n\tborder: 1px solid red;\n}\n\n.home-headline{\n\tfont-family: 'Times New Roman', Times, serif;\n\tfont-size:24px;\n\tcolor: #fff;\n\tmargin: auto;\n\ttext-align: center;\n\tmargin-top: -13px;\n}\n\n.home-headline span {\n\tbackground-color: #231F20;\n    padding: 5px 22px;\n\t\n}\n\n.section-headline {\n\tfont-family: 'Times New Roman', Times, serif;\n\tfont-size:24px;\n\tcolor: #fff;\n\tmargin: auto;\n\ttext-align: center;\n\tmargin-top: 90px;\n}\n\n.section-headline span {\n\tbackground-color: #231F20;\n    padding: 5px 22px;\n\t\n}\n\n"
  },
  {
    "path": "adminportal/src/main/resources/templates/addBook.html",
    "content": "\r\n<!DOCTYPE html>\r\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\r\n<head th:replace=\"common/header :: common-header\" />\r\n\r\n<body>\r\n\t<div th:replace=\"common/header :: navbar\" />\r\n\r\n\t<div class=\"container\">\r\n\t\t<div class=\"row\">\r\n\t\t\t<form class=\"form-horizontal\" th:action=\"@{/book/add}\" method=\"post\"\r\n\t\t\t\tenctype=\"multipart/form-data\">\r\n\t\t\t\t<fieldset>\r\n\t\t\t\t\t<legend class=\"center-block\">\r\n\t\t\t\t\t\tNew Book Information<span style=\"font-size: small\">  * is a\r\n\t\t\t\t\t\t\trequired field</span>\r\n\t\t\t\t\t</legend>\r\n\r\n\r\n\t\t\t\t\t<!-- title -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"title\">* Title</label>\r\n\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"text\" name=\"title\" class=\"form-control\" id=\"title\"\r\n\t\t\t\t\t\t\t\tth:value=\"${book.title}\" required=\"required\" placeholder=\"Title\" />\r\n\t\t\t\t\t\t\t<span class=\"help-block\">Title of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- author -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"author\">*\r\n\t\t\t\t\t\t\tAuthor</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"text\" name=\"author\" class=\"form-control\" id=\"author\"\r\n\t\t\t\t\t\t\t\tth:value=\"${book.author}\" required=\"required\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Author\" /> <span class=\"help-block\">Author\r\n\t\t\t\t\t\t\t\tof the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- publisher -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"publisher\">Publisher</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"text\" name=\"publisher\" class=\"form-control\"\r\n\t\t\t\t\t\t\t\tid=\"publisher\" th:value=\"${book.publisher}\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Publisher\" /> <span class=\"help-block\">Publisher\r\n\t\t\t\t\t\t\t\tof the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- publication date -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"publicationDate\">Publication\r\n\t\t\t\t\t\t\tDate</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"date\" class=\"form-control\" id=\"publicationDate\"\r\n\t\t\t\t\t\t\t\tname=\"publicationDate\" th:value=\"${book.publicationDate}\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"ublication Date\" /> <span class=\"help-block\">Publication\r\n\t\t\t\t\t\t\t\tDate of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- language -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"language\">Language</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<select th:value=\"${book.language}\" id=\"language\" name=\"language\"\r\n\t\t\t\t\t\t\t\tclass=\"form-control\">\r\n\t\t\t\t\t\t\t\t<option value=\"english\">English</option>\r\n\t\t\t\t\t\t\t\t<option value=\"spanish\">Spanish</option>\r\n\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- category -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"category\">*\r\n\t\t\t\t\t\t\tCategory</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<select th:value=\"${book.category}\" id=\"category\" name=\"category\"\r\n\t\t\t\t\t\t\t\tclass=\"form-control\">\r\n\t\t\t\t\t\t\t\t<option value=\"\" selected=\"selected\" disabled=\"disabled\">Please\r\n\t\t\t\t\t\t\t\t\tselect an option...</option>\r\n\t\t\t\t\t\t\t\t<option value=\"Management\"\r\n\t\t\t\t\t\t\t\t\tth:selected=\"(${book.category}=='Management')\">Management</option>\r\n\t\t\t\t\t\t\t\t<option value=\"Fiction\"\r\n\t\t\t\t\t\t\t\t\tth:selected=\"(${book.category}=='Fiction')\">Fiction</option>\r\n\t\t\t\t\t\t\t\t<option value=\"Engineering\"\r\n\t\t\t\t\t\t\t\t\tth:selected=\"(${book.category}=='Engineering')\">Engineering</option>\r\n\t\t\t\t\t\t\t\t<option value=\"Programming\"\r\n\t\t\t\t\t\t\t\t\tth:selected=\"(${book.category}=='Programming')\">Programming</option>\r\n\t\t\t\t\t\t\t\t<option value=\"Arts &amp; Literature\"\r\n\t\t\t\t\t\t\t\t\tth:selected=\"(${book.category}=='Arts &amp; Literature')\">Arts\r\n\t\t\t\t\t\t\t\t\t&amp; Literature</option>\r\n\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- pages -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"pageNumber\">Pages</label>\r\n\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"number\" name=\"numberOfPages\" class=\"form-control\"\r\n\t\t\t\t\t\t\t\tid=\"pageNumber\" th:value=\"${book.numberOfPages}\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Page Number\" /> <span class=\"help-block\">Number\r\n\t\t\t\t\t\t\t\tof pages of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- format -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"format\">Format</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<select th:value=\"${book.format}\" id=\"format\" name=\"format\"\r\n\t\t\t\t\t\t\t\tclass=\"form-control\">\r\n\t\t\t\t\t\t\t\t<option value=\"paperback\">Paperback</option>\r\n\t\t\t\t\t\t\t\t<option value=\"hardcover\">Hardcover</option>\r\n\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- isbn -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"isbn\">ISBN</label>\r\n\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"text\" name=\"isbn\" class=\"form-control\" id=\"isbn\"\r\n\t\t\t\t\t\t\t\tth:value=\"${book.isbn}\" placeholder=\"ISBN\" /> <span\r\n\t\t\t\t\t\t\t\tclass=\"help-block\">ISBN of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- shipping weight -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"shippingWeight\">Shipping\r\n\t\t\t\t\t\t\tWeight</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<div class=\"input-group\">\r\n\t\t\t\t\t\t\t\t<input th:value=\"${book.shippingWeight}\" type=\"number\" step=\"0.01\"\r\n\t\t\t\t\t\t\t\t\tname=\"shippingWeight\" class=\"form-control\" id=\"shippingWeight\"\r\n\t\t\t\t\t\t\t\t\tplaceholder=\"Shipping Weight\" /> <span\r\n\t\t\t\t\t\t\t\t\tclass=\"input-group-addon\">Ounces</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<span class=\"help-block\">Shipping Weight of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- list price -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"listPrice\">List\r\n\t\t\t\t\t\t\tPrice</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<div class=\"input-group\">\r\n\t\t\t\t\t\t\t\t<span class=\"input-group-addon\">$</span> <input\r\n\t\t\t\t\t\t\t\t\tth:value=\"${book.listPrice}\" type=\"number\" name=\"listPrice\" step=\"0.01\"\r\n\t\t\t\t\t\t\t\t\tclass=\"form-control\" id=\"listPrice\" placeholder=\"List Price\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<span class=\"help-block\">List price of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- our price -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"ourPrice\">Our\r\n\t\t\t\t\t\t\tPrice</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<div class=\"input-group\">\r\n\t\t\t\t\t\t\t\t<span class=\"input-group-addon\">$</span> <input\r\n\t\t\t\t\t\t\t\t\tth:value=\"${book.ourPrice}\" type=\"number\" name=\"ourPrice\" step=\"0.01\"\r\n\t\t\t\t\t\t\t\t\tclass=\"form-control\" id=\"ourPrice\" placeholder=\"Our Price\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<span class=\"help-block\">Our price of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- in stock number -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"inStockNumber\">Number\r\n\t\t\t\t\t\t\tin stock</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input th:value=\"${book.inStockNumber}\" type=\"number\"\r\n\t\t\t\t\t\t\t\tname=\"inStockNumber\" class=\"form-control\" id=\"inStockNumber\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Number of in-stock copies\" /> <span\r\n\t\t\t\t\t\t\t\tclass=\"help-block\">Number of in-stock copies</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- status of book -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"status\">Status</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<label><input value=\"true\" type=\"radio\" name=\"active\"\r\n\t\t\t\t\t\t\t\tchecked=\"checked\" /> Active </label> <label><input\r\n\t\t\t\t\t\t\t\tvalue=\"false\" type=\"radio\" name=\"active\" />\r\n\t\t\t\t\t\t\t\tInactive </label> <span class=\"help-block\">Whether the book is\r\n\t\t\t\t\t\t\t\tactive or inactive</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- description -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"description\">Description</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<textarea name=\"description\" rows=\"5\" class=\"form-control\"\r\n\t\t\t\t\t\t\t\tid=\"description\" th:value=\"${book.description}\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Description\" /></textarea>\r\n\t\t\t\t\t\t\t<span class=\"help-block\">Description of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- upload image -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<div class=\"col-md-2\">\r\n\t\t\t\t\t\t\t<label for=\"bookImage\">Upload book image</label>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input id=\"bookImage\" type=\"file\" name=\"bookImage\"\r\n\t\t\t\t\t\t\t\tth:value=\"${book.bookImage}\" />\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<div class=\"col-md-2\"></div>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-success\">Add Book</button>\r\n\t\t\t\t\t\t\t<a class=\"btn btn-danger\" th:href=\"@{/}\">Cancel</a>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</fieldset>\r\n\t\t\t</form>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\r\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "adminportal/src/main/resources/templates/bookInfo.html",
    "content": "\r\n<!DOCTYPE html>\r\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\r\n<head th:replace=\"common/header :: common-header\" />\r\n\r\n<body>\r\n\t<div th:replace=\"common/header :: navbar\" />\r\n\t\r\n\t<div class=\"container\">\r\n\t\t<div>\r\n\t\t\t<ol class=\"breadcrumb\">\r\n\t\t\t\t<li><a th:href=\"@{/book/bookList}\"><i class=\"fa fa-long-arrow-left\" aria-hidden=\"true\"></i>Go back</a></li>\r\n\t\t\t\t<li><strong><a th:href=\"@{/book/updateBook?id=}+${book.id}\" class=\"fa fa-pencil\" style=\"color: green\"> Edit</a></strong></li>\r\n\t\t\t</ol>\r\n\t\t\t\r\n\t\t</div>\r\n\t\t\r\n\t\t<div class=\"row\">\r\n\t\t\t<div class=\"col-xs-3\">\r\n\t\t\t\t<div class=\"panel panel-default\">\r\n\t\t\t\t<div class=\"panel-body\">\r\n\t\t\t\t\t<img th:src=\"@{/image/book/}+${book.id}+'.png'\" class=\"img-responsive center-block\" />\r\n\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"col-xs-9\">\r\n\t\t\t\t<h3 th:text=\"${book.title}\" style=\"color: red; font-family: cursive\"></h3><br/>\r\n\t\t\t\t<div class=\"row\">\r\n\t\t\t\t\t<div class=\"col-xs-6\">\r\n\t\t\t\t\t\t<p><strong>Author: </strong><span th:text=\"${book.author}\"></span></p>\r\n\t\t\t\t\t\t<p><strong>Publisher: </strong><span th:text=\"${book.publisher}\"></span></p>\r\n\t\t\t\t\t\t<p><strong>Publication Date: </strong><span th:text=\"${book.publicationDate}\"></span></p>\r\n\t\t\t\t\t\t<p><strong>Language: </strong><span th:text=\"${book.language}\"></span></p>\r\n\t\t\t\t\t\t<p><strong>Category: </strong><span th:text=\"${book.category}\"></span></p>\r\n\t\t\t\t\t\t<p><strong>Pages: </strong><span th:text=\"${book.numberOfPages}\"></span></p>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"col-xs-6\">\r\n\t\t\t\t\t\t<p><strong>Format: </strong><span th:text=\"${book.format}\"></span></p>\r\n\t\t\t\t\t\t<p><strong>ISBN: </strong><span th:text=\"${book.isbn}\"></span></p>\r\n\t\t\t\t\t\t<p><strong>Shipping Weight: </strong><span th:text=\"${book.shippingWeight}\"></span></p>\r\n\t\t\t\t\t\t<p><strong>List Price: </strong><span th:text=\"${book.listPrice}\"></span></p>\r\n\t\t\t\t\t\t<p><strong>Our Price: </strong><span th:text=\"${book.ourPrice}\"></span></p>\r\n\t\t\t\t\t\t<p><strong>Number in Stock: </strong><span th:text=\"${book.inStockNumber}\"></span></p>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<hr/>\r\n\t\t\t\t<p><Strong>Description: </Strong><span th:utext=\"${book.description}\"></span></p>\r\n\t\t\t\t<br/><hr/>\r\n\t\t\t</div>\r\n\t\t\t\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "adminportal/src/main/resources/templates/bookList.html",
    "content": "\r\n<!DOCTYPE html>\r\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\r\n<head th:replace=\"common/header :: common-header\" />\r\n\r\n<body>\r\n\t<div th:replace=\"common/header :: navbar\" />\r\n\t\r\n\t<div class=\"container\">\r\n\t\t<div class=\"table-responsive\">\r\n\t\t\t<table id=\"bookListTable\" class=\"table table-bordered table-hover table-striped\">\r\n\t\t\t\t<thead>\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t<th><input th:id=\"selectAllBooks\" type=\"checkbox\" /></th>\r\n\t\t\t\t\t\t<th>Title</th>\r\n\t\t\t\t\t\t<th>Author</th>\r\n\t\t\t\t\t\t<th>Category</th>\r\n\t\t\t\t\t\t<th>List Price</th>\r\n\t\t\t\t\t\t<th>Our Price</th>\r\n\t\t\t\t\t\t<th>Active?</th>\r\n\t\t\t\t\t\t<th>Operation</th>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</thead>\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\t<tr data-th-each=\"book : ${bookList}\">\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t<input hidden=\"hidden\" name=\"id\" th:value=\"${book.id}\" />\r\n\t\t\t\t\t\t<input th:id=\"'selected'+${book.id}\" class=\"checkboxBook\" type=\"checkbox\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td><a th:href=\"@{/book/bookInfo(id=${book.id})}\"><span th:text=\"${book.title}\"></span></a></td>\r\n\t\t\t\t\t\t<td th:text=\"${book.author}\"></td>\r\n\t\t\t\t\t\t<td th:text=\"${book.category}\"></td>\r\n\t\t\t\t\t\t<td th:text=\"${book.listPrice}\"></td>\r\n\t\t\t\t\t\t<td th:text=\"${book.ourPrice}\"></td>\r\n\t\t\t\t\t\t<td th:text=\"${book.active}\"></td>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input hidden=\"hidden\" name=\"id\" th:value=\"${book.id}\" />\r\n\t\t\t\t\t\t\t<button th:id=\" 'oneBook-'+${book.id}\" class=\"btn btn-danger btn-xs delete-book\" type=\"submit\" value=\"delete\" >\r\n\t\t\t\t\t\t\t<span class=\"fa fa-times\"></span>Delete</button>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</tbody>\r\n\t\t\t</table>\r\n\t\t</div>\r\n\t<button th:id=\"deleteSelected\" class=\"btn btn-danger \">Delete Selected</button>\r\n\t</div>\r\n\t\r\n\t\r\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\r\n\t\r\n\t<script>\r\n\t\t$(document).ready(function() {\r\n\t\t\t$(\"#bookListTable\").DataTable({\r\n\t\t\t\t\"lengthMenu\": [ [5,10,15,20,-1],[5,10,15,20,\"All\"] ],\r\n\t\t\t\t\"ordering\": false,\r\n\t\t\t\tstateSave: true\r\n\t\t\t});\r\n\t\t});\r\n\t</script>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "adminportal/src/main/resources/templates/common/header.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1999/xhtml\"\n\txmlns:sec=\"http://www.w3.org/1999/xhtml\">\n<head th:fragment=\"common-header\">\n<meta charset=\"utf-8\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n\n<title>E-Commerce Admin</title>\n\n<!-- Bootstrap core CSS -->\n<link th:href=\"@{/css/bootstrap.min.css}\" rel=\"stylesheet\" />\n\n<!-- Custom styles for this template -->\n<link th:href=\"@{/css/style.css}\" rel=\"stylesheet\" />\n\n<!-- data table -->\n<link th:href=\"@{/css/jquery.dataTables.min.css}\" rel=\"stylesheet\" />\n<link th:href=\"@{/css/dataTables.bootstrap.min.css}\" rel=\"stylesheet\" />\n\n<link th:href=\"@{/css/font-awesome.min.css}\" rel=\"stylesheet\" />\n\n<script src=\"//cdn.tinymce.com/4/tinymce.min.js\"></script>\n<script>tinymce.init({ selector:'textarea' });</script>\n\n<link rel=\"icon\" href=\"/image/applie-touch-icon.png\" />\n</head>\n\n<body>\n\t<div th:fragment=\"navbar\">\n\t<style>.navbar-default {\n        background-color: #a32222;\n        border-color: #293872;\n    }\n\n    .navbar-default .navbar-brand {\n        color: #ecf0f1;\n    }\n\n    .navbar-default .navbar-brand:hover,\n    .navbar-default .navbar-brand:focus {\n        color: #f8f9f8;\n    }\n\n    .navbar-default .navbar-text {\n        color: #ecf0f1;\n    }\n\n    .navbar-default .navbar-nav > li > a {\n        color: #ecf0f1;\n    }\n\n    .navbar-default .navbar-nav > li > a:hover,\n    .navbar-default .navbar-nav > li > a:focus {\n        color: #f8f9f8;\n    }\n\n    .navbar-default .navbar-nav > .active > a,\n    .navbar-default .navbar-nav > .active > a:hover,\n    .navbar-default .navbar-nav > .active > a:focus {\n        color: #f8f9f8;\n        background-color: #293872;\n    }\n\n    .navbar-default .navbar-nav > .open > a,\n    .navbar-default .navbar-nav > .open > a:hover,\n    .navbar-default .navbar-nav > .open > a:focus {\n        color: #f8f9f8;\n        background-color: #293872;\n    }\n\n    .navbar-default .navbar-toggle {\n        border-color: #293872;\n    }\n\n    .navbar-default .navbar-toggle:hover,\n    .navbar-default .navbar-toggle:focus {\n        background-color: #293872;\n    }\n\n    .navbar-default .navbar-toggle .icon-bar {\n        background-color: #ecf0f1;\n    }\n\n    .navbar-default .navbar-collapse,\n    .navbar-default .navbar-form {\n        border-color: #ecf0f1;\n    }\n\n    .navbar-default .navbar-link {\n        color: #ecf0f1;\n    }\n\n    .navbar-default .navbar-link:hover {\n        color: #f8f9f8;\n    }\n\n    @media (max-width: 767px) {\n        .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n            color: #ecf0f1;\n        }\n\n        .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n        .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n            color: #f8f9f8;\n        }\n\n        .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n        .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n        .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n            color: #f8f9f8;\n            background-color: #293872;\n        }\n    }</style>\n\t\t<nav class=\"navbar navbar-default navbar-static-top\">\n\t\t\t<div class=\"container\">\n\t\t\t\t<div class=\"navbar-header\">\n\t\t\t\t\t<button type=\"button\" class=\"navbar-toggle collapsed\"\n\t\t\t\t\t\tdata-toggle=\"collapse\" data-target=\"#navbar\" aria-expanded=\"false\">\n\t\t\t\t\t\t<span class=\"sr-only\">Toggle navigation</span> <span\n\t\t\t\t\t\t\tclass=\"icon-bar\"></span> <span class=\"icon-bar\"></span> <span\n\t\t\t\t\t\t\tclass=\"icon-bar\"></span>\n\t\t\t\t\t</button>\n\t\t\t\t\t<a class=\"navbar-brand\" th:href=\"@{/}\">Admin Portal</a>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Collect the nav links, forms, and other content for toggling -->\n\t\t\t\t<div class=\"collapse navbar-collapse\">\n\t\t\t\t\t<ul class=\"nav navbar-nav\">\n\t\t\t\t\t\t<li class=\"dropdown\"><a href=\"#\" class=\"dropdown-toggle\"\n\t\t\t\t\t\t\tdata-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\"\n\t\t\t\t\t\t\taria-expanded=\"false\">Book <span class=\"caret\"></span></a>\n\t\t\t\t\t\t\t<ul class=\"dropdown-menu\">\n\t\t\t\t\t\t\t\t<li><a th:href=\"@{/book/add}\">Add a new book</a></li>\n\t\t\t\t\t\t\t\t<li><a th:href=\"@{/book/bookList}\">View book list</a></li>\n\t\t\t\t\t\t\t</ul></li>\n\t\t\t\t\t</ul>\n\n\t\t\t\t\t<ul class=\"nav navbar-nav navbar-right\">\n\t\t\t\t\t\t<li><a th:href=\"@{/logout}\">Sign out</a></li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<!-- /.navbar-collapse -->\n\t\t\t</div>\n\t\t\t<!-- /.container-fluid -->\n\t\t</nav>\n\t</div>\n\n\t<div th:fragment=\"body-bottom-scripts\">\n\t\t<script th:src=\"@{/js/jquery.min.js}\"></script>\n\t\t<script th:src=\"@{/js/bootstrap.min.js}\"></script>\n\t\t<script th:src=\"@{/js/bootbox.min.js}\"></script>\n\t\t<script th:src=\"@{/js/scripts.js}\"></script>\n\t\t\n\t\t<!-- data table -->\n\t\t<script th:src=\"@{/js/jquery.dataTables.min.js}\"></script>\n\t\t<script th:src=\"@{/js/dataTables.bootstrap.min.js}\"></script>\n\t</div>\n</body>\n</html>\n"
  },
  {
    "path": "adminportal/src/main/resources/templates/home.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\n<head th:replace=\"common/header :: common-header\">\n\n</head>\n\n<body>\n\t<div th:replace=\"common/header :: navbar\" />\n\t\n\t<h1 style=\"text-align:center; margin-top  : 30px;\"> <strong>Admin Portal</strong></h1>\n\n<br/><br/>\n<hr/>\n   <div style=\"text-align:center; margin-top  : 40px;\">\n\t<a th:href=\"@{/book/add}\"><button\n\t\t\tstyle=\"background-color: #4CAF50; /* Green */ border: none; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 36px;\">Add New Book </button></a>\n\n\t</div>\n\t\n\t<div style=\"text-align:center; margin-top  : 40px;\">\n\t<a th:href=\"@{/book/bookList}\"><button\n\t\t\tstyle=\"background-color: red; /* Green */ border: none; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 36px;\">View Book List</button></a>\n\n\t</div>\n<hr/>\n\n\n\n\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\n</body>\n</html>\n"
  },
  {
    "path": "adminportal/src/main/resources/templates/login.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\n<head th:replace=\"common/header :: common-header\" />\n\n<body>\n\t<div class=\"container\">\n\t\t<h2 style=\"text-align:center; margin-top  : 30px;\"> <strong>Admin Authentication</strong></h2>\n\t\t<hr />\n\t\t<img th:src=\"@{/image/logo.png}\" class=\"img-responsive\"\n\t\t\tstyle=\"width: 250px;\" />\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-xs-4 col-md-offset-4\">\n\t\t\t\t<div class=\"bg-danger\" th:if=\"${param.error}\">Invalid username\n\t\t\t\t\tand password.</div>\n\t\t\t\t\t\n\t\t\t\t<div class=\"bg-danger\" th:if=\"${param.logout}\">You have been\n\t\t\t\t\tlogged out.</div>\n\t\t\t\t\t\n\t\t\t\t<form class=\"form-signin\" th:action=\"@{/login}\" method=\"post\">\n\t\t\t\t\t<h2 class=\"form-signin-heading\">Please sign in</h2>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<label for=\"username\" class=\"sr-only\">Username: </label> \n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" placeholder=\"Username\"\n\t\t\t\t\t\t\tname=\"username\" id=\"username\" required=\"required\"\n\t\t\t\t\t\t\tautofocus=\"autofocus\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<label for=\"password\" class=\"sr-only\">Password</label> \n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"password\" class=\"form-control\" placeholder=\"Password\"\n\t\t\t\t\t\t\tname=\"password\" id=\"password\" required=\"required\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Sign\n\t\t\t\t\t\tIn</button>\n\t\t\t\t</form>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\n</body>\n</html>\n"
  },
  {
    "path": "adminportal/src/main/resources/templates/updateBook.html",
    "content": "\r\n<!DOCTYPE html>\r\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\r\n<head th:replace=\"common/header :: common-header\" />\r\n\r\n<body>\r\n\t<div th:replace=\"common/header :: navbar\" />\r\n\r\n\t<div class=\"container\">\r\n\t\t<div class=\"row\">\r\n\t\t\t<form class=\"form-horizontal\" th:action=\"@{/book/updateBook}\" method=\"post\"\r\n\t\t\t\tenctype=\"multipart/form-data\">\r\n\t\t\t\t<fieldset>\r\n\t\t\t\t\t<legend class=\"center-block\">\r\n\t\t\t\t\t\tUpdate Book Information<span style=\"font-size: small\"> * is a\r\n\t\t\t\t\t\t\trequired field</span>\r\n\t\t\t\t\t</legend>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<input hidden=\"hidden\" name=\"id\" th:value=\"${book.id}\" />\r\n\r\n\r\n\t\t\t\t\t<!-- title -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"title\">* Title</label>\r\n\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"text\" name=\"title\" class=\"form-control\" id=\"title\"\r\n\t\t\t\t\t\t\t\tth:value=\"${book.title}\" required=\"required\" placeholder=\"Title\" />\r\n\t\t\t\t\t\t\t<span class=\"help-block\">Title of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- author -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"author\">*\r\n\t\t\t\t\t\t\tAuthor</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"text\" name=\"author\" class=\"form-control\" id=\"author\"\r\n\t\t\t\t\t\t\t\tth:value=\"${book.author}\" required=\"required\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Author\" /> <span class=\"help-block\">Author\r\n\t\t\t\t\t\t\t\tof the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- publisher -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"publisher\">Publisher</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"text\" name=\"publisher\" class=\"form-control\"\r\n\t\t\t\t\t\t\t\tid=\"publisher\" th:value=\"${book.publisher}\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Publisher\" /> <span class=\"help-block\">Publisher\r\n\t\t\t\t\t\t\t\tof the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- publication date -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"publicationDate\">Publication\r\n\t\t\t\t\t\t\tDate</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"date\" class=\"form-control\" id=\"publicationDate\"\r\n\t\t\t\t\t\t\t\tname=\"publicationDate\" th:value=\"${book.publicationDate}\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"ublication Date\" /> <span class=\"help-block\">Publication\r\n\t\t\t\t\t\t\t\tDate of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- language -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"language\">Language</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<select th:value=\"${book.language}\" id=\"language\" name=\"language\"\r\n\t\t\t\t\t\t\t\tclass=\"form-control\">\r\n\t\t\t\t\t\t\t\t<option value=\"english\">English</option>\r\n\t\t\t\t\t\t\t\t<option value=\"spanish\">Spanish</option>\r\n\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- category -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"category\">*\r\n\t\t\t\t\t\t\tCategory</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<select th:value=\"${book.category}\" id=\"category\" name=\"category\"\r\n\t\t\t\t\t\t\t\tclass=\"form-control\">\r\n\t\t\t\t\t\t\t\t<option value=\"\" selected=\"selected\" disabled=\"disabled\">Please\r\n\t\t\t\t\t\t\t\t\tselect an option...</option>\r\n\t\t\t\t\t\t\t\t<option value=\"Management\"\r\n\t\t\t\t\t\t\t\t\tth:selected=\"(${book.category}=='Management')\">Management</option>\r\n\t\t\t\t\t\t\t\t<option value=\"Fiction\"\r\n\t\t\t\t\t\t\t\t\tth:selected=\"(${book.category}=='Fiction')\">Fiction</option>\r\n\t\t\t\t\t\t\t\t<option value=\"Engineering\"\r\n\t\t\t\t\t\t\t\t\tth:selected=\"(${book.category}=='Engineering')\">Engineering</option>\r\n\t\t\t\t\t\t\t\t<option value=\"Programming\"\r\n\t\t\t\t\t\t\t\t\tth:selected=\"(${book.category}=='Programming')\">Programming</option>\r\n\t\t\t\t\t\t\t\t<option value=\"Arts &amp; Literature\"\r\n\t\t\t\t\t\t\t\t\tth:selected=\"(${book.category}=='Arts &amp; Literature')\">Arts\r\n\t\t\t\t\t\t\t\t\t&amp; Literature</option>\r\n\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- pages -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"pageNumber\">Pages</label>\r\n\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"number\" name=\"numberOfPages\" class=\"form-control\"\r\n\t\t\t\t\t\t\t\tid=\"pageNumber\" th:value=\"${book.numberOfPages}\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Page Number\" /> <span class=\"help-block\">Number\r\n\t\t\t\t\t\t\t\tof pages of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- format -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"format\">Format</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<select th:value=\"${book.format}\" id=\"format\" name=\"format\"\r\n\t\t\t\t\t\t\t\tclass=\"form-control\">\r\n\t\t\t\t\t\t\t\t<option value=\"paperback\">Paperback</option>\r\n\t\t\t\t\t\t\t\t<option value=\"hardcover\">Hardcover</option>\r\n\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- isbn -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"isbn\">ISBN</label>\r\n\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input type=\"text\" name=\"isbn\" class=\"form-control\" id=\"isbn\"\r\n\t\t\t\t\t\t\t\tth:value=\"${book.isbn}\" placeholder=\"ISBN\" /> <span\r\n\t\t\t\t\t\t\t\tclass=\"help-block\">ISBN of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- shipping weight -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"shippingWeight\">Shipping\r\n\t\t\t\t\t\t\tWeight</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<div class=\"input-group\">\r\n\t\t\t\t\t\t\t\t<input th:value=\"${book.shippingWeight}\" type=\"number\" step=\"0.01\"\r\n\t\t\t\t\t\t\t\t\tname=\"shippingWeight\" class=\"form-control\" id=\"shippingWeight\"\r\n\t\t\t\t\t\t\t\t\tplaceholder=\"Shipping Weight\" /> <span\r\n\t\t\t\t\t\t\t\t\tclass=\"input-group-addon\">Ounces</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<span class=\"help-block\">Shipping Weight of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- list price -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"listPrice\">List\r\n\t\t\t\t\t\t\tPrice</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<div class=\"input-group\">\r\n\t\t\t\t\t\t\t\t<span class=\"input-group-addon\">Tk/=</span> <input\r\n\t\t\t\t\t\t\t\t\tth:value=\"${book.listPrice}\" type=\"number\" name=\"listPrice\" step=\"0.01\"\r\n\t\t\t\t\t\t\t\t\tclass=\"form-control\" id=\"listPrice\" placeholder=\"List Price\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<span class=\"help-block\">List price of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- our price -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"ourPrice\">Our\r\n\t\t\t\t\t\t\tPrice</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<div class=\"input-group\">\r\n\t\t\t\t\t\t\t\t<span class=\"input-group-addon\">Tk/=</span> <input\r\n\t\t\t\t\t\t\t\t\tth:value=\"${book.ourPrice}\" type=\"number\" name=\"ourPrice\" step=\"0.01\"\r\n\t\t\t\t\t\t\t\t\tclass=\"form-control\" id=\"ourPrice\" placeholder=\"Our Price\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<span class=\"help-block\">Our price of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- in stock number -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"inStockNumber\">Number\r\n\t\t\t\t\t\t\tin stock</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input th:value=\"${book.inStockNumber}\" type=\"number\"\r\n\t\t\t\t\t\t\t\tname=\"inStockNumber\" class=\"form-control\" id=\"inStockNumber\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Number of in-stock copies\" /> <span\r\n\t\t\t\t\t\t\t\tclass=\"help-block\">Number of in-stock copies</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- status of book -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"status\">Status</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<label><input value=\"true\" type=\"radio\" name=\"active\"\r\n\t\t\t\t\t\t\t\tth:checked=\"${book.active}\" /> Active </label> <label><input\r\n\t\t\t\t\t\t\t\tvalue=\"false\" type=\"radio\" name=\"active\" th:checked=\"${!book.active}\"/>\r\n\t\t\t\t\t\t\t\tInactive </label> <span class=\"help-block\">Whether the book is\r\n\t\t\t\t\t\t\t\tactive or inactive</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- description -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<label class=\"col-md-2 control-label\" for=\"description\">Description</label>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<textarea name=\"description\" rows=\"5\" class=\"form-control\"\r\n\t\t\t\t\t\t\t\tid=\"description\" th:value=\"${book.description}\" th:text=\"${book.description}\"\r\n\t\t\t\t\t\t\t\tplaceholder=\"Description\" /></textarea>\r\n\t\t\t\t\t\t\t<span class=\"help-block\">Description of the book</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<!-- upload image -->\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<div class=\"col-md-2\">\r\n\t\t\t\t\t\t\t<label for=\"bookImage\">Upload book image</label>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<input id=\"bookImage\" type=\"file\" name=\"bookImage\"\r\n\t\t\t\t\t\t\t\tth:value=\"${book.bookImage}\" />\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t<div class=\"col-md-2\"></div>\r\n\t\t\t\t\t\t<div class=\"col-md-8\">\r\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-success\">Update Book</button>\r\n\t\t\t\t\t\t\t<a class=\"btn btn-danger\" th:href=\"@{/book/bookInfo(id=${book.id})}\">Cancel</a>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</fieldset>\r\n\t\t\t</form>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\r\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "adminportal/src/test/java/com/adminportal/AdminportalApplicationTests.java",
    "content": "package com.adminportal;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class AdminportalApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  },
  {
    "path": "bin/.gitignore",
    "content": "target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\nnbproject/private/\nbuild/\nnbbuild/\ndist/\nnbdist/\n.nb-gradle/"
  },
  {
    "path": "bin/.mvn/wrapper/maven-wrapper.properties",
    "content": "distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip\n"
  },
  {
    "path": "bin/mvnw",
    "content": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements.  See the NOTICE file\n# distributed with this work for additional information\n# regarding copyright ownership.  The ASF licenses this file\n# to you under the Apache License, Version 2.0 (the\n# \"License\"); you may not use this file except in compliance\n# with the License.  You may obtain a copy of the License at\n#\n#    http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing,\n# software distributed under the License is distributed on an\n# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n# KIND, either express or implied.  See the License for the\n# specific language governing permissions and limitations\n# under the License.\n# ----------------------------------------------------------------------------\n\n# ----------------------------------------------------------------------------\n# Maven2 Start Up Batch script\n#\n# Required ENV vars:\n# ------------------\n#   JAVA_HOME - location of a JDK home dir\n#\n# Optional ENV vars\n# -----------------\n#   M2_HOME - location of maven2's installed home dir\n#   MAVEN_OPTS - parameters passed to the Java VM when running Maven\n#     e.g. to debug Maven itself, use\n#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000\n#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files\n# ----------------------------------------------------------------------------\n\nif [ -z \"$MAVEN_SKIP_RC\" ] ; then\n\n  if [ -f /etc/mavenrc ] ; then\n    . /etc/mavenrc\n  fi\n\n  if [ -f \"$HOME/.mavenrc\" ] ; then\n    . \"$HOME/.mavenrc\"\n  fi\n\nfi\n\n# OS specific support.  $var _must_ be set to either true or false.\ncygwin=false;\ndarwin=false;\nmingw=false\ncase \"`uname`\" in\n  CYGWIN*) cygwin=true ;;\n  MINGW*) mingw=true;;\n  Darwin*) darwin=true\n           #\n           # Look for the Apple JDKs first to preserve the existing behaviour, and then look\n           # for the new JDKs provided by Oracle.\n           #\n           if [ -z \"$JAVA_HOME\" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then\n             #\n             # Apple JDKs\n             #\n             export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home\n           fi\n\n           if [ -z \"$JAVA_HOME\" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then\n             #\n             # Apple JDKs\n             #\n             export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home\n           fi\n\n           if [ -z \"$JAVA_HOME\" ] && [ -L \"/Library/Java/JavaVirtualMachines/CurrentJDK\" ] ; then\n             #\n             # Oracle JDKs\n             #\n             export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home\n           fi\n\n           if [ -z \"$JAVA_HOME\" ] && [ -x \"/usr/libexec/java_home\" ]; then\n             #\n             # Apple JDKs\n             #\n             export JAVA_HOME=`/usr/libexec/java_home`\n           fi\n           ;;\nesac\n\nif [ -z \"$JAVA_HOME\" ] ; then\n  if [ -r /etc/gentoo-release ] ; then\n    JAVA_HOME=`java-config --jre-home`\n  fi\nfi\n\nif [ -z \"$M2_HOME\" ] ; then\n  ## resolve links - $0 may be a link to maven's home\n  PRG=\"$0\"\n\n  # need this for relative symlinks\n  while [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n      PRG=\"$link\"\n    else\n      PRG=\"`dirname \"$PRG\"`/$link\"\n    fi\n  done\n\n  saveddir=`pwd`\n\n  M2_HOME=`dirname \"$PRG\"`/..\n\n  # make it fully qualified\n  M2_HOME=`cd \"$M2_HOME\" && pwd`\n\n  cd \"$saveddir\"\n  # echo Using m2 at $M2_HOME\nfi\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched\nif $cygwin ; then\n  [ -n \"$M2_HOME\" ] &&\n    M2_HOME=`cygpath --unix \"$M2_HOME\"`\n  [ -n \"$JAVA_HOME\" ] &&\n    JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\n  [ -n \"$CLASSPATH\" ] &&\n    CLASSPATH=`cygpath --path --unix \"$CLASSPATH\"`\nfi\n\n# For Migwn, ensure paths are in UNIX format before anything is touched\nif $mingw ; then\n  [ -n \"$M2_HOME\" ] &&\n    M2_HOME=\"`(cd \"$M2_HOME\"; pwd)`\"\n  [ -n \"$JAVA_HOME\" ] &&\n    JAVA_HOME=\"`(cd \"$JAVA_HOME\"; pwd)`\"\n  # TODO classpath?\nfi\n\nif [ -z \"$JAVA_HOME\" ]; then\n  javaExecutable=\"`which javac`\"\n  if [ -n \"$javaExecutable\" ] && ! [ \"`expr \\\"$javaExecutable\\\" : '\\([^ ]*\\)'`\" = \"no\" ]; then\n    # readlink(1) is not available as standard on Solaris 10.\n    readLink=`which readlink`\n    if [ ! `expr \"$readLink\" : '\\([^ ]*\\)'` = \"no\" ]; then\n      if $darwin ; then\n        javaHome=\"`dirname \\\"$javaExecutable\\\"`\"\n        javaExecutable=\"`cd \\\"$javaHome\\\" && pwd -P`/javac\"\n      else\n        javaExecutable=\"`readlink -f \\\"$javaExecutable\\\"`\"\n      fi\n      javaHome=\"`dirname \\\"$javaExecutable\\\"`\"\n      javaHome=`expr \"$javaHome\" : '\\(.*\\)/bin'`\n      JAVA_HOME=\"$javaHome\"\n      export JAVA_HOME\n    fi\n  fi\nfi\n\nif [ -z \"$JAVACMD\" ] ; then\n  if [ -n \"$JAVA_HOME\"  ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n      # IBM's JDK on AIX uses strange locations for the executables\n      JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n      JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n  else\n    JAVACMD=\"`which java`\"\n  fi\nfi\n\nif [ ! -x \"$JAVACMD\" ] ; then\n  echo \"Error: JAVA_HOME is not defined correctly.\" >&2\n  echo \"  We cannot execute $JAVACMD\" >&2\n  exit 1\nfi\n\nif [ -z \"$JAVA_HOME\" ] ; then\n  echo \"Warning: JAVA_HOME environment variable is not set.\"\nfi\n\nCLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin; then\n  [ -n \"$M2_HOME\" ] &&\n    M2_HOME=`cygpath --path --windows \"$M2_HOME\"`\n  [ -n \"$JAVA_HOME\" ] &&\n    JAVA_HOME=`cygpath --path --windows \"$JAVA_HOME\"`\n  [ -n \"$CLASSPATH\" ] &&\n    CLASSPATH=`cygpath --path --windows \"$CLASSPATH\"`\nfi\n\n# traverses directory structure from process work directory to filesystem root\n# first directory with .mvn subdirectory is considered project base directory\nfind_maven_basedir() {\n  local basedir=$(pwd)\n  local wdir=$(pwd)\n  while [ \"$wdir\" != '/' ] ; do\n    if [ -d \"$wdir\"/.mvn ] ; then\n      basedir=$wdir\n      break\n    fi\n    wdir=$(cd \"$wdir/..\"; pwd)\n  done\n  echo \"${basedir}\"\n}\n\n# concatenates all lines of a file\nconcat_lines() {\n  if [ -f \"$1\" ]; then\n    echo \"$(tr -s '\\n' ' ' < \"$1\")\"\n  fi\n}\n\nexport MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}\nMAVEN_OPTS=\"$(concat_lines \"$MAVEN_PROJECTBASEDIR/.mvn/jvm.config\") $MAVEN_OPTS\"\n\n# Provide a \"standardized\" way to retrieve the CLI args that will\n# work with both Windows and non-Windows executions.\nMAVEN_CMD_LINE_ARGS=\"$MAVEN_CONFIG $@\"\nexport MAVEN_CMD_LINE_ARGS\n\nWRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain\n\nexec \"$JAVACMD\" \\\n  $MAVEN_OPTS \\\n  -classpath \"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar\" \\\n  \"-Dmaven.home=${M2_HOME}\" \"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}\" \\\n  ${WRAPPER_LAUNCHER} \"$@\"\n"
  },
  {
    "path": "bin/mvnw.cmd",
    "content": "@REM ----------------------------------------------------------------------------\n@REM Licensed to the Apache Software Foundation (ASF) under one\n@REM or more contributor license agreements.  See the NOTICE file\n@REM distributed with this work for additional information\n@REM regarding copyright ownership.  The ASF licenses this file\n@REM to you under the Apache License, Version 2.0 (the\n@REM \"License\"); you may not use this file except in compliance\n@REM with the License.  You may obtain a copy of the License at\n@REM\n@REM    http://www.apache.org/licenses/LICENSE-2.0\n@REM\n@REM Unless required by applicable law or agreed to in writing,\n@REM software distributed under the License is distributed on an\n@REM \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n@REM KIND, either express or implied.  See the License for the\n@REM specific language governing permissions and limitations\n@REM under the License.\n@REM ----------------------------------------------------------------------------\n\n@REM ----------------------------------------------------------------------------\n@REM Maven2 Start Up Batch script\n@REM\n@REM Required ENV vars:\n@REM JAVA_HOME - location of a JDK home dir\n@REM\n@REM Optional ENV vars\n@REM M2_HOME - location of maven2's installed home dir\n@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands\n@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending\n@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven\n@REM     e.g. to debug Maven itself, use\n@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000\n@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files\n@REM ----------------------------------------------------------------------------\n\n@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'\n@echo off\n@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'\n@if \"%MAVEN_BATCH_ECHO%\" == \"on\"  echo %MAVEN_BATCH_ECHO%\n\n@REM set %HOME% to equivalent of $HOME\nif \"%HOME%\" == \"\" (set \"HOME=%HOMEDRIVE%%HOMEPATH%\")\n\n@REM Execute a user defined script before this one\nif not \"%MAVEN_SKIP_RC%\" == \"\" goto skipRcPre\n@REM check for pre script, once with legacy .bat ending and once with .cmd ending\nif exist \"%HOME%\\mavenrc_pre.bat\" call \"%HOME%\\mavenrc_pre.bat\"\nif exist \"%HOME%\\mavenrc_pre.cmd\" call \"%HOME%\\mavenrc_pre.cmd\"\n:skipRcPre\n\n@setlocal\n\nset ERROR_CODE=0\n\n@REM To isolate internal variables from possible post scripts, we use another setlocal\n@setlocal\n\n@REM ==== START VALIDATION ====\nif not \"%JAVA_HOME%\" == \"\" goto OkJHome\n\necho.\necho Error: JAVA_HOME not found in your environment. >&2\necho Please set the JAVA_HOME variable in your environment to match the >&2\necho location of your Java installation. >&2\necho.\ngoto error\n\n:OkJHome\nif exist \"%JAVA_HOME%\\bin\\java.exe\" goto init\n\necho.\necho Error: JAVA_HOME is set to an invalid directory. >&2\necho JAVA_HOME = \"%JAVA_HOME%\" >&2\necho Please set the JAVA_HOME variable in your environment to match the >&2\necho location of your Java installation. >&2\necho.\ngoto error\n\n@REM ==== END VALIDATION ====\n\n:init\n\nset MAVEN_CMD_LINE_ARGS=%*\n\n@REM Find the project base dir, i.e. the directory that contains the folder \".mvn\".\n@REM Fallback to current working directory if not found.\n\nset MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%\nIF NOT \"%MAVEN_PROJECTBASEDIR%\"==\"\" goto endDetectBaseDir\n\nset EXEC_DIR=%CD%\nset WDIR=%EXEC_DIR%\n:findBaseDir\nIF EXIST \"%WDIR%\"\\.mvn goto baseDirFound\ncd ..\nIF \"%WDIR%\"==\"%CD%\" goto baseDirNotFound\nset WDIR=%CD%\ngoto findBaseDir\n\n:baseDirFound\nset MAVEN_PROJECTBASEDIR=%WDIR%\ncd \"%EXEC_DIR%\"\ngoto endDetectBaseDir\n\n:baseDirNotFound\nset MAVEN_PROJECTBASEDIR=%EXEC_DIR%\ncd \"%EXEC_DIR%\"\n\n:endDetectBaseDir\n\nIF NOT EXIST \"%MAVEN_PROJECTBASEDIR%\\.mvn\\jvm.config\" goto endReadAdditionalConfig\n\n@setlocal EnableExtensions EnableDelayedExpansion\nfor /F \"usebackq delims=\" %%a in (\"%MAVEN_PROJECTBASEDIR%\\.mvn\\jvm.config\") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a\n@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%\n\n:endReadAdditionalConfig\n\nSET MAVEN_JAVA_EXE=\"%JAVA_HOME%\\bin\\java.exe\"\n\nset WRAPPER_JAR=\"\".\\.mvn\\wrapper\\maven-wrapper.jar\"\"\nset WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain\n\n%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% \"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%\" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS%\nif ERRORLEVEL 1 goto error\ngoto end\n\n:error\nset ERROR_CODE=1\n\n:end\n@endlocal & set ERROR_CODE=%ERROR_CODE%\n\nif not \"%MAVEN_SKIP_RC%\" == \"\" goto skipRcPost\n@REM check for post script, once with legacy .bat ending and once with .cmd ending\nif exist \"%HOME%\\mavenrc_post.bat\" call \"%HOME%\\mavenrc_post.bat\"\nif exist \"%HOME%\\mavenrc_post.cmd\" call \"%HOME%\\mavenrc_post.cmd\"\n:skipRcPost\n\n@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'\nif \"%MAVEN_BATCH_PAUSE%\" == \"on\" pause\n\nif \"%MAVEN_TERMINATE_CMD%\" == \"on\" exit %ERROR_CODE%\n\nexit /B %ERROR_CODE%"
  },
  {
    "path": "bin/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.bookstore</groupId>\n\t<artifactId>bookstore</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>Bookstore</name>\n\t<description>frontend part for our bookstore project</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>1.4.3.RELEASE</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\n</project>\n"
  },
  {
    "path": "bin/src/main/resources/application.properties",
    "content": ""
  },
  {
    "path": "mvnw",
    "content": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements.  See the NOTICE file\n# distributed with this work for additional information\n# regarding copyright ownership.  The ASF licenses this file\n# to you under the Apache License, Version 2.0 (the\n# \"License\"); you may not use this file except in compliance\n# with the License.  You may obtain a copy of the License at\n#\n#    http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing,\n# software distributed under the License is distributed on an\n# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n# KIND, either express or implied.  See the License for the\n# specific language governing permissions and limitations\n# under the License.\n# ----------------------------------------------------------------------------\n\n# ----------------------------------------------------------------------------\n# Maven2 Start Up Batch script\n#\n# Required ENV vars:\n# ------------------\n#   JAVA_HOME - location of a JDK home dir\n#\n# Optional ENV vars\n# -----------------\n#   M2_HOME - location of maven2's installed home dir\n#   MAVEN_OPTS - parameters passed to the Java VM when running Maven\n#     e.g. to debug Maven itself, use\n#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000\n#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files\n# ----------------------------------------------------------------------------\n\nif [ -z \"$MAVEN_SKIP_RC\" ] ; then\n\n  if [ -f /etc/mavenrc ] ; then\n    . /etc/mavenrc\n  fi\n\n  if [ -f \"$HOME/.mavenrc\" ] ; then\n    . \"$HOME/.mavenrc\"\n  fi\n\nfi\n\n# OS specific support.  $var _must_ be set to either true or false.\ncygwin=false;\ndarwin=false;\nmingw=false\ncase \"`uname`\" in\n  CYGWIN*) cygwin=true ;;\n  MINGW*) mingw=true;;\n  Darwin*) darwin=true\n           #\n           # Look for the Apple JDKs first to preserve the existing behaviour, and then look\n           # for the new JDKs provided by Oracle.\n           #\n           if [ -z \"$JAVA_HOME\" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then\n             #\n             # Apple JDKs\n             #\n             export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home\n           fi\n\n           if [ -z \"$JAVA_HOME\" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then\n             #\n             # Apple JDKs\n             #\n             export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home\n           fi\n\n           if [ -z \"$JAVA_HOME\" ] && [ -L \"/Library/Java/JavaVirtualMachines/CurrentJDK\" ] ; then\n             #\n             # Oracle JDKs\n             #\n             export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home\n           fi\n\n           if [ -z \"$JAVA_HOME\" ] && [ -x \"/usr/libexec/java_home\" ]; then\n             #\n             # Apple JDKs\n             #\n             export JAVA_HOME=`/usr/libexec/java_home`\n           fi\n           ;;\nesac\n\nif [ -z \"$JAVA_HOME\" ] ; then\n  if [ -r /etc/gentoo-release ] ; then\n    JAVA_HOME=`java-config --jre-home`\n  fi\nfi\n\nif [ -z \"$M2_HOME\" ] ; then\n  ## resolve links - $0 may be a link to maven's home\n  PRG=\"$0\"\n\n  # need this for relative symlinks\n  while [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n      PRG=\"$link\"\n    else\n      PRG=\"`dirname \"$PRG\"`/$link\"\n    fi\n  done\n\n  saveddir=`pwd`\n\n  M2_HOME=`dirname \"$PRG\"`/..\n\n  # make it fully qualified\n  M2_HOME=`cd \"$M2_HOME\" && pwd`\n\n  cd \"$saveddir\"\n  # echo Using m2 at $M2_HOME\nfi\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched\nif $cygwin ; then\n  [ -n \"$M2_HOME\" ] &&\n    M2_HOME=`cygpath --unix \"$M2_HOME\"`\n  [ -n \"$JAVA_HOME\" ] &&\n    JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\n  [ -n \"$CLASSPATH\" ] &&\n    CLASSPATH=`cygpath --path --unix \"$CLASSPATH\"`\nfi\n\n# For Migwn, ensure paths are in UNIX format before anything is touched\nif $mingw ; then\n  [ -n \"$M2_HOME\" ] &&\n    M2_HOME=\"`(cd \"$M2_HOME\"; pwd)`\"\n  [ -n \"$JAVA_HOME\" ] &&\n    JAVA_HOME=\"`(cd \"$JAVA_HOME\"; pwd)`\"\n  # TODO classpath?\nfi\n\nif [ -z \"$JAVA_HOME\" ]; then\n  javaExecutable=\"`which javac`\"\n  if [ -n \"$javaExecutable\" ] && ! [ \"`expr \\\"$javaExecutable\\\" : '\\([^ ]*\\)'`\" = \"no\" ]; then\n    # readlink(1) is not available as standard on Solaris 10.\n    readLink=`which readlink`\n    if [ ! `expr \"$readLink\" : '\\([^ ]*\\)'` = \"no\" ]; then\n      if $darwin ; then\n        javaHome=\"`dirname \\\"$javaExecutable\\\"`\"\n        javaExecutable=\"`cd \\\"$javaHome\\\" && pwd -P`/javac\"\n      else\n        javaExecutable=\"`readlink -f \\\"$javaExecutable\\\"`\"\n      fi\n      javaHome=\"`dirname \\\"$javaExecutable\\\"`\"\n      javaHome=`expr \"$javaHome\" : '\\(.*\\)/bin'`\n      JAVA_HOME=\"$javaHome\"\n      export JAVA_HOME\n    fi\n  fi\nfi\n\nif [ -z \"$JAVACMD\" ] ; then\n  if [ -n \"$JAVA_HOME\"  ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n      # IBM's JDK on AIX uses strange locations for the executables\n      JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n      JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n  else\n    JAVACMD=\"`which java`\"\n  fi\nfi\n\nif [ ! -x \"$JAVACMD\" ] ; then\n  echo \"Error: JAVA_HOME is not defined correctly.\" >&2\n  echo \"  We cannot execute $JAVACMD\" >&2\n  exit 1\nfi\n\nif [ -z \"$JAVA_HOME\" ] ; then\n  echo \"Warning: JAVA_HOME environment variable is not set.\"\nfi\n\nCLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin; then\n  [ -n \"$M2_HOME\" ] &&\n    M2_HOME=`cygpath --path --windows \"$M2_HOME\"`\n  [ -n \"$JAVA_HOME\" ] &&\n    JAVA_HOME=`cygpath --path --windows \"$JAVA_HOME\"`\n  [ -n \"$CLASSPATH\" ] &&\n    CLASSPATH=`cygpath --path --windows \"$CLASSPATH\"`\nfi\n\n# traverses directory structure from process work directory to filesystem root\n# first directory with .mvn subdirectory is considered project base directory\nfind_maven_basedir() {\n  local basedir=$(pwd)\n  local wdir=$(pwd)\n  while [ \"$wdir\" != '/' ] ; do\n    if [ -d \"$wdir\"/.mvn ] ; then\n      basedir=$wdir\n      break\n    fi\n    wdir=$(cd \"$wdir/..\"; pwd)\n  done\n  echo \"${basedir}\"\n}\n\n# concatenates all lines of a file\nconcat_lines() {\n  if [ -f \"$1\" ]; then\n    echo \"$(tr -s '\\n' ' ' < \"$1\")\"\n  fi\n}\n\nexport MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}\nMAVEN_OPTS=\"$(concat_lines \"$MAVEN_PROJECTBASEDIR/.mvn/jvm.config\") $MAVEN_OPTS\"\n\n# Provide a \"standardized\" way to retrieve the CLI args that will\n# work with both Windows and non-Windows executions.\nMAVEN_CMD_LINE_ARGS=\"$MAVEN_CONFIG $@\"\nexport MAVEN_CMD_LINE_ARGS\n\nWRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain\n\nexec \"$JAVACMD\" \\\n  $MAVEN_OPTS \\\n  -classpath \"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar\" \\\n  \"-Dmaven.home=${M2_HOME}\" \"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}\" \\\n  ${WRAPPER_LAUNCHER} \"$@\"\n"
  },
  {
    "path": "mvnw.cmd",
    "content": "@REM ----------------------------------------------------------------------------\n@REM Licensed to the Apache Software Foundation (ASF) under one\n@REM or more contributor license agreements.  See the NOTICE file\n@REM distributed with this work for additional information\n@REM regarding copyright ownership.  The ASF licenses this file\n@REM to you under the Apache License, Version 2.0 (the\n@REM \"License\"); you may not use this file except in compliance\n@REM with the License.  You may obtain a copy of the License at\n@REM\n@REM    http://www.apache.org/licenses/LICENSE-2.0\n@REM\n@REM Unless required by applicable law or agreed to in writing,\n@REM software distributed under the License is distributed on an\n@REM \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n@REM KIND, either express or implied.  See the License for the\n@REM specific language governing permissions and limitations\n@REM under the License.\n@REM ----------------------------------------------------------------------------\n\n@REM ----------------------------------------------------------------------------\n@REM Maven2 Start Up Batch script\n@REM\n@REM Required ENV vars:\n@REM JAVA_HOME - location of a JDK home dir\n@REM\n@REM Optional ENV vars\n@REM M2_HOME - location of maven2's installed home dir\n@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands\n@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending\n@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven\n@REM     e.g. to debug Maven itself, use\n@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000\n@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files\n@REM ----------------------------------------------------------------------------\n\n@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'\n@echo off\n@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'\n@if \"%MAVEN_BATCH_ECHO%\" == \"on\"  echo %MAVEN_BATCH_ECHO%\n\n@REM set %HOME% to equivalent of $HOME\nif \"%HOME%\" == \"\" (set \"HOME=%HOMEDRIVE%%HOMEPATH%\")\n\n@REM Execute a user defined script before this one\nif not \"%MAVEN_SKIP_RC%\" == \"\" goto skipRcPre\n@REM check for pre script, once with legacy .bat ending and once with .cmd ending\nif exist \"%HOME%\\mavenrc_pre.bat\" call \"%HOME%\\mavenrc_pre.bat\"\nif exist \"%HOME%\\mavenrc_pre.cmd\" call \"%HOME%\\mavenrc_pre.cmd\"\n:skipRcPre\n\n@setlocal\n\nset ERROR_CODE=0\n\n@REM To isolate internal variables from possible post scripts, we use another setlocal\n@setlocal\n\n@REM ==== START VALIDATION ====\nif not \"%JAVA_HOME%\" == \"\" goto OkJHome\n\necho.\necho Error: JAVA_HOME not found in your environment. >&2\necho Please set the JAVA_HOME variable in your environment to match the >&2\necho location of your Java installation. >&2\necho.\ngoto error\n\n:OkJHome\nif exist \"%JAVA_HOME%\\bin\\java.exe\" goto init\n\necho.\necho Error: JAVA_HOME is set to an invalid directory. >&2\necho JAVA_HOME = \"%JAVA_HOME%\" >&2\necho Please set the JAVA_HOME variable in your environment to match the >&2\necho location of your Java installation. >&2\necho.\ngoto error\n\n@REM ==== END VALIDATION ====\n\n:init\n\nset MAVEN_CMD_LINE_ARGS=%*\n\n@REM Find the project base dir, i.e. the directory that contains the folder \".mvn\".\n@REM Fallback to current working directory if not found.\n\nset MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%\nIF NOT \"%MAVEN_PROJECTBASEDIR%\"==\"\" goto endDetectBaseDir\n\nset EXEC_DIR=%CD%\nset WDIR=%EXEC_DIR%\n:findBaseDir\nIF EXIST \"%WDIR%\"\\.mvn goto baseDirFound\ncd ..\nIF \"%WDIR%\"==\"%CD%\" goto baseDirNotFound\nset WDIR=%CD%\ngoto findBaseDir\n\n:baseDirFound\nset MAVEN_PROJECTBASEDIR=%WDIR%\ncd \"%EXEC_DIR%\"\ngoto endDetectBaseDir\n\n:baseDirNotFound\nset MAVEN_PROJECTBASEDIR=%EXEC_DIR%\ncd \"%EXEC_DIR%\"\n\n:endDetectBaseDir\n\nIF NOT EXIST \"%MAVEN_PROJECTBASEDIR%\\.mvn\\jvm.config\" goto endReadAdditionalConfig\n\n@setlocal EnableExtensions EnableDelayedExpansion\nfor /F \"usebackq delims=\" %%a in (\"%MAVEN_PROJECTBASEDIR%\\.mvn\\jvm.config\") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a\n@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%\n\n:endReadAdditionalConfig\n\nSET MAVEN_JAVA_EXE=\"%JAVA_HOME%\\bin\\java.exe\"\n\nset WRAPPER_JAR=\"\".\\.mvn\\wrapper\\maven-wrapper.jar\"\"\nset WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain\n\n%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% \"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%\" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS%\nif ERRORLEVEL 1 goto error\ngoto end\n\n:error\nset ERROR_CODE=1\n\n:end\n@endlocal & set ERROR_CODE=%ERROR_CODE%\n\nif not \"%MAVEN_SKIP_RC%\" == \"\" goto skipRcPost\n@REM check for post script, once with legacy .bat ending and once with .cmd ending\nif exist \"%HOME%\\mavenrc_post.bat\" call \"%HOME%\\mavenrc_post.bat\"\nif exist \"%HOME%\\mavenrc_post.cmd\" call \"%HOME%\\mavenrc_post.cmd\"\n:skipRcPost\n\n@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'\nif \"%MAVEN_BATCH_PAUSE%\" == \"on\" pause\n\nif \"%MAVEN_TERMINATE_CMD%\" == \"on\" exit %ERROR_CODE%\n\nexit /B %ERROR_CODE%"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>com.bookstore</groupId>\n\t<artifactId>bookstore</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<packaging>jar</packaging>\n\n\t<name>eCommerce</name>\n\t<description>frontend part </description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.3.1</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>21</java.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-thymeleaf</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-jdbc</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-security</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-mail</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.mysql</groupId>\n\t\t\t<artifactId>mysql-connector-j</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.thymeleaf.extras</groupId>\n\t\t\t<artifactId>thymeleaf-extras-springsecurity6</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.testcontainers</groupId>\n\t\t\t<artifactId>junit-jupiter</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.testcontainers</groupId>\n\t\t\t<artifactId>mysql</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\n</project>\n"
  },
  {
    "path": "src/main/java/com/eCommerce/ECommerceApplication.java",
    "content": "package com.eCommerce;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n\n@SpringBootApplication\npublic class ECommerceApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ECommerceApplication.class, args);\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/com/eCommerce/config/SecurityConfig.java",
    "content": "package com.eCommerce.config;\r\n\r\nimport com.eCommerce.service.impl.UserSecurityService;\r\nimport com.eCommerce.utility.SecurityUtility;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.context.annotation.Bean;\r\nimport org.springframework.context.annotation.Configuration;\r\nimport org.springframework.core.env.Environment;\r\nimport org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;\r\nimport org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;\r\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\r\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\r\nimport org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;\r\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\r\nimport org.springframework.security.web.SecurityFilterChain;\r\nimport org.springframework.security.web.util.matcher.AntPathRequestMatcher;\r\n\r\n\r\n@Configuration\r\n@EnableWebSecurity\r\n@EnableMethodSecurity\r\npublic class SecurityConfig {\r\n\t@Autowired\r\n\tprivate Environment env;\r\n\r\n\t@Autowired\r\n\tprivate UserSecurityService userSecurityService;\r\n\r\n\tprivate BCryptPasswordEncoder passwordEncoder() {\r\n\t\treturn SecurityUtility.passwordEncoder();\r\n\t}\r\n\r\n\tprivate static final String[] PUBLIC_MATCHERS = {\r\n\t\t\t\"/css/**\",\r\n\t\t\t\"/js/**\",\r\n\t\t\t\"/image/**\",\r\n\t\t\t\"/\",\r\n\t\t\t\"/newUser\",\r\n\t\t\t\"/forgetPassword\",\r\n\t\t\t\"/login\",\r\n\t\t\t\"/fonts/**\",\r\n\t\t\t\"/bookshelf\",\r\n\t\t\t\"/bookDetail\",\r\n\t\t\t\"/faq\",\r\n\t\t\t\"/searchByCategory\",\r\n\t\t\t\"/searchBook\"\r\n\t};\r\n\r\n\t@Bean\r\n\tpublic SecurityFilterChain configure(HttpSecurity http) throws Exception {\r\n\t\thttp\r\n\t\t\t\t.cors(AbstractHttpConfigurer::disable)\r\n\t\t\t\t.csrf(AbstractHttpConfigurer::disable)\r\n\t\t\t\t.authorizeHttpRequests(authz -> authz\r\n\t\t\t\t\t\t.requestMatchers(PUBLIC_MATCHERS).permitAll().anyRequest().authenticated()\r\n\t\t\t\t)\r\n\t\t\t\t.formLogin(formLogin -> formLogin\r\n\t\t\t\t\t\t.loginPage(\"/login\")\r\n\t\t\t\t\t\t.defaultSuccessUrl(\"/\", true)\r\n\t\t\t\t\t\t.failureUrl(\"/login?error\")\r\n\t\t\t\t)\r\n\t\t\t\t.logout(logout -> logout\r\n\t\t\t\t\t\t.logoutRequestMatcher(new AntPathRequestMatcher(\"/logout\"))\r\n\t\t\t\t\t\t.logoutSuccessUrl(\"/?logout\").deleteCookies(\"remember-me\").permitAll()\r\n\t\t\t\t);\r\n\t\treturn http.build();\r\n\t}\r\n\r\n\t@Autowired\r\n\tpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {\r\n\t\tauth.userDetailsService(userSecurityService).passwordEncoder(passwordEncoder());\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/controller/CheckoutController.java",
    "content": "package com.eCommerce.controller;\r\n\r\nimport java.security.Principal;\r\nimport java.time.LocalDate;\r\nimport java.util.Collections;\r\nimport java.util.List;\r\nimport java.util.Locale;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.mail.javamail.JavaMailSender;\r\nimport org.springframework.stereotype.Controller;\r\nimport org.springframework.ui.Model;\r\nimport org.springframework.web.bind.annotation.ModelAttribute;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\nimport org.springframework.web.bind.annotation.RequestMethod;\r\nimport org.springframework.web.bind.annotation.RequestParam;\r\n\r\nimport com.eCommerce.domain.BillingAddress;\r\nimport com.eCommerce.domain.CartItem;\r\nimport com.eCommerce.domain.Order;\r\nimport com.eCommerce.domain.Payment;\r\nimport com.eCommerce.domain.ShippingAddress;\r\nimport com.eCommerce.domain.ShoppingCart;\r\nimport com.eCommerce.domain.User;\r\nimport com.eCommerce.domain.UserBilling;\r\nimport com.eCommerce.domain.UserPayment;\r\nimport com.eCommerce.domain.UserShipping;\r\nimport com.eCommerce.service.BillingAddressService;\r\nimport com.eCommerce.service.CartItemService;\r\nimport com.eCommerce.service.OrderService;\r\nimport com.eCommerce.service.PaymentService;\r\nimport com.eCommerce.service.ShippingAddressService;\r\nimport com.eCommerce.service.ShoppingCartService;\r\nimport com.eCommerce.service.UserPaymentService;\r\nimport com.eCommerce.service.UserService;\r\nimport com.eCommerce.service.UserShippingService;\r\nimport com.eCommerce.utility.MailConstructor;\r\nimport com.eCommerce.utility.USConstants;\r\n\r\n\r\n@Controller\r\npublic class CheckoutController {\r\n\r\n\tprivate ShippingAddress shippingAddress = new ShippingAddress();\r\n\tprivate BillingAddress billingAddress = new BillingAddress();\r\n\tprivate Payment payment = new Payment();\r\n\t\r\n\t@Autowired\r\n\tprivate JavaMailSender mailSender;\r\n\t\r\n\t@Autowired\r\n\tprivate MailConstructor mailConstructor;\r\n\t\r\n\t@Autowired\r\n\tprivate UserService userService;\r\n\t\r\n\t@Autowired\r\n\tprivate CartItemService cartItemService;\r\n\t\r\n\t@Autowired\r\n\tprivate ShoppingCartService shoppingCartService;\r\n\t\r\n\t@Autowired\r\n\tprivate ShippingAddressService shippingAddressService;\r\n\t\r\n\t@Autowired\r\n\tprivate BillingAddressService billingAddressService;\r\n\t\r\n\t@Autowired\r\n\tprivate PaymentService paymentService;\r\n\t\r\n\t@Autowired\r\n\tprivate UserShippingService userShippingService;\r\n\t\r\n\t@Autowired\r\n\tprivate UserPaymentService userPaymentService;\r\n\t\r\n\t@Autowired\r\n\tprivate OrderService orderService;\r\n\t\r\n\t@RequestMapping(\"/checkout\")\r\n\tpublic String checkout(\r\n\t\t\t@RequestParam(\"id\") Long cartId,\r\n\t\t\t@RequestParam(value=\"missingRequiredField\", required=false) boolean missingRequiredField,\r\n\t\t\tModel model, Principal principal\r\n\t\t\t){\r\n\t\tUser user = userService.findByUsername(principal.getName());\r\n\t\t\r\n\t\tif(cartId != user.getShoppingCart().getId()) {\r\n\t\t\treturn \"badRequestPage\";\r\n\t\t}\r\n\t\t\r\n\t\tList<CartItem> cartItemList = cartItemService.findByShoppingCart(user.getShoppingCart());\r\n\t\t\r\n\t\tif(cartItemList.size() == 0) {\r\n\t\t\tmodel.addAttribute(\"emptyCart\", true);\r\n\t\t\treturn \"forward:/shoppintCart/cart\";\r\n\t\t}\r\n\t\t\r\n\t\tfor (CartItem cartItem : cartItemList) {\r\n\t\t\tif(cartItem.getBook().getInStockNumber() < cartItem.getQty()) {\r\n\t\t\t\tmodel.addAttribute(\"notEnoughStock\", true);\r\n\t\t\t\treturn \"forward:/shoppingCart/cart\";\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tList<UserShipping> userShippingList = user.getUserShippingList();\r\n\t\tList<UserPayment> userPaymentList = user.getUserPaymentList();\r\n\t\t\r\n\t\tmodel.addAttribute(\"userShippingList\", userShippingList);\r\n\t\tmodel.addAttribute(\"userPaymentList\", userPaymentList);\r\n\t\t\r\n\t\tif (userPaymentList.size() == 0) {\r\n\t\t\tmodel.addAttribute(\"emptyPaymentList\", true);\r\n\t\t} else {\r\n\t\t\tmodel.addAttribute(\"emptyPaymentList\", false);\r\n\t\t}\r\n\t\t\r\n\t\tif (userShippingList.size() == 0) {\r\n\t\t\tmodel.addAttribute(\"emptyShippingList\", true);\r\n\t\t} else {\r\n\t\t\tmodel.addAttribute(\"emptyShippingList\", false);\r\n\t\t}\r\n\t\t\r\n\t\tShoppingCart shoppingCart = user.getShoppingCart();\r\n\t\t\r\n\t\tfor(UserShipping userShipping : userShippingList) {\r\n\t\t\tif(userShipping.isUserShippingDefault()) {\r\n\t\t\t\tshippingAddressService.setByUserShipping(userShipping, shippingAddress);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tfor (UserPayment userPayment : userPaymentList) {\r\n\t\t\tif(userPayment.isDefaultPayment()) {\r\n\t\t\t\tpaymentService.setByUserPayment(userPayment, payment);\r\n\t\t\t\tbillingAddressService.setByUserBilling(userPayment.getUserBilling(), billingAddress);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tmodel.addAttribute(\"shippingAddress\", shippingAddress);\r\n\t\tmodel.addAttribute(\"payment\", payment);\r\n\t\tmodel.addAttribute(\"billingAddress\", billingAddress);\r\n\t\tmodel.addAttribute(\"cartItemList\", cartItemList);\r\n\t\tmodel.addAttribute(\"shoppingCart\", user.getShoppingCart());\r\n\t\t\r\n\t\tList<String> stateList = USConstants.listOfUSStatesCode;\r\n\t\tCollections.sort(stateList);\r\n\t\tmodel.addAttribute(\"stateList\", stateList);\r\n\t\t\r\n\t\tmodel.addAttribute(\"classActiveShipping\", true);\r\n\t\t\r\n\t\tif(missingRequiredField) {\r\n\t\t\tmodel.addAttribute(\"missingRequiredField\", true);\r\n\t\t}\r\n\t\t\r\n\t\treturn \"checkout\";\r\n\t\t\r\n\t}\r\n\t\r\n\t@RequestMapping(value = \"/checkout\", method = RequestMethod.POST)\r\n\tpublic String checkoutPost(@ModelAttribute(\"shippingAddress\") ShippingAddress shippingAddress,\r\n\t\t\t@ModelAttribute(\"billingAddress\") BillingAddress billingAddress, @ModelAttribute(\"payment\") Payment payment,\r\n\t\t\t@ModelAttribute(\"billingSameAsShipping\") String billingSameAsShipping,\r\n\t\t\t@ModelAttribute(\"shippingMethod\") String shippingMethod, Principal principal, Model model) {\r\n\t\tShoppingCart shoppingCart = userService.findByUsername(principal.getName()).getShoppingCart();\r\n\r\n\t\tList<CartItem> cartItemList = cartItemService.findByShoppingCart(shoppingCart);\r\n\t\tmodel.addAttribute(\"cartItemList\", cartItemList);\r\n\r\n\t\tif (billingSameAsShipping.equals(\"true\")) {\r\n\t\t\tbillingAddress.setBillingAddressName(shippingAddress.getShippingAddressName());\r\n\t\t\tbillingAddress.setBillingAddressStreet1(shippingAddress.getShippingAddressStreet1());\r\n\t\t\tbillingAddress.setBillingAddressStreet2(shippingAddress.getShippingAddressStreet2());\r\n\t\t\tbillingAddress.setBillingAddressCity(shippingAddress.getShippingAddressCity());\r\n\t\t\tbillingAddress.setBillingAddressState(shippingAddress.getShippingAddressState());\r\n\t\t\tbillingAddress.setBillingAddressCountry(shippingAddress.getShippingAddressCountry());\r\n\t\t\tbillingAddress.setBillingAddressZipcode(shippingAddress.getShippingAddressZipcode());\r\n\t\t}\r\n\r\n\t\tif (shippingAddress.getShippingAddressStreet1().isEmpty() || shippingAddress.getShippingAddressCity().isEmpty()\r\n\t\t\t\t|| shippingAddress.getShippingAddressState().isEmpty()\r\n\t\t\t\t|| shippingAddress.getShippingAddressName().isEmpty()\r\n\t\t\t\t|| shippingAddress.getShippingAddressZipcode().isEmpty() || payment.getCardNumber().isEmpty()\r\n\t\t\t\t|| payment.getCvc() == 0 || billingAddress.getBillingAddressStreet1().isEmpty()\r\n\t\t\t\t|| billingAddress.getBillingAddressCity().isEmpty() || billingAddress.getBillingAddressState().isEmpty()\r\n\t\t\t\t|| billingAddress.getBillingAddressName().isEmpty()\r\n\t\t\t\t|| billingAddress.getBillingAddressZipcode().isEmpty())\r\n\t\t\treturn \"redirect:/checkout?id=\" + shoppingCart.getId() + \"&missingRequiredField=true\";\r\n\t\t\r\n\t\tUser user = userService.findByUsername(principal.getName());\r\n\t\t\r\n\t\tOrder order = orderService.createOrder(shoppingCart, shippingAddress, billingAddress, payment, shippingMethod, user);\r\n\t\t\r\n\t\tmailSender.send(mailConstructor.constructOrderConfirmationEmail(user, order, Locale.ENGLISH));\r\n\t\t\r\n\t\tshoppingCartService.clearShoppingCart(shoppingCart);\r\n\t\t\r\n\t\tLocalDate today = LocalDate.now();\r\n\t\tLocalDate estimatedDeliveryDate;\r\n\t\t\r\n\t\tif (shippingMethod.equals(\"groundShipping\")) {\r\n\t\t\testimatedDeliveryDate = today.plusDays(5);\r\n\t\t} else {\r\n\t\t\testimatedDeliveryDate = today.plusDays(3);\r\n\t\t}\r\n\t\t\r\n\t\tmodel.addAttribute(\"estimatedDeliveryDate\", estimatedDeliveryDate);\r\n\t\t\r\n\t\treturn \"orderSubmittedPage\";\r\n\t}\r\n\t\r\n\t@RequestMapping(\"/setShippingAddress\")\r\n\tpublic String setShippingAddress(\r\n\t\t\t@RequestParam(\"userShippingId\") Long userShippingId,\r\n\t\t\tPrincipal principal, Model model\r\n\t\t\t) {\r\n\t\tUser user = userService.findByUsername(principal.getName());\r\n\t\tUserShipping userShipping = userShippingService.findById(userShippingId);\r\n\t\t\r\n\t\tif(userShipping.getUser().getId() != user.getId()) {\r\n\t\t\treturn \"badRequestPage\";\r\n\t\t} else {\r\n\t\t\tshippingAddressService.setByUserShipping(userShipping, shippingAddress);\r\n\t\t\t\r\n\t\t\tList<CartItem> cartItemList = cartItemService.findByShoppingCart(user.getShoppingCart());\r\n\t\t\r\n\t\t\t\r\n\t\t\tmodel.addAttribute(\"shippingAddress\", shippingAddress);\r\n\t\t\tmodel.addAttribute(\"payment\", payment);\r\n\t\t\tmodel.addAttribute(\"billingAddress\", billingAddress);\r\n\t\t\tmodel.addAttribute(\"cartItemList\", cartItemList);\r\n\t\t\tmodel.addAttribute(\"shoppingCart\", user.getShoppingCart());\r\n\t\t\t\r\n\t\t\tList<String> stateList = USConstants.listOfUSStatesCode;\r\n\t\t\tCollections.sort(stateList);\r\n\t\t\tmodel.addAttribute(\"stateList\", stateList);\r\n\t\t\t\r\n\t\t\tList<UserShipping> userShippingList = user.getUserShippingList();\r\n\t\t\tList<UserPayment> userPaymentList = user.getUserPaymentList();\r\n\t\t\t\r\n\t\t\tmodel.addAttribute(\"userShippingList\", userShippingList);\r\n\t\t\tmodel.addAttribute(\"userPaymentList\", userPaymentList);\r\n\t\t\t\r\n\t\t\tmodel.addAttribute(\"shippingAddress\", shippingAddress);\r\n\t\t\t\r\n\t\t\tmodel.addAttribute(\"classActiveShipping\", true);\r\n\t\t\t\r\n\t\t\tif (userPaymentList.size() == 0) {\r\n\t\t\t\tmodel.addAttribute(\"emptyPaymentList\", true);\r\n\t\t\t} else {\r\n\t\t\t\tmodel.addAttribute(\"emptyPaymentList\", false);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tmodel.addAttribute(\"emptyShippingList\", false);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\treturn \"checkout\";\r\n\t\t}\r\n\t}\r\n\t\r\n\t@RequestMapping(\"/setPaymentMethod\")\r\n\tpublic String setPaymentMethod(\r\n\t\t\t@RequestParam(\"userPaymentId\") Long userPaymentId,\r\n\t\t\tPrincipal principal, Model model\r\n\t\t\t) {\r\n\t\tUser user = userService.findByUsername(principal.getName());\r\n\t\tUserPayment userPayment = userPaymentService.findById(userPaymentId);\r\n\t\tUserBilling userBilling = userPayment.getUserBilling();\r\n\t\t\r\n\t\tif(userPayment.getUser().getId() != user.getId()){\r\n\t\t\treturn \"badRequestPage\";\r\n\t\t} else {\r\n\t\t\tpaymentService.setByUserPayment(userPayment, payment);\r\n\t\t\t\r\n\t\t\tList<CartItem> cartItemList = cartItemService.findByShoppingCart(user.getShoppingCart());\r\n\t\t\t\r\n\t\t\tbillingAddressService.setByUserBilling(userBilling, billingAddress);\r\n\t\t\t\r\n\t\t\tmodel.addAttribute(\"shippingAddress\", shippingAddress);\r\n\t\t\tmodel.addAttribute(\"payment\", payment);\r\n\t\t\tmodel.addAttribute(\"billingAddress\", billingAddress);\r\n\t\t\tmodel.addAttribute(\"cartItemList\", cartItemList);\r\n\t\t\tmodel.addAttribute(\"shoppingCart\", user.getShoppingCart());\r\n\t\t\t\r\n\t\t\tList<String> stateList = USConstants.listOfUSStatesCode;\r\n\t\t\tCollections.sort(stateList);\r\n\t\t\tmodel.addAttribute(\"stateList\", stateList);\r\n\t\t\t\r\n\t\t\tList<UserShipping> userShippingList = user.getUserShippingList();\r\n\t\t\tList<UserPayment> userPaymentList = user.getUserPaymentList();\r\n\t\t\t\r\n\t\t\tmodel.addAttribute(\"userShippingList\", userShippingList);\r\n\t\t\tmodel.addAttribute(\"userPaymentList\", userPaymentList);\r\n\t\t\t\r\n\t\t\tmodel.addAttribute(\"shippingAddress\", shippingAddress);\r\n\t\t\t\r\n\t\t\tmodel.addAttribute(\"classActivePayment\", true);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tmodel.addAttribute(\"emptyPaymentList\", false);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tif (userShippingList.size() == 0) {\r\n\t\t\t\tmodel.addAttribute(\"emptyShippingList\", true);\r\n\t\t\t} else {\r\n\t\t\t\tmodel.addAttribute(\"emptyShippingList\", false);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn \"checkout\";\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/controller/HomeController.java",
    "content": "package com.eCommerce.controller;\n\nimport com.eCommerce.domain.Book;\nimport com.eCommerce.domain.CartItem;\nimport com.eCommerce.domain.Order;\nimport com.eCommerce.domain.User;\nimport com.eCommerce.domain.UserBilling;\nimport com.eCommerce.domain.UserPayment;\nimport com.eCommerce.domain.UserShipping;\nimport com.eCommerce.domain.security.PasswordResetToken;\nimport com.eCommerce.domain.security.Role;\nimport com.eCommerce.domain.security.UserRole;\nimport com.eCommerce.service.BookService;\nimport com.eCommerce.service.CartItemService;\nimport com.eCommerce.service.OrderService;\nimport com.eCommerce.service.UserPaymentService;\nimport com.eCommerce.service.UserService;\nimport com.eCommerce.service.UserShippingService;\nimport com.eCommerce.service.impl.UserSecurityService;\nimport com.eCommerce.utility.MailConstructor;\nimport com.eCommerce.utility.SecurityUtility;\nimport com.eCommerce.utility.USConstants;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.websocket.server.PathParam;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.mail.SimpleMailMessage;\nimport org.springframework.mail.javamail.JavaMailSender;\nimport org.springframework.security.authentication.UsernamePasswordAuthenticationToken;\nimport org.springframework.security.core.Authentication;\nimport org.springframework.security.core.context.SecurityContextHolder;\nimport org.springframework.security.core.userdetails.UserDetails;\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.ModelAttribute;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\nimport java.security.Principal;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Set;\nimport java.util.UUID;\n\n\n@Controller\npublic class HomeController {\n\t\n\t@Autowired\n\tprivate JavaMailSender mailSender;\n\t\n\t@Autowired\n\tprivate MailConstructor mailConstructor;\n\n\t@Autowired\n\tprivate UserService userService;\n\t\n\t@Autowired\n\tprivate UserSecurityService userSecurityService;\n\t\n\t@Autowired\n\tprivate BookService bookService;\n\t\n\t@Autowired\n\tprivate UserPaymentService userPaymentService;\n\t\n\t@Autowired\n\tprivate UserShippingService userShippingService;\n\t\n\t@Autowired\n\tprivate CartItemService cartItemService;\n\t\n\t@Autowired\n\tprivate OrderService orderService;\n\n\t@GetMapping(\"/\")\n\tpublic String index() {\n\t\treturn \"index\";\n\t}\n\n\t@GetMapping(\"/login\")\n\tpublic String login(Model model) {\n\t\tmodel.addAttribute(\"classActiveLogin\", true);\n\t\treturn \"myAccount\";\n\t}\n\n\t@GetMapping(\"/faq\")\n\tpublic String faq() {\n\t\treturn \"faq\";\n\t}\n\n\t@GetMapping(\"/bookshelf\")\n\tpublic String bookshelf(Model model, Principal principal) {\n\t\t\n\t\tif(principal != null) {\n\t\t\tString username = principal.getName();\n\t\t\tUser user = userService.findByUsername(username);\n\t\t\tmodel.addAttribute(\"user\", user);\n\t\t}\n\t\t\n\t\tList<Book> bookList = bookService.findAll();\n\t\tmodel.addAttribute(\"bookList\", bookList);\n\t\tmodel.addAttribute(\"activeAll\",true);\n\t\t\n\t\treturn \"bookshelf\";\n\t}\n\n\t@GetMapping(\"/bookDetail\")\n\tpublic String bookDetail(\n\t\t\t@PathParam(\"id\") Long id, Model model, Principal principal\n\t\t\t) {\n\t\tif(principal != null) {\n\t\t\tString username = principal.getName();\n\t\t\tUser user = userService.findByUsername(username);\n\t\t\tmodel.addAttribute(\"user\", user);\n\t\t}\n\t\t\n\t\tBook book = bookService.findById(id);\n\t\t\n\t\tmodel.addAttribute(\"book\", book);\n\t\t\n\t\tList<Integer> qtyList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);\n\t\t\n\t\tmodel.addAttribute(\"qtyList\", qtyList);\n\t\tmodel.addAttribute(\"qty\", 1);\n\t\t\n\t\treturn \"bookDetail\";\n\t}\n\n\t@GetMapping(\"/forgetPassword\")\n\tpublic String forgetPassword(\n\t\t\tHttpServletRequest request,\n\t\t\t@ModelAttribute(\"email\") String email,\n\t\t\tModel model\n\t\t\t) {\n\n\t\tmodel.addAttribute(\"classActiveForgetPassword\", true);\n\t\t\n\t\tUser user = userService.findByEmail(email);\n\t\t\n\t\tif (user == null) {\n\t\t\tmodel.addAttribute(\"emailNotExist\", true);\n\t\t\treturn \"myAccount\";\n\t\t}\n\t\t\n\t\tString password = SecurityUtility.randomPassword();\n\t\t\n\t\tString encryptedPassword = SecurityUtility.passwordEncoder().encode(password);\n\t\tuser.setPassword(encryptedPassword);\n\t\t\n\t\tuserService.save(user);\n\t\t\n\t\tString token = UUID.randomUUID().toString();\n\t\tuserService.createPasswordResetTokenForUser(user, token);\n\t\t\n\t\tString appUrl = \"http://\"+request.getServerName()+\":\"+request.getServerPort()+request.getContextPath();\n\t\t\n\t\tSimpleMailMessage newEmail = mailConstructor.constructResetTokenEmail(appUrl, request.getLocale(), token, user, password);\n\t\t\n\t\tmailSender.send(newEmail);\n\t\t\n\t\tmodel.addAttribute(\"forgetPasswordEmailSent\", \"true\");\n\t\t\n\t\t\n\t\treturn \"myAccount\";\n\t}\n\n\t@GetMapping(\"/myProfile\")\n\tpublic String myProfile(Model model, Principal principal) {\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tmodel.addAttribute(\"user\", user);\n\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\n\t\tUserShipping userShipping = new UserShipping();\n\t\tmodel.addAttribute(\"userShipping\", userShipping);\n\t\t\n\t\tmodel.addAttribute(\"listOfCreditCards\", true);\n\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\t\n\t\tList<String> stateList = USConstants.listOfUSStatesCode;\n\t\tCollections.sort(stateList);\n\t\tmodel.addAttribute(\"stateList\", stateList);\n\t\tmodel.addAttribute(\"classActiveEdit\", true);\n\t\t\n\t\treturn \"myProfile\";\n\t}\n\n\t@GetMapping(\"/listOfCreditCards\")\n\tpublic String listOfCreditCards(\n\t\t\tModel model, Principal principal, HttpServletRequest request\n\t\t\t) {\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tmodel.addAttribute(\"user\", user);\n\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\n\t\tmodel.addAttribute(\"listOfCreditCards\", true);\n\t\tmodel.addAttribute(\"classActiveBilling\", true);\n\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\t\n\t\treturn \"myProfile\";\n\t}\n\n\t@GetMapping(\"/listOfShippingAddresses\")\n\tpublic String listOfShippingAddresses(\n\t\t\tModel model, Principal principal, HttpServletRequest request\n\t\t\t) {\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tmodel.addAttribute(\"user\", user);\n\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\n\t\tmodel.addAttribute(\"listOfCreditCards\", true);\n\t\tmodel.addAttribute(\"classActiveShipping\", true);\n\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\t\n\t\treturn \"myProfile\";\n\t}\n\n\t@GetMapping(\"/addNewCreditCard\")\n\tpublic String addNewCreditCard(\n\t\t\tModel model, Principal principal\n\t\t\t){\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tmodel.addAttribute(\"user\", user);\n\t\t\n\t\tmodel.addAttribute(\"addNewCreditCard\", true);\n\t\tmodel.addAttribute(\"classActiveBilling\", true);\n\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\t\n\t\tUserBilling userBilling = new UserBilling();\n\t\tUserPayment userPayment = new UserPayment();\n\t\t\n\t\t\n\t\tmodel.addAttribute(\"userBilling\", userBilling);\n\t\tmodel.addAttribute(\"userPayment\", userPayment);\n\t\t\n\t\tList<String> stateList = USConstants.listOfUSStatesCode;\n\t\tCollections.sort(stateList);\n\t\tmodel.addAttribute(\"stateList\", stateList);\n\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\n\t\treturn \"myProfile\";\n\t}\n\n\t@GetMapping(\"/addNewShippingAddress\")\n\tpublic String addNewShippingAddress(\n\t\t\tModel model, Principal principal\n\t\t\t){\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tmodel.addAttribute(\"user\", user);\n\t\t\n\t\tmodel.addAttribute(\"addNewShippingAddress\", true);\n\t\tmodel.addAttribute(\"classActiveShipping\", true);\n\t\tmodel.addAttribute(\"listOfCreditCards\", true);\n\t\t\n\t\tUserShipping userShipping = new UserShipping();\n\t\t\n\t\tmodel.addAttribute(\"userShipping\", userShipping);\n\t\t\n\t\tList<String> stateList = USConstants.listOfUSStatesCode;\n\t\tCollections.sort(stateList);\n\t\tmodel.addAttribute(\"stateList\", stateList);\n\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\n\t\treturn \"myProfile\";\n\t}\n\n\t@PostMapping(value = \"/addNewCreditCard\")\n\tpublic String addNewCreditCard(\n\t\t\t@ModelAttribute(\"userPayment\") UserPayment userPayment,\n\t\t\t@ModelAttribute(\"userBilling\") UserBilling userBilling,\n\t\t\tPrincipal principal, Model model\n\t\t\t){\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tuserService.updateUserBilling(userBilling, userPayment, user);\n\t\t\n\t\tmodel.addAttribute(\"user\", user);\n\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\tmodel.addAttribute(\"listOfCreditCards\", true);\n\t\tmodel.addAttribute(\"classActiveBilling\", true);\n\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\n\t\treturn \"myProfile\";\n\t}\n\n\t@PostMapping(value = \"/addNewShippingAddress\")\n\tpublic String addNewShippingAddressPost(\n\t\t\t@ModelAttribute(\"userShipping\") UserShipping userShipping,\n\t\t\tPrincipal principal, Model model\n\t\t\t){\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tuserService.updateUserShipping(userShipping, user);\n\t\t\n\t\tmodel.addAttribute(\"user\", user);\n\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\tmodel.addAttribute(\"classActiveShipping\", true);\n\t\tmodel.addAttribute(\"listOfCreditCards\", true);\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\n\t\treturn \"myProfile\";\n\t}\n\n\n\t@GetMapping(\"/updateCreditCard\")\n\tpublic String updateCreditCard(\n\t\t\t@ModelAttribute(\"id\") Long creditCardId, Principal principal, Model model\n\t\t\t) {\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tUserPayment userPayment = userPaymentService.findById(creditCardId);\n\t\t\n\t\tif(user.getId() != userPayment.getUser().getId()) {\n\t\t\treturn \"badRequestPage\";\n\t\t} else {\n\t\t\tmodel.addAttribute(\"user\", user);\n\t\t\tUserBilling userBilling = userPayment.getUserBilling();\n\t\t\tmodel.addAttribute(\"userPayment\", userPayment);\n\t\t\tmodel.addAttribute(\"userBilling\", userBilling);\n\t\t\t\n\t\t\tList<String> stateList = USConstants.listOfUSStatesCode;\n\t\t\tCollections.sort(stateList);\n\t\t\tmodel.addAttribute(\"stateList\", stateList);\n\t\t\t\n\t\t\tmodel.addAttribute(\"addNewCreditCard\", true);\n\t\t\tmodel.addAttribute(\"classActiveBilling\", true);\n\t\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\t\t\n\t\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\t\n\t\t\treturn \"myProfile\";\n\t\t}\n\t}\n\n\t@GetMapping(\"/updateUserShipping\")\n\tpublic String updateUserShipping(\n\t\t\t@ModelAttribute(\"id\") Long shippingAddressId, Principal principal, Model model\n\t\t\t) {\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tUserShipping userShipping = userShippingService.findById(shippingAddressId);\n\t\t\n\t\tif(user.getId() != userShipping.getUser().getId()) {\n\t\t\treturn \"badRequestPage\";\n\t\t} else {\n\t\t\tmodel.addAttribute(\"user\", user);\n\t\t\t\n\t\t\tmodel.addAttribute(\"userShipping\", userShipping);\n\t\t\t\n\t\t\tList<String> stateList = USConstants.listOfUSStatesCode;\n\t\t\tCollections.sort(stateList);\n\t\t\tmodel.addAttribute(\"stateList\", stateList);\n\t\t\t\n\t\t\tmodel.addAttribute(\"addNewShippingAddress\", true);\n\t\t\tmodel.addAttribute(\"classActiveShipping\", true);\n\t\t\tmodel.addAttribute(\"listOfCreditCards\", true);\n\t\t\t\n\t\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\t\n\t\t\treturn \"myProfile\";\n\t\t}\n\t}\n\n\t@PostMapping(value = \"/setDefaultPayment\")\n\tpublic String setDefaultPayment(\n\t\t\t@ModelAttribute(\"defaultUserPaymentId\") Long defaultPaymentId, Principal principal, Model model\n\t\t\t) {\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tuserService.setUserDefaultPayment(defaultPaymentId, user);\n\t\t\n\t\tmodel.addAttribute(\"user\", user);\n\t\tmodel.addAttribute(\"listOfCreditCards\", true);\n\t\tmodel.addAttribute(\"classActiveBilling\", true);\n\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\t\n\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\n\t\treturn \"myProfile\";\n\t}\n\n\t@PostMapping(value = \"/setDefaultShippingAddress\")\n\tpublic String setDefaultShippingAddress(\n\t\t\t@ModelAttribute(\"defaultShippingAddressId\") Long defaultShippingId, Principal principal, Model model\n\t\t\t) {\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tuserService.setUserDefaultShipping(defaultShippingId, user);\n\t\t\n\t\tmodel.addAttribute(\"user\", user);\n\t\tmodel.addAttribute(\"listOfCreditCards\", true);\n\t\tmodel.addAttribute(\"classActiveShipping\", true);\n\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\t\n\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\n\t\treturn \"myProfile\";\n\t}\n\n\t@GetMapping(\"/removeCreditCard\")\n\tpublic String removeCreditCard(\n\t\t\t@ModelAttribute(\"id\") Long creditCardId, Principal principal, Model model\n\t\t\t){\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tUserPayment userPayment = userPaymentService.findById(creditCardId);\n\t\t\n\t\tif(user.getId() != userPayment.getUser().getId()) {\n\t\t\treturn \"badRequestPage\";\n\t\t} else {\n\t\t\tmodel.addAttribute(\"user\", user);\n\t\t\tuserPaymentService.deleteById(creditCardId);\n\t\t\t\n\t\t\tmodel.addAttribute(\"listOfCreditCards\", true);\n\t\t\tmodel.addAttribute(\"classActiveBilling\", true);\n\t\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\t\t\n\t\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\t\n\t\t\treturn \"myProfile\";\n\t\t}\n\t}\n\n\t@GetMapping(\"/removeUserShipping\")\n\tpublic String removeUserShipping(\n\t\t\t@ModelAttribute(\"id\") Long userShippingId, Principal principal, Model model\n\t\t\t){\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tUserShipping userShipping = userShippingService.findById(userShippingId);\n\t\t\n\t\tif(user.getId() != userShipping.getUser().getId()) {\n\t\t\treturn \"badRequestPage\";\n\t\t} else {\n\t\t\tmodel.addAttribute(\"user\", user);\n\t\t\t\n\t\t\tuserShippingService.deleteById(userShippingId);\n\t\t\t\n\t\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\t\tmodel.addAttribute(\"classActiveShipping\", true);\n\t\t\t\n\t\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\t\n\t\t\treturn \"myProfile\";\n\t\t}\n\t}\n\n\t@PostMapping(value = \"/newUser\")\n\tpublic String newUserPost(\n\t\t\tHttpServletRequest request,\n\t\t\t@ModelAttribute(\"email\") String userEmail,\n\t\t\t@ModelAttribute(\"username\") String username,\n\t\t\tModel model\n\t\t\t) throws Exception{\n\t\tmodel.addAttribute(\"classActiveNewAccount\", true);\n\t\tmodel.addAttribute(\"email\", userEmail);\n\t\tmodel.addAttribute(\"username\", username);\n\t\t\n\t\tif (userService.findByUsername(username) != null) {\n\t\t\tmodel.addAttribute(\"usernameExists\", true);\n\t\t\t\n\t\t\treturn \"myAccount\";\n\t\t}\n\t\t\n\t\tif (userService.findByEmail(userEmail) != null) {\n\t\t\tmodel.addAttribute(\"emailExists\", true);\n\t\t\t\n\t\t\treturn \"myAccount\";\n\t\t}\n\t\t\n\t\tUser user = new User();\n\t\tuser.setUsername(username);\n\t\tuser.setEmail(userEmail);\n\t\t\n\t\tString password = SecurityUtility.randomPassword();\n\t\t\n\t\tString encryptedPassword = SecurityUtility.passwordEncoder().encode(password);\n\t\tuser.setPassword(encryptedPassword);\n\t\t\n\t\tRole role = new Role();\n\t\trole.setRoleId(1);\n\t\trole.setName(\"ROLE_USER\");\n\t\tSet<UserRole> userRoles = new HashSet<>();\n\t\tuserRoles.add(new UserRole(user, role));\n\t\tuserService.createUser(user, userRoles);\n\t\t\n\t\tString token = UUID.randomUUID().toString();\n\t\tuserService.createPasswordResetTokenForUser(user, token);\n\t\t\n\t\tString appUrl = \"http://\"+request.getServerName()+\":\"+request.getServerPort()+request.getContextPath();\n\t\t\n\t\tSimpleMailMessage email = mailConstructor.constructResetTokenEmail(appUrl, request.getLocale(), token, user, password);\n\t\t\n\t\tmailSender.send(email);\n\t\t\n\t\tmodel.addAttribute(\"emailSent\", \"true\");\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\n\t\treturn \"myAccount\";\n\t}\n\n\n\t@GetMapping(\"/newUser\")\n\tpublic String newUser(Locale locale, @RequestParam(\"token\") String token, Model model) {\n\t\tPasswordResetToken passToken = userService.getPasswordResetToken(token);\n\n\t\tif (passToken == null) {\n\t\t\tString message = \"Invalid Token.\";\n\t\t\tmodel.addAttribute(\"message\", message);\n\t\t\treturn \"redirect:/badRequest\";\n\t\t}\n\n\t\tUser user = passToken.getUser();\n\t\tString username = user.getUsername();\n\n\t\tUserDetails userDetails = userSecurityService.loadUserByUsername(username);\n\n\t\tAuthentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(),\n\t\t\t\tuserDetails.getAuthorities());\n\t\t\n\t\tSecurityContextHolder.getContext().setAuthentication(authentication);\n\t\t\n\t\tmodel.addAttribute(\"user\", user);\n\n\t\tmodel.addAttribute(\"classActiveEdit\", true);\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\treturn \"myProfile\";\n\t}\n\n\t@PostMapping(value = \"/updateUserInfo\")\n\tpublic String updateUserInfo(\n\t\t\t@ModelAttribute(\"user\") User user,\n\t\t\t@ModelAttribute(\"newPassword\") String newPassword,\n\t\t\tModel model\n\t\t\t) throws Exception {\n\t\tUser currentUser = userService.findById(user.getId());\n\t\t\n\t\tif(currentUser == null) {\n\t\t\tthrow new Exception (\"User not found\");\n\t\t}\n\t\t\n\t\t/*check email already exists*/\n\t\tif (userService.findByEmail(user.getEmail())!=null) {\n\t\t\tif(userService.findByEmail(user.getEmail()).getId() != currentUser.getId()) {\n\t\t\t\tmodel.addAttribute(\"emailExists\", true);\n\t\t\t\treturn \"myProfile\";\n\t\t\t}\n\t\t}\n\t\t\n\t\t/*check username already exists*/\n\t\tif (userService.findByUsername(user.getUsername())!=null) {\n\t\t\tif(userService.findByUsername(user.getUsername()).getId() != currentUser.getId()) {\n\t\t\t\tmodel.addAttribute(\"usernameExists\", true);\n\t\t\t\treturn \"myProfile\";\n\t\t\t}\n\t\t}\n\t\t\n//\t\tupdate password\n\t\tif (newPassword != null && !newPassword.isEmpty() && !newPassword.equals(\"\")){\n\t\t\tBCryptPasswordEncoder passwordEncoder = SecurityUtility.passwordEncoder();\n\t\t\tString dbPassword = currentUser.getPassword();\n\t\t\tif(passwordEncoder.matches(user.getPassword(), dbPassword)){\n\t\t\t\tcurrentUser.setPassword(passwordEncoder.encode(newPassword));\n\t\t\t} else {\n\t\t\t\tmodel.addAttribute(\"incorrectPassword\", true);\n\t\t\t\t\n\t\t\t\treturn \"myProfile\";\n\t\t\t}\n\t\t}\n\t\t\n\t\tcurrentUser.setFirstName(user.getFirstName());\n\t\tcurrentUser.setLastName(user.getLastName());\n\t\tcurrentUser.setUsername(user.getUsername());\n\t\tcurrentUser.setEmail(user.getEmail());\n\t\t\n\t\tuserService.save(currentUser);\n\t\t\n\t\tmodel.addAttribute(\"updateSuccess\", true);\n\t\tmodel.addAttribute(\"user\", currentUser);\n\t\tmodel.addAttribute(\"classActiveEdit\", true);\n\t\t\n\t\tUserDetails userDetails = userSecurityService.loadUserByUsername(currentUser.getUsername());\n\n\t\tAuthentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(),\n\t\t\t\tuserDetails.getAuthorities());\n\t\t\n\t\tSecurityContextHolder.getContext().setAuthentication(authentication);\n\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\n\t\treturn \"myProfile\";\n\t}\n\n\t@GetMapping(\"/orderDetail\")\n\tpublic String orderDetail(\n\t\t\t@RequestParam(\"id\") Long orderId,\n\t\t\tPrincipal principal, Model model\n\t\t\t){\n\t\tUser user = userService.findByUsername(principal.getName());\n\t\tOrder order = orderService.findById(orderId);\n\t\t\n\t\tif(order.getUser().getId()!=user.getId()) {\n\t\t\treturn \"badRequestPage\";\n\t\t} else {\n\t\t\tList<CartItem> cartItemList = cartItemService.findByOrder(order);\n\t\t\tmodel.addAttribute(\"cartItemList\", cartItemList);\n\t\t\tmodel.addAttribute(\"user\", user);\n\t\t\tmodel.addAttribute(\"order\", order);\n\t\t\t\n\t\t\tmodel.addAttribute(\"userPaymentList\", user.getUserPaymentList());\n\t\t\tmodel.addAttribute(\"userShippingList\", user.getUserShippingList());\n\t\t\tmodel.addAttribute(\"orderList\", user.getOrderList());\n\t\t\t\n\t\t\tUserShipping userShipping = new UserShipping();\n\t\t\tmodel.addAttribute(\"userShipping\", userShipping);\n\t\t\t\n\t\t\tList<String> stateList = USConstants.listOfUSStatesCode;\n\t\t\tCollections.sort(stateList);\n\t\t\tmodel.addAttribute(\"stateList\", stateList);\n\t\t\t\n\t\t\tmodel.addAttribute(\"listOfShippingAddresses\", true);\n\t\t\tmodel.addAttribute(\"classActiveOrders\", true);\n\t\t\tmodel.addAttribute(\"listOfCreditCards\", true);\n\t\t\tmodel.addAttribute(\"displayOrderDetail\", true);\n\t\t\t\n\t\t\treturn \"myProfile\";\n\t\t}\n\t}\n\t\n\n}\n"
  },
  {
    "path": "src/main/java/com/eCommerce/controller/SearchController.java",
    "content": "package com.eCommerce.controller;\r\n\r\nimport java.security.Principal;\r\nimport java.util.List;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Controller;\r\nimport org.springframework.ui.Model;\r\nimport org.springframework.web.bind.annotation.ModelAttribute;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\nimport org.springframework.web.bind.annotation.RequestParam;\r\n\r\nimport com.eCommerce.domain.Book;\r\nimport com.eCommerce.domain.User;\r\nimport com.eCommerce.service.BookService;\r\nimport com.eCommerce.service.UserService;\r\n\r\n\r\n@Controller\r\npublic class SearchController {\r\n\t@Autowired\r\n\tprivate UserService userService;\r\n\t\r\n\t@Autowired\r\n\tprivate BookService bookService;\r\n\r\n\t@RequestMapping(\"/searchByCategory\")\r\n\tpublic String searchByCategory(\r\n\t\t\t@RequestParam(\"category\") String category,\r\n\t\t\tModel model, Principal principal\r\n\t\t\t){\r\n\t\tif(principal!=null) {\r\n\t\t\tString username = principal.getName();\r\n\t\t\tUser user = userService.findByUsername(username);\r\n\t\t\tmodel.addAttribute(\"user\", user);\r\n\t\t}\r\n\t\t\r\n\t\tString classActiveCategory = \"active\"+category;\r\n\t\tclassActiveCategory = classActiveCategory.replaceAll(\"\\\\s+\", \"\");\r\n\t\tclassActiveCategory = classActiveCategory.replaceAll(\"&\", \"\");\r\n\t\tmodel.addAttribute(classActiveCategory, true);\r\n\t\t\r\n\t\tList<Book> bookList = bookService.findByCategory(category);\r\n\t\t\r\n\t\tif (bookList.isEmpty()) {\r\n\t\t\tmodel.addAttribute(\"emptyList\", true);\r\n\t\t\treturn \"bookshelf\";\r\n\t\t}\r\n\t\t\r\n\t\tmodel.addAttribute(\"bookList\", bookList);\r\n\t\t\r\n\t\treturn \"bookshelf\";\r\n\t}\r\n\t\r\n\t@RequestMapping(\"/searchBook\")\r\n\tpublic String searchBook(\r\n\t\t\t@ModelAttribute(\"keyword\") String keyword,\r\n\t\t\tPrincipal principal, Model model\r\n\t\t\t) {\r\n\t\tif(principal!=null) {\r\n\t\t\tString username = principal.getName();\r\n\t\t\tUser user = userService.findByUsername(username);\r\n\t\t\tmodel.addAttribute(\"user\", user);\r\n\t\t}\r\n\t\t\r\n\t\tList<Book> bookList = bookService.blurrySearch(keyword);\r\n\t\t\r\n\t\tif (bookList.isEmpty()) {\r\n\t\t\tmodel.addAttribute(\"emptyList\", true);\r\n\t\t\treturn \"bookshelf\";\r\n\t\t}\r\n\t\t\r\n\t\tmodel.addAttribute(\"bookList\", bookList);\r\n\t\t\r\n\t\treturn \"bookshelf\";\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/controller/ShoppingCartController.java",
    "content": "package com.eCommerce.controller;\r\n\r\nimport java.security.Principal;\r\nimport java.util.List;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Controller;\r\nimport org.springframework.ui.Model;\r\nimport org.springframework.web.bind.annotation.ModelAttribute;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\nimport org.springframework.web.bind.annotation.RequestParam;\r\n\r\nimport com.eCommerce.domain.Book;\r\nimport com.eCommerce.domain.CartItem;\r\nimport com.eCommerce.domain.ShoppingCart;\r\nimport com.eCommerce.domain.User;\r\nimport com.eCommerce.service.BookService;\r\nimport com.eCommerce.service.CartItemService;\r\nimport com.eCommerce.service.ShoppingCartService;\r\nimport com.eCommerce.service.UserService;\r\n\r\n\r\n@Controller\r\n@RequestMapping(\"/shoppingCart\")\r\npublic class ShoppingCartController {\r\n\t\r\n\t@Autowired\r\n\tprivate UserService userService;\r\n\t\r\n\t@Autowired\r\n\tprivate CartItemService cartItemService;\r\n\t\r\n\t@Autowired\r\n\tprivate BookService bookService;\r\n\t\r\n\t@Autowired\r\n\tprivate ShoppingCartService shoppingCartService;\r\n\t\r\n\t@RequestMapping(\"/cart\")\r\n\tpublic String shoppingCart(Model model, Principal principal) {\r\n\t\tUser user = userService.findByUsername(principal.getName());\r\n\t\tShoppingCart shoppingCart = user.getShoppingCart();\r\n\t\t\r\n\t\tList<CartItem> cartItemList = cartItemService.findByShoppingCart(shoppingCart);\r\n\t\t\r\n\t\tshoppingCartService.updateShoppingCart(shoppingCart);\r\n\t\t\r\n\t\tmodel.addAttribute(\"cartItemList\", cartItemList);\r\n\t\tmodel.addAttribute(\"shoppingCart\", shoppingCart);\r\n\t\t\r\n\t\treturn \"shoppingCart\";\r\n\t}\r\n\t\r\n\t@RequestMapping(\"/addItem\")\r\n\tpublic String addItem(\r\n\t\t\t@ModelAttribute(\"book\") Book book,\r\n\t\t\t@ModelAttribute(\"qty\") String qty,\r\n\t\t\tModel model, Principal principal\r\n\t\t\t) {\r\n\t\tUser user = userService.findByUsername(principal.getName());\r\n\t\tbook = bookService.findById(book.getId());\r\n\t\t\r\n\t\tif (Integer.parseInt(qty) > book.getInStockNumber()) {\r\n\t\t\tmodel.addAttribute(\"notEnoughStock\", true);\r\n\t\t\treturn \"forward:/bookDetail?id=\"+book.getId();\r\n\t\t}\r\n\t\t\r\n\t\tCartItem cartItem = cartItemService.addBookToCartItem(book, user, Integer.parseInt(qty));\r\n\t\tmodel.addAttribute(\"addBookSuccess\", true);\r\n\t\t\r\n\t\treturn \"forward:/bookDetail?id=\"+book.getId();\r\n\t}\r\n\t\r\n\t@RequestMapping(\"/updateCartItem\")\r\n\tpublic String updateShoppingCart(\r\n\t\t\t@ModelAttribute(\"id\") Long cartItemId,\r\n\t\t\t@ModelAttribute(\"qty\") int qty\r\n\t\t\t) {\r\n\t\tCartItem cartItem = cartItemService.findById(cartItemId);\r\n\t\tcartItem.setQty(qty);\r\n\t\tcartItemService.updateCartItem(cartItem);\r\n\t\t\r\n\t\treturn \"forward:/shoppingCart/cart\";\r\n\t}\r\n\t\r\n\t@RequestMapping(\"/removeItem\")\r\n\tpublic String removeItem(@RequestParam(\"id\") Long id) {\r\n\t\tcartItemService.removeCartItem(cartItemService.findById(id));\r\n\t\t\r\n\t\treturn \"forward:/shoppingCart/cart\";\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/BillingAddress.java",
    "content": "package com.eCommerce.domain;\r\n\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.OneToOne;\r\n\r\n@Entity\r\npublic class BillingAddress {\r\n\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\tprivate String BillingAddressName;\r\n\tprivate String BillingAddressStreet1;\r\n\tprivate String BillingAddressStreet2;\r\n\tprivate String BillingAddressCity;\r\n\tprivate String BillingAddressState;\r\n\tprivate String BillingAddressCountry;\r\n\tprivate String BillingAddressZipcode;\r\n\t\r\n\t@OneToOne\r\n\tprivate Order order;\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic String getBillingAddressName() {\r\n\t\treturn BillingAddressName;\r\n\t}\r\n\r\n\tpublic void setBillingAddressName(String billingAddressName) {\r\n\t\tBillingAddressName = billingAddressName;\r\n\t}\r\n\r\n\tpublic String getBillingAddressStreet1() {\r\n\t\treturn BillingAddressStreet1;\r\n\t}\r\n\r\n\tpublic void setBillingAddressStreet1(String billingAddressStreet1) {\r\n\t\tBillingAddressStreet1 = billingAddressStreet1;\r\n\t}\r\n\r\n\tpublic String getBillingAddressStreet2() {\r\n\t\treturn BillingAddressStreet2;\r\n\t}\r\n\r\n\tpublic void setBillingAddressStreet2(String billingAddressStreet2) {\r\n\t\tBillingAddressStreet2 = billingAddressStreet2;\r\n\t}\r\n\r\n\tpublic String getBillingAddressCity() {\r\n\t\treturn BillingAddressCity;\r\n\t}\r\n\r\n\tpublic void setBillingAddressCity(String billingAddressCity) {\r\n\t\tBillingAddressCity = billingAddressCity;\r\n\t}\r\n\r\n\tpublic String getBillingAddressState() {\r\n\t\treturn BillingAddressState;\r\n\t}\r\n\r\n\tpublic void setBillingAddressState(String billingAddressState) {\r\n\t\tBillingAddressState = billingAddressState;\r\n\t}\r\n\r\n\tpublic String getBillingAddressCountry() {\r\n\t\treturn BillingAddressCountry;\r\n\t}\r\n\r\n\tpublic void setBillingAddressCountry(String billingAddressCountry) {\r\n\t\tBillingAddressCountry = billingAddressCountry;\r\n\t}\r\n\r\n\tpublic String getBillingAddressZipcode() {\r\n\t\treturn BillingAddressZipcode;\r\n\t}\r\n\r\n\tpublic void setBillingAddressZipcode(String billingAddressZipcode) {\r\n\t\tBillingAddressZipcode = billingAddressZipcode;\r\n\t}\r\n\r\n\tpublic Order getOrder() {\r\n\t\treturn order;\r\n\t}\r\n\r\n\tpublic void setOrder(Order order) {\r\n\t\tthis.order = order;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/Book.java",
    "content": "package com.eCommerce.domain;\r\n\r\nimport com.fasterxml.jackson.annotation.JsonIgnore;\r\nimport jakarta.persistence.Column;\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.OneToMany;\r\nimport jakarta.persistence.Transient;\r\nimport org.springframework.web.multipart.MultipartFile;\r\n\r\nimport java.util.List;\r\n\r\n@Entity\r\npublic class Book {\r\n\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\tprivate String title;\r\n\tprivate String author;\r\n\tprivate String publisher;\r\n\tprivate String publicationDate;\r\n\tprivate String language;\r\n\tprivate String category;\r\n\tprivate int numberOfPages;\r\n\tprivate String format;\r\n\tprivate int isbn;\r\n\tprivate double shippingWeight;\r\n\tprivate double listPrice;\r\n\tprivate double ourPrice;\r\n\tprivate boolean active=true;\r\n\t\r\n\t@Column(columnDefinition=\"text\")\r\n\tprivate String description;\r\n\tprivate int inStockNumber;\r\n\t\r\n\t@Transient\r\n\tprivate MultipartFile bookImage;\r\n\t\r\n\t@OneToMany(mappedBy = \"book\")\r\n\t@JsonIgnore\r\n\tprivate List<BookToCartItem> bookToCartItemList;\r\n\t\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic String getTitle() {\r\n\t\treturn title;\r\n\t}\r\n\r\n\tpublic void setTitle(String title) {\r\n\t\tthis.title = title;\r\n\t}\r\n\r\n\tpublic String getAuthor() {\r\n\t\treturn author;\r\n\t}\r\n\r\n\tpublic void setAuthor(String author) {\r\n\t\tthis.author = author;\r\n\t}\r\n\r\n\tpublic String getPublisher() {\r\n\t\treturn publisher;\r\n\t}\r\n\r\n\tpublic void setPublisher(String publisher) {\r\n\t\tthis.publisher = publisher;\r\n\t}\r\n\r\n\tpublic String getPublicationDate() {\r\n\t\treturn publicationDate;\r\n\t}\r\n\r\n\tpublic void setPublicationDate(String publicationDate) {\r\n\t\tthis.publicationDate = publicationDate;\r\n\t}\r\n\r\n\tpublic String getLanguage() {\r\n\t\treturn language;\r\n\t}\r\n\r\n\tpublic void setLanguage(String language) {\r\n\t\tthis.language = language;\r\n\t}\r\n\r\n\tpublic String getCategory() {\r\n\t\treturn category;\r\n\t}\r\n\r\n\tpublic void setCategory(String category) {\r\n\t\tthis.category = category;\r\n\t}\r\n\r\n\tpublic int getNumberOfPages() {\r\n\t\treturn numberOfPages;\r\n\t}\r\n\r\n\tpublic void setNumberOfPages(int numberOfPages) {\r\n\t\tthis.numberOfPages = numberOfPages;\r\n\t}\r\n\r\n\tpublic String getFormat() {\r\n\t\treturn format;\r\n\t}\r\n\r\n\tpublic void setFormat(String format) {\r\n\t\tthis.format = format;\r\n\t}\r\n\r\n\tpublic int getIsbn() {\r\n\t\treturn isbn;\r\n\t}\r\n\r\n\tpublic void setIsbn(int isbn) {\r\n\t\tthis.isbn = isbn;\r\n\t}\r\n\r\n\tpublic double getShippingWeight() {\r\n\t\treturn shippingWeight;\r\n\t}\r\n\r\n\tpublic void setShippingWeight(double shippingWeight) {\r\n\t\tthis.shippingWeight = shippingWeight;\r\n\t}\r\n\r\n\tpublic double getListPrice() {\r\n\t\treturn listPrice;\r\n\t}\r\n\r\n\tpublic void setListPrice(double listPrice) {\r\n\t\tthis.listPrice = listPrice;\r\n\t}\r\n\r\n\tpublic double getOurPrice() {\r\n\t\treturn ourPrice;\r\n\t}\r\n\r\n\tpublic void setOurPrice(double ourPrice) {\r\n\t\tthis.ourPrice = ourPrice;\r\n\t}\r\n\r\n\tpublic boolean isActive() {\r\n\t\treturn active;\r\n\t}\r\n\r\n\tpublic void setActive(boolean active) {\r\n\t\tthis.active = active;\r\n\t}\r\n\r\n\tpublic String getDescription() {\r\n\t\treturn description;\r\n\t}\r\n\r\n\tpublic void setDescription(String description) {\r\n\t\tthis.description = description;\r\n\t}\r\n\r\n\tpublic int getInStockNumber() {\r\n\t\treturn inStockNumber;\r\n\t}\r\n\r\n\tpublic void setInStockNumber(int inStockNumber) {\r\n\t\tthis.inStockNumber = inStockNumber;\r\n\t}\r\n\r\n\tpublic MultipartFile getBookImage() {\r\n\t\treturn bookImage;\r\n\t}\r\n\r\n\tpublic void setBookImage(MultipartFile bookImage) {\r\n\t\tthis.bookImage = bookImage;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/BookToCartItem.java",
    "content": "package com.eCommerce.domain;\r\n\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.JoinColumn;\r\nimport jakarta.persistence.ManyToOne;\r\n\r\n@Entity\r\npublic class BookToCartItem {\r\n\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\t\r\n\t@ManyToOne\r\n\t@JoinColumn(name=\"book_id\")\r\n\tprivate Book book;\r\n\t\r\n\t@ManyToOne\r\n\t@JoinColumn(name=\"cart_item_id\")\r\n\tprivate CartItem cartItem;\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic Book getBook() {\r\n\t\treturn book;\r\n\t}\r\n\r\n\tpublic void setBook(Book book) {\r\n\t\tthis.book = book;\r\n\t}\r\n\r\n\tpublic CartItem getCartItem() {\r\n\t\treturn cartItem;\r\n\t}\r\n\r\n\tpublic void setCartItem(CartItem cartItem) {\r\n\t\tthis.cartItem = cartItem;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/CartItem.java",
    "content": "package com.eCommerce.domain;\r\n\r\nimport com.fasterxml.jackson.annotation.JsonIgnore;\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.JoinColumn;\r\nimport jakarta.persistence.ManyToOne;\r\nimport jakarta.persistence.OneToMany;\r\nimport jakarta.persistence.OneToOne;\r\n\r\nimport java.math.BigDecimal;\r\nimport java.util.List;\r\n\r\n@Entity\r\npublic class CartItem {\r\n\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\tprivate int qty;\r\n\tprivate BigDecimal subtotal;\r\n\t\r\n\t@OneToOne\r\n\tprivate Book book;\r\n\t\r\n\t@OneToMany(mappedBy = \"cartItem\")\r\n\t@JsonIgnore\r\n\tprivate List<BookToCartItem> bookToCartItemList;\r\n\t\r\n\t@ManyToOne\r\n\t@JoinColumn(name=\"shopping_cart_id\")\r\n\tprivate ShoppingCart shoppingCart;\r\n\t\r\n\t@ManyToOne\r\n\t@JoinColumn(name=\"order_id\")\r\n\tprivate Order order;\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic int getQty() {\r\n\t\treturn qty;\r\n\t}\r\n\r\n\tpublic void setQty(int qty) {\r\n\t\tthis.qty = qty;\r\n\t}\r\n\r\n\tpublic BigDecimal getSubtotal() {\r\n\t\treturn subtotal;\r\n\t}\r\n\r\n\tpublic void setSubtotal(BigDecimal subtotal) {\r\n\t\tthis.subtotal = subtotal;\r\n\t}\r\n\r\n\tpublic Book getBook() {\r\n\t\treturn book;\r\n\t}\r\n\r\n\tpublic void setBook(Book book) {\r\n\t\tthis.book = book;\r\n\t}\r\n\r\n\tpublic List<BookToCartItem> getBookToCartItemList() {\r\n\t\treturn bookToCartItemList;\r\n\t}\r\n\r\n\tpublic void setBookToCartItemList(List<BookToCartItem> bookToCartItemList) {\r\n\t\tthis.bookToCartItemList = bookToCartItemList;\r\n\t}\r\n\r\n\tpublic ShoppingCart getShoppingCart() {\r\n\t\treturn shoppingCart;\r\n\t}\r\n\r\n\tpublic void setShoppingCart(ShoppingCart shoppingCart) {\r\n\t\tthis.shoppingCart = shoppingCart;\r\n\t}\r\n\r\n\tpublic Order getOrder() {\r\n\t\treturn order;\r\n\t}\r\n\r\n\tpublic void setOrder(Order order) {\r\n\t\tthis.order = order;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/Order.java",
    "content": "package com.eCommerce.domain;\r\n\r\nimport jakarta.persistence.CascadeType;\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.ManyToOne;\r\nimport jakarta.persistence.OneToMany;\r\nimport jakarta.persistence.OneToOne;\r\nimport jakarta.persistence.Table;\r\n\r\nimport java.math.BigDecimal;\r\nimport java.util.Date;\r\nimport java.util.List;\r\n\r\n\r\n@Entity\r\n@Table(name=\"user_order\")\r\npublic class Order {\r\n\t\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\tprivate Date orderDate;\r\n\tprivate Date shippingDate;\r\n\tprivate String shippingMethod;\r\n\tprivate String orderStatus;\r\n\tprivate BigDecimal orderTotal;\r\n\r\n\t@OneToMany(mappedBy = \"order\", cascade = CascadeType.ALL)\r\n\tprivate List<CartItem> cartItemList;\r\n\t\r\n\t@OneToOne(cascade=CascadeType.ALL)\r\n\tprivate ShippingAddress shippingAddress;\r\n\t\r\n\t@OneToOne(cascade=CascadeType.ALL)\r\n\tprivate BillingAddress billingAddress;\r\n\t\r\n\t@OneToOne(cascade=CascadeType.ALL)\r\n\tprivate Payment payment;\r\n\t\r\n\t@ManyToOne\r\n\tprivate User user;\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic Date getOrderDate() {\r\n\t\treturn orderDate;\r\n\t}\r\n\r\n\tpublic void setOrderDate(Date orderDate) {\r\n\t\tthis.orderDate = orderDate;\r\n\t}\r\n\r\n\tpublic Date getShippingDate() {\r\n\t\treturn shippingDate;\r\n\t}\r\n\r\n\tpublic void setShippingDate(Date shippingDate) {\r\n\t\tthis.shippingDate = shippingDate;\r\n\t}\r\n\r\n\tpublic String getShippingMethod() {\r\n\t\treturn shippingMethod;\r\n\t}\r\n\r\n\tpublic void setShippingMethod(String shippingMethod) {\r\n\t\tthis.shippingMethod = shippingMethod;\r\n\t}\r\n\r\n\tpublic String getOrderStatus() {\r\n\t\treturn orderStatus;\r\n\t}\r\n\r\n\tpublic void setOrderStatus(String orderStatus) {\r\n\t\tthis.orderStatus = orderStatus;\r\n\t}\r\n\r\n\tpublic BigDecimal getOrderTotal() {\r\n\t\treturn orderTotal;\r\n\t}\r\n\r\n\tpublic void setOrderTotal(BigDecimal orderTotal) {\r\n\t\tthis.orderTotal = orderTotal;\r\n\t}\r\n\r\n\tpublic List<CartItem> getCartItemList() {\r\n\t\treturn cartItemList;\r\n\t}\r\n\r\n\tpublic void setCartItemList(List<CartItem> cartItemList) {\r\n\t\tthis.cartItemList = cartItemList;\r\n\t}\r\n\r\n\tpublic ShippingAddress getShippingAddress() {\r\n\t\treturn shippingAddress;\r\n\t}\r\n\r\n\tpublic void setShippingAddress(ShippingAddress shippingAddress) {\r\n\t\tthis.shippingAddress = shippingAddress;\r\n\t}\r\n\r\n\tpublic Payment getPayment() {\r\n\t\treturn payment;\r\n\t}\r\n\r\n\tpublic void setPayment(Payment payment) {\r\n\t\tthis.payment = payment;\r\n\t}\r\n\r\n\tpublic BillingAddress getBillingAddress() {\r\n\t\treturn billingAddress;\r\n\t}\r\n\r\n\tpublic void setBillingAddress(BillingAddress billingAddress) {\r\n\t\tthis.billingAddress = billingAddress;\r\n\t}\r\n\r\n\tpublic User getUser() {\r\n\t\treturn user;\r\n\t}\r\n\r\n\tpublic void setUser(User user) {\r\n\t\tthis.user = user;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/Payment.java",
    "content": "package com.eCommerce.domain;\r\n\r\nimport jakarta.persistence.CascadeType;\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.OneToOne;\r\n\r\n@Entity\r\npublic class Payment {\r\n\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\tprivate String type;\r\n\tprivate String cardName;\r\n\tprivate String cardNumber;\r\n\tprivate int expiryMonth;\r\n\tprivate int expiryYear;\r\n\tprivate int cvc;\r\n\tprivate String holderName;\r\n\t\r\n\t@OneToOne\r\n\tprivate Order order;\r\n\t\r\n\t@OneToOne(cascade = CascadeType.ALL, mappedBy = \"userPayment\")\r\n\tprivate UserBilling userBilling;\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic String getType() {\r\n\t\treturn type;\r\n\t}\r\n\r\n\tpublic void setType(String type) {\r\n\t\tthis.type = type;\r\n\t}\r\n\r\n\tpublic String getCardName() {\r\n\t\treturn cardName;\r\n\t}\r\n\r\n\tpublic void setCardName(String cardName) {\r\n\t\tthis.cardName = cardName;\r\n\t}\r\n\r\n\tpublic String getCardNumber() {\r\n\t\treturn cardNumber;\r\n\t}\r\n\r\n\tpublic void setCardNumber(String cardNumber) {\r\n\t\tthis.cardNumber = cardNumber;\r\n\t}\r\n\r\n\tpublic int getExpiryMonth() {\r\n\t\treturn expiryMonth;\r\n\t}\r\n\r\n\tpublic void setExpiryMonth(int expiryMonth) {\r\n\t\tthis.expiryMonth = expiryMonth;\r\n\t}\r\n\r\n\tpublic int getExpiryYear() {\r\n\t\treturn expiryYear;\r\n\t}\r\n\r\n\tpublic void setExpiryYear(int expiryYear) {\r\n\t\tthis.expiryYear = expiryYear;\r\n\t}\r\n\r\n\tpublic int getCvc() {\r\n\t\treturn cvc;\r\n\t}\r\n\r\n\tpublic void setCvc(int cvc) {\r\n\t\tthis.cvc = cvc;\r\n\t}\r\n\r\n\tpublic String getHolderName() {\r\n\t\treturn holderName;\r\n\t}\r\n\r\n\tpublic void setHolderName(String holderName) {\r\n\t\tthis.holderName = holderName;\r\n\t}\r\n\r\n\tpublic Order getOrder() {\r\n\t\treturn order;\r\n\t}\r\n\r\n\tpublic void setOrder(Order order) {\r\n\t\tthis.order = order;\r\n\t}\r\n\r\n\tpublic UserBilling getUserBilling() {\r\n\t\treturn userBilling;\r\n\t}\r\n\r\n\tpublic void setUserBilling(UserBilling userBilling) {\r\n\t\tthis.userBilling = userBilling;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/ShippingAddress.java",
    "content": "package com.eCommerce.domain;\r\n\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.OneToOne;\r\n\r\n@Entity\r\npublic class ShippingAddress {\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\tprivate String ShippingAddressName;\r\n\tprivate String ShippingAddressStreet1;\r\n\tprivate String ShippingAddressStreet2;\r\n\tprivate String ShippingAddressCity;\r\n\tprivate String ShippingAddressState;\r\n\tprivate String ShippingAddressCountry;\r\n\tprivate String ShippingAddressZipcode;\r\n\t\r\n\t@OneToOne\r\n\tprivate Order order;\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\r\n\tpublic String getShippingAddressName() {\r\n\t\treturn ShippingAddressName;\r\n\t}\r\n\r\n\r\n\tpublic void setShippingAddressName(String shippingAddressName) {\r\n\t\tShippingAddressName = shippingAddressName;\r\n\t}\r\n\r\n\r\n\tpublic String getShippingAddressStreet1() {\r\n\t\treturn ShippingAddressStreet1;\r\n\t}\r\n\r\n\r\n\tpublic void setShippingAddressStreet1(String shippingAddressStreet1) {\r\n\t\tShippingAddressStreet1 = shippingAddressStreet1;\r\n\t}\r\n\r\n\r\n\tpublic String getShippingAddressStreet2() {\r\n\t\treturn ShippingAddressStreet2;\r\n\t}\r\n\r\n\r\n\tpublic void setShippingAddressStreet2(String shippingAddressStreet2) {\r\n\t\tShippingAddressStreet2 = shippingAddressStreet2;\r\n\t}\r\n\r\n\r\n\tpublic String getShippingAddressCity() {\r\n\t\treturn ShippingAddressCity;\r\n\t}\r\n\r\n\r\n\tpublic void setShippingAddressCity(String shippingAddressCity) {\r\n\t\tShippingAddressCity = shippingAddressCity;\r\n\t}\r\n\r\n\r\n\tpublic String getShippingAddressState() {\r\n\t\treturn ShippingAddressState;\r\n\t}\r\n\r\n\r\n\tpublic void setShippingAddressState(String shippingAddressState) {\r\n\t\tShippingAddressState = shippingAddressState;\r\n\t}\r\n\r\n\r\n\tpublic String getShippingAddressCountry() {\r\n\t\treturn ShippingAddressCountry;\r\n\t}\r\n\r\n\r\n\tpublic void setShippingAddressCountry(String shippingAddressCountry) {\r\n\t\tShippingAddressCountry = shippingAddressCountry;\r\n\t}\r\n\r\n\r\n\tpublic String getShippingAddressZipcode() {\r\n\t\treturn ShippingAddressZipcode;\r\n\t}\r\n\r\n\r\n\tpublic void setShippingAddressZipcode(String shippingAddressZipcode) {\r\n\t\tShippingAddressZipcode = shippingAddressZipcode;\r\n\t}\r\n\r\n\r\n\tpublic Order getOrder() {\r\n\t\treturn order;\r\n\t}\r\n\r\n\r\n\tpublic void setOrder(Order order) {\r\n\t\tthis.order = order;\r\n\t}\r\n\t\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/ShoppingCart.java",
    "content": "package com.eCommerce.domain;\r\n\r\nimport com.fasterxml.jackson.annotation.JsonIgnore;\r\nimport jakarta.persistence.CascadeType;\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.FetchType;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.OneToMany;\r\nimport jakarta.persistence.OneToOne;\r\n\r\nimport java.math.BigDecimal;\r\nimport java.util.List;\r\n\r\n@Entity\r\npublic class ShoppingCart {\r\n\t\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\tprivate BigDecimal GrandTotal;\r\n\r\n\t@OneToMany(mappedBy = \"shoppingCart\", cascade = CascadeType.ALL, fetch = FetchType.LAZY)\r\n\t@JsonIgnore\r\n\tprivate List<CartItem> cartItemList;\r\n\t\r\n\t@OneToOne(cascade = CascadeType.ALL)\r\n\tprivate User user;\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic BigDecimal getGrandTotal() {\r\n\t\treturn GrandTotal;\r\n\t}\r\n\r\n\tpublic void setGrandTotal(BigDecimal grandTotal) {\r\n\t\tGrandTotal = grandTotal;\r\n\t}\r\n\r\n\tpublic List<CartItem> getCartItemList() {\r\n\t\treturn cartItemList;\r\n\t}\r\n\r\n\tpublic void setCartItemList(List<CartItem> cartItemList) {\r\n\t\tthis.cartItemList = cartItemList;\r\n\t}\r\n\r\n\tpublic User getUser() {\r\n\t\treturn user;\r\n\t}\r\n\r\n\tpublic void setUser(User user) {\r\n\t\tthis.user = user;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/User.java",
    "content": "package com.eCommerce.domain;\n\nimport com.eCommerce.domain.security.Authority;\nimport com.eCommerce.domain.security.UserRole;\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport jakarta.persistence.CascadeType;\nimport jakarta.persistence.Column;\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.FetchType;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.GenerationType;\nimport jakarta.persistence.Id;\nimport jakarta.persistence.OneToMany;\nimport jakarta.persistence.OneToOne;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.core.userdetails.UserDetails;\n\nimport java.util.Collection;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\n@Entity\npublic class User implements UserDetails{\n\t\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.AUTO)\n\t@Column(name=\"id\", nullable = false, updatable = false)\n\tprivate Long id;\n\tprivate String username;\n\tprivate String password;\n\tprivate String firstName;\n\tprivate String lastName;\n\t\n\t@Column(name=\"email\", nullable = false, updatable = false)\n\tprivate String email;\n\tprivate String phone;\n\tprivate boolean enabled=true;\n\t\n\t@OneToOne(cascade = CascadeType.ALL, mappedBy = \"user\")\n\tprivate ShoppingCart shoppingCart;\n\t\n\t@OneToMany(cascade = CascadeType.ALL, mappedBy = \"user\")\n\tprivate List<UserShipping> userShippingList;\n\t\n\t@OneToMany(cascade = CascadeType.ALL, mappedBy = \"user\")\n\tprivate List<UserPayment> userPaymentList;\n\t\n\t@OneToMany(mappedBy = \"user\")\n\tprivate List<Order> orderList;\n\t\n\t@OneToMany(mappedBy = \"user\", cascade = CascadeType.MERGE, fetch = FetchType.EAGER)\n\t@JsonIgnore\n\tprivate Set<UserRole> userRoles = new HashSet<>();\n\t\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\tpublic String getUsername() {\n\t\treturn username;\n\t}\n\tpublic void setUsername(String username) {\n\t\tthis.username = username;\n\t}\n\tpublic String getPassword() {\n\t\treturn password;\n\t}\n\tpublic void setPassword(String password) {\n\t\tthis.password = password;\n\t}\n\tpublic String getFirstName() {\n\t\treturn firstName;\n\t}\n\tpublic void setFirstName(String firstName) {\n\t\tthis.firstName = firstName;\n\t}\n\tpublic String getLastName() {\n\t\treturn lastName;\n\t}\n\tpublic void setLastName(String lastName) {\n\t\tthis.lastName = lastName;\n\t}\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\tpublic void setEmail(String email) {\n\t\tthis.email = email;\n\t}\n\tpublic String getPhone() {\n\t\treturn phone;\n\t}\n\tpublic void setPhone(String phone) {\n\t\tthis.phone = phone;\n\t}\n\t\n\tpublic void setEnabled(boolean enabled) {\n\t\tthis.enabled = enabled;\n\t}\n\tpublic Set<UserRole> getUserRoles() {\n\t\treturn userRoles;\n\t}\n\tpublic void setUserRoles(Set<UserRole> userRoles) {\n\t\tthis.userRoles = userRoles;\n\t}\n\t\n\n\tpublic List<UserShipping> getUserShippingList() {\n\t\treturn userShippingList;\n\t}\n\tpublic void setUserShippingList(List<UserShipping> userShippingList) {\n\t\tthis.userShippingList = userShippingList;\n\t}\n\tpublic List<UserPayment> getUserPaymentList() {\n\t\treturn userPaymentList;\n\t}\n\tpublic void setUserPaymentList(List<UserPayment> userPaymentList) {\n\t\tthis.userPaymentList = userPaymentList;\n\t}\n\t\n\tpublic ShoppingCart getShoppingCart() {\n\t\treturn shoppingCart;\n\t}\n\tpublic void setShoppingCart(ShoppingCart shoppingCart) {\n\t\tthis.shoppingCart = shoppingCart;\n\t}\n\t\n\tpublic List<Order> getOrderList() {\n\t\treturn orderList;\n\t}\n\tpublic void setOrderList(List<Order> orderList) {\n\t\tthis.orderList = orderList;\n\t}\n\t@Override\n\tpublic Collection<? extends GrantedAuthority> getAuthorities() {\n\t\tSet<GrantedAuthority> authorites = new HashSet<>();\n\t\tuserRoles.forEach(ur -> authorites.add(new Authority(ur.getRole().getName())));\n\t\t\n\t\treturn authorites;\n\t}\n\t@Override\n\tpublic boolean isAccountNonExpired() {\n\t\t// TODO Auto-generated method stub\n\t\treturn true;\n\t}\n\t@Override\n\tpublic boolean isAccountNonLocked() {\n\t\t// TODO Auto-generated method stub\n\t\treturn true;\n\t}\n\t@Override\n\tpublic boolean isCredentialsNonExpired() {\n\t\t// TODO Auto-generated method stub\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic boolean isEnabled() {\n\t\treturn enabled;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/UserBilling.java",
    "content": "package com.eCommerce.domain;\r\n\r\nimport jakarta.persistence.CascadeType;\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.OneToOne;\r\n\r\n@Entity\r\npublic class UserBilling {\r\n\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\tprivate String userBillingName;\r\n\tprivate String userBillingStreet1;\r\n\tprivate String userBillingStreet2;\r\n\tprivate String userBillingCity;\r\n\tprivate String userBillingState;\r\n\tprivate String userBillingCountry;\r\n\tprivate String userBillingZipcode;\r\n\r\n\t@OneToOne(cascade = CascadeType.ALL)\r\n\tprivate UserPayment userPayment;\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic String getUserBillingName() {\r\n\t\treturn userBillingName;\r\n\t}\r\n\r\n\tpublic void setUserBillingName(String userBillingName) {\r\n\t\tthis.userBillingName = userBillingName;\r\n\t}\r\n\r\n\tpublic String getUserBillingStreet1() {\r\n\t\treturn userBillingStreet1;\r\n\t}\r\n\r\n\tpublic void setUserBillingStreet1(String userBillingStreet1) {\r\n\t\tthis.userBillingStreet1 = userBillingStreet1;\r\n\t}\r\n\r\n\tpublic String getUserBillingStreet2() {\r\n\t\treturn userBillingStreet2;\r\n\t}\r\n\r\n\tpublic void setUserBillingStreet2(String userBillingStreet2) {\r\n\t\tthis.userBillingStreet2 = userBillingStreet2;\r\n\t}\r\n\r\n\tpublic String getUserBillingCity() {\r\n\t\treturn userBillingCity;\r\n\t}\r\n\r\n\tpublic void setUserBillingCity(String userBillingCity) {\r\n\t\tthis.userBillingCity = userBillingCity;\r\n\t}\r\n\r\n\tpublic String getUserBillingState() {\r\n\t\treturn userBillingState;\r\n\t}\r\n\r\n\tpublic void setUserBillingState(String userBillingState) {\r\n\t\tthis.userBillingState = userBillingState;\r\n\t}\r\n\r\n\tpublic String getUserBillingCountry() {\r\n\t\treturn userBillingCountry;\r\n\t}\r\n\r\n\tpublic void setUserBillingCountry(String userBillingCountry) {\r\n\t\tthis.userBillingCountry = userBillingCountry;\r\n\t}\r\n\r\n\tpublic String getUserBillingZipcode() {\r\n\t\treturn userBillingZipcode;\r\n\t}\r\n\r\n\tpublic void setUserBillingZipcode(String userBillingZipcode) {\r\n\t\tthis.userBillingZipcode = userBillingZipcode;\r\n\t}\r\n\r\n\tpublic UserPayment getUserPayment() {\r\n\t\treturn userPayment;\r\n\t}\r\n\r\n\tpublic void setUserPayment(UserPayment userPayment) {\r\n\t\tthis.userPayment = userPayment;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/UserPayment.java",
    "content": "package com.eCommerce.domain;\r\n\r\nimport jakarta.persistence.CascadeType;\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.JoinColumn;\r\nimport jakarta.persistence.ManyToOne;\r\nimport jakarta.persistence.OneToOne;\r\n\r\n@Entity\r\npublic class UserPayment {\r\n\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\tprivate String type;\r\n\tprivate String cardName;\r\n\tprivate String cardNumber;\r\n\tprivate int expiryMonth;\r\n\tprivate int expiryYear;\r\n\tprivate int cvc;\r\n\tprivate String holderName;\r\n\tprivate boolean defaultPayment;\r\n\t\r\n\t@ManyToOne\r\n\t@JoinColumn(name=\"user_id\")\r\n\tprivate User user;\r\n\t\r\n\t@OneToOne(cascade = CascadeType.ALL, mappedBy = \"userPayment\",orphanRemoval = true)\r\n\tprivate UserBilling userBilling;\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic String getType() {\r\n\t\treturn type;\r\n\t}\r\n\r\n\tpublic void setType(String type) {\r\n\t\tthis.type = type;\r\n\t}\r\n\r\n\tpublic String getCardName() {\r\n\t\treturn cardName;\r\n\t}\r\n\r\n\tpublic void setCardName(String cardName) {\r\n\t\tthis.cardName = cardName;\r\n\t}\r\n\r\n\tpublic String getCardNumber() {\r\n\t\treturn cardNumber;\r\n\t}\r\n\r\n\tpublic void setCardNumber(String cardNumber) {\r\n\t\tthis.cardNumber = cardNumber;\r\n\t}\r\n\r\n\tpublic int getExpiryMonth() {\r\n\t\treturn expiryMonth;\r\n\t}\r\n\r\n\tpublic void setExpiryMonth(int expiryMonth) {\r\n\t\tthis.expiryMonth = expiryMonth;\r\n\t}\r\n\r\n\tpublic int getExpiryYear() {\r\n\t\treturn expiryYear;\r\n\t}\r\n\r\n\tpublic void setExpiryYear(int expiryYear) {\r\n\t\tthis.expiryYear = expiryYear;\r\n\t}\r\n\r\n\tpublic int getCvc() {\r\n\t\treturn cvc;\r\n\t}\r\n\r\n\tpublic void setCvc(int cvc) {\r\n\t\tthis.cvc = cvc;\r\n\t}\r\n\r\n\tpublic String getHolderName() {\r\n\t\treturn holderName;\r\n\t}\r\n\r\n\tpublic void setHolderName(String holderName) {\r\n\t\tthis.holderName = holderName;\r\n\t}\r\n\r\n\tpublic boolean isDefaultPayment() {\r\n\t\treturn defaultPayment;\r\n\t}\r\n\r\n\tpublic void setDefaultPayment(boolean defaultPayment) {\r\n\t\tthis.defaultPayment = defaultPayment;\r\n\t}\r\n\r\n\tpublic User getUser() {\r\n\t\treturn user;\r\n\t}\r\n\r\n\tpublic void setUser(User user) {\r\n\t\tthis.user = user;\r\n\t}\r\n\r\n\tpublic UserBilling getUserBilling() {\r\n\t\treturn userBilling;\r\n\t}\r\n\r\n\tpublic void setUserBilling(UserBilling userBilling) {\r\n\t\tthis.userBilling = userBilling;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/UserShipping.java",
    "content": "package com.eCommerce.domain;\r\n\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.JoinColumn;\r\nimport jakarta.persistence.ManyToOne;\r\n\r\n@Entity\r\npublic class UserShipping {\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\tprivate String userShippingName;\r\n\tprivate String userShippingStreet1;\r\n\tprivate String userShippingStreet2;\r\n\tprivate String userShippingCity;\r\n\tprivate String userShippingState;\r\n\tprivate String userShippingCountry;\r\n\tprivate String userShippingZipcode;\r\n\tprivate boolean userShippingDefault;\r\n\t\r\n\t\r\n\t@ManyToOne\r\n\t@JoinColumn(name = \"user_id\")\r\n\tprivate User user;\r\n\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\r\n\tpublic String getUserShippingName() {\r\n\t\treturn userShippingName;\r\n\t}\r\n\r\n\r\n\tpublic void setUserShippingName(String userShippingName) {\r\n\t\tthis.userShippingName = userShippingName;\r\n\t}\r\n\r\n\r\n\tpublic String getUserShippingStreet1() {\r\n\t\treturn userShippingStreet1;\r\n\t}\r\n\r\n\r\n\tpublic void setUserShippingStreet1(String userShippingStreet1) {\r\n\t\tthis.userShippingStreet1 = userShippingStreet1;\r\n\t}\r\n\r\n\r\n\tpublic String getUserShippingStreet2() {\r\n\t\treturn userShippingStreet2;\r\n\t}\r\n\r\n\r\n\tpublic void setUserShippingStreet2(String userShippingStreet2) {\r\n\t\tthis.userShippingStreet2 = userShippingStreet2;\r\n\t}\r\n\r\n\r\n\tpublic String getUserShippingCity() {\r\n\t\treturn userShippingCity;\r\n\t}\r\n\r\n\r\n\tpublic void setUserShippingCity(String userShippingCity) {\r\n\t\tthis.userShippingCity = userShippingCity;\r\n\t}\r\n\r\n\r\n\tpublic String getUserShippingState() {\r\n\t\treturn userShippingState;\r\n\t}\r\n\r\n\r\n\tpublic void setUserShippingState(String userShippingState) {\r\n\t\tthis.userShippingState = userShippingState;\r\n\t}\r\n\r\n\r\n\tpublic String getUserShippingCountry() {\r\n\t\treturn userShippingCountry;\r\n\t}\r\n\r\n\r\n\tpublic void setUserShippingCountry(String userShippingCountry) {\r\n\t\tthis.userShippingCountry = userShippingCountry;\r\n\t}\r\n\r\n\r\n\tpublic String getUserShippingZipcode() {\r\n\t\treturn userShippingZipcode;\r\n\t}\r\n\r\n\r\n\tpublic void setUserShippingZipcode(String userShippingZipcode) {\r\n\t\tthis.userShippingZipcode = userShippingZipcode;\r\n\t}\r\n\r\n\r\n\tpublic User getUser() {\r\n\t\treturn user;\r\n\t}\r\n\r\n\r\n\tpublic void setUser(User user) {\r\n\t\tthis.user = user;\r\n\t}\r\n\r\n\r\n\tpublic boolean isUserShippingDefault() {\r\n\t\treturn userShippingDefault;\r\n\t}\r\n\r\n\r\n\tpublic void setUserShippingDefault(boolean userShippingDefault) {\r\n\t\tthis.userShippingDefault = userShippingDefault;\r\n\t}\r\n\t\r\n\t\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/security/Authority.java",
    "content": "package com.eCommerce.domain.security;\n\nimport org.springframework.security.core.GrantedAuthority;\n\npublic class Authority implements GrantedAuthority{\n\tprivate final String authority;\n\t\n\tpublic Authority(String authority) {\n\t\tthis.authority = authority;\n\t}\n\t\n\t@Override\n\tpublic String getAuthority() {\n\t\treturn authority;\n\t}\n}\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/security/PasswordResetToken.java",
    "content": "package com.eCommerce.domain.security;\r\n\r\nimport com.eCommerce.domain.User;\r\nimport jakarta.persistence.Entity;\r\nimport jakarta.persistence.FetchType;\r\nimport jakarta.persistence.GeneratedValue;\r\nimport jakarta.persistence.GenerationType;\r\nimport jakarta.persistence.Id;\r\nimport jakarta.persistence.JoinColumn;\r\nimport jakarta.persistence.OneToOne;\r\n\r\nimport java.util.Calendar;\r\nimport java.util.Date;\r\n\r\n@Entity\r\npublic class PasswordResetToken {\r\n\r\n\tprivate static final int EXPIRATION = 60 * 24;\r\n\t\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate Long id;\r\n\t\r\n\tprivate String token;\r\n\t\r\n\t@OneToOne(targetEntity = User.class, fetch = FetchType.EAGER)\r\n\t@JoinColumn(nullable=false, name=\"user_id\")\r\n\tprivate User user;\r\n\t\r\n\tprivate Date expiryDate;\r\n\t\r\n\tpublic PasswordResetToken(){}\r\n\t\r\n\tpublic PasswordResetToken(final String token, final User user) {\r\n\t\tsuper ();\r\n\t\t\r\n\t\tthis.token = token;\r\n\t\tthis.user = user;\r\n\t\tthis.expiryDate = calculateExpiryDate(EXPIRATION);\r\n\t}\r\n\t\r\n\tprivate Date calculateExpiryDate (final int expiryTimeInMinutes) {\r\n\t\tfinal Calendar cal = Calendar.getInstance();\r\n\t\tcal.setTimeInMillis(new Date().getTime());\r\n\t\tcal.add(Calendar.MINUTE, expiryTimeInMinutes);\r\n\t\treturn new Date(cal.getTime().getTime());\r\n\t}\r\n\t\r\n\tpublic void updateToken(final String token) {\r\n\t\tthis.token = token;\r\n\t\tthis.expiryDate = calculateExpiryDate(EXPIRATION);\r\n\t}\r\n\r\n\tpublic Long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(Long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic String getToken() {\r\n\t\treturn token;\r\n\t}\r\n\r\n\tpublic void setToken(String token) {\r\n\t\tthis.token = token;\r\n\t}\r\n\r\n\tpublic User getUser() {\r\n\t\treturn user;\r\n\t}\r\n\r\n\tpublic void setUser(User user) {\r\n\t\tthis.user = user;\r\n\t}\r\n\r\n\tpublic Date getExpiryDate() {\r\n\t\treturn expiryDate;\r\n\t}\r\n\r\n\tpublic void setExpiryDate(Date expiryDate) {\r\n\t\tthis.expiryDate = expiryDate;\r\n\t}\r\n\r\n\tpublic static int getExpiration() {\r\n\t\treturn EXPIRATION;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"PasswordResetToken [id=\" + id + \", token=\" + token + \", user=\" + user + \", expiryDate=\" + expiryDate\r\n\t\t\t\t+ \"]\";\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/security/Role.java",
    "content": "package com.eCommerce.domain.security;\n\nimport jakarta.persistence.CascadeType;\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.FetchType;\nimport jakarta.persistence.Id;\nimport jakarta.persistence.OneToMany;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\n@Entity\npublic class Role {\n\n\t@Id\n\tprivate int roleId;\n\tprivate String name;\n\n\t@OneToMany(mappedBy = \"role\", cascade = CascadeType.ALL, fetch = FetchType.LAZY)\n\tprivate Set<UserRole> userRoles = new HashSet<>();\n\n\tpublic int getRoleId() {\n\t\treturn roleId;\n\t}\n\n\tpublic void setRoleId(int roleId) {\n\t\tthis.roleId = roleId;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic Set<UserRole> getUserRoles() {\n\t\treturn userRoles;\n\t}\n\n\tpublic void setUserRoles(Set<UserRole> userRoles) {\n\t\tthis.userRoles = userRoles;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/com/eCommerce/domain/security/UserRole.java",
    "content": "package com.eCommerce.domain.security;\n\nimport com.eCommerce.domain.User;\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.FetchType;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.GenerationType;\nimport jakarta.persistence.Id;\nimport jakarta.persistence.JoinColumn;\nimport jakarta.persistence.ManyToOne;\nimport jakarta.persistence.Table;\n\n@Entity\n@Table(name=\"user_role\")\npublic class UserRole {\n\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.AUTO)\n\tprivate Long userRoleId;\n\t\n\t@ManyToOne(fetch = FetchType.EAGER)\n\t@JoinColumn(name=\"user_id\")\n\tprivate User user;\n\t\n\t@ManyToOne(fetch = FetchType.EAGER)\n\t@JoinColumn(name=\"role_id\")\n\tprivate Role role;\n\t\n\tpublic UserRole(){}\n\t\n\tpublic UserRole(User user, Role role) {\n\t\tthis.user = user;\n\t\tthis.role = role;\n\t}\n\n\n\tpublic Long getUserRoleId() {\n\t\treturn userRoleId;\n\t}\n\n\n\tpublic void setUserRoleId(Long userRoleId) {\n\t\tthis.userRoleId = userRoleId;\n\t}\n\n\n\tpublic User getUser() {\n\t\treturn user;\n\t}\n\n\n\tpublic void setUser(User user) {\n\t\tthis.user = user;\n\t}\n\n\n\tpublic Role getRole() {\n\t\treturn role;\n\t}\n\n\n\tpublic void setRole(Role role) {\n\t\tthis.role = role;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/com/eCommerce/repository/BookRepository.java",
    "content": "package com.eCommerce.repository;\r\n\r\n\r\nimport java.util.List;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\n\r\nimport com.eCommerce.domain.Book;\r\n\r\npublic interface BookRepository extends CrudRepository<Book, Long>{\r\n\t\r\nList<Book> findByCategory(String category);\r\n\t\r\n\tList<Book> findByTitleContaining(String title);\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/repository/BookToCartItemRepository.java",
    "content": "package com.eCommerce.repository;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\nimport org.springframework.transaction.annotation.Transactional;\r\n\r\nimport com.eCommerce.domain.BookToCartItem;\r\nimport com.eCommerce.domain.CartItem;\r\n\r\n@Transactional\r\npublic interface BookToCartItemRepository extends CrudRepository<BookToCartItem, Long> {\r\n\t\r\n\tvoid deleteByCartItem(CartItem cartItem);\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/repository/CartItemRepository.java",
    "content": "package com.eCommerce.repository;\r\n\r\nimport java.util.List;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\n\r\nimport com.eCommerce.domain.CartItem;\r\nimport com.eCommerce.domain.Order;\r\nimport com.eCommerce.domain.ShoppingCart;\r\n\r\n\r\npublic interface CartItemRepository extends CrudRepository<CartItem, Long>{\r\n\t\r\n\tList<CartItem> findByShoppingCart(ShoppingCart shoppingCart);\r\n\t\r\n\tList<CartItem> findByOrder(Order order);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/repository/OrderRepository.java",
    "content": "package com.eCommerce.repository;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\n\r\nimport com.eCommerce.domain.Order;\r\n\r\npublic interface OrderRepository extends CrudRepository<Order, Long>{\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/repository/PasswordResetTokenRepository.java",
    "content": "package com.eCommerce.repository;\r\n\r\nimport java.util.Date;\r\nimport java.util.stream.Stream;\r\n\r\nimport org.springframework.data.jpa.repository.JpaRepository;\r\nimport org.springframework.data.jpa.repository.Modifying;\r\nimport org.springframework.data.jpa.repository.Query;\r\n\r\nimport com.eCommerce.domain.User;\r\nimport com.eCommerce.domain.security.PasswordResetToken;\r\n\r\npublic interface PasswordResetTokenRepository extends JpaRepository<PasswordResetToken, Long> {\r\n\t\r\n\tPasswordResetToken findByToken(String token);\r\n\t\r\n\tPasswordResetToken findByUser(User user);\r\n\t\r\n\tStream<PasswordResetToken> findAllByExpiryDateLessThan(Date now);\r\n\t\r\n\t@Modifying\r\n\t@Query(\"delete from PasswordResetToken t where t.expiryDate <= ?1\")\r\n\tvoid deleteAllExpiredSince(Date now);\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/repository/RoleRepository.java",
    "content": "package com.eCommerce.repository;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\n\r\nimport com.eCommerce.domain.security.Role;\r\n\r\npublic interface RoleRepository extends CrudRepository<Role, Long> {\r\n\tRole findByname(String name);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/repository/ShoppingCartRepository.java",
    "content": "package com.eCommerce.repository;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\n\r\nimport com.eCommerce.domain.ShoppingCart;\r\n\r\npublic interface ShoppingCartRepository extends CrudRepository<ShoppingCart, Long> {\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/repository/UserPaymentRepository.java",
    "content": "package com.eCommerce.repository;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\n\r\nimport com.eCommerce.domain.UserPayment;\r\n\r\npublic interface UserPaymentRepository extends CrudRepository<UserPayment, Long>{\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/repository/UserRepository.java",
    "content": "package com.eCommerce.repository;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\n\r\nimport com.eCommerce.domain.User;\r\n\r\npublic interface UserRepository extends CrudRepository<User, Long> {\r\n\tUser findByUsername(String username);\r\n\t\r\n\tUser findByEmail(String email);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/repository/UserShippingRepository.java",
    "content": "package com.eCommerce.repository;\r\n\r\nimport org.springframework.data.repository.CrudRepository;\r\n\r\nimport com.eCommerce.domain.UserShipping;\r\n\r\npublic interface UserShippingRepository extends CrudRepository<UserShipping, Long> {\r\n\t\r\n\t\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/BillingAddressService.java",
    "content": "package com.eCommerce.service;\r\n\r\nimport com.eCommerce.domain.BillingAddress;\r\nimport com.eCommerce.domain.UserBilling;\r\n\r\npublic interface BillingAddressService {\r\n\tBillingAddress setByUserBilling(UserBilling userBilling, BillingAddress billingAddress);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/BookService.java",
    "content": "package com.eCommerce.service;\r\n\r\nimport java.util.List;\r\n\r\nimport com.eCommerce.domain.Book;\r\n\r\n\r\npublic interface BookService {\r\n\tList<Book> findAll ();\r\n\t\r\n\tBook findById(Long id);\r\n\t\r\n\tList<Book> findByCategory(String category);\r\n\t\r\n\tList<Book> blurrySearch(String title);\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/CartItemService.java",
    "content": "package com.eCommerce.service;\r\n\r\nimport java.util.List;\r\n\r\nimport com.eCommerce.domain.Book;\r\nimport com.eCommerce.domain.CartItem;\r\nimport com.eCommerce.domain.Order;\r\nimport com.eCommerce.domain.ShoppingCart;\r\nimport com.eCommerce.domain.User;\r\n\r\npublic interface CartItemService {\r\n\tList<CartItem> findByShoppingCart(ShoppingCart shoppingCart);\r\n\t\r\n\tCartItem updateCartItem(CartItem cartItem);\r\n\t\r\n\tCartItem addBookToCartItem(Book book, User user, int qty);\r\n\t\r\n\tCartItem findById(Long id);\r\n\t\r\n\tvoid removeCartItem(CartItem cartItem);\r\n\t\r\n\tCartItem save(CartItem cartItem);\r\n\t\r\n\tList<CartItem> findByOrder(Order order);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/OrderService.java",
    "content": "package com.eCommerce.service;\r\n\r\nimport com.eCommerce.domain.BillingAddress;\r\nimport com.eCommerce.domain.Order;\r\nimport com.eCommerce.domain.Payment;\r\nimport com.eCommerce.domain.ShippingAddress;\r\nimport com.eCommerce.domain.ShoppingCart;\r\nimport com.eCommerce.domain.User;\r\n\r\npublic interface OrderService {\r\n\tOrder createOrder(ShoppingCart shoppingCart,\r\n\t\t\tShippingAddress shippingAddress,\r\n\t\t\tBillingAddress billingAddress,\r\n\t\t\tPayment payment,\r\n\t\t\tString shippingMethod,\r\n\t\t\tUser user);\r\n\t\r\n\tOrder findById(Long id);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/PaymentService.java",
    "content": "package com.eCommerce.service;\r\n\r\nimport com.eCommerce.domain.Payment;\r\nimport com.eCommerce.domain.UserPayment;\r\n\r\npublic interface PaymentService {\r\n\tPayment setByUserPayment(UserPayment userPayment, Payment payment);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/ShippingAddressService.java",
    "content": "package com.eCommerce.service;\r\n\r\nimport com.eCommerce.domain.ShippingAddress;\r\nimport com.eCommerce.domain.UserShipping;\r\n\r\npublic interface ShippingAddressService {\r\n\tShippingAddress setByUserShipping(UserShipping userShipping, ShippingAddress shippingAddress);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/ShoppingCartService.java",
    "content": "package com.eCommerce.service;\r\n\r\nimport com.eCommerce.domain.ShoppingCart;\r\n\r\npublic interface ShoppingCartService {\r\n\tShoppingCart updateShoppingCart(ShoppingCart shoppingCart);\r\n\t\r\n\tvoid clearShoppingCart(ShoppingCart shoppingCart);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/UserPaymentService.java",
    "content": "package com.eCommerce.service;\r\n\r\nimport com.eCommerce.domain.UserPayment;\r\n\r\npublic interface UserPaymentService {\r\n\tUserPayment findById(Long id);\r\n\r\n\tvoid deleteById(Long id);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/UserService.java",
    "content": "package com.eCommerce.service;\r\n\r\nimport java.util.Set;\r\n\r\nimport com.eCommerce.domain.User;\r\nimport com.eCommerce.domain.UserBilling;\r\nimport com.eCommerce.domain.UserPayment;\r\nimport com.eCommerce.domain.UserShipping;\r\nimport com.eCommerce.domain.security.PasswordResetToken;\r\nimport com.eCommerce.domain.security.UserRole;\r\n\r\n\r\n\r\npublic interface UserService {\r\n\tPasswordResetToken getPasswordResetToken(final String token);\r\n\t\r\n\tvoid createPasswordResetTokenForUser(final User user, final String token);\r\n\t\r\n\tUser findByUsername(String username);\r\n\t\r\n\tUser findByEmail (String email);\r\n\t\r\n\tUser findById(Long id);\r\n\t\r\n\tUser createUser(User user, Set<UserRole> userRoles) throws Exception;\r\n\t\r\n\tUser save(User user);\r\n\t\r\n\tvoid updateUserBilling(UserBilling userBilling, UserPayment userPayment, User user);\r\n\t\r\n\tvoid updateUserShipping(UserShipping userShipping, User user);\r\n\t\r\n\tvoid setUserDefaultPayment(Long userPaymentId, User user);\r\n\t\r\n\tvoid setUserDefaultShipping(Long userShippingId, User user);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/UserShippingService.java",
    "content": "package com.eCommerce.service;\r\n\r\nimport com.eCommerce.domain.UserShipping;\r\n\r\npublic interface UserShippingService {\r\n\tUserShipping findById(Long id);\r\n\t\r\n\tvoid deleteById(Long id);\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/impl/BillingAddressServiceImpl.java",
    "content": "package com.eCommerce.service.impl;\r\n\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.eCommerce.domain.BillingAddress;\r\nimport com.eCommerce.domain.UserBilling;\r\nimport com.eCommerce.service.BillingAddressService;\r\n\r\n@Service\r\npublic class BillingAddressServiceImpl implements BillingAddressService{\r\n\t\r\n\tpublic BillingAddress setByUserBilling(UserBilling userBilling, BillingAddress billingAddress) {\r\n\t\t\r\n\t\tbillingAddress.setBillingAddressName(userBilling.getUserBillingName());\r\n\t\tbillingAddress.setBillingAddressStreet1(userBilling.getUserBillingStreet1());\r\n\t\tbillingAddress.setBillingAddressStreet2(userBilling.getUserBillingStreet2());\r\n\t\tbillingAddress.setBillingAddressCity(userBilling.getUserBillingCity());\r\n\t\tbillingAddress.setBillingAddressState(userBilling.getUserBillingState());\r\n\t\tbillingAddress.setBillingAddressCountry(userBilling.getUserBillingCountry());\r\n\t\tbillingAddress.setBillingAddressZipcode(userBilling.getUserBillingZipcode());\r\n\t\t\r\n\t\treturn billingAddress;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/impl/BookServiceImpl.java",
    "content": "package com.eCommerce.service.impl;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.eCommerce.domain.Book;\r\nimport com.eCommerce.repository.BookRepository;\r\nimport com.eCommerce.service.BookService;\r\n\r\n@Service\r\npublic class BookServiceImpl implements BookService{\r\n\t@Autowired\r\n\tprivate BookRepository bookRepository;\r\n\t\r\n\tpublic List<Book> findAll() {\r\n\t\tList<Book> bookList = (List<Book>) bookRepository.findAll();\r\n\t\tList<Book> activeBookList = new ArrayList<>();\r\n\t\t\r\n\t\tfor (Book book: bookList) {\r\n\t\t\tif(book.isActive()) {\r\n\t\t\t\tactiveBookList.add(book);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn activeBookList;\r\n\t}\r\n\t\r\n\tpublic Book findById(Long id) {\r\n\t\treturn bookRepository.findById(id).orElse(null);\r\n\t}\r\n\t\r\n\tpublic List<Book> findByCategory(String category){\r\n\t\tList<Book> bookList = bookRepository.findByCategory(category);\r\n\t\t\r\n\t\tList<Book> activeBookList = new ArrayList<>();\r\n\t\t\r\n\t\tfor (Book book: bookList) {\r\n\t\t\tif(book.isActive()) {\r\n\t\t\t\tactiveBookList.add(book);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn activeBookList;\r\n\t}\r\n\t\r\n\tpublic List<Book> blurrySearch(String title) {\r\n\t\tList<Book> bookList = bookRepository.findByTitleContaining(title);\r\n        List<Book> activeBookList = new ArrayList<>();\r\n\t\t\r\n\t\tfor (Book book: bookList) {\r\n\t\t\tif(book.isActive()) {\r\n\t\t\t\tactiveBookList.add(book);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn activeBookList;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/impl/CartItemServiceImpl.java",
    "content": "package com.eCommerce.service.impl;\r\n\r\nimport java.math.BigDecimal;\r\nimport java.util.List;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.eCommerce.domain.Book;\r\nimport com.eCommerce.domain.BookToCartItem;\r\nimport com.eCommerce.domain.CartItem;\r\nimport com.eCommerce.domain.Order;\r\nimport com.eCommerce.domain.ShoppingCart;\r\nimport com.eCommerce.domain.User;\r\nimport com.eCommerce.repository.BookToCartItemRepository;\r\nimport com.eCommerce.repository.CartItemRepository;\r\nimport com.eCommerce.service.CartItemService;\r\n\r\n@Service\r\npublic class CartItemServiceImpl implements CartItemService{\r\n\t\r\n\t@Autowired\r\n\tprivate CartItemRepository cartItemRepository;\r\n\t\r\n\t@Autowired\r\n\tprivate BookToCartItemRepository bookToCartItemRepository;\r\n\t\r\n\tpublic List<CartItem> findByShoppingCart(ShoppingCart shoppingCart) {\r\n\t\treturn cartItemRepository.findByShoppingCart(shoppingCart);\r\n\t}\r\n\t\r\n\tpublic CartItem updateCartItem(CartItem cartItem) {\r\n\t\tBigDecimal bigDecimal = new BigDecimal(cartItem.getBook().getOurPrice()).multiply(new BigDecimal(cartItem.getQty()));\r\n\t\t\r\n\t\tbigDecimal = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);\r\n\t\tcartItem.setSubtotal(bigDecimal);\r\n\t\t\r\n\t\tcartItemRepository.save(cartItem);\r\n\t\t\r\n\t\treturn cartItem;\r\n\t}\r\n\t\r\n\tpublic CartItem addBookToCartItem(Book book, User user, int qty) {\r\n\t\tList<CartItem> cartItemList = findByShoppingCart(user.getShoppingCart());\r\n\t\t\r\n\t\tfor (CartItem cartItem : cartItemList) {\r\n\t\t\tif(book.getId() == cartItem.getBook().getId()) {\r\n\t\t\t\tcartItem.setQty(cartItem.getQty()+qty);\r\n\t\t\t\tcartItem.setSubtotal(new BigDecimal(book.getOurPrice()).multiply(new BigDecimal(qty)));\r\n\t\t\t\tcartItemRepository.save(cartItem);\r\n\t\t\t\treturn cartItem;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tCartItem cartItem = new CartItem();\r\n\t\tcartItem.setShoppingCart(user.getShoppingCart());\r\n\t\tcartItem.setBook(book);\r\n\t\t\r\n\t\tcartItem.setQty(qty);\r\n\t\tcartItem.setSubtotal(new BigDecimal(book.getOurPrice()).multiply(new BigDecimal(qty)));\r\n\t\tcartItem = cartItemRepository.save(cartItem);\r\n\t\t\r\n\t\tBookToCartItem bookToCartItem = new BookToCartItem();\r\n\t\tbookToCartItem.setBook(book);\r\n\t\tbookToCartItem.setCartItem(cartItem);\r\n\t\tbookToCartItemRepository.save(bookToCartItem);\r\n\t\t\r\n\t\treturn cartItem;\r\n\t}\r\n\t\r\n\tpublic CartItem findById(Long id) {\r\n\t\treturn cartItemRepository.findById(id).orElse(null);\r\n\t}\r\n\t\r\n\tpublic void removeCartItem(CartItem cartItem) {\r\n\t\tbookToCartItemRepository.deleteByCartItem(cartItem);\r\n\t\tcartItemRepository.delete(cartItem);\r\n\t}\r\n\t\r\n\tpublic CartItem save(CartItem cartItem) {\r\n\t\treturn cartItemRepository.save(cartItem);\r\n\t}\r\n\t\r\n\tpublic List<CartItem> findByOrder(Order order) {\r\n\t\treturn cartItemRepository.findByOrder(order);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/impl/OrderServiceImpl.java",
    "content": "package com.eCommerce.service.impl;\r\n\r\nimport java.util.Calendar;\r\nimport java.util.List;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.eCommerce.domain.BillingAddress;\r\nimport com.eCommerce.domain.Book;\r\nimport com.eCommerce.domain.CartItem;\r\nimport com.eCommerce.domain.Order;\r\nimport com.eCommerce.domain.Payment;\r\nimport com.eCommerce.domain.ShippingAddress;\r\nimport com.eCommerce.domain.ShoppingCart;\r\nimport com.eCommerce.domain.User;\r\nimport com.eCommerce.repository.OrderRepository;\r\nimport com.eCommerce.service.CartItemService;\r\nimport com.eCommerce.service.OrderService;\r\n\r\n\r\n@Service\r\npublic class OrderServiceImpl implements OrderService{\r\n\t\r\n\t@Autowired\r\n\tprivate OrderRepository orderRepository;\r\n\t\r\n\t@Autowired\r\n\tprivate CartItemService cartItemService;\r\n\t\r\n\tpublic synchronized Order createOrder(ShoppingCart shoppingCart,\r\n\t\t\tShippingAddress shippingAddress,\r\n\t\t\tBillingAddress billingAddress,\r\n\t\t\tPayment payment,\r\n\t\t\tString shippingMethod,\r\n\t\t\tUser user) {\r\n\t\tOrder order = new Order();\r\n\t\torder.setBillingAddress(billingAddress);\r\n\t\torder.setOrderStatus(\"created\");\r\n\t\torder.setPayment(payment);\r\n\t\torder.setShippingAddress(shippingAddress);\r\n\t\torder.setShippingMethod(shippingMethod);\r\n\t\t\r\n\t\tList<CartItem> cartItemList = cartItemService.findByShoppingCart(shoppingCart);\r\n\t\t\r\n\t\tfor(CartItem cartItem : cartItemList) {\r\n\t\t\tBook book = cartItem.getBook();\r\n\t\t\tcartItem.setOrder(order);\r\n\t\t\tbook.setInStockNumber(book.getInStockNumber() - cartItem.getQty());\r\n\t\t}\r\n\t\t\r\n\t\torder.setCartItemList(cartItemList);\r\n\t\torder.setOrderDate(Calendar.getInstance().getTime());\r\n\t\torder.setOrderTotal(shoppingCart.getGrandTotal());\r\n\t\tshippingAddress.setOrder(order);\r\n\t\tbillingAddress.setOrder(order);\r\n\t\tpayment.setOrder(order);\r\n\t\torder.setUser(user);\r\n\t\torder = orderRepository.save(order);\r\n\t\t\r\n\t\treturn order;\r\n\t}\r\n\t\r\n\tpublic Order findById(Long id) {\r\n\t\treturn orderRepository.findById(id).orElse(null);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/impl/PaymentServiceImpl.java",
    "content": "package com.eCommerce.service.impl;\r\n\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.eCommerce.domain.Payment;\r\nimport com.eCommerce.domain.UserPayment;\r\nimport com.eCommerce.service.PaymentService;\r\n\r\n@Service\r\npublic class PaymentServiceImpl implements PaymentService{\r\n\t\r\n\tpublic Payment setByUserPayment(UserPayment userPayment, Payment payment) {\r\n\t\t\r\n\t\tpayment.setType(userPayment.getType());\r\n\t\tpayment.setHolderName(userPayment.getHolderName());\r\n\t\tpayment.setCardNumber(userPayment.getCardNumber());\r\n\t\tpayment.setExpiryMonth(userPayment.getExpiryMonth());\r\n\t\tpayment.setExpiryYear(userPayment.getExpiryYear());\r\n\t\tpayment.setCvc(userPayment.getCvc());\r\n\t\t\r\n\t\treturn payment;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/impl/ShippingAddressServiceImpl.java",
    "content": "package com.eCommerce.service.impl;\r\n\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.eCommerce.domain.ShippingAddress;\r\nimport com.eCommerce.domain.UserShipping;\r\nimport com.eCommerce.service.ShippingAddressService;\r\n\r\n@Service\r\npublic class ShippingAddressServiceImpl implements ShippingAddressService {\r\n\t\r\n\tpublic ShippingAddress setByUserShipping(UserShipping userShipping, ShippingAddress shippingAddress) {\r\n\t\t\r\n\t\tshippingAddress.setShippingAddressName(userShipping.getUserShippingName());\r\n\t\tshippingAddress.setShippingAddressStreet1(userShipping.getUserShippingStreet1());\r\n\t\tshippingAddress.setShippingAddressStreet2(userShipping.getUserShippingStreet2());\r\n\t\tshippingAddress.setShippingAddressCity(userShipping.getUserShippingCity());\r\n\t\tshippingAddress.setShippingAddressState(userShipping.getUserShippingState());\r\n\t\tshippingAddress.setShippingAddressCountry(userShipping.getUserShippingCountry());\r\n\t\tshippingAddress.setShippingAddressZipcode(userShipping.getUserShippingZipcode());\r\n\t\t\r\n\t\treturn shippingAddress;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/impl/ShoppingCartServiceImpl.java",
    "content": "package com.eCommerce.service.impl;\r\n\r\nimport java.math.BigDecimal;\r\nimport java.util.List;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.eCommerce.domain.CartItem;\r\nimport com.eCommerce.domain.ShoppingCart;\r\nimport com.eCommerce.repository.ShoppingCartRepository;\r\nimport com.eCommerce.service.CartItemService;\r\nimport com.eCommerce.service.ShoppingCartService;\r\n\r\n@Service\r\npublic class ShoppingCartServiceImpl implements ShoppingCartService{\r\n\t\r\n\t@Autowired\r\n\tprivate CartItemService cartItemService;\r\n\t\r\n\t@Autowired\r\n\tprivate ShoppingCartRepository shoppingCartRepository;\r\n\t\r\n\tpublic ShoppingCart updateShoppingCart(ShoppingCart shoppingCart) {\r\n\t\tBigDecimal cartTotal = new BigDecimal(0);\r\n\t\t\r\n\t\tList<CartItem> cartItemList = cartItemService.findByShoppingCart(shoppingCart);\r\n\t\t\r\n\t\tfor (CartItem cartItem : cartItemList) {\r\n\t\t\tif(cartItem.getBook().getInStockNumber() > 0) {\r\n\t\t\t\tcartItemService.updateCartItem(cartItem);\r\n\t\t\t\tcartTotal = cartTotal.add(cartItem.getSubtotal());\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tshoppingCart.setGrandTotal(cartTotal);\r\n\t\t\r\n\t\tshoppingCartRepository.save(shoppingCart);\r\n\t\t\r\n\t\treturn shoppingCart;\r\n\t}\r\n\t\r\n\tpublic void clearShoppingCart(ShoppingCart shoppingCart) {\r\n\t\tList<CartItem> cartItemList = cartItemService.findByShoppingCart(shoppingCart);\r\n\t\t\r\n\t\tfor (CartItem cartItem : cartItemList) {\r\n\t\t\tcartItem.setShoppingCart(null);\r\n\t\t\tcartItemService.save(cartItem);\r\n\t\t}\r\n\t\t\r\n\t\tshoppingCart.setGrandTotal(new BigDecimal(0));\r\n\t\t\r\n\t\tshoppingCartRepository.save(shoppingCart);\r\n\t}\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/impl/UserPaymentServiceImpl.java",
    "content": "package com.eCommerce.service.impl;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.eCommerce.domain.UserPayment;\r\nimport com.eCommerce.repository.UserPaymentRepository;\r\nimport com.eCommerce.service.UserPaymentService;\r\n\r\n\r\n@Service\r\npublic class UserPaymentServiceImpl implements UserPaymentService{\r\n\r\n\t@Autowired\r\n\tprivate UserPaymentRepository userPaymentRepository;\r\n\t\t\r\n\tpublic UserPayment findById(Long id) {\r\n\t\treturn userPaymentRepository.findById(id).orElse(null);\r\n\t}\r\n\t\r\n\tpublic void deleteById(Long id) {\r\n\t\tuserPaymentRepository.deleteById(id);\r\n\t}\r\n} \r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/impl/UserSecurityService.java",
    "content": "package com.eCommerce.service.impl;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.security.core.userdetails.UserDetails;\r\nimport org.springframework.security.core.userdetails.UserDetailsService;\r\nimport org.springframework.security.core.userdetails.UsernameNotFoundException;\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.eCommerce.domain.User;\r\nimport com.eCommerce.repository.UserRepository;\r\n\r\n@Service\r\npublic class UserSecurityService implements UserDetailsService{\r\n\t\r\n\t@Autowired\r\n\tprivate UserRepository userRepository;\r\n\t\r\n\t@Override\r\n\tpublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {\r\n\t\tUser user = userRepository.findByUsername(username);\r\n\t\t\r\n\t\tif(null == user) {\r\n\t\t\tthrow new UsernameNotFoundException(\"Username not found\");\r\n\t\t}\r\n\t\t\r\n\t\treturn user;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/impl/UserServiceImpl.java",
    "content": "package com.eCommerce.service.impl;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\nimport java.util.Set;\r\n\r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Service;\r\nimport org.springframework.transaction.annotation.Transactional;\r\n\r\nimport com.eCommerce.domain.ShoppingCart;\r\nimport com.eCommerce.domain.User;\r\nimport com.eCommerce.domain.UserBilling;\r\nimport com.eCommerce.domain.UserPayment;\r\nimport com.eCommerce.domain.UserShipping;\r\nimport com.eCommerce.domain.security.PasswordResetToken;\r\nimport com.eCommerce.domain.security.UserRole;\r\nimport com.eCommerce.repository.PasswordResetTokenRepository;\r\nimport com.eCommerce.repository.RoleRepository;\r\nimport com.eCommerce.repository.UserPaymentRepository;\r\nimport com.eCommerce.repository.UserRepository;\r\nimport com.eCommerce.repository.UserShippingRepository;\r\nimport com.eCommerce.service.UserService;\r\n\r\n\r\n@Service\r\npublic class UserServiceImpl implements UserService{\r\n\t\r\n\tprivate static final Logger LOG = LoggerFactory.getLogger(UserService.class);\r\n\t\r\n\t@Autowired\r\n\tprivate UserRepository userRepository;\r\n\t\r\n\t@Autowired\r\n\tprivate RoleRepository roleRepository;\r\n\t\r\n\t@Autowired\r\n\tprivate UserPaymentRepository userPaymentRepository;\r\n\t\r\n\t@Autowired\r\n\tprivate UserShippingRepository userShippingRepository;\r\n\t\r\n\t@Autowired\r\n\tprivate PasswordResetTokenRepository passwordResetTokenRepository;\r\n\t\r\n\t@Override\r\n\tpublic PasswordResetToken getPasswordResetToken(final String token) {\r\n\t\treturn passwordResetTokenRepository.findByToken(token);\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void createPasswordResetTokenForUser(final User user, final String token) {\r\n\t\tfinal PasswordResetToken myToken = new PasswordResetToken(token, user);\r\n\t\tpasswordResetTokenRepository.save(myToken);\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic User findByUsername(String username) {\r\n\t\treturn userRepository.findByUsername(username);\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic User findById(Long id){\r\n\t\treturn userRepository.findById(id).orElse(null);\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic User findByEmail (String email) {\r\n\t\treturn userRepository.findByEmail(email);\r\n\t}\r\n\t\r\n\t@Override\r\n\t@Transactional\r\n\tpublic User createUser(User user, Set<UserRole> userRoles){\r\n\t\tUser localUser = userRepository.findByUsername(user.getUsername());\r\n\t\t\r\n\t\tif(localUser != null) {\r\n\t\t\tLOG.info(\"user {} already exists. Nothing will be done.\", user.getUsername());\r\n\t\t} else {\r\n\t\t\tfor (UserRole ur : userRoles) {\r\n\t\t\t\troleRepository.save(ur.getRole());\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tuser.getUserRoles().addAll(userRoles);\r\n\t\t\t\r\n\t\t\tShoppingCart shoppingCart = new ShoppingCart();\r\n\t\t\tshoppingCart.setUser(user);\r\n\t\t\tuser.setShoppingCart(shoppingCart);\r\n\t\t\t\r\n\t\t\tuser.setUserShippingList(new ArrayList<UserShipping>());\r\n\t\t\tuser.setUserPaymentList(new ArrayList<UserPayment>());\r\n\t\t\t\r\n\t\t\tlocalUser = userRepository.save(user);\r\n\t\t}\r\n\t\t\r\n\t\treturn localUser;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic User save(User user) {\r\n\t\treturn userRepository.save(user);\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void updateUserBilling(UserBilling userBilling, UserPayment userPayment, User user) {\r\n\t\tuserPayment.setUser(user);\r\n\t\tuserPayment.setUserBilling(userBilling);\r\n\t\tuserPayment.setDefaultPayment(true);\r\n\t\tuserBilling.setUserPayment(userPayment);\r\n\t\tuser.getUserPaymentList().add(userPayment);\r\n\t\tsave(user);\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void updateUserShipping(UserShipping userShipping, User user){\r\n\t\tuserShipping.setUser(user);\r\n\t\tuserShipping.setUserShippingDefault(true);\r\n\t\tuser.getUserShippingList().add(userShipping);\r\n\t\tsave(user);\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void setUserDefaultPayment(Long userPaymentId, User user) {\r\n\t\tList<UserPayment> userPaymentList = (List<UserPayment>) userPaymentRepository.findAll();\r\n\t\t\r\n\t\tfor (UserPayment userPayment : userPaymentList) {\r\n\t\t\tif(userPayment.getId() == userPaymentId) {\r\n\t\t\t\tuserPayment.setDefaultPayment(true);\r\n\t\t\t\tuserPaymentRepository.save(userPayment);\r\n\t\t\t} else {\r\n\t\t\t\tuserPayment.setDefaultPayment(false);\r\n\t\t\t\tuserPaymentRepository.save(userPayment);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void setUserDefaultShipping(Long userShippingId, User user) {\r\n\t\tList<UserShipping> userShippingList = (List<UserShipping>) userShippingRepository.findAll();\r\n\t\t\r\n\t\tfor (UserShipping userShipping : userShippingList) {\r\n\t\t\tif(userShipping.getId() == userShippingId) {\r\n\t\t\t\tuserShipping.setUserShippingDefault(true);\r\n\t\t\t\tuserShippingRepository.save(userShipping);\r\n\t\t\t} else {\r\n\t\t\t\tuserShipping.setUserShippingDefault(false);\r\n\t\t\t\tuserShippingRepository.save(userShipping);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/service/impl/UserShippingServiceImpl.java",
    "content": "package com.eCommerce.service.impl;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport com.eCommerce.domain.UserShipping;\r\nimport com.eCommerce.repository.UserShippingRepository;\r\nimport com.eCommerce.service.UserShippingService;\r\n\r\n@Service\r\npublic class UserShippingServiceImpl implements UserShippingService{\r\n\t\r\n\t@Autowired\r\n\tprivate UserShippingRepository userShippingRepository;\r\n\t\r\n\t\r\n\tpublic UserShipping findById(Long id) {\r\n\t\treturn userShippingRepository.findById(id).orElse(null);\r\n\t}\r\n\t\r\n\tpublic void deleteById(Long id) {\r\n\t\tuserShippingRepository.deleteById(id);\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/utility/MailConstructor.java",
    "content": "package com.eCommerce.utility;\r\n\r\nimport com.eCommerce.domain.Order;\r\nimport com.eCommerce.domain.User;\r\nimport jakarta.mail.internet.InternetAddress;\r\nimport jakarta.mail.internet.MimeMessage;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.core.env.Environment;\r\nimport org.springframework.mail.SimpleMailMessage;\r\nimport org.springframework.mail.javamail.MimeMessageHelper;\r\nimport org.springframework.mail.javamail.MimeMessagePreparator;\r\nimport org.springframework.stereotype.Component;\r\nimport org.thymeleaf.TemplateEngine;\r\nimport org.thymeleaf.context.Context;\r\n\r\nimport java.util.Locale;\r\n\r\n\r\n@Component\r\npublic class MailConstructor {\r\n\t\r\n\t@Autowired\r\n\tprivate TemplateEngine templateEngine;\r\n\t\r\n\t@Autowired\r\n\tprivate Environment env;\r\n\t\r\n\tpublic SimpleMailMessage constructResetTokenEmail(\r\n\t\t\tString contextPath, Locale locale, String token, User user, String password\r\n\t\t\t) {\r\n\t\t\r\n\t\tString url = contextPath + \"/newUser?token=\"+token;\r\n\t\tString message = \"\\nPlease click on this link to verify your email and edit your personal information. Your password is: \\n\"+password;\r\n\t\tSimpleMailMessage email = new SimpleMailMessage();\r\n\t\temail.setTo(user.getEmail());\r\n\t\temail.setSubject(\"E-Commerce - New User\");\r\n\t\temail.setText(url+message);\r\n\t\temail.setFrom(env.getProperty(\"support.email\"));\r\n\t\treturn email;\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic MimeMessagePreparator constructOrderConfirmationEmail (User user, Order order, Locale locale) {\r\n\t\tContext context = new Context();\r\n\t\tcontext.setVariable(\"order\", order);\r\n\t\tcontext.setVariable(\"user\", user);\r\n\t\tcontext.setVariable(\"cartItemList\", order.getCartItemList());\r\n\t\tString text = templateEngine.process(\"orderConfirmationEmailTemplate\", context);\r\n\t\t\r\n\t\tMimeMessagePreparator messagePreparator = new MimeMessagePreparator() {\r\n\t\t\t@Override\r\n\t\t\tpublic void prepare(MimeMessage mimeMessage) throws Exception {\r\n\t\t\t\tMimeMessageHelper email = new MimeMessageHelper(mimeMessage);\r\n\t\t\t\temail.setTo(user.getEmail());\r\n\t\t\t\temail.setSubject(\"Order Confirmation - \"+order.getId());\r\n\t\t\t\temail.setText(text, true);\r\n\t\t\t\temail.setFrom(new InternetAddress(\"foysal.ecommerce@gmail.com\"));\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\treturn messagePreparator;\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/utility/SecurityUtility.java",
    "content": "package com.eCommerce.utility;\r\n\r\nimport java.security.SecureRandom;\r\nimport java.util.Random;\r\n\r\nimport org.springframework.context.annotation.Bean;\r\nimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\r\nimport org.springframework.stereotype.Component;\r\n\r\n@Component\r\npublic class SecurityUtility {\r\n\tprivate static final String SALT = \"salt\"; // Salt should be protected carefully\r\n\t\r\n\t@Bean\r\n\tpublic static BCryptPasswordEncoder passwordEncoder() {\r\n\t\treturn new BCryptPasswordEncoder(12, new SecureRandom(SALT.getBytes()));\r\n\t}\r\n\t\r\n\t@Bean\r\n\tpublic static String randomPassword() {\r\n\t\tString SALTCHARS = \"ABCEFGHIJKLMNOPQRSTUVWXYZ1234567890\";\r\n\t\tStringBuilder salt = new StringBuilder();\r\n\t\tRandom rnd = new Random();\r\n\t\t\r\n\t\twhile (salt.length()<18) {\r\n\t\t\tint index= (int) (rnd.nextFloat()*SALTCHARS.length());\r\n\t\t\tsalt.append(SALTCHARS.charAt(index));\r\n\t\t}\r\n\t\tString saltStr = salt.toString();\r\n\t\treturn saltStr;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/main/java/com/eCommerce/utility/USConstants.java",
    "content": "package com.eCommerce.utility;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\npublic class USConstants {\n\t\n\tpublic final static String US = \"US\";\n\t\n\tpublic final static Map<String, String> mapOfUSStates = new HashMap<String, String>() {\n\t\t{\n\t\t\tput(\"Barisal\", \"Barisal\");\n\t\t\tput(\"Dhaka\", \"Dhaka\");\n\t\t\tput(\"Chittagong\", \"Chittagong\");\n            put(\"Khulna\", \"Khulna\");\n            put(\"Mymensingh\", \"Mymensingh\");\n            put(\"Rajshahi\", \"Rajshahi\");\n            put(\"Sylhet\", \"Sylhet\");\n            put(\"Rangpur\", \"Rangpur\");\n           \n\t\t}\n\t};\n\t\n\tpublic final static List<String> listOfUSStatesCode = new ArrayList<>(mapOfUSStates.keySet());\n\tpublic final static List<String> listOfUSStatesName = new ArrayList<>(mapOfUSStates.values());\n\n}\n"
  },
  {
    "path": "src/main/resources/application.properties",
    "content": "spring.thymeleaf.cache=false\n\n# ===============================\n# = DATA SOURCE\n# ===============================\n\n# Set here configurations for the database connection\nspring.datasource.url=jdbc:mysql://localhost:3306/ecommerceDB?createDatabaseIfNotExist=true&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Jakarta&useSSL=false&allowPublicKeyRetrieval=true\n\n# Username and secret\nspring.datasource.username=root\nspring.datasource.password=foysal28\n\n# Keep the connection alive if idle for a long time (needed in production)\nspring.datasource.testWhileIdle = true\nspring.datasource.validationQuery = SELECT 1\n\n\n# ===============================\n# = JPA / HIBERNATE\n# ===============================\n\n# Use spring.jpa.properties.* for Hibernate native properties (the prefix is\n# stripped before adding them to the entity manager).\n\n# Show or not log for each sql query\nspring.jpa.show-sql=true\n\n# Hibernate ddl auto (create, create-drop, update): with \"update\" the database\n# schema will be automatically updated accordingly to java entities found in\n# the project\nspring.jpa.hibernate.ddl-auto = update\n\n# Allows Hibernate to generate SQL optimized for a particular DBMS\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect\n\n\nspring.mail.host=smtp.gmail.com\nspring.mail.username={Email Address}\nspring.mail.password={Email Password}\nspring.mail.properties.mail.smtp.auth=true\nspring.mail.properties.mail.smtp.socketFactory.port=465\nspring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory\nspring.mail.properties.mail.smtp.socketFactory.fallback=false\nsupport.email={Email Address}\n\n"
  },
  {
    "path": "src/main/resources/messages.properties",
    "content": "adminPath=http://localhost:8081/adminportal"
  },
  {
    "path": "src/main/resources/static/css/jquery.dataTables_themeroller.css",
    "content": "/*\r\n * Table styles\r\n */\r\ntable.dataTable {\r\n  width: 100%;\r\n  margin: 0 auto;\r\n  clear: both;\r\n  border-collapse: separate;\r\n  border-spacing: 0;\r\n  /*\r\n   * Header and footer styles\r\n   */\r\n  /*\r\n   * Body styles\r\n   */\r\n}\r\ntable.dataTable thead th,\r\ntable.dataTable thead td,\r\ntable.dataTable tfoot th,\r\ntable.dataTable tfoot td {\r\n  padding: 4px 10px;\r\n}\r\ntable.dataTable thead th,\r\ntable.dataTable tfoot th {\r\n  font-weight: bold;\r\n}\r\ntable.dataTable thead th:active,\r\ntable.dataTable thead td:active {\r\n  outline: none;\r\n}\r\ntable.dataTable thead .sorting_asc,\r\ntable.dataTable thead .sorting_desc,\r\ntable.dataTable thead .sorting {\r\n  cursor: pointer;\r\n  *cursor: hand;\r\n}\r\ntable.dataTable thead th div.DataTables_sort_wrapper {\r\n  position: relative;\r\n  padding-right: 10px;\r\n}\r\ntable.dataTable thead th div.DataTables_sort_wrapper span {\r\n  position: absolute;\r\n  top: 50%;\r\n  margin-top: -8px;\r\n  right: -5px;\r\n}\r\ntable.dataTable thead th.ui-state-default {\r\n  border-right-width: 0;\r\n}\r\ntable.dataTable thead th.ui-state-default:last-child {\r\n  border-right-width: 1px;\r\n}\r\ntable.dataTable tbody tr {\r\n  background-color: #ffffff;\r\n}\r\ntable.dataTable tbody tr.selected {\r\n  background-color: #B0BED9;\r\n}\r\ntable.dataTable tbody th,\r\ntable.dataTable tbody td {\r\n  padding: 8px 10px;\r\n}\r\ntable.dataTable th.center,\r\ntable.dataTable td.center,\r\ntable.dataTable td.dataTables_empty {\r\n  text-align: center;\r\n}\r\ntable.dataTable th.right,\r\ntable.dataTable td.right {\r\n  text-align: right;\r\n}\r\ntable.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {\r\n  border-top: 1px solid #ddd;\r\n}\r\ntable.dataTable.row-border tbody tr:first-child th,\r\ntable.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,\r\ntable.dataTable.display tbody tr:first-child td {\r\n  border-top: none;\r\n}\r\ntable.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {\r\n  border-top: 1px solid #ddd;\r\n  border-right: 1px solid #ddd;\r\n}\r\ntable.dataTable.cell-border tbody tr th:first-child,\r\ntable.dataTable.cell-border tbody tr td:first-child {\r\n  border-left: 1px solid #ddd;\r\n}\r\ntable.dataTable.cell-border tbody tr:first-child th,\r\ntable.dataTable.cell-border tbody tr:first-child td {\r\n  border-top: none;\r\n}\r\ntable.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {\r\n  background-color: #f9f9f9;\r\n}\r\ntable.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {\r\n  background-color: #abb9d3;\r\n}\r\ntable.dataTable.hover tbody tr:hover,\r\ntable.dataTable.hover tbody tr.odd:hover,\r\ntable.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover,\r\ntable.dataTable.display tbody tr.odd:hover,\r\ntable.dataTable.display tbody tr.even:hover {\r\n  background-color: whitesmoke;\r\n}\r\ntable.dataTable.hover tbody tr:hover.selected,\r\ntable.dataTable.hover tbody tr.odd:hover.selected,\r\ntable.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected,\r\ntable.dataTable.display tbody tr.odd:hover.selected,\r\ntable.dataTable.display tbody tr.even:hover.selected {\r\n  background-color: #a9b7d1;\r\n}\r\ntable.dataTable.order-column tbody tr > .sorting_1,\r\ntable.dataTable.order-column tbody tr > .sorting_2,\r\ntable.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,\r\ntable.dataTable.display tbody tr > .sorting_2,\r\ntable.dataTable.display tbody tr > .sorting_3 {\r\n  background-color: #f9f9f9;\r\n}\r\ntable.dataTable.order-column tbody tr.selected > .sorting_1,\r\ntable.dataTable.order-column tbody tr.selected > .sorting_2,\r\ntable.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,\r\ntable.dataTable.display tbody tr.selected > .sorting_2,\r\ntable.dataTable.display tbody tr.selected > .sorting_3 {\r\n  background-color: #acbad4;\r\n}\r\ntable.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {\r\n  background-color: #f1f1f1;\r\n}\r\ntable.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {\r\n  background-color: #f3f3f3;\r\n}\r\ntable.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {\r\n  background-color: whitesmoke;\r\n}\r\ntable.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {\r\n  background-color: #a6b3cd;\r\n}\r\ntable.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {\r\n  background-color: #a7b5ce;\r\n}\r\ntable.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {\r\n  background-color: #a9b6d0;\r\n}\r\ntable.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {\r\n  background-color: #f9f9f9;\r\n}\r\ntable.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {\r\n  background-color: #fbfbfb;\r\n}\r\ntable.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {\r\n  background-color: #fdfdfd;\r\n}\r\ntable.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {\r\n  background-color: #acbad4;\r\n}\r\ntable.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {\r\n  background-color: #adbbd6;\r\n}\r\ntable.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {\r\n  background-color: #afbdd8;\r\n}\r\ntable.dataTable.display tbody tr:hover > .sorting_1,\r\ntable.dataTable.display tbody tr.odd:hover > .sorting_1,\r\ntable.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1,\r\ntable.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1,\r\ntable.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 {\r\n  background-color: #eaeaea;\r\n}\r\ntable.dataTable.display tbody tr:hover > .sorting_2,\r\ntable.dataTable.display tbody tr.odd:hover > .sorting_2,\r\ntable.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2,\r\ntable.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2,\r\ntable.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 {\r\n  background-color: #ebebeb;\r\n}\r\ntable.dataTable.display tbody tr:hover > .sorting_3,\r\ntable.dataTable.display tbody tr.odd:hover > .sorting_3,\r\ntable.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3,\r\ntable.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3,\r\ntable.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 {\r\n  background-color: #eeeeee;\r\n}\r\ntable.dataTable.display tbody tr:hover.selected > .sorting_1,\r\ntable.dataTable.display tbody tr.odd:hover.selected > .sorting_1,\r\ntable.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1,\r\ntable.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1,\r\ntable.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 {\r\n  background-color: #a1aec7;\r\n}\r\ntable.dataTable.display tbody tr:hover.selected > .sorting_2,\r\ntable.dataTable.display tbody tr.odd:hover.selected > .sorting_2,\r\ntable.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2,\r\ntable.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2,\r\ntable.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 {\r\n  background-color: #a2afc8;\r\n}\r\ntable.dataTable.display tbody tr:hover.selected > .sorting_3,\r\ntable.dataTable.display tbody tr.odd:hover.selected > .sorting_3,\r\ntable.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3,\r\ntable.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3,\r\ntable.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 {\r\n  background-color: #a4b2cb;\r\n}\r\ntable.dataTable.nowrap th, table.dataTable.nowrap td {\r\n  white-space: nowrap;\r\n}\r\ntable.dataTable.compact thead th,\r\ntable.dataTable.compact thead td {\r\n  padding: 5px 9px;\r\n}\r\ntable.dataTable.compact tfoot th,\r\ntable.dataTable.compact tfoot td {\r\n  padding: 5px 9px 3px 9px;\r\n}\r\ntable.dataTable.compact tbody th,\r\ntable.dataTable.compact tbody td {\r\n  padding: 4px 5px;\r\n}\r\ntable.dataTable th.dt-left,\r\ntable.dataTable td.dt-left {\r\n  text-align: left;\r\n}\r\ntable.dataTable th.dt-center,\r\ntable.dataTable td.dt-center,\r\ntable.dataTable td.dataTables_empty {\r\n  text-align: center;\r\n}\r\ntable.dataTable th.dt-right,\r\ntable.dataTable td.dt-right {\r\n  text-align: right;\r\n}\r\ntable.dataTable th.dt-justify,\r\ntable.dataTable td.dt-justify {\r\n  text-align: justify;\r\n}\r\ntable.dataTable th.dt-nowrap,\r\ntable.dataTable td.dt-nowrap {\r\n  white-space: nowrap;\r\n}\r\ntable.dataTable thead th.dt-head-left,\r\ntable.dataTable thead td.dt-head-left,\r\ntable.dataTable tfoot th.dt-head-left,\r\ntable.dataTable tfoot td.dt-head-left {\r\n  text-align: left;\r\n}\r\ntable.dataTable thead th.dt-head-center,\r\ntable.dataTable thead td.dt-head-center,\r\ntable.dataTable tfoot th.dt-head-center,\r\ntable.dataTable tfoot td.dt-head-center {\r\n  text-align: center;\r\n}\r\ntable.dataTable thead th.dt-head-right,\r\ntable.dataTable thead td.dt-head-right,\r\ntable.dataTable tfoot th.dt-head-right,\r\ntable.dataTable tfoot td.dt-head-right {\r\n  text-align: right;\r\n}\r\ntable.dataTable thead th.dt-head-justify,\r\ntable.dataTable thead td.dt-head-justify,\r\ntable.dataTable tfoot th.dt-head-justify,\r\ntable.dataTable tfoot td.dt-head-justify {\r\n  text-align: justify;\r\n}\r\ntable.dataTable thead th.dt-head-nowrap,\r\ntable.dataTable thead td.dt-head-nowrap,\r\ntable.dataTable tfoot th.dt-head-nowrap,\r\ntable.dataTable tfoot td.dt-head-nowrap {\r\n  white-space: nowrap;\r\n}\r\ntable.dataTable tbody th.dt-body-left,\r\ntable.dataTable tbody td.dt-body-left {\r\n  text-align: left;\r\n}\r\ntable.dataTable tbody th.dt-body-center,\r\ntable.dataTable tbody td.dt-body-center {\r\n  text-align: center;\r\n}\r\ntable.dataTable tbody th.dt-body-right,\r\ntable.dataTable tbody td.dt-body-right {\r\n  text-align: right;\r\n}\r\ntable.dataTable tbody th.dt-body-justify,\r\ntable.dataTable tbody td.dt-body-justify {\r\n  text-align: justify;\r\n}\r\ntable.dataTable tbody th.dt-body-nowrap,\r\ntable.dataTable tbody td.dt-body-nowrap {\r\n  white-space: nowrap;\r\n}\r\n\r\ntable.dataTable,\r\ntable.dataTable th,\r\ntable.dataTable td {\r\n  -webkit-box-sizing: content-box;\r\n  -moz-box-sizing: content-box;\r\n  box-sizing: content-box;\r\n}\r\n\r\n/*\r\n * Control feature layout\r\n */\r\n.dataTables_wrapper {\r\n  position: relative;\r\n  clear: both;\r\n  *zoom: 1;\r\n  zoom: 1;\r\n}\r\n.dataTables_wrapper .dataTables_length {\r\n  float: left;\r\n}\r\n.dataTables_wrapper .dataTables_filter {\r\n  float: right;\r\n  text-align: right;\r\n}\r\n.dataTables_wrapper .dataTables_filter input {\r\n  margin-left: 0.5em;\r\n}\r\n.dataTables_wrapper .dataTables_info {\r\n  clear: both;\r\n  float: left;\r\n  padding-top: 0.55em;\r\n}\r\n.dataTables_wrapper .dataTables_paginate {\r\n  float: right;\r\n  text-align: right;\r\n}\r\n.dataTables_wrapper .dataTables_paginate .fg-button {\r\n  box-sizing: border-box;\r\n  display: inline-block;\r\n  min-width: 1.5em;\r\n  padding: 0.5em;\r\n  margin-left: 2px;\r\n  text-align: center;\r\n  text-decoration: none !important;\r\n  cursor: pointer;\r\n  *cursor: hand;\r\n  color: #333 !important;\r\n  border: 1px solid transparent;\r\n}\r\n.dataTables_wrapper .dataTables_paginate .fg-button:active {\r\n  outline: none;\r\n}\r\n.dataTables_wrapper .dataTables_paginate .fg-button:first-child {\r\n  border-top-left-radius: 3px;\r\n  border-bottom-left-radius: 3px;\r\n}\r\n.dataTables_wrapper .dataTables_paginate .fg-button:last-child {\r\n  border-top-right-radius: 3px;\r\n  border-bottom-right-radius: 3px;\r\n}\r\n.dataTables_wrapper .dataTables_processing {\r\n  position: absolute;\r\n  top: 50%;\r\n  left: 50%;\r\n  width: 100%;\r\n  height: 40px;\r\n  margin-left: -50%;\r\n  margin-top: -25px;\r\n  padding-top: 20px;\r\n  text-align: center;\r\n  font-size: 1.2em;\r\n  background-color: white;\r\n  background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));\r\n  /* Chrome,Safari4+ */\r\n  background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);\r\n  /* Chrome10+,Safari5.1+ */\r\n  background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);\r\n  /* FF3.6+ */\r\n  background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);\r\n  /* IE10+ */\r\n  background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);\r\n  /* Opera 11.10+ */\r\n  background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);\r\n  /* W3C */\r\n}\r\n.dataTables_wrapper .dataTables_length,\r\n.dataTables_wrapper .dataTables_filter,\r\n.dataTables_wrapper .dataTables_info,\r\n.dataTables_wrapper .dataTables_processing,\r\n.dataTables_wrapper .dataTables_paginate {\r\n  color: #333;\r\n}\r\n.dataTables_wrapper .dataTables_scroll {\r\n  clear: both;\r\n}\r\n.dataTables_wrapper .dataTables_scrollBody {\r\n  *margin-top: -1px;\r\n  -webkit-overflow-scrolling: touch;\r\n}\r\n.dataTables_wrapper .ui-widget-header {\r\n  font-weight: normal;\r\n}\r\n.dataTables_wrapper .ui-toolbar {\r\n  padding: 8px;\r\n}\r\n.dataTables_wrapper:after {\r\n  visibility: hidden;\r\n  display: block;\r\n  content: \"\";\r\n  clear: both;\r\n  height: 0;\r\n}\r\n\r\n@media screen and (max-width: 767px) {\r\n  .dataTables_wrapper .dataTables_length,\r\n  .dataTables_wrapper .dataTables_filter,\r\n  .dataTables_wrapper .dataTables_info,\r\n  .dataTables_wrapper .dataTables_paginate {\r\n    float: none;\r\n    text-align: center;\r\n  }\r\n  .dataTables_wrapper .dataTables_filter,\r\n  .dataTables_wrapper .dataTables_paginate {\r\n    margin-top: 0.5em;\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/main/resources/static/css/non-responsive.css",
    "content": "/* Template-specific stuff\n *\n * Customizations just for the template; these are not necessary for anything\n * with disabling the responsiveness.\n */\n\n/* Account for fixed navbar */\nbody {\n  padding-top: 70px;\n  padding-bottom: 30px;\n}\n\nbody,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  min-width: 970px;\n}\n\n/* Don't let the lead text change font-size. */\n.lead {\n  font-size: 16px;\n}\n\n/* Finesse the page header spacing */\n.page-header {\n  margin-bottom: 30px;\n}\n.page-header .lead {\n  margin-bottom: 10px;\n}\n\n\n/* Non-responsive overrides\n *\n * Utilize the following CSS to disable the responsive-ness of the container,\n * grid system, and navbar.\n */\n\n/* Reset the container */\n.container {\n  width: 970px;\n  max-width: none !important;\n}\n\n/* Demonstrate the grids */\n.col-xs-4 {\n  padding-top: 15px;\n  padding-bottom: 15px;\n  /*background-color: #eee;*/\n  /*background-color: rgba(86,61,124,.15);*/\n  /*border: 1px solid #ddd;*/\n  /*border: 1px solid rgba(86,61,124,.2);*/\n}\n\n.container .navbar-header,\n.container .navbar-collapse {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n/* Always float the navbar header */\n.navbar-header {\n  float: left;\n}\n\n/* Undo the collapsing navbar */\n.navbar-collapse {\n  display: block !important;\n  height: auto !important;\n  padding-bottom: 0;\n  overflow: visible !important;\n  visibility: visible !important;\n}\n\n.navbar-toggle {\n  display: none;\n}\n.navbar-collapse {\n  border-top: 0;\n}\n\n.navbar-brand {\n  margin-left: -15px;\n}\n\n/* Always apply the floated nav */\n.navbar-nav {\n  float: left;\n  margin: 0;\n}\n.navbar-nav > li {\n  float: left;\n}\n.navbar-nav > li > a {\n  padding: 15px;\n}\n\n/* Redeclare since we override the float above */\n.navbar-nav.navbar-right {\n  float: right;\n}\n\n/* Undo custom dropdowns */\n.navbar .navbar-nav .open .dropdown-menu {\n  position: absolute;\n  float: left;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-width: 0 1px 1px;\n  border-radius: 0 0 4px 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.navbar-default .navbar-nav .open .dropdown-menu > li > a {\n  color: #333;\n}\n.navbar .navbar-nav .open .dropdown-menu > li > a:hover,\n.navbar .navbar-nav .open .dropdown-menu > li > a:focus,\n.navbar .navbar-nav .open .dropdown-menu > .active > a,\n.navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n.navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n  color: #fff !important;\n  background-color: #428bca !important;\n}\n.navbar .navbar-nav .open .dropdown-menu > .disabled > a,\n.navbar .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n.navbar .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n  color: #999 !important;\n  background-color: transparent !important;\n}\n\n/* Undo form expansion */\n.navbar-form {\n  float: left;\n  width: auto;\n  padding-top: 0;\n  padding-bottom: 0;\n  margin-right: 0;\n  margin-left: 0;\n  border: 0;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n/* Copy-pasted from forms.less since we mixin the .form-inline styles. */\n.navbar-form .form-group {\n  display: inline-block;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.navbar-form .form-control {\n  display: inline-block;\n  width: auto;\n  vertical-align: middle;\n}\n\n.navbar-form .form-control-static {\n  display: inline-block;\n}\n\n.navbar-form .input-group {\n  display: inline-table;\n  vertical-align: middle;\n}\n\n.navbar-form .input-group .input-group-addon,\n.navbar-form .input-group .input-group-btn,\n.navbar-form .input-group .form-control {\n  width: auto;\n}\n\n.navbar-form .input-group > .form-control {\n  width: 100%;\n}\n\n.navbar-form .control-label {\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.navbar-form .radio,\n.navbar-form .checkbox {\n  display: inline-block;\n  margin-top: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.navbar-form .radio label,\n.navbar-form .checkbox label {\n  padding-left: 0;\n}\n\n.navbar-form .radio input[type=\"radio\"],\n.navbar-form .checkbox input[type=\"checkbox\"] {\n  position: relative;\n  margin-left: 0;\n}\n\n.navbar-form .has-feedback .form-control-feedback {\n  top: 0;\n}\n\n/* Undo inline form compaction on small screens */\n.form-inline .form-group {\n  display: inline-block;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.form-inline .form-control {\n  display: inline-block;\n  width: auto;\n  vertical-align: middle;\n}\n\n.form-inline .form-control-static {\n  display: inline-block;\n}\n\n.form-inline .input-group {\n  display: inline-table;\n  vertical-align: middle;\n}\n.form-inline .input-group .input-group-addon,\n.form-inline .input-group .input-group-btn,\n.form-inline .input-group .form-control {\n  width: auto;\n}\n\n.form-inline .input-group > .form-control {\n  width: 100%;\n}\n\n.form-inline .control-label {\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.form-inline .radio,\n.form-inline .checkbox {\n  display: inline-block;\n  margin-top: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.form-inline .radio label,\n.form-inline .checkbox label {\n  padding-left: 0;\n}\n\n.form-inline .radio input[type=\"radio\"],\n.form-inline .checkbox input[type=\"checkbox\"] {\n  position: relative;\n  margin-left: 0;\n}\n\n.form-inline .has-feedback .form-control-feedback {\n  top: 0;\n}"
  },
  {
    "path": "src/main/resources/static/css/style.css",
    "content": "\nhr {\n\tborder: none;\n\theight: 1px;\n\tcolor: #333;\n\tbackground-color: #333;\n}\n\n.container {\n\twidth: 90%;\n}\n\n.page-top {\n\tmargin-top: -70px;\n}\n\n.navbar {\n  margin-bottom: 20px;\n}\n\n.box {\n\tborder: 1px solid red;\n}\n\n.home-headline{\n\tfont-family: 'Times New Roman', Times, serif;\n\tfont-size:24px;\n\tcolor: #fff;\n\tmargin: auto;\n\ttext-align: center;\n\tmargin-top: -13px;\n}\n\n.home-headline span {\n\tbackground-color: #231F20;\n    padding: 5px 22px;\n\t\n}\n\n.section-headline {\n\tfont-family: 'Times New Roman', Times, serif;\n\tfont-size:24px;\n\tcolor: #fff;\n\tmargin: auto;\n\ttext-align: center;\n\tmargin-top: 70px;\n}\n\n.section-headline span {\n\tbackground-color: #231F20;\n    padding: 5px 22px;\n\t\n}"
  },
  {
    "path": "src/main/resources/static/js/scripts.js",
    "content": "/**\r\n * \r\n */\r\n\r\nfunction checkBillingAddress() {\r\n\tif($(\"#theSameAsShippingAddress\").is(\":checked\")) {\r\n\t\t$(\".billingAddress\").prop(\"disabled\", true);\r\n\t} else {\r\n\t\t$(\".billingAddress\").prop(\"disabled\", false);\r\n\t}\r\n}\r\n\r\nfunction checkPasswordMatch() {\r\n\tvar password = $(\"#txtNewPassword\").val();\r\n\tvar confirmPassword = $(\"#txtConfirmPassword\").val();\r\n\t\r\n\tif(password == \"\" && confirmPassword ==\"\") {\r\n\t\t$(\"#checkPasswordMatch\").html(\"\");\r\n\t\t$(\"#updateUserInfoButton\").prop('disabled', false);\r\n\t} else {\r\n\t\tif(password != confirmPassword) {\r\n\t\t\t$(\"#checkPasswordMatch\").html(\"Passwords do not match!\");\r\n\t\t\t$(\"#updateUserInfoButton\").prop('disabled', true);\r\n\t\t} else {\r\n\t\t\t$(\"#checkPasswordMatch\").html(\"Passwords match\");\r\n\t\t\t$(\"#updateUserInfoButton\").prop('disabled', false);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n$(document).ready(function(){\r\n\t$(\".cartItemQty\").on('change', function(){\r\n\t\tvar id=this.id;\r\n\t\t\r\n\t\t$('#update-item-'+id).css('display', 'inline-block');\r\n\t});\r\n\t$(\"#theSameAsShippingAddress\").on('click', checkBillingAddress);\r\n\t$(\"#txtConfirmPassword\").keyup(checkPasswordMatch);\r\n\t$(\"#txtNewPassword\").keyup(checkPasswordMatch);\r\n\t\r\n});\r\n\r\n"
  },
  {
    "path": "src/main/resources/templates/badRequestPage.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\n<head th:replace=\"common/header :: common-header\" />\n\n<body>\n\t<div th:replace=\"common/header :: navbar\" />\n\n\t<div class=\"container\">\n\t\t<div class=\"row\" style=\"margin-bottom: -100px;\">\n\t\t\t<div class=\"col-xs-8\">\n\t\t\t\t<h2 class=\"section-headline\">\n\t\t\t\t\t<span>User Account</span>\n\t\t\t\t</h2>\n\t\t\t</div>\n\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t<img src=\"/image/logo.png\" class=\"img-responsive\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<hr\n\t\t\tstyle=\"position: absolute; width: 100%; height: 6px; background-color: #333; z-index: -1; margin-top: -80px;\" />\n\t\t<img class=\"img-responsive\" src=\"/image/wood.png\"\n\t\t\tstyle=\"margin-top: -75px;\" />\n\n\t\t<div class=\"row\" style=\"margin-top:10px\">\n\t\t\t<div class=\"col-xs-9 col-xs-offset-3\">\n\t\t\t\t<h5>Bad request. The request path is invalid. Click <a th:href=\"@{/}\">here</a> to return to the home page.</h5>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<!-- end of container -->\n<div th:replace=\"common/header :: footer\"/>\n\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/bookDetail.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\n<head th:replace=\"common/header :: common-header\"/>\n\n<body>\n<div th:replace=\"common/header :: navbar\"/>\n\n<div class=\"container\">\n    <div class=\"row\" style=\"margin-bottom: -100px;\">\n        <div class=\"col-xs-8\">\n            <h2 class=\"section-headline\">\n                <h2 class=\"section-headline\">\n                    <span th:text=\"${user}? ${#strings.toUpperCase(user.username)} : 'All Books'\"></span>\n                </h2>\n            </h2>\n        </div>\n        <div class=\"col-xs-4\">\n            <img src=\"/image/logo.png\" class=\"img-responsive\"/>\n        </div>\n    </div>\n    <hr\n            style=\"position: absolute; width: 100%; height: 6px; background-color: #333; z-index: -1; margin-top: -80px;\"/>\n    <img class=\"img-responsive\" src=\"/image/wood.png\"\n         style=\"margin-top: -75px;\"/>\n\n    \n    <form th:action=\"@{/shoppingCart/addItem}\" method=\"post\">\n    \t<input hidden=\"hidden\" th:field=\"*{book.id}\" />\n    \t<div class=\"row\" style=\"margin-top: 120px;\">\n    \t\t<div class=\"col-xs-3\">\n    \t\t\t<h3><a th:href=\"@{/bookshelf}\" class=\"fa fa-long-arrow-left\" aria-hidden=\"true\" style=\"color: green\"> Back to book list</a></h3><br/>\n    \t\t\t<img class=\"img-responsive shelf-book\" th:src=\"#{adminPath}+@{/image/book/}+${book.id}+'.png'\" />\n    \t\t</div>\n    \t\t\n    \t\t<div class=\"col-xs-9\">\n    \t\t\t<h3><span th:if=\"${addBookSuccess}\" style=\"color: forestgreen\"><i class=\"fa fa-check\" aria-hidden=\"true\" style=\"color: forestgreen\"></i>Added to cart.</span></h3>\n    \t\t\t<h3><span th:if=\"${notEnoughStock}\" style=\"color: red\">Oops, only <span th:text=\"${book.inStockNumber}\"></span> In Stock.</span></h3>\n    \t\t\t<h3 th:text=\"${book.title}\" style=\"color: red; font-family: cursive\"  >Book Title</h3>\n    \t\t\t<div class=\"row\">\n    \t\t\t\t<div class=\"col-xs-5\">\n    \t\t\t\t\t<h5><strong>Author: </strong><span th:text=\"${book.author}\"></span></h5>\n    \t\t\t\t\t<p><strong>Publisher: </strong><span th:text=\"${book.publisher}\"></span></p>\n    \t\t\t\t\t<p><strong>Publication Date: </strong><span th:text=\"${book.publicationDate}\"></span></p>\n    \t\t\t\t\t<p><strong>Language: </strong><span th:text=\"${book.language}\"></span></p>\n    \t\t\t\t\t<p><strong>Category: </strong><span th:text=\"${book.category}\"></span></p>\n    \t\t\t\t\t<p><strong><span th:text=\"${book.format}\"></span>: </strong><span th:text=\"${book.numberOfPages}\"></span> pages</p>\n    \t\t\t\t\t<p><strong>ISBN: </strong><span th:text=\"${book.isbn}\"></span></p>\n    \t\t\t\t\t<p><strong>Shipping Weight: </strong><span th:text=\"${book.shippingWeight}\"></span> ounces</p>\n    \t\t\t\t</div>\n    \t\t\t\t\n    \t\t\t\t<div class=\"col-xs-7\">\n    \t\t\t\t\t<div class=\"panel panel-default\" style=\"border-width: 5px; margin-top: 20px;\">\n    \t\t\t\t\t\t<div class=\"panel-body\">\n    \t\t\t\t\t\t\t<div class=\"row\">\n    \t\t\t\t\t\t\t\t<div class=\"col-xs-6\">\n    \t\t\t\t\t\t\t\t\t<h4>Our Price: <span style=\"color:#db3208;\">$<span th:text=\"${book.ourPrice}\"></span></span></h4>\n    \t\t\t\t\t\t\t\t\t<p>List Price: <span style=\"text-decoration: line-through\">$<span th:text=\"${book.listPrice}\"></span></span></p>\n    \t\t\t\t\t\t\t\t\t<p>You save: $<span th:text=\"${#numbers.formatDecimal((book.listPrice - book.ourPrice), 0, 'COMMA', 2, 'POINT' )}\"></span></p>\n    \t\t\t\t\t\t\t\t\t<span>Qty: </span>\n    \t\t\t\t\t\t\t\t\t<select name=\"qty\">\n    \t\t\t\t\t\t\t\t\t\t<option th:each=\"qty : ${qtyList}\" th:value=\"${qty}\" th:text=\"${qty}\">\n    \t\t\t\t\t\t\t\t\t\t</option>\n    \t\t\t\t\t\t\t\t\t</select>\n    \t\t\t\t\t\t\t\t</div>\n    \t\t\t\t\t\t\t\t<div class=\"col-xs-6\">\n    \t\t\t\t\t\t\t\t\t<h4 th:if=\"*{book.inStockNumber&gt;10}\" style=\"color: green\">In Stock</h4>\n    \t\t\t\t\t\t\t\t\t<h4 th:if=\"*{book.inStockNumber&lt;10 and book.inStockNumber&gt;0}\" style=\"color: green\">Only <span th:text=\"${book.inStockNumber}\"> </span> In Stock</h4>\n    \t\t\t\t\t\t\t\t\t<h4 th:if=\"*{book.inStockNumber==0}\" style=\"color:darkred;\">Unavailable</h4>\n    \t\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-warning\" style=\"color:black;border:1px solid black; padding: 10px 40px 10px 40px;\">Add to Cart</button>\n    \t\t\t\t\t\t\t\t</div>\n    \t\t\t\t\t\t\t</div>\n    \t\t\t\t\t\t</div>\n    \t\t\t\t\t</div>\n    \t\t\t\t</div>\n    \t\t\t</div>\n    \t\t\t\n    \t\t\t<hr/>\n    \t\t\t<h3>Description:</h3>\n    \t\t\t<p th:utext=\"${book.description}\"></p>\n    \t\t\t<br/><hr/>\n    \t\t</div>\n    \t</div>\n    </form>\n</div>\n<!-- end of container -->\n\n<div th:replace=\"common/header :: footer\"/>\n\n\n<div th:replace=\"common/header :: body-bottom-scripts\"/>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/bookshelf.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\n<head th:replace=\"common/header :: common-header\" />\n\n<body>\n\t<div th:replace=\"common/header :: navbar\" />\n\n\t<div class=\"container\">\n\t\t<div class=\"row\" style=\"margin-bottom: -100px;\">\n\t\t\t<div class=\"col-xs-8\">\n\t\t\t\t<h2 class=\"section-headline\">\n\t\t\t\t\t<h2 class=\"section-headline\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tth:text=\"${user}? ${#strings.toUpperCase(user.username)} : 'Books'\"></span>\n\t\t\t\t\t</h2>\n\t\t\t\t</h2>\n\t\t\t</div>\n\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t<img src=\"/image/logo.png\" class=\"img-responsive\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<hr\n\t\t\tstyle=\"position: absolute; width: 100%; height: 6px; background-color: #333; z-index: -1; margin-top: -80px;\" />\n\t\t<img class=\"img-responsive\" src=\"/image/wood.png\"\n\t\t\tstyle=\"margin-top: -75px;\" />\n\n\t\t<div class=\"row\" style=\"margin-top: 60px;\">\n\n\t\t\t<div class=\"row\" style=\"margin-top: 60px;\">\n\t\t\t\t<div class=\"col-xs-3\">\n\t\t\t\t\t<h3>\n\t\t\t\t\t\t<label for=\"category\">Category</label>\n\t\t\t\t\t</h3>\n\t\t\t\t\t<div class=\"list-group\" id=\"category\">\n\t\t\t\t\t\t<a th:href=\"@{/bookshelf(category='all')}\"\n\t\t\t\t\t\t\tth:classappend=\"${activeAll}? 'active'\" class=\"list-group-item\">All</a>\n\t\t\t\t\t\t<a th:href=\"@{/searchByCategory(category='Management')}\"\n\t\t\t\t\t\t\tth:classappend=\"${activeManagement}? 'active'\"\n\t\t\t\t\t\t\tclass=\"list-group-item\">Management</a> <a\n\t\t\t\t\t\t\tth:href=\"@{/searchByCategory(category='Fiction')}\"\n\t\t\t\t\t\t\tth:classappend=\"${activeFiction}? 'active'\"\n\t\t\t\t\t\t\tclass=\"list-group-item\">Fiction</a> <a\n\t\t\t\t\t\t\tth:href=\"@{/searchByCategory(category='Engineering')}\"\n\t\t\t\t\t\t\tth:classappend=\"${activeEngineering}? 'active'\"\n\t\t\t\t\t\t\tclass=\"list-group-item\">Engineering</a> <a\n\t\t\t\t\t\t\tth:href=\"@{/searchByCategory(category='Programming')}\"\n\t\t\t\t\t\t\tth:classappend=\"${activeProgramming}? 'active'\"\n\t\t\t\t\t\t\tclass=\"list-group-item\">Programming</a> <a\n\t\t\t\t\t\t\tth:href=\"@{/searchByCategory(category='Arts &amp; Literature')}\"\n\t\t\t\t\t\t\tth:classappend=\"${activeArtsLiterature}? 'active'\"\n\t\t\t\t\t\t\tclass=\"list-group-item\">Arts &amp; Literature</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"col-xs-9\">\n\t\t\t\t\t<div th:if=\"${emptyList}\">\n\t\t\t\t\t\t<h5 style=\"font-style: italic;\">Oops, no result is found. Try\n\t\t\t\t\t\t\tsomething else or try again later.</h5>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<table border=\"0\" id=\"bookList\">\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr class=\"book-item\" data-th-each=\"book : ${bookList}\">\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<div th:if=\"${book != null}\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"row\" style=\"margin-bottom: 50px;\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=}+${book.id}\"><img\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"img-responsive shelf-book\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:src=\"#{adminPath}+@{/image/book/}+${book.id}+'.png'\" /></a>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-9\">\n\t\t\t\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=}+${book.id}\"><h4\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${book.title}\"></h4></a> <span\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${book.publicationDate}\"></span>\n\t\t\t\t\t\t\t\t\t\t\t\t<p th:text=\"${book.author}\"></p>\n\t\t\t\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=}+${book.id}\"><span\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${#strings.capitalize(book.format)}\"></span></a> <span\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${book.numberOfPages}\"><span> pages</span></span><br />\n\n\t\t\t\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=}+${book.id}\"><span\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle=\"font-size: x-large; color: #db3208;\">$<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${#numbers.formatDecimal(book.ourPrice, 0 , 'COMMA', 2, 'POINT')}\"></span></span></a>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span style=\"text-decoration: line-through;\">$<span\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${#numbers.formatDecimal(book.listPrice, 0 , 'COMMA', 2, 'POINT')}\"></span></span>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<p th:utext=\"${#strings.abbreviate(book.description,1000)}\"></p>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<hr/>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<!-- end of container -->\n\n\t\t<div th:replace=\"common/header :: footer\" />\n\n\t\t<div th:replace=\"common/header :: body-bottom-scripts\" />\n\n\t\t<script>\n\t\t\t$(document).ready(\n\t\t\t\t\tfunction() {\n\t\t\t\t\t\t$('#bookList').DataTable(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"lengthMenu\" : [ [ 5, 10, 15, 20, -1 ],\n\t\t\t\t\t\t\t\t\t\t\t[ 5, 10, 15, 20, \"All\" ] ],\n\t\t\t\t\t\t\t\t\t\"ordering\" : false,\n\t\t\t\t\t\t\t\t\tstateSave : true\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t$(\"#bookList\").on('page.dt', function() {\n\t\t\t\t\t\t\t$('html, body').animate({\n\t\t\t\t\t\t\t\tscrollTop : $('#bookList').offset().top\n\t\t\t\t\t\t\t}, 200);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/checkout.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\n<head th:replace=\"common/header :: common-header\" />\n\n<body>\n\t<div th:replace=\"common/header :: navbar\" />\n\n\t<div class=\"container\">\n\t\t<div class=\"row\" style=\"margin-bottom: -100px;\">\n\t\t\t<div class=\"col-xs-8\">\n\t\t\t\t<h2 class=\"section-headline\">\n\t\t\t\t\t<span>User Account</span>\n\t\t\t\t</h2>\n\t\t\t</div>\n\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t<img src=\"/image/logo.png\" class=\"img-responsive\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<hr\n\t\t\tstyle=\"position: absolute; width: 100%; height: 6px; background-color: #333; z-index: -1; margin-top: -80px;\" />\n\t\t<img class=\"img-responsive\" src=\"/image/wood.png\"\n\t\t\tstyle=\"margin-top: -75px;\" />\n\n\t\t<div class=\"row\" style=\"margin-top: 10px;\">\n\t\t\t<form th:action=\"@{/checkout}\" method=\"post\">\n\n\t\t\t\t<!-- Left Panel -->\n\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t<div class=\"panel panel-default\">\n\t\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-warning btn-block\">Place\n\t\t\t\t\t\t\t\tyour order</button>\n\t\t\t\t\t\t\t<p style=\"font-size: smaller;\">\n\t\t\t\t\t\t\t\tBy placing your order, you agree to Le's Bookstore <a href=\"#\">privacy</a>\n\t\t\t\t\t\t\t\tnotice and <a href=\"#\">conditions</a> of use.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t\t<h3>Order Summary</h3>\n\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t<div class=\"col-xs-7 text-left\">Total before tax:</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-5 text-right\">\n\t\t\t\t\t\t\t\t\t$<span th:text=\"${shoppingCart.grandTotal}\"></span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t<div class=\"col-xs-7 text-left\">Estimated tax:</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-5 text-right\">\n\t\t\t\t\t\t\t\t\t$<span th:with=\"tax=${shoppingCart.grandTotal*0.06}\"\n\t\t\t\t\t\t\t\t\t\t\tth:text=\"${#numbers.formatDecimal(tax, 0 ,2)}\"></span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t<div class=\"col-xs-7 text-left\">\n\t\t\t\t\t\t\t\t\t<h3 style=\"color: darkred;\">\n\t\t\t\t\t\t\t\t\t\t<strong>Order Total: </strong>\n\t\t\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-5 text-right\">\n\t\t\t\t\t\t\t\t\t<h3>\n\t\t\t\t\t\t\t\t\t\t<strong style=\"color: darkred;\">$<span\n\t\t\t\t\t\t\t\t\t\t\tth:with=\"total=${shoppingCart.grandTotal+shoppingCart.grandTotal*0.06}\"\n\t\t\t\t\t\t\t\t\t\t\tth:text=\"${#numbers.formatDecimal(total, 0 ,2)}\"></span></strong>\n\t\t\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"panel-footer\">Shipping and handling haven't\n\t\t\t\t\t\t\t\tapplied.</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Checkout Info -->\n\t\t\t\t<div class=\"col-xs-8\">\n\t\t\t\t\t<div th:if=\"${missingRequiredField}\">\n\t\t\t\t\t\t<h5 class=\"alert alert-warning\">There are some fields\n\t\t\t\t\t\t\tmissing. Field with * is required.</h5>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"panel-group\" id=\"accordion\">\n\n\t\t\t\t\t\t<!-- 1. Shipping Address -->\n\t\t\t\t\t\t<div class=\"panel panel-default\">\n\t\t\t\t\t\t\t<div class=\"panel-heading\">\n\t\t\t\t\t\t\t\t<h4 class=\"panel-title\">\n\t\t\t\t\t\t\t\t\t<a data-toggle=\"collapse\" data-parent=\"#accordion\"\n\t\t\t\t\t\t\t\t\t\thref=\"#shippingInfo\"> 1. Shipping Address </a>\n\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div id=\"shippingInfo\" class=\"panel-collapse collapse\"\n\t\t\t\t\t\t\t\tth:classappend=\"${classActiveShipping}? 'in'\">\n\t\t\t\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t\t\t\t<table class=\"table\" th:if=\"${not emptyShippingList}\">\n\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t<th>Available Shipping Address</th>\n\t\t\t\t\t\t\t\t\t\t\t\t<th>Operations</th>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t<tr th:each=\"userShipping : ${userShippingList}\">\n\t\t\t\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${userShipping.userShippingStreet1}+' '+${userShipping.userShippingStreet2}+', '+${userShipping.userShippingCity}\n\t\t\t\t\t\t\t\t\t\t\t\t+', '+${userShipping.userShippingState}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td><a th:href=\"@{/setShippingAddress(userShippingId=${userShipping.id})}\">use\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis address</a></td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t</table>\n\n\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t<label for=\"shippingName\">* Name</label> <input type=\"text\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"form-control\" id=\"shippingName\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Receiver Name\" name=\"shippingAddressName\"\n\t\t\t\t\t\t\t\t\t\t\tth:value=\"${shippingAddress.shippingAddressName}\" />\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t<label for=\"shippingStreet\">* Street Address</label> <input\n\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"shippingStreet\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Street Address 1\" name=\"shippingAddressStreet1\"\n\t\t\t\t\t\t\t\t\t\t\tth:value=\"${shippingAddress.shippingAddressStreet1}\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t<input type=\"text\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Street Address 2\" name=\"shippingAddressStreet2\"\n\t\t\t\t\t\t\t\t\t\t\tth:value=\"${shippingAddress.shippingAddressStreet2}\" />\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"shippingCity\">* City</label> <input type=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"form-control\" id=\"shippingCity\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Shipping City\" th:name=\"shippingAddressCity\"\n\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${shippingAddress.shippingAddressCity}\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"shippingState\">* State</label> <select\n\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"shippingState\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"shippingAddressState\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${shippingAddress.shippingAddressState}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"\" disabled=\"disabled\">Please select\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tan option</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<option th:each=\"state : ${stateList}\" th:text=\"${state}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:selected=\"(${shippingAddress.shippingAddressState}==${state})\"></option>\n\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"shippingZipcode\">* Zipcode</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"shippingZipcode\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Shipping Zipcode\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"shippingAddressZipcode\" required=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${shippingAddress.shippingAddressZipcode}\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<a data-toggle=\"collapse\" data-parent=\"#accordion\"\n\t\t\t\t\t\t\t\t\t\tclass=\"btn btn-warning pull-right\" href=\"#paymentInfo\">Next</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Payment Information -->\n\t\t\t\t\t\t<div class=\"panel panel-default\">\n\t\t\t\t\t\t\t<div class=\"panel-heading\">\n\t\t\t\t\t\t\t\t<h4 class=\"panel-title\">\n\t\t\t\t\t\t\t\t\t<a data-toggle=\"collapse\" data-parent=\"#accordion\"\n\t\t\t\t\t\t\t\t\t\thref=\"#paymentInfo\"> 2. Payment Information </a>\n\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div id=\"paymentInfo\" class=\"panel-collapse collapse\"\n\t\t\t\t\t\t\t\tth:classappend=\"${classActivePayment}? 'in'\">\n\t\t\t\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t\t\t\t<table class=\"table\" th:if=\"${not emptyPaymentList}\">\n\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t<th>Available Credit Card</th>\n\t\t\t\t\t\t\t\t\t\t\t\t<th>Operations</th>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t<tr th:each=\"userPayment : ${userPaymentList}\">\n\t\t\t\t\t\t\t\t\t\t\t\t<td th:text=\"${userPayment.cardName}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td><a\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:href=\"@{/setPaymentMethod(userPaymentId=${userPayment.id})}\">use\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis payment</a></td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t</table>\n\n\t\t\t\t\t\t\t\t\t<!-- Credit Card Information -->\n\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-12\">\n\t\t\t\t\t\t\t\t\t\t\t<img th:src=\"@{/image/creditcard.png}\" class=\"img-responsive\" /><br />\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"cardType\">* Select Card Type: </label> <select\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"form-control\" id=\"cardType\" name=\"type\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${payment.type}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"visa\">Visa</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"mastercard\">Mastercard</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"discover\">Discover</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"amex\">American Express</option>\n\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"cardHolder\">* Card Holder Name:</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"cardHolder\"\n\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\" placeHolder=\"Card Holder Name\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"holderName\" th:value=\"${payment.holderName}\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"cardNumber\">* Card Number:</label>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"input-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"tel\" class=\"form-control\" id=\"cardNumber\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\" placeHolder=\"Valid Card Number\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"cardNumber\" th:value=\"${payment.cardNumber}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"input-group-addon\"><i\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"fa fa-credit-card\" aria-hidden=\"true\"></i></span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-7\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label>* Expiration Date</label>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<select class=\"form-control\" name=\"expiryMonth\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\" th:value=\"${payment.expiryMonth}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option disabled=\"disabled\">-- Month --</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"01\">Jan (01)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"02\">Feb (02)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"03\">Mar (03)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"04\">Apr (04)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"05\">May (05)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"06\">June (06)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"07\">July (07)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"08\">Aug (08)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"09\">Sep (09)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"10\">Oct (10)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"11\">Nov (11)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"12\">Dec (12)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<select class=\"form-control\" name=\"expiryYear\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${payment.expiryYear}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option disabled=\"disabled\">-- Year --</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"2017\">2017</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"2018\">2018</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"19\">2019</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"20\">2020</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"21\">2021</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"22\">2022</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2023</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2024</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2025</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2026</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2027</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2028</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2029</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-5\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"cardCVC\">CV Code</label> <input id=\"cardCVC\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"tel\" class=\"form-control\" name=\"cvc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"CVC\" th:name=\"cvc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${payment.cvc}\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\n\t\t\t\t\t\t\t\t\t<!-- Billing Address -->\n\t\t\t\t\t\t\t\t\t<div class=\"checkbox\">\n\t\t\t\t\t\t\t\t\t\t<label> <input id=\"theSameAsShippingAddress\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\" name=\"billingSameAsShipping\" value=\"true\" />\n\t\t\t\t\t\t\t\t\t\t\tThe same as shipping address\n\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t<label for=\"billingName\">* Name</label> <input type=\"text\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"form-control billingAddress\" id=\"billingName\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Receiver Name\" th:name=\"billingAddressName\"\n\t\t\t\t\t\t\t\t\t\t\trequired=\"required\"\n\t\t\t\t\t\t\t\t\t\t\tth:value=\"${billingAddress.billingAddressName}\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t<label for=\"billingAddress\">* Street Address</label> <input\n\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control billingAddress\" id=\"billingAddress\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Street Address 1\"\n\t\t\t\t\t\t\t\t\t\t\tth:name=\"billingAddressStreet1\" required=\"required\"\n\t\t\t\t\t\t\t\t\t\t\tth:value=\"${billingAddress.billingAddressStreet1}\" /> <input\n\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control billingAddress\" id=\"billingAddress\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Street Address 2\"\n\t\t\t\t\t\t\t\t\t\t\tth:name=\"billingAddressStreet2\"\n\t\t\t\t\t\t\t\t\t\t\tth:value=\"${billingAddress.billingAddressStreet2}\" />\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"billingCity\">* City</label> <input type=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"form-control billingAddress\" id=\"billingCity\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Billing city\" th:name=\"billingAddressCity\"\n\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${billingAddress.billingAddressCity}\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"billingState\">* State</label> <select\n\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"billingState\" class=\"form-control billingAddress\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"billingAddressState\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${billingAddress.billingAddressState}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"\" disabled=\"disabled\">Please select\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tan option</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<option th:each=\"state : ${stateList}\" th:text=\"${state}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:selected=\"(${billingAddress.billingAddressState}==${state})\"></option>\n\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"billingZipcode\">* Zipcode</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control billingAddress\" id=\"billingZipcode\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Billing Zipcode\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"billingAddressZipcode\" required=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${billingAddress.billingAddressZipcode}\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<a data-toggle=\"collapse\" data-parent=\"#accordion\"\n\t\t\t\t\t\t\t\t\t\tclass=\"btn btn-warning pull-right\" href=\"#reviewItems\">Next</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- 3. Review Items and Shipping -->\n\t\t\t\t\t\t<div class=\"panel panel-default\">\n\t\t\t\t\t\t\t<div class=\"panel-heading\">\n\t\t\t\t\t\t\t\t<h4 class=\"panel-title\">\n\t\t\t\t\t\t\t\t\t<a data-toggle=\"collapse\" data-parent=\"#accordion\"\n\t\t\t\t\t\t\t\t\t\thref=\"#reviewItems\"> 3. Review Items and Shipping </a>\n\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div id=\"reviewItems\" class=\"panel-collapse collapse\">\n\t\t\t\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t\t\t\t<h4>Choose your shipping method:</h4>\n\t\t\t\t\t\t\t\t\t<div class=\"radio\">\n\t\t\t\t\t\t\t\t\t\t<label> <input type=\"radio\" name=\"shippingMethod\"\n\t\t\t\t\t\t\t\t\t\t\tvalue=\"groundShipping\" checked=\"checked\" /> Ground Shipping\n\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class=\"radio\">\n\t\t\t\t\t\t\t\t\t\t<label> <input type=\"radio\" name=\"shippingMethod\"\n\t\t\t\t\t\t\t\t\t\t\tvalue=\"premiumShipping\" /> Premium Shipping\n\t\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-8\">\n\t\t\t\t\t\t\t\t\t\t\t<h4>Products</h4>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t\t\t<h4>Price</h4>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t\t\t<h4>Qty</h4>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<!-- display products in cart -->\n\t\t\t\t\t\t\t\t\t<div class=\"row\" th:each=\"cartItem : ${cartItemList}\">\n\t\t\t\t\t\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail(id=${cartItem.book.id})}\"> <img\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"img-responsive shelf-book\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:src=\"#{adminPath}+@{/image/book/}+${cartItem.book.id}+'.png'\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle=\"width: 70px;\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div style=\"margin-left: 50px;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=}+${cartItem.book.id}\"><h4\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${cartItem.book.title}\"></h4></a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p th:if=\"${cartItem.book.inStockNumber&gt;10}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle=\"color: green;\">In Stock</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:if=\"${cartItem.book.inStockNumber&lt;10 and cartItem.book.inStockNumber&gt;0}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle=\"color: green;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tOnly <span th:text=\"${cartItem.book.inStockNumber}\"></span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tIn Stock\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p th:if=\"${cartItem.book.inStockNumber==0}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle=\"color: darkred;\">Product Unavailable</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a th:href=\"@{/shoppingCart/removeItem?id=}+${cartItem.id}\">delete</a>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<h5 style=\"color: #db3208; font-size: large;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t$<span th:text=\"${cartItem.book.ourPrice}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:style=\"${cartItem.book.inStockNumber}==0? 'text-decoration: line-through' : ''\"></span>\n\t\t\t\t\t\t\t\t\t\t\t\t</h5>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<h5 style=\"font-size: large;\" th:text=\"${cartItem.qty}\"></h5>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t\t\t\t<h4 class=\"col-xs-12 text-right\">\n\t\t\t\t\t\t\t\t\t\t<strong style=\"font-size: large;\">Order Total (<span\n\t\t\t\t\t\t\t\t\t\t\tth:text=\"${#lists.size(cartItemList)}\"></span> items):\n\t\t\t\t\t\t\t\t\t\t</strong> <span style=\"color: #db3208; font-szie: large;\">$<span\n\t\t\t\t\t\t\t\t\t\t\tth:text=\"${shoppingCart.grandTotal}\"></span></span>\n\t\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-warning btn-block\">Place\n\t\t\t\t\t\t\t\t\t\tyour order</button>\n\t\t\t\t\t\t\t\t\t<p style=\"font-size: smaller;\">\n\t\t\t\t\t\t\t\t\t\tBy placing your order, you agree to Le's Bookstore <a href=\"#\">privacy</a>\n\t\t\t\t\t\t\t\t\t\tnotice and <a href=\"#\">conditions</a> of use.\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\t</div>\n\t<!-- end of container -->\n\n\t<div th:replace=\"common/header :: footer\"/>\n\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/common/header.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1999/xhtml\"\n\txmlns:sec=\"http://www.w3.org/1999/xhtml\">\n<head th:fragment=\"common-header\">\n<meta charset=\"utf-8\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n\n<title>E-Books</title>\n\n<!-- Bootstrap core CSS -->\n<link href=\"/css/bootstrap.min.css\" rel=\"stylesheet\" />\n\n<link href=\"/css/non-responsive.css\" rel=\"stylesheet\" />\n\n<!-- data table -->\n<link th:href=\"@{/css/jquery.dataTables.min.css}\" rel=\"stylesheet\" />\n<link th:href=\"@{/css/dataTables.bootstrap.min.css}\" rel=\"stylesheet\" />\n\n<link th:href=\"@{/css/font-awesome.min.css}\" rel=\"stylesheet\" />\n\n<!-- Custom styles for this template -->\n<link href=\"/css/style.css\" rel=\"stylesheet\" />\n\n\n<link rel=\"icon\" href=\"/image/applie-touch-icon.png\" />\n</head>\n\n<body>\n\t<div th:fragment=\"navbar\">\n\t\t<div class=\"page-top\"\n\t\t\tstyle=\"width: 100%; height: 10px; background-color: #008080;\"></div>\n\t\t<!-- Static navbar -->\n\t\t<nav class=\"navbar navbar-default navbar-inverse\">\n\t\t\t<div class=\"container-fluid\">\n\t\t\t\t<div class=\"navbar-header\">\n\t\t\t\t\t<a class=\"navbar-brand\" th:href=\"@{/}\"><span\n\t\t\t\t\t\tclass=\"glyphicon glyphicon-home\"></span> E-Books</a>\n\t\t\t\t</div>\n\t\t\t\t<div id=\"navbar\">\n\t\t\t\t\t<ul class=\"nav navbar-nav navbar-left\">\n\t\t\t\t\t\t<li class=\"dropdown\"><a th:href=\"@{/bookshelf}\"\n\t\t\t\t\t\t\tclass=\"dropdown-toggle\" data-toggle=\"dropdown\" role=\"button\"\n\t\t\t\t\t\t\taria-haspopup=\"true\" aria-expanded=\"false\"><span\n\t\t\t\t\t\t\t\tclass=\"glyphicon glyphicon-list-alt\"></span> BOOKS <span\n\t\t\t\t\t\t\t\tclass=\"caret\"></span></a>\n\t\t\t\t\t\t\t<ul class=\"dropdown-menu\">\n\t\t\t\t\t\t\t\t<li><a th:href=\"@{/bookshelf}\"><span class=\"glyphicon glyphicon-th-list\"></span> Browse All Books</a></li>\n\t\t\t\t\t\t\t\t<li><a th:href=\"@{/searchByCategory(category='Programming')}\" \n\t\t\t\t\t\t\tclass=\"list-group-item\"><span class=\"glyphicon glyphicon-book\"></span> Programming</a></li>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<li><a th:href=\"@{/searchByCategory(category='Engineering')}\" \n\t\t\t\t\t\t\tclass=\"list-group-item\"><span class=\"glyphicon glyphicon-book\"></span> Engineering</a></li>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<li><a th:href=\"@{/searchByCategory(category='Fiction')}\" \n\t\t\t\t\t\t\tclass=\"list-group-item\"><span class=\"glyphicon glyphicon-book\"></span> Fiction</a></li>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<li><a th:href=\"@{/searchByCategory(category='Management')}\" \n\t\t\t\t\t\t\tclass=\"list-group-item\"><span class=\"glyphicon glyphicon-book\"></span> Management</a></li>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<li><a th:href=\"@{/searchByCategory(category='Arts &amp; Literature')}\" \n\t\t\t\t\t\t\tclass=\"list-group-item\"><span class=\"glyphicon glyphicon-book\"></span> Arts &amp; Literature</a></li>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<li><a th:href=\"@{/faq}\"><span class=\"glyphicon glyphicon-question-sign\"></span> FAQ</a></li>\n\n\t\t\t\t\t\t\t</ul></li>\n\t\t\t\t\t\t<form class=\"navbar-form\" th:action=\"@{/searchBook}\" method=\"post\">\n\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t<input type=\"text\" name=\"keyword\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"Book title\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-info btn-sm\"><span\n\t\t\t\t\t\t\t\tclass=\"glyphicon glyphicon-search\"></span> Search</button>\n\t\t\t\t\t\t\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</ul>\n\t\t\t\t\t<ul class=\"nav navbar-nav navbar-right\">\n\t\t\t\t\t\t<li><a th:href=\"@{/shoppingCart/cart}\"><span\n\t\t\t\t\t\t\t\tclass=\"glyphicon glyphicon-shopping-cart\"></span> SHOPPING CART</a></li>\n\t\t\t\t\t\t<li><a sec:authorize=\"isAnonymous()\" th:href=\"@{/login}\"><span\n\t\t\t\t\t\t\t\tclass=\"glyphicon glyphicon-user\"></span> MY ACCOUNT</a></li>\n\t\t\t\t\t\t<li><a sec:authorize=\"isAuthenticated()\"\n\t\t\t\t\t\t\tth:href=\"@{/myProfile}\"><span\n\t\t\t\t\t\t\t\tclass=\"glyphicon glyphicon-user\"></span> MY ACCOUNT</a></li>\n\t\t\t\t\t\t<li><a sec:authorize=\"isAuthenticated()\" th:href=\"@{/logout}\"><span\n\t\t\t\t\t\t\t\tclass=\"glyphicon glyphicon-log-out\"></span> LOGOUT</a></li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<!--/.nav-collapse -->\n\t\t\t</div>\n\t\t\t<!--/.container-fluid -->\n\t\t</nav>\n\t</div>\n\n\t<div th:fragment=\"footer\">\n\t\t<br /> <br />\n\t\t<footer>\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-xs-3 footerleft\">\n\t\t\t\t\t<div class=\"logofooter\">\n\t\t\t\t\t\t<a th:href=\"@{/}\"><img class=\"img-responsive\"\n\t\t\t\t\t\t\tsrc=\"/image/logo.png\" style=\"width: 200px;\" /></a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tE-book. <br />The World's best books is here.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-xs-3 paddingtop-bottom\">\n\t\t\t\t\t<h6 class=\"heading7\">CONTACT</h6>\n\t\t\t\t\t<ul class=\"post\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<i class=\"fa fa-map-pin\"></i> Mirpur - 12<br /> Dhaka, \n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<i class=\"fa fa-phone\"></i> Phone (BD) : +8801712-345678\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<i class=\"fa fa-envelope\"></i> E-mail : foysal.ecommerce.com\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-xs-3 paddingtop-bottom\">\n\t\t\t\t\t<h6 class=\"heading7\">LINKS</h6>\n\t\t\t\t\t<ul class=\"footer-ul\">\n\t\t\t\t\t\t<li><a href=\"#\"> Privacy Policy</a></li>\n\t\t\t\t\t\t<li><a href=\"#\"> Terms &#38; Conditions</a></li>\n\t\t\t\t\t\t<li><a href=\"#\"> Frequently Ask Questions</a></li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-xs-3 paddingtop-bottom\">\n\t\t\t\t\t<h6 class=\"heading7\">Open HOURS</h6>\n\t\t\t\t\t<div class=\"post\">\n\t\t\t\t\t\t<p>Monday - Saturday: 9am - 12pm</p>\n\t\t\t\t\t\t<p>Sunday: 10am - 9pm</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</footer>\n\n\t\t<div class=\"copyright\">\n\t\t\t<div class=\"col-md-6\">\n\t\t\t\t<p>© 2020 - All Rights Reserved</p>\n\t\t\t</div>\n\t\t\t<div class=\"col-md-6\">\n\t\t\t\t<ul class=\"bottom_ul\">\n\t\t\t\t\t<li><a th:href=\"badRequestPage.html\">About us</a></li>\n\t\t\t\t\t<li><a href=\"#\">Foysal</a></li>\n\t\t\t\t\t<li><a href=\"#\">Mahmud</a></li>\n\t\t\t\t\t\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\n\t<div th:fragment=\"body-bottom-scripts\">\n\t\t<script th:src=\"@{/js/jquery.min.js}\"></script>\n\t\t<script src=\"/js/bootstrap.min.js\"></script>\n\n\t\t<script th:src=\"@{/js/scripts.js}\"></script>\n\n\t\t<!-- data table -->\n\t\t<script th:src=\"@{/js/jquery.dataTables.min.js}\"></script>\n\t\t<script th:src=\"@{/js/dataTables.bootstrap.min.js}\"></script>\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/faq.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1999/xhtml\">\n<head th:replace=\"common/header :: common-header\"/>\n<body>\n<div th:replace=\"common/header :: navbar\"/>\n<div class=\"container\">\n    <div class=\"row\" style=\"margin-bottom: -100px;\">\n        <div class=\"row\">\n            <div class=\"col-xs-8\">\n                <h2 class=\"section-headline\"><span>User Account</span></h2>\n            </div>\n            <div class=\"col-xs-4\">\n                <a th:href=\"@{/}\"><img src=\"/image/logo.png\" class=\"img-responsive\"/></a>\n            </div>\n        </div>\n        <hr style=\"position: absolute; width:100%; height:6px; background-color: #333; z-index: -1; margin-top: -80px;\"/>\n        <img class=\"img-responsive\" src=\"/image/wood.png\" style=\"margin-top: -75px;\"/>\n    </div>\n    <div class=\"row\" style=\"margin-top: 120px;\">\n        <div class=\"col-xs-9 col-xs-offset-3\">\n            <h3>Shopping</h3>\n            <hr/>\n            <h4 class=\"question\">Q: How do I place an order?</h4>\n            <p>A:&nbsp;First you need to set up an account, once that is created you are ready to place an order.</p>\n            <h4 class=\"question\">Q: How do I set up an account?&nbsp;</h4>\n            <p>A: Click on the login button in the upper right hand corner of the main page and then click on create an\n                account.</p>\n            <h4 class=\"question\">Q: How long does it take to process and ship orders?</h4>\n            <p>A: Please allow 1 - 3 business days (Monday-Friday) for order processing regardless of the shipping\n                method chosen. Once shipped you should receive your order within 2 - 10 business days. Please note that\n                2 day and Overnight services refer to business days (Monday - Friday).\n            </p>\n            <h4 class=\"question\">Q: Are all of the items guaranteed in stock?</h4>\n            <p>A: We try to update the website as often as possible to reflect out of stock conditions. However, the\n                ability to order an item does not guarantee that it will be in stock when your order is processed. You\n                will be notified if an order is not available.\n            </p>\n            <h4 class=\"question\">Q: Why can't I choose the size and color I want?</h4>\n            <p>A:&nbsp;If you are unable to select a specific size or color, it typically means that the item is out of\n                stock. Try checking back in 2 - 3 weeks to see if your size or color is available.\n            </p>\n            <h4 class=\"question\">Q: I can't find a specific item on the website, are there items available that are not listed on the\n                website?</h4>\n            <p>A:&nbsp;The items that are currently shown on our website represent what is currently available to view\n                and order online. There is a wider selection of merchandise available at the UVM Bookstore and the\n                Catamount Store. Please visit our stores when you are in the Burlington area.\n            </p>\n            <h4 class=\"question\">Q: How can I check the status of my order?</h4>\n            <p>A: If you have registered for an account at the UVM Bookstore, click on \"My Account\" and login with your\n                email address and password. You can view the status of any orders that were made while you were signed\n                in. You can also contact us at&nbsp;1.800.331.7305 with your name, order number, and a request for\n                status of your order. Our office hours are Monday - Friday 8am -4:30pm EST\n            </p>\n            <h4 class=\"question\">Q: How can I cancel or change my order?</h4>\n            <p>A:&nbsp;You can cancel your order or make a change to it by contacting us at 1.999.999.9999 as soon as\n                possible after your order is placed with your name, order number, and a request for cancellation or a\n                description of the requested change. Our office hours are Monday Friday 8am 4:30pm. We will do our best\n                to cancel or modify your order, but we will not be able to complete the cancellation if your order has\n                been processed or shipped.\n            </p>\n\n            <h3>Shipping&nbsp;</h3>\n            <hr />\n            <p>The UVM Bookstore is proud to offer you competitive shipping rates. All of our shipments are\n                professionally packed to ensure the safety of your items in route.</p>\n            <h4 class=\"question\">Q: How much is the shipping charge on orders?</h4>\n            <p>A: The shipping charge depends on the total amount of the merchandise ordered as well as the shipping\n                method chosen. There are some items that incur additional charges such as diploma frames $19.99 for an\n                oversized box and maple syrup $1.00 for double-boxing. The rate for chairs and rockers is $35.00 for\n                shipments east of the Mississippi and $45.00 west of the Mississippi.</p>\n            <h4 class=\"question\">Q. What is your shipping method?</h4>\n            <p>A: We ship UPS, FedEx or US mail .\n            </p>\n            <h4 class=\"question\">Q: When will I receive my order?</h4>\n            <p>A: On average, your order will be received in 7 - 10 working days. During August and January, delivery\n                time may take longer.&nbsp;</p>\n        </div>\n    </div>\n</div>\n\n<div th:replace=\"common/header :: footer\"/>\n\n<div th:replace=\"common/header :: body-bottom-scripts\"/>\n\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\n\n<head th:replace=\"common/header :: common-header\" />\n\n<body>\n\t<div th:replace=\"common/header :: navbar\" />\n\n<!-- start of container -->\n\t<div class=\"container\"> \n\t\t<div class=\"row banner\">\n\t\t\t<!-- carousel effect-->\n\t\t\t<div class=\"col-xs-8\">\n\t\t\t\t<div class=\"panel panel-default\" style=\"margin-top: 20px;\">\n\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t<div id=\"carousel-example-generic\" class=\"carousel slide\" data-ride=\"carousel\">\n\t\t\t\t\t\t\t<!-- Indicators -->\n\t\t\t\t\t\t\t<ol class=\"carousel-indicators\">\n\t\t\t\t\t\t\t\t<li data-target=\"#carousel-example-generic\" data-slide-to=\"0\" class=\"active\"></li>\n\t\t\t\t\t\t\t\t<li data-target=\"#carousel-example-generic\" data-slide-to=\"1\"></li>\n\t\t\t\t\t\t\t\t<li data-target=\"#carousel-example-generic\" data-slide-to=\"2\"></li>\n\t\t\t\t\t\t\t</ol>\n\n\t\t\t\t\t\t\t<!-- Wrapper for slides -->\n\t\t\t\t\t\t\t<div class=\"carousel-inner\" role=\"listbox\">\n\t\t\t\t\t\t\t\t<div class=\"item active\">\n\t\t\t\t\t\t\t\t\t<img src=\"/image/bank.jpg\" class=\"img-responsive\" />\n\t\t\t\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t\t\t\t<h4>Foysal Mahmud</h4>\n\t\t\t\t\t\t\t\t\t\t<p>Studied at Computer Science and Engineering, University of Barisal. </p>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"item\">\n\t\t\t\t\t\t\t\t\t<img src=\"/image/library3.jpg\" class=\"img-responsive\" />\n\t\t\t\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t\t\t\t<h4>Foysal Mahmud</h4>\n\t\t\t\t\t\t\t\t\t\t<p>Studied at Computer Science and Engineering, University of Barisal.</p>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"item\">\n\t\t\t\t\t\t\t\t\t<img src=\"/image/bank.jpg\" class=\"img-responsive\" />\n\t\t\t\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t\t\t\t<h4>Foysal Mahmud</h4>\n\t\t\t\t\t\t\t\t\t\t<p>Studied at Computer Science and Engineering, University of Barisal.</p>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Controls -->\n\t\t\t\t\t\t\t<a class=\"left carousel-control\" href=\"#carousel-example-generic\" role=\"button\"\n\t\t\t\t\t\t\t\tdata-slide=\"prev\"> <span class=\"glyphicon glyphicon-chevron-left\"\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"></span>\n\t\t\t\t\t\t\t\t<span class=\"sr-only\">Previous</span>\n\t\t\t\t\t\t\t</a> <a class=\"right carousel-control\" href=\"#carousel-example-generic\" role=\"button\"\n\t\t\t\t\t\t\t\tdata-slide=\"next\">\n\t\t\t\t\t\t\t\t<span class=\"glyphicon glyphicon-chevron-right\" aria-hidden=\"true\"></span> <span\n\t\t\t\t\t\t\t\t\tclass=\"sr-only\">Next</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\n\t\t\t<!-- logo here -->\n\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t<img src=\"/image/logo.png\" class=\"img-responsive\" />\n\t\t\t\t<img src=\"/image/web-dev.jpg\" class=\"img-responsive\" />\n\t\t\t</div>\n\t\t\t\n\t\t</div>\n\n\t\t<hr /> <!-- Horizontal Line -->\n\n<!-- ----------------------------------------------------------------------------------------- -->\n\n\t\t<div class=\"row\">\n\n\t\t\t<!-- Three images with links -->\n\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t<div class=\"panel panel-default\">\n\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t<a th:href=\"@{/searchByCategory(category='Programming')}\"><img src=\"/image/programmingBook.png\" class=\"img-responsive\" /></a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t<div class=\"panel panel-default\">\n\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t<a th:href=\"@{/bookshelf}\"><img src=\"/image/library.png\" class=\"img-responsive\" /></a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t<div class=\"panel panel-default\">\n\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t<a th:href=\"@{/faq}\"><img src=\"/image/faq.png\" class=\"img-responsive\" /></a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t</div>\n\n<br/>\n<!-- ----------------------------------------------------------------------------------------- -->\n\t\t<div>\n\t\t\t<div class=\"home-headline\"> <span>Best Seller Books</span></div>\n\t\t\t<hr style=\"margin-top: -15px;\" />\n\t\t</div>\n\n\n\t\t<div class=\"row\">\n\t\t\t<div id=\"top-product\" class=\"carousel slide\" data-ride=\"carousel\">\n\t\t\t\t<!-- Indicators -->\n\t\t\t\t<ol class=\"carousel-indicators\">\n\t\t\t\t\t<li data-target=\"#top-product\" data-slide-to=\"0\" class=\"active\"></li>\n\t\t\t\t\t<li data-target=\"#top-product\" data-slide-to=\"1\"></li>\n\t\t\t\t\t<li data-target=\"#top-product\" data-slide-to=\"2\"></li>\n\t\t\t\t</ol>\n\n\t\t\t\t<!-- Wrapper for slides -->\n\t\t\t\t<div class=\"carousel-inner\" role=\"listbox\">\n\t\t\t\t\t<div class=\"item active\">\n\t\t\t\t\t\t<img src=\"/image/shelf.png\" class=\"img-responsive\" />\n\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=46}\"><img class=\"img-responsive\" src=\"/image/book1.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=49}\"><img class=\"img-responsive\" src=\"/image/book2.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=152}\"><img class=\"img-responsive\" src=\"/image/book3.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=50}\"><img class=\"img-responsive\" src=\"/image/book4.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=153}\"><img class=\"img-responsive\" src=\"/image/book5.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=48}\"><img class=\"img-responsive\" src=\"/image/book6.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"item\">\n\t\t\t\t\t\t<img src=\"/image/shelf.png\" class=\"img-responsive\" />\n\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=46}\"><img class=\"img-responsive\" src=\"/image/book1.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=49}\"><img class=\"img-responsive\" src=\"/image/book2.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=153}\"><img class=\"img-responsive\" src=\"/image/book5.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=50}\"><img class=\"img-responsive\" src=\"/image/book4.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=48}\"><img class=\"img-responsive\" src=\"/image/book6.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=152}\"><img class=\"img-responsive\" src=\"/image/book3.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"item\">\n\t\t\t\t\t\t<img src=\"/image/shelf.png\" class=\"img-responsive\" />\n\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=46}\"><img class=\"img-responsive\" src=\"/image/book1.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=49}\"><img class=\"img-responsive\" src=\"/image/book2.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=152}\"><img class=\"img-responsive\" src=\"/image/book3.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=50}\"><img class=\"img-responsive\" src=\"/image/book4.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=153}\"><img class=\"img-responsive\" src=\"/image/book5.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=48}\"><img class=\"img-responsive\" src=\"/image/book6.png\" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Controls -->\n\t\t\t\t<a class=\"left carousel-control\" href=\"#top-product\"\n\t\t\t\t\trole=\"button\" data-slide=\"prev\"> <span\n\t\t\t\t\tclass=\"glyphicon glyphicon-chevron-left\" aria-hidden=\"true\"></span>\n\t\t\t\t\t<span class=\"sr-only\">Previous</span>\n\t\t\t\t</a> <a class=\"right carousel-control\" href=\"#top-product\"\n\t\t\t\t\trole=\"button\" data-slide=\"next\"> <span\n\t\t\t\t\tclass=\"glyphicon glyphicon-chevron-right\" aria-hidden=\"true\"></span>\n\t\t\t\t\t<span class=\"sr-only\">Next</span>\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t</div>\n<!-- ----------------------------------------------------------------------------------------- -->\n\n\t</div>\n\t<!-- end of container -->\n\n\t<div th:replace=\"common/header :: footer\"/>\n\t\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\n</body>\n\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/myAccount.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\n<head th:replace=\"common/header :: common-header\" />\n\n<body>\n\t<div th:replace=\"common/header :: navbar\" />\n\n\t<div class=\"container\">\n\t\t<div class=\"row\" style=\"margin-bottom: -100px;\">\n\t\t\t<div class=\"col-xs-8\">\n\t\t\t\t<h2 class=\"section-headline\">\n\t\t\t\t\t<span>User Account</span>\n\t\t\t\t</h2>\n\t\t\t</div>\n\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t<img src=\"/image/logo.png\" class=\"img-responsive\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<hr\n\t\t\tstyle=\"position: absolute; width: 100%; height: 6px; background-color: #333; z-index: -1; margin-top: -80px;\" />\n\t\t<img class=\"img-responsive\" src=\"/image/wood.png\"\n\t\t\tstyle=\"margin-top: -75px;\" />\n\n\t\t<div class=\"row\" style=\"margin-top: 40px;\">\n\t\t\t<div class=\"col-xs-9 col-xs-offset-3\">\n\n\t\t\t\t<div class=\"panel with-nav-tabs panel-primary\">\n\t\t\t\t\t<div class=\"panel-heading\">\n\n\t\t\t\t\t\t<!-- Nav tabs -->\n\t\t\t\t\t\t<ul class=\"nav nav-tabs\">\n\t\t\t\t\t\t\t<li th:classappend=\"${classActiveNewAccount}? 'active'\"><a\n\t\t\t\t\t\t\t\thref=\"#tab-1\" data-toggle=\"tab\"><span>Create new\n\t\t\t\t\t\t\t\t\t\taccount</span></a></li>\n\t\t\t\t\t\t\t<li th:classappend=\"${classActiveLogin}? 'active'\"><a\n\t\t\t\t\t\t\t\thref=\"#tab-2\" data-toggle=\"tab\"><span>Log in</span></a></li>\n\t\t\t\t\t\t\t<li th:classappend=\"${classActiveForgetPassword}? 'active'\"><a\n\t\t\t\t\t\t\t\thref=\"#tab-3\" data-toggle=\"tab\"><span>Forget Password</span></a></li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t<!-- Tab panels -->\n\t\t\t\t\t\t<div class=\"tab-content\">\n\n\t\t\t\t\t\t\t<!-- create new user pane -->\n\t\t\t\t\t\t\t<div class=\"tab-pane fade\" id=\"tab-1\"\n\t\t\t\t\t\t\t\tth:classappend=\"${classActiveNewAccount}? 'in active'\">\n\t\t\t\t\t\t\t\t<div class=\"panel-group\">\n\t\t\t\t\t\t\t\t\t<div class=\"panel panel-default\" style=\"border: none;\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"panel-body\"\n\t\t\t\t\t\t\t\t\t\t\tstyle=\"background-color: #ededed; margin-top: 20px;\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"alert alert-info\" th:if=\"${emailSent}\">An\n\t\t\t\t\t\t\t\t\t\t\t\temail has been sent to the email address you just\n\t\t\t\t\t\t\t\t\t\t\t\tregistered. Please validate your email address and update\n\t\t\t\t\t\t\t\t\t\t\t\tyour password information.</div>\n\t\t\t\t\t\t\t\t\t\t\t<form th:action=\"@{/newUser}\" method=\"post\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"newUsername\">* Username: </label>&nbsp;<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle=\"color: red;\" th:if=\"${usernameExists}\">Username\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talready exists. Choose a different one.</span> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\" type=\"text\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"newUsername\" name=\"username\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p style=\"color: #828282\">Enter your username here.</p>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"email\">* Email Address: </label><span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle=\"color: red;\" th:if=\"${emailExists}\">Email\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talready exists. Choose a different one.</span> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\" type=\"text\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"email\" name=\"email\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p style=\"color: #828282\">A valid email address. All\n\t\t\t\t\t\t\t\t\t\t\t\t\t\temails from the system will be sent to this address. The\n\t\t\t\t\t\t\t\t\t\t\t\t\t\temail address is not made public and will only be used if\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyou wish to receive a new password or wish to receive\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcertain notification.</p>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\">Create\n\t\t\t\t\t\t\t\t\t\t\t\t\tnew account</button>\n\t\t\t\t\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- log in -->\n\t\t\t\t\t\t\t<div class=\"tab-pane fade\" id=\"tab-2\"\n\t\t\t\t\t\t\t\tth:classappend=\"${classActiveLogin}? 'in active'\">\n\t\t\t\t\t\t\t\t<div class=\"panel-group\">\n\t\t\t\t\t\t\t\t\t<div class=\"panel panel-default\" style=\"border: none;\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"panel-body\"\n\t\t\t\t\t\t\t\t\t\t\tstyle=\"background-color: #ededed; margin-top: 20px;\">\n\t\t\t\t\t\t\t\t\t\t\t<div th:if=\"${param.error != null}\" style=\"color: red;\">Incorrect\n\t\t\t\t\t\t\t\t\t\t\t\tusername or password.</div>\n\t\t\t\t\t\t\t\t\t\t\t<form th:action=\"@{/login}\" method=\"post\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"username\">* Username: </label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\" type=\"text\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"username\" name=\"username\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p style=\"color: #828282\">Enter your username here.</p>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"password\">* Password: </label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\" type=\"password\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"password\" name=\"password\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p style=\"color: #828282\">Enter the password that\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taccompanies your username</p>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\">Log\n\t\t\t\t\t\t\t\t\t\t\t\t\tin</button>\n\t\t\t\t\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- forget password -->\n\t\t\t\t\t\t\t<div class=\"tab-pane fade\" id=\"tab-3\"\n\t\t\t\t\t\t\t\tth:classappend=\"${classActiveForgetPassword}? 'in active'\">\n\t\t\t\t\t\t\t\t<div class=\"panel-group\">\n\t\t\t\t\t\t\t\t\t<div class=\"panel panel-default\" style=\"border: none;\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"panel-body\"\n\t\t\t\t\t\t\t\t\t\t\tstyle=\"background-color: #ededed; margin-top: 20px;\">\n\t\t\t\t\t\t\t\t\t\t\t<div th:if=\"${emailNotExist}\" class=\"alert alert-danger\">Email\n\t\t\t\t\t\t\t\t\t\t\t\tdoesn't exist.</div>\n\t\t\t\t\t\t\t\t\t\t\t<div th:if=\"${forgetPasswordEmailSent}\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"alert alert-success\">Email sent.</div>\n\t\t\t\t\t\t\t\t\t\t\t<form th:action=\"@{/forgetPassword}\" method=\"post\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"recoverEmail\">* Your Email: </label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\" type=\"text\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"recoverEmail\" name=\"email\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p style=\"color: #828282\">Enter your registered email\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taddress here.</p>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n\t\t\t\t\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<!-- end of container -->\n\n\t<div th:replace=\"common/header :: footer\"/>\n\t\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/myProfile.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\n<head th:replace=\"common/header :: common-header\" />\n\n<body>\n\t<div th:replace=\"common/header :: navbar\" />\n\n\t<div class=\"container\">\n\t\t<div class=\"row\" style=\"margin-bottom: -100px;\">\n\t\t\t<div class=\"col-xs-8\">\n\t\t\t\t<h2 class=\"section-headline\">\n\t\t\t\t\t<h2 class=\"section-headline\">\n\t\t\t\t\t\t<span th:text=\"${#strings.toUpperCase(user.username)}\"></span>\n\t\t\t\t\t</h2>\n\t\t\t\t</h2>\n\t\t\t</div>\n\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t<img src=\"/image/logo.png\" class=\"img-responsive\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<hr style=\"position: absolute; width: 100%; height: 6px; background-color: #333; z-index: -1; margin-top: -80px;\" />\n\t\t<img class=\"img-responsive\" src=\"/image/wood.png\"\n\t\t\tstyle=\"margin-top: -75px;\" />\n\n\t\t<div class=\"row\" style=\"margin-top: 60px;\">\n\t\t\t<div class=\"col-xs-9 col-xs-offset-3\">\n\n\t\t\t\t<div class=\"panel with-nav-tabs panel-primary\">\n\t\t\t\t\t<div class=\"panel-heading\">\n\n\t\t\t\t\t\t<!-- Nav tabs -->\n\t\t\t\t\t\t<ul class=\"nav nav-tabs\">\n\t\t\t\t\t\t\t<li th:classappend=\"${classActiveEdit}? 'active'\"><a\n\t\t\t\t\t\t\t\thref=\"#tab-1\" data-toggle=\"tab\"><span>Edit</span></a></li>\n\t\t\t\t\t\t\t<li th:classappend=\"${classActiveOrders}? 'active'\"><a\n\t\t\t\t\t\t\t\thref=\"#tab-2\" data-toggle=\"tab\"><span>Orders</span></a></li>\n\t\t\t\t\t\t\t<li th:classappend=\"${classActiveBilling}? 'active'\"><a\n\t\t\t\t\t\t\t\thref=\"#tab-3\" data-toggle=\"tab\"><span>Billing</span></a></li>\n\t\t\t\t\t\t\t<li th:classappend=\"${classActiveShipping}? 'active'\"><a\n\t\t\t\t\t\t\t\thref=\"#tab-4\" data-toggle=\"tab\"><span>Shipping</span></a></li>\n\t\t\t\t\t\t</ul>\n\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"panel-body\">\n\n\t\t\t\t\t\t<!-- Tab panels -->\n\t\t\t\t\t\t<div class=\"tab-content\">\n\n\t\t\t\t\t\t\t<!-- Edit user information -->\n\t\t\t\t\t\t\t<div class=\"tab-pane fade\" id=\"tab-1\"\n\t\t\t\t\t\t\t\tth:classappend=\"${classActiveEdit}? 'in active'\">\n\t\t\t\t\t\t\t\t<div class=\"panel-group\">\n\t\t\t\t\t\t\t\t\t<div class=\"panel panel-default\" style=\"border: none;\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"panel-body\"\n\t\t\t\t\t\t\t\t\t\t\tstyle=\"background-color: #ededed; margin-top: 20px;\">\n\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"alert alert-danger\" th:if=\"${incorrectPassword}\">\n\t\t\t\t\t\t\t\t\t\t\t\t<strong>Incorrect Password!</strong> Please enter the\n\t\t\t\t\t\t\t\t\t\t\t\tcorrect password for the current user.\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"alert alert-succss\" th:if=\"${updateSuccess}\">\n\t\t\t\t\t\t\t\t\t\t\t\t<strong style=\"color: green\">Update Successfully!!!</strong>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t<form th:action=\"@{/updateUserInfo}\" method=\"post\">\n\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"id\" th:value=\"${user.id}\" />\n\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"bg-info\" th:if=\"${updateUserInfo}\">User\n\t\t\t\t\t\t\t\t\t\t\t\t\tinfo updated.</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"firstName\">First Name</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"firstName\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tname=\"firstName\" th:value=\"${user.firstName}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"lastName\">Last Name</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"lastName\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tname=\"lastName\" th:value=\"${user.lastName}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"userName\">UserName</label> <input type=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"form-control\" id=\"userName\" name=\"username\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${user.username}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"currentPassword\">Current Password</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"password\" class=\"form-control\" id=\"currentPassword\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tname=\"password\" th:value=\"${currentPassword}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<p style=\"color: #828282\">Enter your current password to\n\t\t\t\t\t\t\t\t\t\t\t\t\tchange the email address or password.</p>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"email\">* Email Address</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"email\" name=\"email\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${user.email}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<p style=\"color: #828282\">A valid email address. All\n\t\t\t\t\t\t\t\t\t\t\t\t\temails from the system withll be sent to this address. The\n\t\t\t\t\t\t\t\t\t\t\t\t\temail address is not made public and will only be used if\n\t\t\t\t\t\t\t\t\t\t\t\t\tyou wish to receive a new password or wish to receive\n\t\t\t\t\t\t\t\t\t\t\t\t\tcertain notification.</p>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"txtNewPassword\">Password</label>&nbsp;<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"checkPasswordMatch\" style=\"color: red;\"></span> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"password\" class=\"form-control\" id=\"txtNewPassword\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tname=\"newPassword\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"txtConfirmPassword\">Confirm Password</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"password\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"txtConfirmPassword\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<p style=\"color: #828282\">To change the current user\n\t\t\t\t\t\t\t\t\t\t\t\t\tpassword, enter the new password in both fields.</p>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<button id=\"updateUserInfoButton\" type=\"submit\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"btn btn-primary\">Save All</button>\n\t\t\t\t\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Order Information -->\n\t\t\t\t\t\t\t<div class=\"tab-pane fade\" id=\"tab-2\"\n\t\t\t\t\t\t\t\tth:classappend=\"${classActiveOrders}? 'in active'\">\n\t\t\t\t\t\t\t\t<div class=\"panel-group\">\n\t\t\t\t\t\t\t\t\t<div class=\"panel panel-default\" style=\"border: none;\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"panel-body\"\n\t\t\t\t\t\t\t\t\t\t\tstyle=\"background-color: #ededed; margin-top: 20px;\">\n\n\t\t\t\t\t\t\t\t\t\t\t<table class=\"table table-sm table-inverse\">\n\t\t\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Order Date</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Order Number</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Total</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Status</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<tr th:each=\"order : ${orderList}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td><a th:href=\"@{/orderDetail(id=${order.id})}\"><span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.orderDate}\"></span></a></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td data-th-text=\"${order.id}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td data-th-text=\"${order.orderTotal}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td data-th-text=\"${order.orderStatus}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t\t\t</table>\n\n\t\t\t\t\t\t\t\t\t\t\t<div th:if=\"${displayOrderDetail}\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-12\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h2>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tOrder Detail for Purchase #<span th:text=\"${order.id}\"></span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<hr />\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"panel panel-default height\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"panel-heading\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<strong>Billing Details</strong>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.billingAddress.billingAddressName}\"></span><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.billingAddress.billingAddressStreet1}+' '+${order.billingAddress.billingAddressStreet2}\"></span><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.billingAddress.billingAddressCity}\"></span><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.billingAddress.billingAddressState}\"></span><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.billingAddress.billingAddressZipcode}\"></span><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"panel panel-default height\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"panel-heading\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<strong>Payment Information</strong>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span th:text=\"${order.payment.holderName}\">Card\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tName</span><br /> <span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.payment.cardNumber}\">Card\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tNumber</span><br /> <span>Exp Date:</span><span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.payment.expiryMonth}\"></span>/<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.payment.expiryYear}\"></span><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"panel panel-default height\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"panel-heading\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<strong>Shipping Details</strong>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.shippingAddress.shippingAddressName}\"></span><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.shippingAddress.shippingAddressStreet1}+' '+${order.shippingAddress.shippingAddressStreet2}\"></span><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.shippingAddress.shippingAddressCity}\"></span><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.shippingAddress.shippingAddressState}\"></span><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${order.shippingAddress.shippingAddressZipcode}\"></span><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-md-12\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"panel-heading\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h3 class=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<strong>Order Summary</strong>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"table-responsive\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<table class=\"table table-condensed\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td><strong>Item Name</strong></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"text-center\"><strong>Item\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tPrice</strong></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"text-center\"><strong>Item\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tQuantity</strong></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"text-right\"><strong>Total</strong></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</thead>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr th:each=\"cartItem : ${cartItemList}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td data-th-text=\"${cartItem.book.title}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"text-center\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-th-text=\"${cartItem.book.ourPrice}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"text-center\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-th-text=\"${cartItem.qty}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"text-right\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-th-text=\"${cartItem.subtotal}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"highrow\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"highrow\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"highrow text-center\"><strong>SubTotal</strong></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"highrow text-right\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-th-text=\"${order.orderTotal}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"emptyrow\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"emptyrow\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"emptyrow text-center\"><strong>Tax</strong></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"emptyrow text-right\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-th-text=\"${#numbers.formatDecimal(order.orderTotal*0.06,0,2)}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"emptyrow\"><i\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"fa fa-barcode iconbig\"></i></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"emptyrow\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td class=\"emptyrow text-center\"><strong>Total</strong></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:with=\"total=${order.orderTotal+order.orderTotal*0.06}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-th-text=\"${#numbers.formatDecimal(total, 0, 2)}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"emptyrow text-right\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Billing Information -->\n\t\t\t\t\t\t\t<div class=\"tab-pane fade\" id=\"tab-3\"\n\t\t\t\t\t\t\t\tth:classappend=\"${classActiveBilling}? 'in active'\">\n\t\t\t\t\t\t\t\t<div class=\"panel-group\">\n\t\t\t\t\t\t\t\t\t<div class=\"panel panel-default\" style=\"border: none;\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"panel-body\"\n\t\t\t\t\t\t\t\t\t\t\tstyle=\"background-color: #ededed; margin-top: 20px;\">\n\t\t\t\t\t\t\t\t\t\t\t<ol class=\"breadcrumb\">\n\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"breadcrumb-item active\"><a\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:href=\"@{/listOfCreditCards}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:style=\"${listOfCreditCards}? 'color:red'\">List of\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tCredit Cards</a></li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"breadcrumb-item active\"><a\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:href=\"@{/addNewCreditCard}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:style=\"${addNewCreditCard}? 'color:red'\">Add(Update)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tCredit Card</a></li>\n\t\t\t\t\t\t\t\t\t\t\t</ol>\n\n\t\t\t\t\t\t\t\t\t\t\t<div th:if=\"${listOfCreditCards}\">\n\t\t\t\t\t\t\t\t\t\t\t\t<form th:action=\"@{/setDefaultPayment}\" method=\"post\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<table class=\"table\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Default</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Credit Card</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Operations</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr th:each=\"userPayment : ${userPaymentList}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"defaultUserPaymentId\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userPayment.id}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:checked=\"${userPayment.defaultPayment}\" /></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td th:text=\"${userPayment.cardName}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td><a\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:href=\"@{/updateCreditCard(id=${userPayment.id})}\"><i\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"fa fa-pencil\" style=\"color: green\">Edit</i></a>&nbsp;&nbsp;&nbsp;&nbsp;<a\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:href=\"@{/removeCreditCard(id=${userPayment.id})}\"><i\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"fa fa-times\" style=\"color: red\">Delete</i></a></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button class=\"btn btn-primary\" type=\"submit\">Save</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t<div th:if=\"${addNewCreditCard}\">\n\t\t\t\t\t\t\t\t\t\t\t\t<form th:action=\"@{addNewCreditCard}\" method=\"post\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"bg-info\" th:if=\"${updateUserPaymentInfo}\">User\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tinfo updated.</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input hidden=\"hidden\" name=\"id\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userPayment.id}\" />\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h5>* Give a name for your card:</h5>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" class=\"form-control\" id=\"cardName\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Card Name\" th:name=\"cardName\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\" th:value=\"${userPayment.cardName}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- Billing Address -->\n\t\t\t\t\t\t\t\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h4>Billing Address</h4>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"billingName\">* Name</label> <input type=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"form-control\" id=\"billingName\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Receiver Name\" th:name=\"userBillingName\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userBilling.userBillingName}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"billingAddress\">* Street Address</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"billingAddress\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Street Address 1\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"userBillingStreet1\" required=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userBilling.userBillingStreet1}\" /> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"billingAddress\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Street Address 2\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"userBillingStreet2\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userBilling.userBillingStreet2}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"billingCity\">* City</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"billingCity\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Billing city\" th:name=\"userBillingCity\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userBilling.userBillingCity}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"billingState\">* State</label> <select\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"billingState\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"userBillingState\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userBilling.userBillingState}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"\" disabled=\"disabled\">Please\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselect an option</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option th:each=\"state : ${stateList}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${state}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:selected=\"(${userBilling.userBillingState}==${state})\"></option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"billingZipcode\">* Zipcode</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"billingZipcode\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Billing Zipcode\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"userBillingZipcode\" required=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userBilling.userBillingZipcode}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- Credit Card Information -->\n\t\t\t\t\t\t\t\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h4>Credit Card Information</h4>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-12\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img src=\"/image/creditcard.png\" class=\"img-responsive\" /><br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"cardType\">* Select Card Type:</label> <select\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"form-control\" id=\"cardType\" th:name=\"type\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userPayment.type}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"visa\">Visa</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"mastercard\">Mastercard</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"discover\">Discover</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"amex\">American Express</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"cardHolder\">* Card Holder Name:</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"cardHolder\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\" placeHolder=\"Card Holder Name\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"holderName\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userPayment.holderName}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"cardNumber\">* Card Number:</label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"input-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"tel\" class=\"form-control\" id=\"cardNumber\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\" placeHolder=\"Valid Card Number\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"cardNumber\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userPayment.cardNumber}\" /> <span\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"input-group-addon\"><i\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"fa fa-credit-card\" aria-hidden=\"true\"></i></span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-7\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label>* Expiration Date</label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<select class=\"form-control\" name=\"expiryMonth\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userPayment.expiryMonth}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option disabled=\"disabled\">-- Month --</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"01\">Jan (01)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"02\">Feb (02)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"03\">Mar (03)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"04\">Apr (04)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"05\">May (05)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"06\">June (06)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"07\">July (07)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"08\">Aug (08)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"09\">Sep (09)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"10\">Oct (10)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"11\">Nov (11)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"12\">Dec (12)</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<select class=\"form-control\" name=\"expiryYear\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userPayment.expiryYear}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option disabled=\"disabled\">-- Year --</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"20\">2020</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"21\">2021</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"22\">2022</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2023</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2024</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2025</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2026</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2027</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2028</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2029</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"23\">2030</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"cardCVC\">CV Code</label> <input id=\"cardCVC\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"tel\" class=\"form-control\" name=\"cvc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"CVC\" th:name=\"cvc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userPayment.cvc}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary btn-lg\">Save\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAll</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Shipping Information -->\n\t\t\t\t\t\t\t<div class=\"tab-pane fade\" id=\"tab-4\"\n\t\t\t\t\t\t\t\tth:classappend=\"${classActiveShipping}? 'in active'\">\n\t\t\t\t\t\t\t\t<div class=\"panel-group\">\n\t\t\t\t\t\t\t\t\t<div class=\"panel panel-default\" style=\"border: none;\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"panel-body\"\n\t\t\t\t\t\t\t\t\t\t\tstyle=\"background-color: #ededed; margin-top: 20px;\">\n\n\t\t\t\t\t\t\t\t\t\t\t<ol class=\"breadcrumb\">\n\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"breadcrumb-item active\"><a\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:href=\"@{/listOfShippingAddresses}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:style=\"${listOfShippingAddresses}? 'color:red'\">List\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tof Shipping Addresses</a></li>\n\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"breadcrumb-item active\"><a\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:href=\"@{/addNewShippingAddress}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tth:style=\"${addNewShippingAddress}? 'color:red'\">Add(Update)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tShipping Address</a></li>\n\t\t\t\t\t\t\t\t\t\t\t</ol>\n\n\t\t\t\t\t\t\t\t\t\t\t<div th:if=\"${listOfShippingAddresses}\">\n\t\t\t\t\t\t\t\t\t\t\t\t<form th:action=\"@{/setDefaultShippingAddress}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tmethod=\"post\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<table class=\"table\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Default</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Shipping Address</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<th>Operations</th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<tr th:each=\"userShipping : ${userShippingList}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tname=\"defaultShippingAddressId\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userShipping.id}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:checked=\"${userShipping.userShippingDefault}\" /><span>default</span></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${userShipping.userShippingStreet1}+', '+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t${userShipping.userShippingCity}+', '+${userShipping.userShippingState}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<td><a\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:href=\"@{/updateUserShipping(id=${userShipping.id})}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-pencil\" style=\"color: green\">Edit</i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>&nbsp;&nbsp;&nbsp;&nbsp; <a\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:href=\"@{/removeUserShipping(id=${userShipping.id})}\"><i\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"fa fa-times\" style=\"color: red\">Delete</i></a></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button class=\"btn btn-primary\" type=\"submit\">Save</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t<div th:if=\"${addNewShippingAddress}\">\n\t\t\t\t\t\t\t\t\t\t\t\t<form th:action=\"@{/addNewShippingAddress}\" method=\"post\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"bg-info\" th:if=\"${updateUserShippingInfo}\">User\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tinfo updated.</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input hidden=\"hidden\" name=\"id\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userShipping.id}\" />\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- Shipping Address -->\n\t\t\t\t\t\t\t\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<h4>Shipping Address</h4>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"shippingName\">* Name</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"shippingName\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Receiver Name\" th:name=\"userShippingName\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userShipping.userShippingName}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"shippingAddress\">* Street Address</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"shippingAddress\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Street Address 1\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"userShippingStreet1\" required=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userShipping.userShippingStreet1}\" /> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Street Address 2\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"userShppingStreet2\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userShipping.userShippingStreet2}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"shippingCity\">* City</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"shippingCity\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Shipping City\" th:name=\"userShippingCity\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userShipping.userShippingCity}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"shippingState\">* State</label> <select\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"shippingState\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"userShippingState\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userShipping.userShippingState}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"\" disabled=\"disabled\">Please\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselect an option</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option th:each=\"state : ${stateList}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:text=\"${state}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:selected=\"(${userShipping.userShippingState}==${state})\"></option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"shippingZipcode\">* Zipcode</label> <input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\" class=\"form-control\" id=\"shippingZipcode\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Shipping Zipcode\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:name=\"userShippingZipcode\" required=\"required\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tth:value=\"${userShipping.userShippingZipcode}\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary btn-lg\">Save\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAll</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<!-- end of container -->\n\n\n\t<div th:replace=\"common/header :: footer\" />\n\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/orderConfirmationEmailTemplate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1999/xhtml\">\n<head>\n\n<!-- Bootstrap core CSS -->\n<link href=\"/css/bootstrap.min.css\" rel=\"stylesheet\" />\n\n<link href=\"/css/non-responsive.css\" rel=\"stylesheet\" />\n\n<link href=\"/css/font-awesome.min.css\" rel=\"stylesheet\" />\n\n<!-- Custom styles for this template -->\n<link href=\"/css/style.css\" rel=\"stylesheet\" />\n\n<style>\ntable {\n\tfont-family: \"Trebuchet MS\", Arial, Helvetica, sans-serif;\n\tborder-collapse: collapse;\n\twidth: 100%;\n}\n\nth, td {\n\tborder: 2px solid #ddd;\n\tpadding: 8px;\n}\n\nth {\n\tpadding-top: 12px;\n\tpadding-bottom: 12px;\n\ttext-align: left;\n\tbackground-color: teal;\n\tcolor: white;\n}\n\ntr:hover {\n\tbackground-color: #ddd;\n}\n\ntr:nth-child(even) {\n\tbackground-color: #f2f2f2;\n}\n</style>\n</head>\n<body>\n\t<p>\n\t\tDear <span th:text=\"${user.firstName}\"></span>,\n\t</p>\n\t<br />\n\t<p>Thank you for shopping from our site. We hope you had a good\n\t\ttime with our service!</p>\n\t<p>\n\t\tYour order number is: <strong>#<span th:text=\"${order.id}\"></span></strong>.\n\t\tHere is your order detail:\n\t</p>\n\t<h2>\n\t\tOrder Detail for purchase #<span th:text=\"${order.id}\"></span>\n\t</h2>\n\t<hr />\n\n\t<table>\n\t\t<tr>\n\t\t\t<th>Billing Detail</th>\n\t\t\t<th>Payment Information</th>\n\t\t\t<th>Shipping Address</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td><span th:text=\"${order.billingAddress.billingAddressName}\"></span><br />\n\t\t\t\t<span\n\t\t\t\tth:text=\"${order.billingAddress.billingAddressStreet1}+' '+${order.billingAddress.billingAddressStreet2}\"></span><br />\n\t\t\t\t<span th:text=\"${order.billingAddress.billingAddressCity}\"></span><br />\n\t\t\t\t<span th:text=\"${order.billingAddress.billingAddressState}\"></span><br />\n\t\t\t\t<span th:text=\"${order.billingAddress.billingAddressZipcode}\"></span><br />\n\t\t\t</td>\n\t\t\t<td><span th:text=\"${order.payment.holderName}\"></span><br /> <span\n\t\t\t\tth:text=\"${order.payment.type}\"></span><br /> <span\n\t\t\t\tth:text=\"${order.payment.cardNumber}\"></span><br /> <span\n\t\t\t\tth:text=\"${order.payment.expiryMonth}\"></span><br /> <span\n\t\t\t\tth:text=\"${order.payment.expiryYear}\"></span><br /></td>\n\t\t\t<td><span th:text=\"${order.shippingAddress.shippingAddressName}\"></span><br />\n\t\t\t\t<span\n\t\t\t\tth:text=\"${order.shippingAddress.shippingAddressStreet1}+' '+${order.shippingAddress.shippingAddressStreet2}\"></span><br />\n\t\t\t\t<span th:text=\"${order.shippingAddress.shippingAddressCity}\"></span><br />\n\t\t\t\t<span th:text=\"${order.shippingAddress.shippingAddressState}\"></span><br />\n\t\t\t\t<span th:text=\"${order.shippingAddress.shippingAddressZipcode}\"></span><br />\n\t\t\t</td>\n\t\t</tr>\n\t</table>\n\n\t<h3>\n\t\t<strong>Order Summary</strong>\n\t</h3>\n\t<table>\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<td><strong> Item Name </strong></td>\n\t\t\t\t<td class=\"text-center\"><strong> Item Price </strong></td>\n\t\t\t\t<td class=\"text-center\"><strong> Item Quantity </strong></td>\n\t\t\t\t<td class=\"text-right\"><strong> Total </strong></td>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr th:each=\"cartItem : ${cartItemList}\">\n\t\t\t\t<td><span data-th-text=\"${cartItem.book.title}\"></span></td>\n\t\t\t\t<td class=\"text-center\" data-th-text=\"${cartItem.book.ourPrice}\"></td>\n\t\t\t\t<td class=\"text-center\" data-th-text=\"${cartItem.qty}\"></td>\n\t\t\t\t<td class=\"text-right\" data-th-text=\"${cartItem.subtotal}\"></td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td class=\"highrow\"></td>\n\t\t\t\t<td class=\"highrow\"></td>\n\t\t\t\t<td class=\"highrow text-center\"><strong>Subtotal</strong></td>\n\t\t\t\t<td class=\"highrow text-right\" data-th-text=\"${order.orderTotal}\"></td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td class=\"emptyrow\"></td>\n\t\t\t\t<td class=\"emptyrow\"></td>\n\t\t\t\t<td class=\"emptyrow text-center\"><strong>Tax</strong></td>\n\t\t\t\t<td class=\"emptyrow text-right\"\n\t\t\t\t\tdata-th-text=\"${#numbers.formatDecimal(order.orderTotal*0.06,0,2)}\"></td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td class=\"emptyrow\"><i class=\"fa fa-barcode iconbig\"></i></td>\n\t\t\t\t<td class=\"emptyrow\"></td>\n\t\t\t\t<td class=\"emptyrow text-center\"><strong>Total</strong></td>\n\t\t\t\t<td th:with=\"total=${order.orderTotal+order.orderTotal*0.06}\"\n\t\t\t\t\tdata-th-text=\"${#numbers.formatDecimal(total, 0, 2)}\"\n\t\t\t\t\tclass=\"emptyrow text-right\"></td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n\n\t<br />\n\t<p>Best,</p>\n\t<p>Foysal Mahmud.</p>\n\t<p>Department of CSE, University of Barisal.</p>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/orderSubmittedPage.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\n<head th:replace=\"common/header :: common-header\" />\n\n<body>\n\t<div th:replace=\"common/header :: navbar\" />\n\n\t<div class=\"container\">\n\t\t<div class=\"row\" style=\"margin-bottom: -100px;\">\n\t\t\t<div class=\"col-xs-8\">\n\t\t\t\t<h2 class=\"section-headline\">\n\t\t\t\t\t<span>User Account</span>\n\t\t\t\t</h2>\n\t\t\t</div>\n\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t<img src=\"/image/logo.png\" class=\"img-responsive\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<hr\n\t\t\tstyle=\"position: absolute; width: 100%; height: 6px; background-color: #333; z-index: -1; margin-top: -80px;\" />\n\t\t<img class=\"img-responsive\" src=\"/image/wood.png\"\n\t\t\tstyle=\"margin-top: -75px;\" />\n\n\t\t<div class=\"row\" style=\"margin-top: 10px;\">\n\t\t\t<div class=\"col-xs-12\">\n\t\t\t\t<div class=\"alert alert-success\">\n\t\t\t\t\t<h3>\n\t\t\t\t\t\t<i class=\"fa fa-check\" aria-hidden=\"true\"\n\t\t\t\t\t\t\tstyle=\"color: limegreen;\"></i> Thank you, your order has been\n\t\t\t\t\t\tplaced.\n\t\t\t\t\t</h3>\n\t\t\t\t\t<h4>\n\t\t\t\t\t\tThe estimated delivery date is <span\n\t\t\t\t\t\t\tth:text=\"${estimatedDeliveryDate}\"></span>\n\t\t\t\t\t</h4>\n\t\t\t\t</div>\n\n\t\t\t\t<h3>List of Items</h3>\n\t\t\t\t<div class=\"row\" th:each=\"cartItem : ${cartItemList}\">\n\t\t\t\t\t<hr />\n\t\t\t\t\t<div class=\"col-xs-2\"></div>\n\t\t\t\t\t<div class=\"col-xs-2\">\n\n\t\t\t\t\t\t<a th:href=\"@{/bookDetail(id=${cartItem.book.id})}\"> <img\n\t\t\t\t\t\t\tclass=\"img-responsive shelf-book\"\n\t\t\t\t\t\t\tth:src=\"#{adminPath}+@{/image/book/}+${cartItem.book.id}+'.png'\"\n\t\t\t\t\t\t\tstyle=\"width: 70px;\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t\t<div style=\"margin-left: 50px;\">\n\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=}+${cartItem.book.id}\"><h4\n\t\t\t\t\t\t\t\t\tth:text=\"${cartItem.book.title}\"></h4></a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t<h5 style=\"color: #db3208; font-size: large;\">\n\t\t\t\t\t\t\t$<span th:text=\"${cartItem.book.ourPrice}\"\n\t\t\t\t\t\t\t\tth:style=\"${cartItem.book.inStockNumber}==0? 'text-decoration: line-through' : ''\"></span>\n\t\t\t\t\t\t</h5>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<!-- end of container -->\n\n\t<div th:replace=\"common/header :: footer\"/>\n\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/templates/shoppingCart.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.w3.org/1000/xhtml\">\n<head th:replace=\"common/header :: common-header\" />\n\n<body>\n\t<div th:replace=\"common/header :: navbar\" />\n\n\t<div class=\"container\">\n\t\t<div class=\"row\" style=\"margin-bottom: -100px;\">\n\t\t\t<div class=\"col-xs-8\">\n\t\t\t\t<h2 class=\"section-headline\">\n\t\t\t\t\t<h2 class=\"section-headline\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tth:text=\"${user}? ${#strings.toUpperCase(user.username)} : 'All Books'\"></span>\n\t\t\t\t\t</h2>\n\t\t\t\t</h2>\n\t\t\t</div>\n\t\t\t<div class=\"col-xs-4\">\n\t\t\t\t<img src=\"/image/logo.png\" class=\"img-responsive\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<hr style=\"position: absolute; width:85%; height: 6px; background-color: #333; z-index: -1; margin-top: -80px;\" />\n\t\t<img class=\"img-responsive\" src=\"/image/wood.png\"\n\t\t\tstyle=\"margin-top: -75px;\" />\n\n\t\t<div class=\"row\" style=\"margin-top: 10px;\">\n\t\t\t<div class=\"col-xs-12\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"col-xs-6 text-left\">\n\t\t\t\t\t\t<a class=\"btn btn-warning\" th:href=\"@{/bookshelf}\">Continue\n\t\t\t\t\t\t\tShopping</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"col-xs-6 text-right\">\n\t\t\t\t\t\t<a class=\"btn btn-primary\"\n\t\t\t\t\t\t\tth:href=\"@{/checkout(id=${shoppingCart.id})}\">Check Out</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<br />\n\t\t\t\t\t<div th:if=\"${notEnoughStock}\" class=\"alert alert-warning\">\n\t\t\t\t\t\tOops, some of the products don't have enough stock. Please update\n\t\t\t\t\t\tproduct quantity.</div>\n\t\t\t\t\t<div th:if=\"${emptyCart}\" class=\"alert alert-warning\">Oops,\n\t\t\t\t\t\tyour cart is empty. See if you can find what you like in the\n\t\t\t\t\t\tbookshelf and add them to cart.</div>\n\n\t\t\t\t\t<br /> <br />\n\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t<div class=\"col-xs-8 \">\n\t\t\t\t\t\t\t<h4 style=\"margin-left:70px;\">Products</h4>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t<h4>Price</h4>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t<h4>Qty</h4>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!--**************** display products in cart ****************-->\n\n\t\t\t\t\t<div class=\"row\" th:each=\"cartItem : ${cartItemList}\">\n\t\t\t\t\t\t<form th:action=\"@{/shoppingCart/updateCartItem}\" method=\"post\">\n\t\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t<a th:href=\"@{bookDetail(id=${cartItem.book.id})}\"> <img\n\t\t\t\t\t\t\t\t\tstyle=\"width:70px;\"\n\t\t\t\t\t\t\t\t\tclass=\"img-responsive shelf-book center-block\"\n\t\t\t\t\t\t\t\t\tth:src=\"#{adminPath}+@{/image/book/}+\n\t\t\t\t\t\t\t\t${cartItem.book.id}+'.png'\" />\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"col-xs-6\">\n\t\t\t\t\t\t\t\t<div style=\"margin-left:50px;\">\n\t\t\t\t\t\t\t\t<a th:href=\"@{/bookDetail?id=}+${cartItem.book.id}\"><h4 th:text=\"${cartItem.book.title}\"></h4></a>\n\t\t\t\t\t\t\t\t<p th:if=\"${cartItem.book.inStockNumber&gt;10}\"\n\t\t\t\t\t\t\t\t\tstyle=\"color: green;\">In Stock</p>\n\t\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\t\tth:if=\"${cartItem.book.inStockNumber&lt;10 and cartItem.book.inStockNumber&gt;0}\"\n\t\t\t\t\t\t\t\t\tstyle=\"color: green;\">\n\t\t\t\t\t\t\t\t\tOnly <span th:text=\"${cartItem.book.inStockNumber}\"></span> In\n\t\t\t\t\t\t\t\t\tStock\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<p th:if=\"${cartItem.book.inStockNumber==0}\"\n\t\t\t\t\t\t\t\t\tstyle=\"color: darkred;\">Product Unavailable</p>\n\t\t\t\t\t\t\t\t<a class=\"btn btn-danger\" th:href=\"@{/shoppingCart/removeItem?id=}+${cartItem.id}\">Delete</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t<h5 style=\"color: #db3208; font-size: large;\">\n\t\t\t\t\t\t\t\t\t$<span th:text=\"${cartItem.book.ourPrice}\"\n\t\t\t\t\t\t\t\t\t\tth:style=\"${cartItem.book.inStockNumber}==0? 'text-decoration: line-through' : ''\"></span>\n\t\t\t\t\t\t\t\t</h5>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t\t\t\t\t<input hidden=\"hidden\" name=\"id\" th:value=\"${cartItem.id}\" /> <input\n\t\t\t\t\t\t\t\t\tth:id=\"${cartItem.id}\" th:name=\"qty\" th:disabled=\"${cartItem.book.inStockNumber==0}\" class=\"form-control cartItemQty\" th:value=\"${cartItem.qty}\" />\n\t\t\t\t\t\t\t\t<button style=\"display: none;\"\n\t\t\t\t\t\t\t\t\tth:id=\"'update-item-'+${cartItem.id}\" type=\"submit\"\n\t\t\t\t\t\t\t\t\tclass=\"btn btn-warning btn-xs\">Update</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t<h4 class=\"col-xs-12 text-right\">\n\t\t\t\t\t\t\t<strong style=\"font-size: large;\">Total Price (<span\n\t\t\t\t\t\t\t\tth:text=\"${#lists.size(cartItemList)}\"></span> items):\n\t\t\t\t\t\t\t</strong> <span style=\"color: #db3208; font-szie: large;\">$<span\n\t\t\t\t\t\t\t\tth:text=\"${shoppingCart.grandTotal}\"></span></span>\n\t\t\t\t\t\t</h4>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<!-- end of container -->\n\n\n\t<div th:replace=\"common/header :: footer\"/>\n\t\n\t<div th:replace=\"common/header :: body-bottom-scripts\" />\n</body>\n</html>\n"
  },
  {
    "path": "src/test/java/com/eCommerce/ECommerceApplicationTests.java",
    "content": "package com.eCommerce;\n\nimport com.eCommerce.repository.BookRepository;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.testcontainers.junit.jupiter.Testcontainers;\n\nimport static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;\n\n@Testcontainers\n@SpringBootTest(\n\t\tproperties = {\n\t\t\t\t\"management.endpoint.health.show-details=always\",\n\t\t\t\t\"spring.datasource.url=jdbc:tc:mysql:8.4.0:///bookShopDB\"\n\t\t},\n\t\twebEnvironment = RANDOM_PORT\n)\npublic class ECommerceApplicationTests {\n\n\t@Autowired\n\tprivate BookRepository bookRepository;\n\n\t@BeforeEach\n\tvoid deleteAll() {\n\t\tbookRepository.deleteAll();\n\t}\n\n}\n"
  }
]