Browse Source

User+Product integrated

master
Suhas 4 years ago
parent
commit
f1f1d80ecd
148 changed files with 27599 additions and 0 deletions
  1. 33
      BackEnd/London/.gitignore
  2. 117
      BackEnd/London/.mvn/wrapper/MavenWrapperDownloader.java
  3. BIN
      BackEnd/London/.mvn/wrapper/maven-wrapper.jar
  4. 2
      BackEnd/London/.mvn/wrapper/maven-wrapper.properties
  5. 33
      BackEnd/London/bin/.gitignore
  6. BIN
      BackEnd/London/bin/.mvn/wrapper/MavenWrapperDownloader.class
  7. BIN
      BackEnd/London/bin/.mvn/wrapper/maven-wrapper.jar
  8. 2
      BackEnd/London/bin/.mvn/wrapper/maven-wrapper.properties
  9. 310
      BackEnd/London/bin/mvnw
  10. 182
      BackEnd/London/bin/mvnw.cmd
  11. 76
      BackEnd/London/bin/pom.xml
  12. BIN
      BackEnd/London/bin/src/main/java/com/example/londonStore/CorsConfig.class
  13. BIN
      BackEnd/London/bin/src/main/java/com/example/londonStore/LondonApplication.class
  14. BIN
      BackEnd/London/bin/src/main/java/com/example/londonStore/SecurityConfig.class
  15. BIN
      BackEnd/London/bin/src/main/java/com/example/londonStore/controller/HomeController.class
  16. BIN
      BackEnd/London/bin/src/main/java/com/example/londonStore/controller/UserController.class
  17. BIN
      BackEnd/London/bin/src/main/java/com/example/londonStore/model/Category.class
  18. BIN
      BackEnd/London/bin/src/main/java/com/example/londonStore/model/User.class
  19. BIN
      BackEnd/London/bin/src/main/java/com/example/londonStore/repository/CategoryRepo.class
  20. BIN
      BackEnd/London/bin/src/main/java/com/example/londonStore/repository/UserRepository.class
  21. BIN
      BackEnd/London/bin/src/main/java/com/example/londonStore/service/Home.class
  22. BIN
      BackEnd/London/bin/src/main/java/com/example/londonStore/service/MyUserDetailsService.class
  23. 10
      BackEnd/London/bin/src/main/resources/application.properties
  24. BIN
      BackEnd/London/bin/src/test/java/com/example/londonStore/LondonApplicationTests.class
  25. 310
      BackEnd/London/mvnw
  26. 182
      BackEnd/London/mvnw.cmd
  27. 76
      BackEnd/London/pom.xml
  28. 14
      BackEnd/London/src/main/java/com/example/londonStore/CorsConfig.java
  29. 31
      BackEnd/London/src/main/java/com/example/londonStore/LondonApplication.java
  30. 56
      BackEnd/London/src/main/java/com/example/londonStore/SecurityConfig.java
  31. 30
      BackEnd/London/src/main/java/com/example/londonStore/controller/HomeController.java
  32. 76
      BackEnd/London/src/main/java/com/example/londonStore/controller/UserController.java
  33. 27
      BackEnd/London/src/main/java/com/example/londonStore/model/Category.java
  34. 111
      BackEnd/London/src/main/java/com/example/londonStore/model/User.java
  35. 11
      BackEnd/London/src/main/java/com/example/londonStore/repository/CategoryRepo.java
  36. 14
      BackEnd/London/src/main/java/com/example/londonStore/repository/UserRepository.java
  37. 27
      BackEnd/London/src/main/java/com/example/londonStore/service/Home.java
  38. 25
      BackEnd/London/src/main/java/com/example/londonStore/service/MyUserDetailsService.java
  39. 10
      BackEnd/London/src/main/resources/application.properties
  40. 13
      BackEnd/London/src/test/java/com/example/londonStore/LondonApplicationTests.java
  41. 17
      FrontEnd/.browserslistrc
  42. 16
      FrontEnd/.editorconfig
  43. 45
      FrontEnd/.gitignore
  44. 27
      FrontEnd/README.md
  45. 110
      FrontEnd/angular.json
  46. 44
      FrontEnd/karma.conf.js
  47. 12122
      FrontEnd/package-lock.json
  48. 39
      FrontEnd/package.json
  49. 12
      FrontEnd/proxy.conf.json
  50. 42
      FrontEnd/src/app/app-routing.module.ts
  51. 0
      FrontEnd/src/app/app.component.css
  52. 2
      FrontEnd/src/app/app.component.html
  53. 35
      FrontEnd/src/app/app.component.spec.ts
  54. 10
      FrontEnd/src/app/app.component.ts
  55. 38
      FrontEnd/src/app/app.module.ts
  56. 0
      FrontEnd/src/app/auth/login/login.component.css
  57. 46
      FrontEnd/src/app/auth/login/login.component.html
  58. 25
      FrontEnd/src/app/auth/login/login.component.spec.ts
  59. 43
      FrontEnd/src/app/auth/login/login.component.ts
  60. 16
      FrontEnd/src/app/auth/service/auth-guard.service.spec.ts
  61. 20
      FrontEnd/src/app/auth/service/auth-guard.service.ts
  62. 16
      FrontEnd/src/app/auth/service/auth.service.spec.ts
  63. 17
      FrontEnd/src/app/auth/service/auth.service.ts
  64. 0
      FrontEnd/src/app/auth/sign-up/sign-up.component.css
  65. 89
      FrontEnd/src/app/auth/sign-up/sign-up.component.html
  66. 25
      FrontEnd/src/app/auth/sign-up/sign-up.component.spec.ts
  67. 48
      FrontEnd/src/app/auth/sign-up/sign-up.component.ts
  68. 0
      FrontEnd/src/app/component/account/account.component.css
  69. 87
      FrontEnd/src/app/component/account/account.component.html
  70. 25
      FrontEnd/src/app/component/account/account.component.spec.ts
  71. 51
      FrontEnd/src/app/component/account/account.component.ts
  72. 0
      FrontEnd/src/app/component/catalog/catalog.component.css
  73. 152
      FrontEnd/src/app/component/catalog/catalog.component.html
  74. 25
      FrontEnd/src/app/component/catalog/catalog.component.spec.ts
  75. 43
      FrontEnd/src/app/component/catalog/catalog.component.ts
  76. 3
      FrontEnd/src/app/component/home/home.component.css
  77. 27
      FrontEnd/src/app/component/home/home.component.html
  78. 25
      FrontEnd/src/app/component/home/home.component.spec.ts
  79. 16
      FrontEnd/src/app/component/home/home.component.ts
  80. 0
      FrontEnd/src/app/component/navbar/navbar.component.css
  81. 42
      FrontEnd/src/app/component/navbar/navbar.component.html
  82. 25
      FrontEnd/src/app/component/navbar/navbar.component.spec.ts
  83. 62
      FrontEnd/src/app/component/navbar/navbar.component.ts
  84. 0
      FrontEnd/src/app/component/pagenotfound/pagenotfound.component.css
  85. 1
      FrontEnd/src/app/component/pagenotfound/pagenotfound.component.html
  86. 25
      FrontEnd/src/app/component/pagenotfound/pagenotfound.component.spec.ts
  87. 15
      FrontEnd/src/app/component/pagenotfound/pagenotfound.component.ts
  88. 0
      FrontEnd/src/app/component/product/product.component.css
  89. 166
      FrontEnd/src/app/component/product/product.component.html
  90. 25
      FrontEnd/src/app/component/product/product.component.spec.ts
  91. 32
      FrontEnd/src/app/component/product/product.component.ts
  92. 11
      FrontEnd/src/app/model/product.model.ts
  93. 8
      FrontEnd/src/app/model/user.model.ts
  94. 16
      FrontEnd/src/app/service/appservice.service.spec.ts
  95. 16
      FrontEnd/src/app/service/appservice.service.ts
  96. 16
      FrontEnd/src/app/service/product.service.spec.ts
  97. 41
      FrontEnd/src/app/service/product.service.ts
  98. 16
      FrontEnd/src/app/service/user-service.service.spec.ts
  99. 67
      FrontEnd/src/app/service/user-service.service.ts
  100. 0
      FrontEnd/src/assets/.gitkeep

33
BackEnd/London/.gitignore

@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/

117
BackEnd/London/.mvn/wrapper/MavenWrapperDownloader.java

@ -0,0 +1,117 @@
/*
* Copyright 2007-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;
public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if(mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if(mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if(!outputFile.getParentFile().exists()) {
if(!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}
}

BIN
BackEnd/London/.mvn/wrapper/maven-wrapper.jar

2
BackEnd/London/.mvn/wrapper/maven-wrapper.properties

@ -0,0 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.2/apache-maven-3.8.2-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar

33
BackEnd/London/bin/.gitignore

@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/

BIN
BackEnd/London/bin/.mvn/wrapper/MavenWrapperDownloader.class

BIN
BackEnd/London/bin/.mvn/wrapper/maven-wrapper.jar

2
BackEnd/London/bin/.mvn/wrapper/maven-wrapper.properties

@ -0,0 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.2/apache-maven-3.8.2-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar

310
BackEnd/London/bin/mvnw

@ -0,0 +1,310 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`"
else
export JAVA_HOME="/Library/Java/Home"
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`which java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
fi
while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi
if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaClass=`cygpath --path --windows "$javaClass"`
fi
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
if [ "$MVNW_VERBOSE" = true ]; then
echo $MAVEN_PROJECTBASEDIR
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

182
BackEnd/London/bin/mvnw.cmd

@ -0,0 +1,182 @@
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%" == "on" pause
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
exit /B %ERROR_CODE%

76
BackEnd/London/bin/pom.xml

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>London</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>London</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

BIN
BackEnd/London/bin/src/main/java/com/example/londonStore/CorsConfig.class

BIN
BackEnd/London/bin/src/main/java/com/example/londonStore/LondonApplication.class

BIN
BackEnd/London/bin/src/main/java/com/example/londonStore/SecurityConfig.class

BIN
BackEnd/London/bin/src/main/java/com/example/londonStore/controller/HomeController.class

BIN
BackEnd/London/bin/src/main/java/com/example/londonStore/controller/UserController.class

BIN
BackEnd/London/bin/src/main/java/com/example/londonStore/model/Category.class

BIN
BackEnd/London/bin/src/main/java/com/example/londonStore/model/User.class

BIN
BackEnd/London/bin/src/main/java/com/example/londonStore/repository/CategoryRepo.class

BIN
BackEnd/London/bin/src/main/java/com/example/londonStore/repository/UserRepository.class

BIN
BackEnd/London/bin/src/main/java/com/example/londonStore/service/Home.class

BIN
BackEnd/London/bin/src/main/java/com/example/londonStore/service/MyUserDetailsService.class

10
BackEnd/London/bin/src/main/resources/application.properties

@ -0,0 +1,10 @@
server.port=59274
spring.datasource.url=jdbc:mysql://localhost:3306/london_db59274?createDatabaseIfNotExist=true
server.servlet.context-path=/api
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jackson.serialization.fail-on-empty-beans=false
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.format-sql=false

BIN
BackEnd/London/bin/src/test/java/com/example/londonStore/LondonApplicationTests.class

310
BackEnd/London/mvnw

@ -0,0 +1,310 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`"
else
export JAVA_HOME="/Library/Java/Home"
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`which java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
fi
while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi
if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaClass=`cygpath --path --windows "$javaClass"`
fi
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
if [ "$MVNW_VERBOSE" = true ]; then
echo $MAVEN_PROJECTBASEDIR
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

182
BackEnd/London/mvnw.cmd

@ -0,0 +1,182 @@
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%" == "on" pause
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
exit /B %ERROR_CODE%

76
BackEnd/London/pom.xml

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>London</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>London</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

14
BackEnd/London/src/main/java/com/example/londonStore/CorsConfig.java

@ -0,0 +1,14 @@
package com.example.londonStore;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer{
@Override
public void addCorsMappings(CorsRegistry registry) {
// TODO Auto-generated method stub
WebMvcConfigurer.super.addCorsMappings(registry);
registry.addMapping("/**");
}
}

31
BackEnd/London/src/main/java/com/example/londonStore/LondonApplication.java

@ -0,0 +1,31 @@
package com.example.londonStore;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootApplication
@EnableSwagger2
//@EnableAutoConfiguration(exclude= {SecurityAutoConfiguration.class})
public class LondonApplication {
public static void main(String[] args) {
SpringApplication.run(LondonApplication.class, args);
}
@Bean
public Docket postsApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo()).select().build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("London Store")
.description("London") .termsOfServiceUrl("https://simplifyingtech371899608.wordpress.com/") .licenseUrl("simplifyingtech@gmail.com").version("2.0").build();
}
}

56
BackEnd/London/src/main/java/com/example/londonStore/SecurityConfig.java

@ -0,0 +1,56 @@
package com.example.londonStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import com.example.londonStore.service.MyUserDetailsService;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
private MyUserDetailsService myUserDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
System.out.println("hi");
http.authorizeRequests()
.antMatchers("/customer").authenticated()
.antMatchers("/vendor").hasAnyAuthority("ADMIN")
.antMatchers("/product/**").permitAll()
.antMatchers("/review/**").permitAll()
.antMatchers("/login").permitAll()
.antMatchers("/user").permitAll()
.and()
.httpBasic();
http.cors();
http.csrf().disable(); //cross-site req forgery
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(getAuthenticator());
}
private DaoAuthenticationProvider getAuthenticator() {
// TODO Auto-generated method stub
DaoAuthenticationProvider dao=new DaoAuthenticationProvider();
dao.setUserDetailsService(myUserDetailsService);
dao.setPasswordEncoder(getPasswordEncoder());
return dao;
}
@Primary
@Bean
public PasswordEncoder getPasswordEncoder() {
// TODO Auto-generated method stub
return new BCryptPasswordEncoder();
}
}

30
BackEnd/London/src/main/java/com/example/londonStore/controller/HomeController.java

@ -0,0 +1,30 @@
package com.example.londonStore.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.example.londonStore.model.Category;
import com.example.londonStore.service.Home;
@RestController
public class HomeController {
@Autowired
private Home home;
@GetMapping("/category")
public List<Category> getAll() {
return home.get();
}
@PostMapping("/category")
public Category insert(@RequestBody Category category) {
return home.insert(category);
}
@GetMapping("/category/{name}")
public Category getOne(@PathVariable("name") String name) {
return home.getOne(name);
}
}

76
BackEnd/London/src/main/java/com/example/londonStore/controller/UserController.java

@ -0,0 +1,76 @@
package com.example.londonStore.controller;
import java.security.Principal;
import java.util.Base64;
import java.util.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.example.londonStore.model.User;
import com.example.londonStore.repository.UserRepository;
@RestController
@CrossOrigin(origins="http://localhost:4200",methods = {RequestMethod.DELETE,RequestMethod.GET,RequestMethod.POST,RequestMethod.PUT})
public class UserController {
@Autowired
private UserRepository userRepo;
@Autowired
private PasswordEncoder passEncoder;
@GetMapping("/user/{name}")
private User getDetails(@PathVariable("name") String name) {
return userRepo.getByUserName(name);
}
@PutMapping("user/{name}")
private User putUser(@PathVariable("name") String name,@RequestBody User user) {
User us=userRepo.getByUserName(name);
User use=userRepo.getById(us.getId());
use.setName(user.getName());
use.setMobile(user.getMobile());
use.setEmail(user.getEmail());
use.setAddress(user.getAddress());
String enPass=passEncoder.encode(user.getPassword());
use.setPassword(enPass);
return userRepo.save(use);
}
@PostMapping("/user")
private ResponseEntity<Object> postUser(@RequestBody User user) {
String op= userRepo.getByUserName(user.getUsername()).getUsername();
if(!op.isEmpty()) {
return ResponseEntity.badRequest().body("The user is already Present, Failed to Create new User");
}
else {
String code=user.getUsername();
String username=new String(Base64.getDecoder().decode(code)).split(":")[0];
String password=new String(Base64.getDecoder().decode(code)).split(":")[1];
user.setUsername(username);
user.setPassword(password);
System.out.println(username+":"+password);
String enPass=passEncoder.encode(user.getPassword());
user.setPassword(enPass);
return ResponseEntity.ok("User Created Successfully");
}
}
@GetMapping("/login")
private Principal getUser(Principal principal) {
System.out.println("Yes");
if(principal.getName()==null) {
throw new Error("Invalid Credentials");
}
System.out.println(principal);
return principal;
}
}

27
BackEnd/London/src/main/java/com/example/londonStore/model/Category.java

@ -0,0 +1,27 @@
package com.example.londonStore.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long Id;
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
private String category;
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category= category;
}
}

111
BackEnd/London/src/main/java/com/example/londonStore/model/User.java

@ -0,0 +1,111 @@
package com.example.londonStore.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"username"})})
public class User implements UserDetails{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long Id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getMobile() {
return mobile;
}
public void setMobile(Long mobile) {
this.mobile = mobile;
}
@Column(unique = true)
private String username;
@Column(unique = true)
private String email;
private String password;
private String address;
private Long mobile;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// TODO Auto-generated method stub
List<GrantedAuthority> list=new ArrayList<>();
SimpleGrantedAuthority sga=new SimpleGrantedAuthority("CUSTOMER");
list.add(sga);
return list;
}
@Override
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
}

11
BackEnd/London/src/main/java/com/example/londonStore/repository/CategoryRepo.java

@ -0,0 +1,11 @@
package com.example.londonStore.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.londonStore.model.Category;
public interface CategoryRepo extends JpaRepository<Category, Long>{
Category getByCategory(String name);
}

14
BackEnd/London/src/main/java/com/example/londonStore/repository/UserRepository.java

@ -0,0 +1,14 @@
package com.example.londonStore.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import com.example.londonStore.model.User;
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.username=?1")
User getByUserName(String username);
}

27
BackEnd/London/src/main/java/com/example/londonStore/service/Home.java

@ -0,0 +1,27 @@
package com.example.londonStore.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.londonStore.model.Category;
import com.example.londonStore.repository.CategoryRepo;
@Service
public class Home {
@Autowired
private CategoryRepo categoryRepo;
public List<Category> get(){
List<Category> li=categoryRepo.findAll();
return li;
}
public Category getOne(String name) {
return categoryRepo.getByCategory(name);
}
public Category insert(Category category) {
return categoryRepo.save(category);
}
}

25
BackEnd/London/src/main/java/com/example/londonStore/service/MyUserDetailsService.java

@ -0,0 +1,25 @@
package com.example.londonStore.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import com.example.londonStore.model.User;
import com.example.londonStore.repository.UserRepository;
@Service
public class MyUserDetailsService implements UserDetailsService{
@Autowired
private UserRepository userRepo;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// TODO Auto-generated method stub
User user=userRepo.getByUserName(username);
return user;
}
}

10
BackEnd/London/src/main/resources/application.properties

@ -0,0 +1,10 @@
server.port=59274
spring.datasource.url=jdbc:mysql://localhost:3306/LondonStoreDB?createDatabaseIfNotExist=true
server.servlet.context-path=/apiUser
spring.datasource.username=root
spring.datasource.password=Password123
spring.jpa.hibernate.ddl-auto=update
spring.jackson.serialization.fail-on-empty-beans=false
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.format-sql=false

13
BackEnd/London/src/test/java/com/example/londonStore/LondonApplicationTests.java

@ -0,0 +1,13 @@
package com.example.londonStore;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class LondonApplicationTests {
@Test
void contextLoads() {
}
}

17
FrontEnd/.browserslistrc

@ -0,0 +1,17 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# For the full list of supported browsers by the Angular framework, please see:
# https://angular.io/guide/browser-support
# You can see what browsers were selected by your queries by running:
# npx browserslist
last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR
not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line.

16
FrontEnd/.editorconfig

@ -0,0 +1,16 @@
# Editor configuration, see https://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
[*.ts]
quote_type = single
[*.md]
max_line_length = off
trim_trailing_whitespace = false

45
FrontEnd/.gitignore

@ -0,0 +1,45 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
# compiled output
/dist
/tmp
/out-tsc
# Only exists if Bazel was run
/bazel-out
# dependencies
/node_modules
# profiling files
chrome-profiler-events*.json
# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*
# misc
/.sass-cache
/connect.lock
/coverage
/libpeerconnection.log
npm-debug.log
yarn-error.log
testem.log
/typings
# System Files
.DS_Store
Thumbs.db

27
FrontEnd/README.md

@ -0,0 +1,27 @@
# Prod
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.1.1.
## Development server
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
## Code scaffolding
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
## Build
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
## Running unit tests
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Running end-to-end tests
Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.

110
FrontEnd/angular.json

@ -0,0 +1,110 @@
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"prod": {
"projectType": "application",
"schematics": {
"@schematics/angular:application": {
"strict": true
}
},
"root": "",
"sourceRoot": "src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/prod",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.app.json",
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"src/styles.css"
],
"scripts": []
},
"configurations": {
"production": {
"budgets": [
{
"type": "initial",
"maximumWarning": "500kb",
"maximumError": "1mb"
},
{
"type": "anyComponentStyle",
"maximumWarning": "2kb",
"maximumError": "4kb"
}
],
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"outputHashing": "all"
},
"development": {
"buildOptimizer": false,
"optimization": false,
"vendorChunk": true,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
}
},
"defaultConfiguration": "production"
},
"serve": {
"options": {
"host": "0.0.0.0",
"port": 4300
},
"builder": "@angular-devkit/build-angular:dev-server",
"configurations": {
"production": {
"browserTarget": "prod:build:production"
},
"development": {
"browserTarget": "prod:build:development"
}
},
"defaultConfiguration": "development"
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "prod:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.spec.json",
"karmaConfig": "karma.conf.js",
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"src/styles.css"
],
"scripts": []
}
}
}
}
},
"defaultProject": "prod"
}

44
FrontEnd/karma.conf.js

@ -0,0 +1,44 @@
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage'),
require('@angular-devkit/build-angular/plugins/karma')
],
client: {
jasmine: {
// you can add configuration options for Jasmine here
// the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
// for example, you can disable the random execution with `random: false`
// or set a specific seed with `seed: 4321`
},
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
jasmineHtmlReporter: {
suppressAll: true // removes the duplicated traces
},
coverageReporter: {
dir: require('path').join(__dirname, './coverage/prod'),
subdir: '.',
reporters: [
{ type: 'html' },
{ type: 'text-summary' }
]
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false,
restartOnFileChange: true
});
};

12122
FrontEnd/package-lock.json
File diff suppressed because it is too large
View File

39
FrontEnd/package.json

@ -0,0 +1,39 @@
{
"name": "prod",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve --proxy-config proxy.conf.json",
"build": "ng build",
"watch": "ng build --watch --configuration development",
"test": "ng test"
},
"private": true,
"dependencies": {
"@angular/animations": "~12.1.1",
"@angular/common": "~12.1.1",
"@angular/compiler": "~12.1.1",
"@angular/core": "~12.1.1",
"@angular/forms": "~12.1.1",
"@angular/platform-browser": "~12.1.1",
"@angular/platform-browser-dynamic": "~12.1.1",
"@angular/router": "~12.1.1",
"rxjs": "~6.6.0",
"tslib": "^2.2.0",
"zone.js": "~0.11.4"
},
"devDependencies": {
"@angular-devkit/build-angular": "~12.1.1",
"@angular/cli": "~12.1.1",
"@angular/compiler-cli": "~12.1.1",
"@types/jasmine": "~3.6.0",
"@types/node": "^12.11.1",
"jasmine-core": "~3.7.0",
"karma": "~6.3.0",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage": "~2.0.3",
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "^1.5.0",
"typescript": "~4.3.2"
}
}

12
FrontEnd/proxy.conf.json

@ -0,0 +1,12 @@
{
"/apiProduct/*": {
"target": "http://localhost:59327",
"secure": false
},
"/apiUser/*":{
"target":"http://localhost:59274",
"secure":false,
"loglevel":"debug"
}
}

42
FrontEnd/src/app/app-routing.module.ts

@ -0,0 +1,42 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { CatalogComponent } from './component/catalog/catalog.component';
import { ProductComponent } from './component/product/product.component';
import { LoginComponent } from './auth/login/login.component';
import { AuthGuardService } from './auth/service/auth-guard.service';
import { SignUpComponent } from './auth/sign-up/sign-up.component';
import { AccountComponent } from './component/account/account.component';
import { HomeComponent } from './component/home/home.component';
import { NavbarComponent } from './component/navbar/navbar.component';
import { PagenotfoundComponent } from './component/pagenotfound/pagenotfound.component';
const routes: Routes = [
{path: 'product/:pid', component: ProductComponent},
{path: 'catalog/:cname', component: CatalogComponent},
{path: 'catalog', component: CatalogComponent},
{
path:'',redirectTo:'/login',pathMatch:'full'
},
{path:'login',component:LoginComponent},
{
path:'signup',component:SignUpComponent
},
{
path:'account',component:AccountComponent
},
{
path:'home',component:HomeComponent
},
{
path:'navbar',component:NavbarComponent
},
{
path:'**',component:PagenotfoundComponent
}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }

0
FrontEnd/src/app/app.component.css

2
FrontEnd/src/app/app.component.html

@ -0,0 +1,2 @@
<app-navbar></app-navbar>
<router-outlet></router-outlet>

35
FrontEnd/src/app/app.component.spec.ts

@ -0,0 +1,35 @@
import { TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
AppComponent
],
}).compileComponents();
});
it('should create the app', () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.componentInstance;
expect(app).toBeTruthy();
});
it(`should have as title 'prod'`, () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.componentInstance;
expect(app.title).toEqual('prod');
});
it('should render title', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const compiled = fixture.nativeElement;
expect(compiled.querySelector('.content span').textContent).toContain('prod app is running!');
});
});

10
FrontEnd/src/app/app.component.ts

@ -0,0 +1,10 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'prod';
}

38
FrontEnd/src/app/app.module.ts

@ -0,0 +1,38 @@
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { ProductComponent } from './component/product/product.component';
import { CatalogComponent } from './component/catalog/catalog.component';
import { LoginComponent } from './auth/login/login.component';
import { SignUpComponent } from './auth/sign-up/sign-up.component';
import { PagenotfoundComponent } from './component/pagenotfound/pagenotfound.component';
import { NavbarComponent } from './component/navbar/navbar.component';
import { ReactiveFormsModule } from '@angular/forms';
import { HomeComponent } from './component/home/home.component';
import { AccountComponent } from './component/account/account.component';
@NgModule({
declarations: [
AppComponent,
ProductComponent,
CatalogComponent,
LoginComponent,
SignUpComponent,
PagenotfoundComponent,
NavbarComponent,
HomeComponent,
AccountComponent
],
imports: [
BrowserModule,
HttpClientModule,
ReactiveFormsModule,
AppRoutingModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }

0
FrontEnd/src/app/auth/login/login.component.css

46
FrontEnd/src/app/auth/login/login.component.html

@ -0,0 +1,46 @@
<div class="container-fluid" style="height:100%;border:1px solid black;bottom:0px;overflow:hidden;">
<div class="row">
<div class="col-md-8" style="background-image: url('assets/images/Logo.png');background-repeat: no-repeat;
background-size: cover;">
</div>
<!-- ========================= SECTION CONTENT ========================= -->
<div class="col-lg-4">
<section class="section-conten padding-y" style="min-height:99.7vh;overflow:hidden;">
<!-- ============================ COMPONENT LOGIN ================================= -->
<div class="card mx-auto" style="max-width: 380px; margin-top:125.5px;">
<div class="card-body">
<h4 class="card-title mb-4">Sign in</h4>
<form [formGroup]='loginForm' (submit)='onloginFormSubmit()'>
<a href="#" class="btn btn-google btn-block mb-4"> <i class="fab fa-google"></i> Sign in with Google</a>
<p>{{msg}}</p>
<div class="form-group">
<input name="" class="form-control" placeholder="Username" type="text" formControlName="username">
<div *ngIf="loginForm.controls['username'].invalid && (loginForm.controls['username'].touched)" style="color:red;">Invalid UserName</div>
</div> <!-- form-group// -->
<div class="form-group">
<input name="" class="form-control" placeholder="Password" type="password" formControlName="password">
<div *ngIf="loginForm.controls['password'].invalid && (loginForm.controls['password'].touched)" style="color:red;">Invalid Password</div>
</div> <!-- form-group// -->
<div class="form-group">
<a href="#" class="float-right">Forgot password?</a>
<label class="float-left custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" checked=""> <div class="custom-control-label"> Remember </div> </label>
</div> <!-- form-group form-check .// -->
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block" [disabled]='!loginForm.valid'> Login </button>
</div> <!-- form-group// -->
</form>
</div> <!-- card-body.// -->
</div> <!-- card .// -->
<p class="text-center mt-4">Don't have account? <a routerLink="/signup">Sign-Up</a></p>
<br><br>
</section>
</div>
</div>
</div>
<router-outlet></router-outlet>
<!-- ========================= FOOTER END // ========================= -->

25
FrontEnd/src/app/auth/login/login.component.spec.ts

@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { LoginComponent } from './login.component';
describe('LoginComponent', () => {
let component: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ LoginComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(LoginComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

43
FrontEnd/src/app/auth/login/login.component.ts

@ -0,0 +1,43 @@
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { User } from 'src/app/model/user.model';
import { AppserviceService } from 'src/app/service/appservice.service';
import { UserServiceService } from 'src/app/service/user-service.service';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
user:User=new User();
loginForm:FormGroup;
msg:string;
constructor(private route:Router,private userService:UserServiceService,private appService:AppserviceService) {
this.msg="";
}
ngOnInit(): void {
this.loginForm=new FormGroup(
{
username:new FormControl('',Validators.required),
password:new FormControl('',Validators.required),
}
);
}
onloginFormSubmit(){
console.log(this.loginForm.value.username);
this.userService.getUser(this.loginForm.value).subscribe(data=>{
window.localStorage.setItem('username',this.loginForm.value.username);
window.localStorage.setItem('isLoggedIn','true');
this.appService.activate.next(true);
//this.authService.isAuthenticated();
this.route.navigateByUrl('/home');
},(err:any)=>{
console.log(err)
this.msg="Invalid Credentials";
});
}}

16
FrontEnd/src/app/auth/service/auth-guard.service.spec.ts

@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { AuthGuardService } from './auth-guard.service';
describe('AuthGuardService', () => {
let service: AuthGuardService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(AuthGuardService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

20
FrontEnd/src/app/auth/service/auth-guard.service.ts

@ -0,0 +1,20 @@
import { Injectable } from '@angular/core';
import { Router, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from './auth.service';
@Injectable({
providedIn: 'root'
})
export class AuthGuardService {
status:boolean;
constructor(private authService:AuthService,private route:Router) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> {
this.status=this.authService.isAuthenticated();
console.log("status",this.status);
if(this.status==false){
this.route.navigateByUrl('/login');
}
return true;
}
}

16
FrontEnd/src/app/auth/service/auth.service.spec.ts

@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { AuthService } from './auth.service';
describe('AuthService', () => {
let service: AuthService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(AuthService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

17
FrontEnd/src/app/auth/service/auth.service.ts

@ -0,0 +1,17 @@
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class AuthService {
constructor() { }
isAuthenticated():boolean{
if(window.localStorage.getItem('isLoggedIn')=='true'){
//console.log("true");
return true;}
//frm local storage we read the value of username/isLoggedIn and decide
return false;
}
}

0
FrontEnd/src/app/auth/sign-up/sign-up.component.css

89
FrontEnd/src/app/auth/sign-up/sign-up.component.html

@ -0,0 +1,89 @@
<div class="container-fluid" style="height:50%;border:1px solid black;bottom:0px;overflow:hidden;">
<div class="row">
<div class="col-md-8" style="background-image: url('assets/images/Logo.png');background-repeat: no-repeat;
background-size: cover;">
</div>
<div class="col-lg-4">
<section class="section-content padding-y" style="min-height:99.5vh;overflow:hidden;margin-top:2px">
<div class="card mx-auto" style="max-width:520px; margin-top:2px">
<div class="card-body">
<h4 class="card-title">Sign up</h4>
<form [formGroup]='signUpForm' (submit)='onSignUpSubmit()'>
<p>{{msg}}</p>
<div class="form-row">
<div class="col form-group">
<label>name</label>
<input type="text" class="form-control" placeholder="" formControlName="name">
<div *ngIf="signUpForm.controls['name'].invalid && (signUpForm.controls['name'].touched)" style="color:red;">Invalid Name</div>
</div>
<div class="col form-group">
<label>user name</label>
<input type="text" class="form-control" placeholder="" formControlName="username">
<div *ngIf="signUpForm.controls['username'].invalid && (signUpForm.controls['username'].touched)" style="color:red;">Invalid UserName</div>
</div>
</div>
<div class="form-group">
<label>Email</label>
<input type="email" class="form-control" placeholder="" formControlName="email">
<div *ngIf="signUpForm.controls['email'].invalid && (signUpForm.controls['email'].touched)" style="color:red;">Invalid Email</div>
</div>
<!-- <div class="form-group">
<label class="custom-control custom-radio custom-control-inline">
<input class="custom-control-input" checked="" type="radio" name="gender" value="option1">
<span class="custom-control-label"> Male </span>
</label>
<label class="custom-control custom-radio custom-control-inline">
<input class="custom-control-input" type="radio" name="gender" value="option2">
<span class="custom-control-label"> Female </span>
</label>
</div> -->
<div class="form-row">
<div class="form-group col-md-6">
<label>Address</label>
<input type="text" class="form-control" formControlName="address">
<div *ngIf="signUpForm.controls['address'].invalid && (signUpForm.controls['address'].touched)" style="color:red;">Invalid Address</div>
</div>
<!-- <div class="form-group col-md-6">
<label>Country</label>
<select id="inputState" class="form-control">
<option> Choose...</option>
<option>Uzbekistan</option>
<option>Russia</option>
<option selected="">United States</option>
<option>India</option>
<option>Afganistan</option>
</select>
</div> -->
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label>Create password</label>
<input class="form-control" type="password" formControlName="password">
<div *ngIf="signUpForm.controls['password'].invalid && (signUpForm.controls['password'].touched)" style="color:red;">Invalid Password</div>
</div>
<div class="form-group col-md-6">
<label>Mobile</label>
<input class="form-control" type="text" formControlName="mobile">
<div *ngIf="signUpForm.controls['mobile'].invalid && (signUpForm.controls['mobile'].touched)" style="color:red;">Invalid</div>
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block" [disabled]='!signUpForm.valid'> Register </button>
</div>
<!-- <div class="form-group">
<label class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" checked=""> <div class="custom-control-label"> I am agree with <a href="#">terms and contitions</a> </div> </label>
</div> -->
</form>
</div>
</div>
<p class="text-center mt-4">Have an account? <a routerLink="/login">Log In</a></p>
<br><br>
</section>
</div>
</div>
</div>

25
FrontEnd/src/app/auth/sign-up/sign-up.component.spec.ts

@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { SignUpComponent } from './sign-up.component';
describe('SignUpComponent', () => {
let component: SignUpComponent;
let fixture: ComponentFixture<SignUpComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ SignUpComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(SignUpComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

48
FrontEnd/src/app/auth/sign-up/sign-up.component.ts

@ -0,0 +1,48 @@
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { UserServiceService } from 'src/app/service/user-service.service';
@Component({
selector: 'app-sign-up',
templateUrl: './sign-up.component.html',
styleUrls: ['./sign-up.component.css']
})
export class SignUpComponent implements OnInit {
signUpForm:FormGroup;
msg:String='';
emailPattern: string | RegExp;
namePattern:string | RegExp;
constructor(private userService:UserServiceService,private route:Router) {
this.emailPattern = "^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$";
this.namePattern="^[a-zA-Z][a-zA-Z ]+$"
}
ngOnInit(): void {
this.signUpForm=new FormGroup(
{
name:new FormControl('',[Validators.required,Validators.maxLength(30),
Validators.pattern(this.namePattern)]),
username:new FormControl('',Validators.required),
password:new FormControl('',Validators.required),
mobile:new FormControl('',[Validators.required,Validators.pattern(/^[6-9]\d{9}$/),Validators.maxLength(10)]),
email:new FormControl('',[Validators.required,Validators.pattern(this.emailPattern)]),
address:new FormControl('',Validators.required)
}
);
}
onSignUpSubmit(){
console.log(this.signUpForm.value);
this.userService.postUser(this.signUpForm.value).subscribe(data=>{
this.signUpForm.reset();
this.route.navigateByUrl('/login?msg=Success');
},(err:any)=>{
console.log(err);
this.msg="UserName might already be taken."
})
}
}

0
FrontEnd/src/app/component/account/account.component.css

87
FrontEnd/src/app/component/account/account.component.html

@ -0,0 +1,87 @@
<div class="container-fluid" style="height:50%;border:1px solid black;bottom:0px;overflow:hidden;">
<div class="row">
<!--<div class="col-md-8" style="background-image: url('assets/images/Logo.png');background-repeat: no-repeat;
background-size: cover;">
</div>-->
<div class="col-md-12">
<section class="section-content padding-y" style="min-height:99.5vh;overflow:hidden;margin-top:2px">
<div class="card mx-auto" style="max-width:520px; margin-top:2px">
<div class="card-body">
<h4 class="card-title">Profile</h4>
<form [formGroup]='signUpForm' (submit)='onUpdate()'>
<div class="form-row">
<div class="col form-group">
<label>name</label>
<input type="text" class="form-control" placeholder="" formControlName="name">
<div *ngIf="signUpForm.controls['name'].invalid && (signUpForm.controls['name'].touched)" style="color:red;">Invalid Name</div>
</div>
<div class="col form-group">
<label>user name</label>
<input type="text" class="form-control" placeholder="" formControlName="username" readonly>
<div *ngIf="signUpForm.controls['username'].invalid && (signUpForm.controls['username'].touched)" style="color:red;">Invalid UserName</div>
</div>
</div>
<div class="form-group">
<label>Email</label>
<input type="email" class="form-control" placeholder="" formControlName="email">
<div *ngIf="signUpForm.controls['email'].invalid && (signUpForm.controls['email'].touched)" style="color:red;">Invalid Email</div>
</div>
<!-- <div class="form-group">
<label class="custom-control custom-radio custom-control-inline">
<input class="custom-control-input" checked="" type="radio" name="gender" value="option1">
<span class="custom-control-label"> Male </span>
</label>
<label class="custom-control custom-radio custom-control-inline">
<input class="custom-control-input" type="radio" name="gender" value="option2">
<span class="custom-control-label"> Female </span>
</label>
</div> -->
<div class="form-row">
<div class="form-group col-md-6">
<label>Address</label>
<input type="text" class="form-control" formControlName="address">
<div *ngIf="signUpForm.controls['address'].invalid && (signUpForm.controls['address'].touched)" style="color:red;">Invalid Address</div>
</div>
<!-- <div class="form-group col-md-6">
<label>Country</label>
<select id="inputState" class="form-control">
<option> Choose...</option>
<option>Uzbekistan</option>
<option>Russia</option>
<option selected="">United States</option>
<option>India</option>
<option>Afganistan</option>
</select>
</div> -->
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label>Create password</label>
<input class="form-control" type="password" formControlName="password">
<div *ngIf="signUpForm.controls['password'].invalid && (signUpForm.controls['password'].touched)" style="color:red;">Invalid Password</div>
</div>
<div class="form-group col-md-6">
<label>Mobile</label>
<input class="form-control" type="text" formControlName="mobile">
<div *ngIf="signUpForm.controls['mobile'].invalid && (signUpForm.controls['mobile'].touched)" style="color:red;">Invalid</div>
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block" [disabled]='!signUpForm.valid'> Update </button>
</div>
<!-- <div class="form-group">
<label class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" checked=""> <div class="custom-control-label"> I am agree with <a href="#">terms and contitions</a> </div> </label>
</div> -->
</form>
</div>
</div>
<br><br>
</section>
</div>
</div>
</div>

25
FrontEnd/src/app/component/account/account.component.spec.ts

@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AccountComponent } from './account.component';
describe('AccountComponent', () => {
let component: AccountComponent;
let fixture: ComponentFixture<AccountComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ AccountComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(AccountComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

51
FrontEnd/src/app/component/account/account.component.ts

@ -0,0 +1,51 @@
import { Component, OnInit, Output } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { User } from 'src/app/model/user.model';
import { AppserviceService } from 'src/app/service/appservice.service';
import { UserServiceService } from 'src/app/service/user-service.service';
@Component({
selector: 'app-account',
templateUrl: './account.component.html',
styleUrls: ['./account.component.css']
})
export class AccountComponent implements OnInit {
signUpForm:FormGroup;
msg:String='';
emailPattern: string | RegExp;
namePattern:string | RegExp;
constructor(private userService:UserServiceService,private route:Router,private appService:AppserviceService) {
this.emailPattern = "^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$";
this.namePattern="^[a-zA-Z][a-zA-Z ]+$"
}
ngOnInit(): void {
this.appService.userDetails.subscribe(data=>{
this.signUpForm=new FormGroup(
{
name:new FormControl(data.name,[Validators.required,Validators.maxLength(30),
Validators.pattern(this.namePattern)]),
username:new FormControl(data.username,Validators.required),
password:new FormControl('',Validators.required),
mobile:new FormControl(data.mobile,[Validators.required,Validators.pattern(/^[6-9]\d{9}$/),Validators.maxLength(10)]),
email:new FormControl(data.email,[Validators.required,Validators.pattern(this.emailPattern)]),
address:new FormControl(data.address,Validators.required)
}
);})
}
onUpdate(){
console.log(this.signUpForm.value);
this.userService.updateUser(this.signUpForm.value).subscribe(data=>{
window.localStorage.setItem("auth",btoa(data.username+":"+data.password))
alert("Updated Successfully")
},(err:any)=>{
console.log(err)
})
}
}

0
FrontEnd/src/app/component/catalog/catalog.component.css

152
FrontEnd/src/app/component/catalog/catalog.component.html

@ -0,0 +1,152 @@
<!-- ========================= SECTION PAGETOP ========================= -->
<section class="section-pagetop bg">
<div class="container">
<h2 class="title-page" *ngIf="query==undefined; else elseBlock">Category products</h2>
<ng-template #elseBlock><h2 class="title-page">Search Results</h2></ng-template>
<nav>
<ol class="breadcrumb text-white">
<li class="breadcrumb-item"><a href="/home">Home</a></li>
</ol>
</nav>
</div> <!-- container // -->
</section>
<!-- ========================= SECTION INTRO END// ========================= -->
<!-- ========================= SECTION CONTENT ========================= -->
<section class="section-content padding-y">
<div class="container">
<div class="row">
<aside class="col-md-3">
<div class="card">
<article class="filter-group">
<header class="card-header">
<a href="#" data-toggle="collapse" data-target="#collapse_1" aria-expanded="true" class="">
<i class="icon-control fa fa-chevron-down"></i>
<h6 class="title">Other categories</h6>
</a>
</header>
<div class="filter-content collapse show" id="collapse_1">
<div class="card-body">
<ul class="list-menu">
<li *ngIf="cname!='Electronics';"><a href="catalog/Electronics">Electronics</a></li>
<li *ngIf="cname!='Clothes';"><a href="catalog/Clothes">Clothes</a></li>
<li *ngIf="cname!='Sports';"><a href="catalog/Sports">Sports</a></li>
</ul>
</div> <!-- card-body.// -->
</div>
</article> <!-- filter-group .// -->
</div> <!-- card.// -->
</aside> <!-- col.// -->
<main class="col-md-9">
<!-- <header class="border-bottom mb-4 pb-3">
<div class="form-inline">
<span class="mr-md-auto">32 Items found </span>
<select class="mr-2 form-control">
<option>Latest items</option>
<option>Trending</option>
<option>Most Popular</option>
<option>Cheapest</option>
</select>
<div class="btn-group">
<a href="#" class="btn btn-outline-secondary" data-toggle="tooltip" title="List view">
<i class="fa fa-bars"></i></a>
<a href="#" class="btn btn-outline-secondary active" data-toggle="tooltip" title="Grid view">
<i class="fa fa-th"></i></a>
</div>
</div>
</header> -->
<div class="row">
<div class="col-md-4" *ngFor='let product of products'>
<figure class="card card-product-grid">
<div class="img-wrap">
<!-- <span class="badge badge-danger"> NEW </span> -->
<img src="{{product.picture}}">
</div> <!-- img-wrap.// -->
<figcaption class="info-wrap">
<div class="fix-height">
<a href="/product/{{product.id}}" class="text-primary">{{product.name}}</a>
<div class="price-wrap mt-2">
<span class="price">₹{{product.price}}</span>&nbsp;
<del class="price-old">₹{{product.price + 100}}</del>
</div> <!-- price-wrap.// -->
<div>Rating: {{product.rating}}/5</div>
</div>
<a href="javascript:void(0);" class="btn btn-block btn-primary" (click)="addToCart(product.id)">Add to Cart </a>
</figcaption>
</figure>
</div> <!-- col.// -->
</div> <!-- row end.// -->
<nav class="mt-4" aria-label="Page navigation sample">
<ul class="pagination">
<li class="page-item disabled"><a class="page-link" href="#">Previous</a></li>
<li class="page-item active"><a class="page-link" href="#">1</a></li>
<li class="page-item"><a class="page-link" href="#">2</a></li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item"><a class="page-link" href="#">Next</a></li>
</ul>
</nav>
</main> <!-- col.// -->
</div>
</div> <!-- container .// -->
</section>
<!-- ========================= SECTION CONTENT END// ========================= -->
<!-- ========================= FOOTER ========================= -->
<footer class="section-footer border-top padding-y">
<div class="container">
<p class="float-md-right">
&copy; Copyright 2021 All rights reserved
</p>
<p>
<a href="#">Terms and conditions</a>
</p>
</div><!-- //container -->
</footer>
<!-- ========================= FOOTER END // ========================= -->
<!-- <form action="/catalog">
<input type="text" placeholder="Search.." name="search">
<button type="submit">Submit</button>
</form>
<div *ngFor = 'let product of products'>
Name: {{product?.name}}&nbsp;&nbsp;
Picture: {{product?.picture}}&nbsp;&nbsp;
Price: {{product?.price}}&nbsp;&nbsp;
Rating: {{product?.rating}}&nbsp;&nbsp;
Vendor Name: {{product?.vendorName}}&nbsp;&nbsp;
Category: {{product?.category}}&nbsp;&nbsp;
Description: {{product?.description}}&nbsp;&nbsp;
Quantity: {{product?.quantity}}&nbsp;&nbsp;
&nbsp;&nbsp;<a routerLink="/product/{{product.id}}">VIEW PRODUCT</a>
<br><br><br>
</div> -->

25
FrontEnd/src/app/component/catalog/catalog.component.spec.ts

@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { CatalogComponent } from './catalog.component';
describe('CatalogComponent', () => {
let component: CatalogComponent;
let fixture: ComponentFixture<CatalogComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ CatalogComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(CatalogComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

43
FrontEnd/src/app/component/catalog/catalog.component.ts

@ -0,0 +1,43 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Product } from 'src/app/model/product.model';
import { ProductService } from 'src/app/service/product.service';
import { filter } from 'rxjs/operators';
@Component({
selector: 'app-catalog',
templateUrl: './catalog.component.html',
styleUrls: ['./catalog.component.css']
})
export class CatalogComponent implements OnInit {
products: Product[];
cname: string;
query : string;
constructor(private actRoute : ActivatedRoute, private productService : ProductService) { }
ngOnInit(): void {
this.products =[];
this.cname = undefined;
this.query = undefined;
this.actRoute.paramMap.subscribe(params => {this.cname = params.get('cname')});
this.actRoute.queryParams.pipe(filter(params => params.search)).subscribe(params => {
console.log(params);
this.query = params.search;
}
);
this.productService.searchProducts(this.query).subscribe(data =>{
if(this.query != undefined){this.products = data;}
});
this.productService.getAllProductsByCategory(this.cname).subscribe(data => {
if(this.cname != undefined){this.products = data;}
});
}
public addToCart(id: number){
this.productService.addItemToCart(id);
}
}

3
FrontEnd/src/app/component/home/home.component.css

@ -0,0 +1,3 @@
img{
height: 16rem;
}

27
FrontEnd/src/app/component/home/home.component.html

@ -0,0 +1,27 @@
<div class="container-fluid" style="height:50%;bottom:0px;overflow:hidden;padding:0%;">
<img src="assets/images/Sale.jpg" width="100%" style="margin:0px;">
</div>
<div class="container-fluid" style="height:50%;bottom:0px;overflow:hidden;">
<div class="row">
<div class="card" style="width: 12rem;" class="col-md-4">
<img src="assets/images/Electronics.jpg" class="card-img-top" alt="Electronics">
<div class="card-body">
<h5 class="card-title">Electronics</h5>
<a href="catalog/Electronics" class="btn btn-primary">Shop</a>
</div>
</div>
<div class="card" style="width: 12rem;" class="col-md-4">
<img src="assets/images/Clothes.jpg" class="card-img-top" alt="Clothes">
<div class="card-body">
<h5 class="card-title">Clothes</h5>
<a href="catalog/Clothes" class="btn btn-primary">Shop</a>
</div>
</div>
<div class="card" style="width: 12rem;" class="col-md-4">
<img src="assets/images/Sports.jpg" class="card-img-top" alt="Sports">
<div class="card-body">
<h5 class="card-title">Sports</h5>
<a href="catalog/Sports" class="btn btn-primary">Shop</a>
</div>
</div></div>
<div>

25
FrontEnd/src/app/component/home/home.component.spec.ts

@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { HomeComponent } from './home.component';
describe('HomeComponent', () => {
let component: HomeComponent;
let fixture: ComponentFixture<HomeComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ HomeComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(HomeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

16
FrontEnd/src/app/component/home/home.component.ts

@ -0,0 +1,16 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
constructor() { }
ngOnInit(): void {
console.log(window.location.pathname)
}
}

0
FrontEnd/src/app/component/navbar/navbar.component.css

42
FrontEnd/src/app/component/navbar/navbar.component.html

@ -0,0 +1,42 @@
<nav class="navbar navbar-expand-lg navbar-dark bg-dark" [hidden]="!activate">
<!--<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>-->
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" routerLink="/home">Home <span class="sr-only">(current)</span></a>
</li>
<!--<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link disabled" href="#">Disabled</a>
</li>-->
<li class="nav-item">
<form class="form-inline my-2 my-lg-0" [hidden]='!rou' action="/catalog">
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search" name="search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit" >Search</button>
</form>
</li>
<li class="nav-item" >
<a href="#" class="nav-item nav-link" ><i class="fa fa-shopping-cart" style="font-size:24px;color:white;position:absolute;right:225px;" ></i></a>
</li> <li class="nav-item dropdown" style="position:absolute;right:135px;" >
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="bi bi-person-circle" viewBox="0 0 16 16">
<path d="M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/>
<path fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z"/>
</svg>
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown" >
<a class="dropdown-item" (click)="account()">Account</a>
<a class="dropdown-item" (click)="logout()">Log-Out</a>
</div>
</li>
</ul>
</div>
</nav>

25
FrontEnd/src/app/component/navbar/navbar.component.spec.ts

@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NavbarComponent } from './navbar.component';
describe('NavbarComponent', () => {
let component: NavbarComponent;
let fixture: ComponentFixture<NavbarComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ NavbarComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(NavbarComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

62
FrontEnd/src/app/component/navbar/navbar.component.ts

@ -0,0 +1,62 @@
import { Component, OnInit, Output } from '@angular/core';
import { NavigationEnd, NavigationStart, Router, RouterEvent } from '@angular/router';
import { User } from 'src/app/model/user.model';
import { AppserviceService } from 'src/app/service/appservice.service';
import { UserServiceService } from 'src/app/service/user-service.service';
import { filter } from 'rxjs/operators';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.css']
})
export class NavbarComponent implements OnInit {
activate:boolean;
rou:boolean;
constructor(private route:Router,private userService:UserServiceService,private appService:AppserviceService) {
/*route.events.subscribe((val) => {
});*/
/* route.events.pipe(filter(e => e instanceof NavigationEnd)).subscribe((e) => {console.log("Route",e)
this.rou=e;
});*/
this.route.events
.subscribe(
(event: any) => {
if(event instanceof NavigationStart) {
if(event.url.startsWith('/catalog')||event.url.startsWith('/product'))
this.appService.path.next(true);
}
});
}
ngOnInit(): void {
this.appService.activate.subscribe(data=>{
this.activate=data;
})
this.appService.path.subscribe(data=>{
this.rou=data;
})
if(window.localStorage.getItem("isLoggedIn")){
this.activate=true;
}
this.activate=true;
console.log("reload");
}
account(){
this.userService.getDetails(window.localStorage.getItem("username")).subscribe(data=>{
console.log(data);
this.appService.userDetails.next(data);
this.route.navigateByUrl("/account");
},(err:any)=>{
console.log(err)
})
}
logout(){
window.localStorage.removeItem("auth");
window.localStorage.removeItem("isLoggedIn");
window.localStorage.removeItem("username");
this.appService.activate.next(false);
this.route.navigateByUrl("/");
}
}

0
FrontEnd/src/app/component/pagenotfound/pagenotfound.component.css

1
FrontEnd/src/app/component/pagenotfound/pagenotfound.component.html

@ -0,0 +1 @@
<app-navbar></app-navbar>

25
FrontEnd/src/app/component/pagenotfound/pagenotfound.component.spec.ts

@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { PagenotfoundComponent } from './pagenotfound.component';
describe('PagenotfoundComponent', () => {
let component: PagenotfoundComponent;
let fixture: ComponentFixture<PagenotfoundComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ PagenotfoundComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(PagenotfoundComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

15
FrontEnd/src/app/component/pagenotfound/pagenotfound.component.ts

@ -0,0 +1,15 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-pagenotfound',
templateUrl: './pagenotfound.component.html',
styleUrls: ['./pagenotfound.component.css']
})
export class PagenotfoundComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
}

0
FrontEnd/src/app/component/product/product.component.css

166
FrontEnd/src/app/component/product/product.component.html

@ -0,0 +1,166 @@
<!-- ========================= SECTION CONTENT ========================= -->
<section class="section-content padding-y bg">
<div class="container">
<article class="card">
<div class="card-body">
<div class="row">
<aside class="col-md-6">
<article class="gallery-wrap">
<div class="card img-big-wrap">
<a href="#"> <img src="{{product.picture}}"></a>
</div> <!-- card img-big-wrap.// -->
</article> <!-- gallery-wrap .end// -->
</aside>
<main class="col-md-6">
<article>
<a href="/catalog/{{product.category}}" class="text-primary btn-link">{{product.category}}</a>
<h3 class="title">{{product.name}}</h3>
<div>
<ul class="rating-stars">
<li class="stars-active">
<i class="fa fa-star"></i> <i class="fa fa-star"></i>
<i class="fa fa-star"></i>
</li>
<li>
<i class="fa fa-star"></i> <i class="fa fa-star"></i>
<i class="fa fa-star"></i> <i class="fa fa-star"></i>
<i class="fa fa-star"></i>
</li>
</ul>
<span class="label-rating mr-3 text-muted">{{product.rating}}/5</span>
<!-- <a href="#" class="btn-link mr-3 text-muted"> <i class="fa fa-heart"></i> Save for later </a>
<a href="#" class="btn-link text-muted"> <i class="fa fa-book-open"></i> Compare </a> -->
</div>
<hr>
<div class="mb-3">
<h6>Description</h6>
<ul class="list-dots mb-0">
<li>{{product.description}}</li>
<li>Description Line Two </li>
<li>Description Line Three</li>
<li>Description Line Four</li>
</ul>
</div>
<div class="mb-3">
<h6>Vendor Name</h6>
<ul class="list-dots mb-0">
<li>{{product.vendorName}}</li>
</ul>
</div>
<!-- <div class="form-group">
<label class="text-muted">Available sizes</label>
<div>
<label class="js-check btn btn-check active mr-1">
<input type="radio" name="option_size" value="option1" checked="">
<span>Small</span>
</label>
<label class="js-check btn btn-check mr-1">
<input type="radio" name="option_size" value="option1">
<span>Medium</span>
</label>
<label class="js-check btn btn-check mr-1">
<input type="radio" name="option_size" value="option1">
<span>Large</span>
</label>
<label class="js-check btn btn-check disabled">
<input type="radio" name="option_size" disabled="" value="option1">
<span>Babies</span>
</label>
</div>
</div> -->
<div class="mb-3">
<var class="price h4">₹{{product.price}}</var> <br>
<del class="price-old">₹{{product.price + 100}}</del>
</div> <!-- price-detail-wrap .// -->
<div class="mb-4">
<a href="javascript:void(0);" class="btn btn-primary mr-1" (click)="addToCart(product.id)">Add to Cart</a>
</div>
</article> <!-- product-info-aside .// -->
</main> <!-- col.// -->
</div> <!-- row.// -->
</div> <!-- card-body.// -->
</article>
<!-- <article class="card mt-5">
<div class="card-body">
<div class="row">
<aside class="col-md-6">
<h5>Parameters</h5>
<dl class="row">
<dt class="col-sm-3">Display</dt>
<dd class="col-sm-9">13.3-inch LED-backlit display with IPS</dd>
<dt class="col-sm-3">Processor</dt>
<dd class="col-sm-9">2.3GHz dual-core Intel Core i5</dd>
<dt class="col-sm-3">Camera</dt>
<dd class="col-sm-9">720p FaceTime HD camera</dd>
<dt class="col-sm-3">Memory</dt>
<dd class="col-sm-9">8 GB RAM or 16 GB RAM</dd>
<dt class="col-sm-3">Graphics</dt>
<dd class="col-sm-9">Intel Iris Plus Graphics 640</dd>
</dl>
</aside>
<aside class="col-md-6">
<h5>Features</h5>
<ul class="list-check">
<li>Best performance of battery</li>
<li>5 years warranty for this product</li>
<li>Amazing features and high quality</li>
<li>Best performance of battery</li>
<li>5 years warranty for this product</li>
</ul>
</aside>
</div> <!-- row.// -->
<!-- <hr>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</div>
</article> -->
</div>
</section>
<!-- ========================= SECTION CONTENT END// ========================= -->
<!-- ========================= FOOTER ========================= -->
<footer class="section-footer border-top padding-y">
<div class="container">
<p class="float-md-right">
&copy; Copyright 2021 All rights reserved
</p>
<p>
<a href="#">Terms and conditions</a>
</p>
</div><!-- //container -->
</footer>
<!-- ========================= FOOTER END // ========================= -->
<!-- <div>Name: {{product?.name}}</div>
<div>Picture: {{product?.picture}}</div>
<div>Price: {{product?.price}}</div>
<div>Rating: {{product?.rating}}</div>
<div>Vendor Name: {{product?.vendorName}}</div>
<div>Category: {{product?.category}}</div>
<div>Description: {{product?.description}}</div>
<div>Quantity: {{product?.quantity}}</div> -->

25
FrontEnd/src/app/component/product/product.component.spec.ts

@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ProductComponent } from './product.component';
describe('ProductComponent', () => {
let component: ProductComponent;
let fixture: ComponentFixture<ProductComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ ProductComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(ProductComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

32
FrontEnd/src/app/component/product/product.component.ts

@ -0,0 +1,32 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Product } from 'src/app/model/product.model';
import { ProductService } from 'src/app/service/product.service';
@Component({
selector: 'app-product',
templateUrl: './product.component.html',
styleUrls: ['./product.component.css']
})
export class ProductComponent implements OnInit {
product : Product;
pid : string;
constructor(private actRoute : ActivatedRoute, private productService : ProductService) {
}
ngOnInit(): void {
this.actRoute.paramMap.subscribe(params => {this.pid = params.get('pid')});
this.productService.getProductDetails(this.pid).subscribe(data => {
this.product = data;
});
}
public addToCart(id: number){
this.productService.addItemToCart(id);
}
}

11
FrontEnd/src/app/model/product.model.ts

@ -0,0 +1,11 @@
export class Product{
id : number;
name : string;
picture : string;
price : number;
rating : number;
vendorName : string;
category : string;
description : string;
quantity : number;
}

8
FrontEnd/src/app/model/user.model.ts

@ -0,0 +1,8 @@
export class User{
name:string
email:string;
username:string;
password:string;
address:string;
mobile:Number;
}

16
FrontEnd/src/app/service/appservice.service.spec.ts

@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { AppserviceService } from './appservice.service';
describe('AppserviceService', () => {
let service: AppserviceService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(AppserviceService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

16
FrontEnd/src/app/service/appservice.service.ts

@ -0,0 +1,16 @@
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { User } from '../model/user.model';
@Injectable({
providedIn: 'root'
})
export class AppserviceService {
public activate=new BehaviorSubject<boolean>(false);
public path=new BehaviorSubject<boolean>(false);
public userDetails=new BehaviorSubject<User>({email:"",username:"",
password:"",
address:"",
mobile:0,name:""});
constructor() { }
}

16
FrontEnd/src/app/service/product.service.spec.ts

@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { ProductService } from './product.service';
describe('ProductService', () => {
let service: ProductService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(ProductService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

41
FrontEnd/src/app/service/product.service.ts

@ -0,0 +1,41 @@
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { EMPTY } from 'rxjs'
import { Product } from '../model/product.model';
@Injectable({
providedIn: 'root'
})
export class ProductService {
path : string = "http://localhost:4300/apiProduct";
cartPath : string = "http://localhost:4300/apiCart";
constructor(private httpClient: HttpClient) { }
public getProductDetails(id : string){
let product_get_url = this.path + '/product/' + id;
console.log(id);
return this.httpClient.get<Product>(product_get_url);
}
public getAllProductsByCategory(id: string){
if(id == undefined){return EMPTY;}
let category_get_url = this.path + '/category/' + id;
return this.httpClient.get<Product[]>(category_get_url);
}
public searchProducts(query: string){
if(query == undefined){return EMPTY;}
let search_get_url = this.path + '/product/search';
return this.httpClient.get<Product[]>(search_get_url, {
params: new HttpParams().set('q', query)
});
}
public addItemToCart(id: number){
let cart_get_url = this.cartPath + '/product/' + id;
console.log(id);
this.httpClient.post<any>(cart_get_url, null);
}
}

16
FrontEnd/src/app/service/user-service.service.spec.ts

@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { UserServiceService } from './user-service.service';
describe('UserServiceService', () => {
let service: UserServiceService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(UserServiceService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

67
FrontEnd/src/app/service/user-service.service.ts

@ -0,0 +1,67 @@
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { User } from '../model/user.model';
@Injectable({
providedIn: 'root'
})
export class UserServiceService {
path:string='http://localhost:4300/apiUser';
constructor(private httpClient:HttpClient) { }
public postUser(user:User):Observable<any>{
let auth=btoa(user.username+":"+user.password)
user.password=''
user.username=auth
let user_api=this.path+'/user';
return this.httpClient.post<any>(user_api,user);
}
public updateUser(user:User):Observable<any>{
/*let auth=btoa(user.username+":"+user.password)
user.password=''
user.username=auth*/
console.log(btoa(user.username+':'+user.password))
let httpOptions={
headers:new HttpHeaders({
'Content-Type':'application/json',
'Authorization':'Basic '+window.localStorage.getItem("auth")
})
}
let user_api=this.path+'/user/'+user.username;
window.localStorage.setItem("auth",btoa(user.username+":"+user.password));
return this.httpClient.put<any>(user_api,user,httpOptions);
}
public getUser(user:User):Observable<any>{
let auth=btoa(user.username+":"+user.password)
/*user.password=''
user.username=auth*/
window.localStorage.setItem("auth",auth);
console.log("j",user)
console.log(btoa(user.username+':'+user.password))
let httpOptions={
headers:new HttpHeaders({
'Content-Type':'application/json',
'Authorization':'Basic '+btoa(user.username+':'+user.password)
})
}
let user_api=this.path+'/login';
return this.httpClient.get<any>(user_api,httpOptions);
}
public getDetails(user:any):Observable<any>{
//let auth=btoa(user.username+":"+user.password)
/*user.password=''
user.username=auth*/
//window.localStorage.setItem("auth",auth);
console.log("j",user)
// console.log(btoa(user.username+':'+user.password))
let httpOptions={
headers:new HttpHeaders({
'Content-Type':'application/json',
'Authorization':'Basic '+window.localStorage.getItem("auth")
})
}
let user_api=this.path+'/user/'+user;
return this.httpClient.get<any>(user_api,httpOptions);
}
}

0
FrontEnd/src/assets/.gitkeep

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save