main ecae1cad6af4 cached
266 files
469.5 KB
117.8k tokens
472 symbols
1 requests
Download .txt
Showing preview only (544K chars total). Download the full file or copy to clipboard to get everything.
Repository: EmbarkXOfficial/spring-boot-course
Branch: main
Commit: ecae1cad6af4
Files: 266
Total size: 469.5 KB

Directory structure:
gitextract_0gy1k5a8/

├── FirstSpring/
│   ├── .gitignore
│   ├── mvnw
│   ├── mvnw.cmd
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── embarkx/
│       │   │           └── FirstSpring/
│       │   │               ├── FirstSpringApplication.java
│       │   │               ├── HelloController.java
│       │   │               └── HelloResponse.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── embarkx/
│                       └── FirstSpring/
│                           └── FirstSpringApplicationTests.java
├── Java Spring Boot- Professional eCommerce Project Masterclass.postman_collection.json
├── README.md
├── SpringExample/
│   ├── .gitignore
│   ├── .idea/
│   │   ├── .gitignore
│   │   ├── encodings.xml
│   │   ├── misc.xml
│   │   ├── uiDesigner.xml
│   │   └── vcs.xml
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   ├── car/
│           │   │   └── example/
│           │   │       ├── bean/
│           │   │       │   ├── App.java
│           │   │       │   └── MyBean.java
│           │   │       ├── constructor/
│           │   │       │   └── injection/
│           │   │       │       ├── App.java
│           │   │       │       ├── Car.java
│           │   │       │       └── Specification.java
│           │   │       └── setter/
│           │   │           └── injection/
│           │   │               ├── App.java
│           │   │               ├── Car.java
│           │   │               └── Specification.java
│           │   └── com/
│           │       ├── example/
│           │       │   ├── autowire/
│           │       │   │   ├── constructor/
│           │       │   │   │   ├── App.java
│           │       │   │   │   ├── Car.java
│           │       │   │   │   └── Specification.java
│           │       │   │   ├── name/
│           │       │   │   │   ├── App.java
│           │       │   │   │   ├── Car.java
│           │       │   │   │   └── Specification.java
│           │       │   │   └── type/
│           │       │   │       ├── App.java
│           │       │   │       ├── Car.java
│           │       │   │       └── Specification.java
│           │       │   ├── autowired/
│           │       │   │   └── annotation/
│           │       │   │       ├── App.java
│           │       │   │       ├── AppConfig.java
│           │       │   │       ├── Employee.java
│           │       │   │       └── Manager.java
│           │       │   └── componentscan/
│           │       │       ├── App.java
│           │       │       ├── Employee.java
│           │       │       └── annotation/
│           │       │           ├── App.java
│           │       │           ├── AppConfig.java
│           │       │           └── Employee.java
│           │       ├── ioc/
│           │       │   └── coupling/
│           │       │       ├── IOCExample.java
│           │       │       ├── NewDatabaseProvider.java
│           │       │       ├── UserDataProvider.java
│           │       │       ├── UserDatabaseProvider.java
│           │       │       ├── UserManager.java
│           │       │       └── WebServiceDataProvider.java
│           │       ├── loose/
│           │       │   └── coupling/
│           │       │       ├── LooseCouplingExample.java
│           │       │       ├── NewDatabaseProvider.java
│           │       │       ├── UserDataProvider.java
│           │       │       ├── UserDatabaseProvider.java
│           │       │       ├── UserManager.java
│           │       │       └── WebServiceDataProvider.java
│           │       └── tight/
│           │           └── coupling/
│           │               ├── TightCouplingExample.java
│           │               ├── UserDatabase.java
│           │               └── UserManager.java
│           └── resources/
│               ├── applicationBeanContext.xml
│               ├── applicationConstructorInjection.xml
│               ├── applicationIoCLooseCouplingExample.xml
│               ├── applicationSetterInjection.xml
│               ├── autowireByConstructor.xml
│               ├── autowireByName.xml
│               ├── autowireByType.xml
│               └── componentScanDemo.xml
├── ecom-frontend/
│   ├── .gitignore
│   ├── README.md
│   ├── eslint.config.js
│   ├── index.html
│   ├── package.json
│   ├── postcss.config.js
│   ├── src/
│   │   ├── App.css
│   │   ├── App.jsx
│   │   ├── api/
│   │   │   └── api.js
│   │   ├── components/
│   │   │   ├── About.jsx
│   │   │   ├── BackDrop.jsx
│   │   │   ├── Contact.jsx
│   │   │   ├── PrivateRoute.jsx
│   │   │   ├── UserMenu.jsx
│   │   │   ├── admin/
│   │   │   │   ├── AdminLayout.jsx
│   │   │   │   ├── categories/
│   │   │   │   │   ├── AddCategoryForm.jsx
│   │   │   │   │   └── Category.jsx
│   │   │   │   ├── dashboard/
│   │   │   │   │   ├── Dashboard.jsx
│   │   │   │   │   └── DashboardOverview.jsx
│   │   │   │   ├── orders/
│   │   │   │   │   ├── OrderTable.jsx
│   │   │   │   │   ├── Orders.jsx
│   │   │   │   │   └── UpdateOrderForm.jsx
│   │   │   │   ├── products/
│   │   │   │   │   ├── AddProductForm.jsx
│   │   │   │   │   ├── AdminProducts.jsx
│   │   │   │   │   └── ImageUploadForm.jsx
│   │   │   │   └── sellers/
│   │   │   │       ├── AddSellerForm.jsx
│   │   │   │       ├── SellerTable.jsx
│   │   │   │       ├── Sellers.jsx
│   │   │   │       └── useSellerFilter.jsx
│   │   │   ├── auth/
│   │   │   │   ├── LogIn.jsx
│   │   │   │   └── Register.jsx
│   │   │   ├── cart/
│   │   │   │   ├── Cart.jsx
│   │   │   │   ├── CartEmpty.jsx
│   │   │   │   ├── ItemContent.jsx
│   │   │   │   └── SetQuantity.jsx
│   │   │   ├── checkout/
│   │   │   │   ├── AddAddressForm.jsx
│   │   │   │   ├── AddressInfo.jsx
│   │   │   │   ├── AddressInfoModal.jsx
│   │   │   │   ├── AddressList.jsx
│   │   │   │   ├── Checkout.jsx
│   │   │   │   ├── DeleteModal.jsx
│   │   │   │   ├── OrderSummary.jsx
│   │   │   │   ├── PaymentConfirmation.jsx
│   │   │   │   ├── PaymentForm.jsx
│   │   │   │   ├── PaymentMethod.jsx
│   │   │   │   ├── PaypalPayment.jsx
│   │   │   │   └── StripePayment.jsx
│   │   │   ├── helper/
│   │   │   │   └── tableColumn.jsx
│   │   │   ├── home/
│   │   │   │   ├── HeroBanner.jsx
│   │   │   │   └── Home.jsx
│   │   │   ├── products/
│   │   │   │   ├── Filter.jsx
│   │   │   │   └── Products.jsx
│   │   │   └── shared/
│   │   │       ├── DeleteModal.jsx
│   │   │       ├── ErrorPage.jsx
│   │   │       ├── InputField.jsx
│   │   │       ├── Loader.jsx
│   │   │       ├── Modal.jsx
│   │   │       ├── Navbar.jsx
│   │   │       ├── Paginations.jsx
│   │   │       ├── ProductCard.jsx
│   │   │       ├── ProductViewModal.jsx
│   │   │       ├── SelectTextField.jsx
│   │   │       ├── Sidebar.jsx
│   │   │       ├── Skeleton.jsx
│   │   │       ├── Spinners.jsx
│   │   │       └── Status.jsx
│   │   ├── hooks/
│   │   │   ├── useCategoryFilter.js
│   │   │   ├── useOrderFilter.js
│   │   │   └── useProductFilter.js
│   │   ├── index.css
│   │   ├── main.jsx
│   │   ├── store/
│   │   │   ├── actions/
│   │   │   │   └── index.js
│   │   │   └── reducers/
│   │   │       ├── ProductReducer.js
│   │   │       ├── adminReducer.js
│   │   │       ├── authReducer.js
│   │   │       ├── cartReducer.js
│   │   │       ├── errorReducer.js
│   │   │       ├── orderReducer.js
│   │   │       ├── paymentMethodReducer.js
│   │   │       ├── sellerReducer.js
│   │   │       └── store.js
│   │   └── utils/
│   │       ├── constant.js
│   │       ├── formatPrice.js
│   │       ├── index.js
│   │       └── truncateText.js
│   └── vite.config.js
├── media/
│   ├── .gitignore
│   ├── .mvn/
│   │   └── wrapper/
│   │       ├── maven-wrapper.jar
│   │       └── maven-wrapper.properties
│   ├── mvnw
│   ├── mvnw.cmd
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── social/
│       │   │           └── media/
│       │   │               ├── DataInitializer.java
│       │   │               ├── MediaApplication.java
│       │   │               ├── controllers/
│       │   │               │   └── SocialController.java
│       │   │               ├── models/
│       │   │               │   ├── Post.java
│       │   │               │   ├── SocialGroup.java
│       │   │               │   ├── SocialProfile.java
│       │   │               │   └── SocialUser.java
│       │   │               ├── repositories/
│       │   │               │   ├── PostRepository.java
│       │   │               │   ├── SocialGroupRepository.java
│       │   │               │   ├── SocialProfileRepository.java
│       │   │               │   └── SocialUserRepository.java
│       │   │               └── services/
│       │   │                   └── SocialService.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── social/
│                       └── media/
│                           └── MediaApplicationTests.java
└── sb-ecom/
    ├── .gitignore
    ├── .mvn/
    │   └── wrapper/
    │       ├── maven-wrapper.jar
    │       └── maven-wrapper.properties
    ├── mvnw
    ├── mvnw.cmd
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── java/
        │   │   └── com/
        │   │       └── ecommerce/
        │   │           └── project/
        │   │               ├── SbEcomApplication.java
        │   │               ├── config/
        │   │               │   ├── AppConfig.java
        │   │               │   ├── AppConstants.java
        │   │               │   ├── SwaggerConfig.java
        │   │               │   └── WebMvcConfig.java
        │   │               ├── controller/
        │   │               │   ├── AddressController.java
        │   │               │   ├── AnalyticsController.java
        │   │               │   ├── AuthController.java
        │   │               │   ├── CartController.java
        │   │               │   ├── CategoryController.java
        │   │               │   ├── OrderController.java
        │   │               │   └── ProductController.java
        │   │               ├── exceptions/
        │   │               │   ├── APIException.java
        │   │               │   ├── MyGlobalExceptionHandler.java
        │   │               │   └── ResourceNotFoundException.java
        │   │               ├── model/
        │   │               │   ├── Address.java
        │   │               │   ├── AppRole.java
        │   │               │   ├── Cart.java
        │   │               │   ├── CartItem.java
        │   │               │   ├── Category.java
        │   │               │   ├── Order.java
        │   │               │   ├── OrderItem.java
        │   │               │   ├── Payment.java
        │   │               │   ├── Product.java
        │   │               │   ├── Role.java
        │   │               │   └── User.java
        │   │               ├── payload/
        │   │               │   ├── APIResponse.java
        │   │               │   ├── AddressDTO.java
        │   │               │   ├── AnalyticsResponse.java
        │   │               │   ├── AuthenticationResult.java
        │   │               │   ├── CartDTO.java
        │   │               │   ├── CartItemDTO.java
        │   │               │   ├── CategoryDTO.java
        │   │               │   ├── CategoryResponse.java
        │   │               │   ├── OrderDTO.java
        │   │               │   ├── OrderItemDTO.java
        │   │               │   ├── OrderRequestDTO.java
        │   │               │   ├── OrderResponse.java
        │   │               │   ├── OrderStatusUpdateDto.java
        │   │               │   ├── PaymentDTO.java
        │   │               │   ├── ProductDTO.java
        │   │               │   ├── ProductResponse.java
        │   │               │   ├── StripePaymentDto.java
        │   │               │   ├── UserDTO.java
        │   │               │   └── UserResponse.java
        │   │               ├── repositories/
        │   │               │   ├── AddressRepository.java
        │   │               │   ├── CartItemRepository.java
        │   │               │   ├── CartRepository.java
        │   │               │   ├── CategoryRepository.java
        │   │               │   ├── OrderItemRepository.java
        │   │               │   ├── OrderRepository.java
        │   │               │   ├── PaymentRepository.java
        │   │               │   ├── ProductRepository.java
        │   │               │   ├── RoleRepository.java
        │   │               │   └── UserRepository.java
        │   │               ├── security/
        │   │               │   ├── WebConfig.java
        │   │               │   ├── WebSecurityConfig.java
        │   │               │   ├── jwt/
        │   │               │   │   ├── AuthEntryPointJwt.java
        │   │               │   │   ├── AuthTokenFilter.java
        │   │               │   │   └── JwtUtils.java
        │   │               │   ├── request/
        │   │               │   │   ├── LoginRequest.java
        │   │               │   │   └── SignupRequest.java
        │   │               │   ├── response/
        │   │               │   │   ├── MessageResponse.java
        │   │               │   │   └── UserInfoResponse.java
        │   │               │   └── services/
        │   │               │       ├── UserDetailsImpl.java
        │   │               │       └── UserDetailsServiceImpl.java
        │   │               ├── service/
        │   │               │   ├── AddressService.java
        │   │               │   ├── AddressServiceImpl.java
        │   │               │   ├── AnalyticsService.java
        │   │               │   ├── AnalyticsServiceImpl.java
        │   │               │   ├── AuthService.java
        │   │               │   ├── AuthServiceImpl.java
        │   │               │   ├── CartService.java
        │   │               │   ├── CartServiceImpl.java
        │   │               │   ├── CategoryService.java
        │   │               │   ├── CategoryServiceImpl.java
        │   │               │   ├── FileService.java
        │   │               │   ├── FileServiceImpl.java
        │   │               │   ├── OrderService.java
        │   │               │   ├── OrderServiceImpl.java
        │   │               │   ├── ProductService.java
        │   │               │   ├── ProductServiceImpl.java
        │   │               │   ├── StripeService.java
        │   │               │   └── StripeServiceImpl.java
        │   │               └── util/
        │   │                   └── AuthUtil.java
        │   └── resources/
        │       └── application.properties
        └── test/
            └── java/
                └── com/
                    └── ecommerce/
                        └── project/
                            └── SbEcomApplicationTests.java

================================================
FILE CONTENTS
================================================

================================================
FILE: FirstSpring/.gitignore
================================================
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/


================================================
FILE: FirstSpring/mvnw
================================================
#!/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.
# ----------------------------------------------------------------------------

# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.2.0
#
# Required ENV vars:
# ------------------
#   JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
#     e.g. to debug Maven itself, use
#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------

if [ -z "$MAVEN_SKIP_RC" ] ; then

  if [ -f /usr/local/etc/mavenrc ] ; then
    . /usr/local/etc/mavenrc
  fi

  if [ -f /etc/mavenrc ] ; then
    . /etc/mavenrc
  fi

  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi

fi

# OS specific support.  $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "$(uname)" in
  CYGWIN*) cygwin=true ;;
  MINGW*) mingw=true;;
  Darwin*) darwin=true
    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
    if [ -z "$JAVA_HOME" ]; then
      if [ -x "/usr/libexec/java_home" ]; then
        JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
      else
        JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
      fi
    fi
    ;;
esac

if [ -z "$JAVA_HOME" ] ; then
  if [ -r /etc/gentoo-release ] ; then
    JAVA_HOME=$(java-config --jre-home)
  fi
fi

# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
  [ -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 "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
    JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
fi

if [ -z "$JAVA_HOME" ]; then
  javaExecutable="$(which javac)"
  if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
    # readlink(1) is not available as standard on Solaris 10.
    readLink=$(which readlink)
    if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
      if $darwin ; then
        javaHome="$(dirname "\"$javaExecutable\"")"
        javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
      else
        javaExecutable="$(readlink -f "\"$javaExecutable\"")"
      fi
      javaHome="$(dirname "\"$javaExecutable\"")"
      javaHome=$(expr "$javaHome" : '\(.*\)/bin')
      JAVA_HOME="$javaHome"
      export JAVA_HOME
    fi
  fi
fi

if [ -z "$JAVACMD" ] ; then
  if [ -n "$JAVA_HOME"  ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
      # IBM's JDK on AIX uses strange locations for the executables
      JAVACMD="$JAVA_HOME/jre/sh/java"
    else
      JAVACMD="$JAVA_HOME/bin/java"
    fi
  else
    JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
  fi
fi

if [ ! -x "$JAVACMD" ] ; then
  echo "Error: JAVA_HOME is not defined correctly." >&2
  echo "  We cannot execute $JAVACMD" >&2
  exit 1
fi

if [ -z "$JAVA_HOME" ] ; then
  echo "Warning: JAVA_HOME environment variable is not set."
fi

# 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/.." || exit 1; pwd)
    fi
    # end of workaround
  done
  printf '%s' "$(cd "$basedir" || exit 1; pwd)"
}

# concatenates all lines of a file
concat_lines() {
  if [ -f "$1" ]; then
    # Remove \r in case we run on Windows within Git Bash
    # and check out the repository with auto CRLF management
    # enabled. Otherwise, we may read lines that are delimited with
    # \r\n and produce $'-Xarg\r' rather than -Xarg due to word
    # splitting rules.
    tr -s '\r\n' ' ' < "$1"
  fi
}

log() {
  if [ "$MVNW_VERBOSE" = true ]; then
    printf '%s\n' "$1"
  fi
}

BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
if [ -z "$BASE_DIR" ]; then
  exit 1;
fi

MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
log "$MAVEN_PROJECTBASEDIR"

##########################################################################################
# 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.
##########################################################################################
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
if [ -r "$wrapperJarPath" ]; then
    log "Found $wrapperJarPath"
else
    log "Couldn't find $wrapperJarPath, downloading it ..."

    if [ -n "$MVNW_REPOURL" ]; then
      wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
    else
      wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
    fi
    while IFS="=" read -r key value; do
      # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
      safeValue=$(echo "$value" | tr -d '\r')
      case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
      esac
    done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
    log "Downloading from: $wrapperUrl"

    if $cygwin; then
      wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
    fi

    if command -v wget > /dev/null; then
        log "Found wget ... using wget"
        [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
            wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
        else
            wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
        fi
    elif command -v curl > /dev/null; then
        log "Found curl ... using curl"
        [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
            curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
        else
            curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
        fi
    else
        log "Falling back to using Java to download"
        javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
        javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
        # For Cygwin, switch paths to Windows format before running javac
        if $cygwin; then
          javaSource=$(cygpath --path --windows "$javaSource")
          javaClass=$(cygpath --path --windows "$javaClass")
        fi
        if [ -e "$javaSource" ]; then
            if [ ! -e "$javaClass" ]; then
                log " - Compiling MavenWrapperDownloader.java ..."
                ("$JAVA_HOME/bin/javac" "$javaSource")
            fi
            if [ -e "$javaClass" ]; then
                log " - Running MavenWrapperDownloader.java ..."
                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
            fi
        fi
    fi
fi
##########################################################################################
# End of extension
##########################################################################################

# If specified, validate the SHA-256 sum of the Maven wrapper jar file
wrapperSha256Sum=""
while IFS="=" read -r key value; do
  case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
  esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
if [ -n "$wrapperSha256Sum" ]; then
  wrapperSha256Result=false
  if command -v sha256sum > /dev/null; then
    if echo "$wrapperSha256Sum  $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
      wrapperSha256Result=true
    fi
  elif command -v shasum > /dev/null; then
    if echo "$wrapperSha256Sum  $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
      wrapperSha256Result=true
    fi
  else
    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
    echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
    exit 1
  fi
  if [ $wrapperSha256Result = false ]; then
    echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
    echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
    echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
    exit 1
  fi
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 "$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

# shellcheck disable=SC2086 # safe args
exec "$JAVACMD" \
  $MAVEN_OPTS \
  $MAVEN_DEBUG_OPTS \
  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
  "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"


================================================
FILE: FirstSpring/mvnw.cmd
================================================
@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 Apache Maven Wrapper startup batch script, version 3.2.0
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM     e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------

@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%

@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")

@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre

@setlocal

set ERROR_CODE=0

@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal

@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome

echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error

:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init

echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error

@REM ==== END VALIDATION ====

:init

@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.

set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir

set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir

:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir

:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"

:endDetectBaseDir

IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig

@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%

:endReadAdditionalConfig

SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain

set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"

FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
    IF "%%A"=="wrapperUrl" SET WRAPPER_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 WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
    )
    if "%MVNW_VERBOSE%" == "true" (
        echo Couldn't find %WRAPPER_JAR%, downloading it ...
        echo Downloading from: %WRAPPER_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('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
		"}"
    if "%MVNW_VERBOSE%" == "true" (
        echo Finished downloading %WRAPPER_JAR%
    )
)
@REM End of extension

@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
SET WRAPPER_SHA_256_SUM=""
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
    IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
)
IF NOT %WRAPPER_SHA_256_SUM%=="" (
    powershell -Command "&{"^
       "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
       "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
       "  Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
       "  Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
       "  Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
       "  exit 1;"^
       "}"^
       "}"
    if ERRORLEVEL 1 goto error
)

@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*

%MAVEN_JAVA_EXE% ^
  %JVM_CONFIG_MAVEN_PROPS% ^
  %MAVEN_OPTS% ^
  %MAVEN_DEBUG_OPTS% ^
  -classpath %WRAPPER_JAR% ^
  "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
  %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end

:error
set ERROR_CODE=1

:end
@endlocal & set ERROR_CODE=%ERROR_CODE%

if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost

@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause

if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%

cmd /C exit /B %ERROR_CODE%


================================================
FILE: FirstSpring/pom.xml
================================================
<?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>4.0.1</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.embarkx</groupId>
	<artifactId>FirstSpring</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>FirstSpring</name>
	<description>First project for Spring Boot</description>
	<properties>
		<java.version>24</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webmvc</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>


================================================
FILE: FirstSpring/src/main/java/com/embarkx/FirstSpring/FirstSpringApplication.java
================================================
package com.embarkx.FirstSpring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class FirstSpringApplication {


    public static void main(String[] args) {
        SpringApplication.run(FirstSpringApplication.class, args);
    }

}


================================================
FILE: FirstSpring/src/main/java/com/embarkx/FirstSpring/HelloController.java
================================================
package com.embarkx.FirstSpring;

import org.springframework.web.bind.annotation.*;

@RestController
public class HelloController {

    @GetMapping("/hello/{name}")
    public HelloResponse helloParam(@PathVariable String name) {
        return new HelloResponse("Hello, " + name);
    }

    @GetMapping("/hello")
    public HelloResponse hello() {
        return new HelloResponse("Hello, World!");
    }

    @PostMapping("/hello")
    public HelloResponse helloPost(@RequestBody String name) {
        return new HelloResponse("Hello, " + name + "!");
    }
}


================================================
FILE: FirstSpring/src/main/java/com/embarkx/FirstSpring/HelloResponse.java
================================================
package com.embarkx.FirstSpring;

public class HelloResponse {
    private String message;

    public HelloResponse(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}


================================================
FILE: FirstSpring/src/main/resources/application.properties
================================================
server.port=8080

================================================
FILE: FirstSpring/src/test/java/com/embarkx/FirstSpring/FirstSpringApplicationTests.java
================================================
package com.embarkx.FirstSpring;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class FirstSpringApplicationTests {

	@Test
	void contextLoads() {
	}

}


================================================
FILE: Java Spring Boot- Professional eCommerce Project Masterclass.postman_collection.json
================================================
{
	"info": {
		"_postman_id": "e901da3d-88dd-479e-a9f9-2a1a38b6282b",
		"name": "Java Spring Boot: Professional eCommerce Project Masterclass",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"_exporter_id": "28392683"
	},
	"item": [
		{
			"name": "SocialMedia APIs",
			"item": [
				{
					"name": "GetUsers",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "http://localhost:8080/social/users",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"port": "8080",
							"path": [
								"social",
								"users"
							]
						}
					},
					"response": []
				},
				{
					"name": "GetUsers",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "http://localhost:8080/social/users/1",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"port": "8080",
							"path": [
								"social",
								"users",
								"1"
							]
						}
					},
					"response": []
				},
				{
					"name": "DeleteUsers",
					"request": {
						"method": "DELETE",
						"header": [],
						"url": {
							"raw": "http://localhost:8080/social/users/4",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"port": "8080",
							"path": [
								"social",
								"users",
								"4"
							]
						}
					},
					"response": []
				},
				{
					"name": "SaveUsers",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "{\r\n        \"id\": 10,\r\n        \"socialProfile\": {\r\n            \"id\": 10,\r\n            \"description\":\"Test 4\"\r\n        }\r\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "http://localhost:8080/social/users",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"port": "8080",
							"path": [
								"social",
								"users"
							]
						}
					},
					"response": []
				}
			]
		},
		{
			"name": "Hello World App",
			"item": [
				{
					"name": "http://localhost:8080/hello",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "Spring Boot"
						},
						"url": {
							"raw": "http://localhost:8080/hello",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"port": "8080",
							"path": [
								"hello"
							]
						}
					},
					"response": []
				},
				{
					"name": "http://localhost:8080/hello",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "http://localhost:8080/hello",
							"protocol": "http",
							"host": [
								"localhost"
							],
							"port": "8080",
							"path": [
								"hello"
							]
						}
					},
					"response": []
				}
			]
		},
		{
			"name": "Spring Boot Ecommerce",
			"item": [
				{
					"name": "Product",
					"item": [
						{
							"name": "Add Product",
							"request": {
								"method": "POST",
								"header": [],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"productName\": \"Adjustable dumbbell set for home workouts | Premium Quality\",\r\n    \"description\": \"Adjustable dumbbell set for home workouts, can be used indoors, outdoors, at your personal gym. This is available at lowest possible rates.\",\r\n    \"quantity\": 90,\r\n    \"price\": 90,\r\n    \"discount\": 10\r\n}\r\n",
									"options": {
										"raw": {
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "http://localhost:8080/api/admin/categories/6/product",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"admin",
										"categories",
										"6",
										"product"
									]
								}
							},
							"response": []
						},
						{
							"name": "Update Product",
							"request": {
								"method": "PUT",
								"header": [],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"productName\": \"Adjustable dumbbell set for home workouts | Premium Quality\",\r\n    \"description\": \"Adjustable dumbbell set for home workouts, can be used indoors, outdoors, at your personal gym. This is available at lowest possible rates.\",\r\n    \"quantity\": 0,\r\n    \"price\": 90,\r\n    \"discount\": 10\r\n}\r\n",
									"options": {
										"raw": {
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "http://localhost:8080/api/admin/products/157",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"admin",
										"products",
										"157"
									]
								}
							},
							"response": []
						},
						{
							"name": "Update Product Image",
							"request": {
								"method": "PUT",
								"header": [],
								"body": {
									"mode": "formdata",
									"formdata": [
										{
											"key": "image",
											"type": "file",
											"src": "/C:/Users/FAISAL/Downloads/placeholder.png"
										}
									]
								},
								"url": {
									"raw": "http://localhost:8080/api/products/202/image",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"products",
										"202",
										"image"
									]
								}
							},
							"response": []
						},
						{
							"name": "Delete Product",
							"request": {
								"method": "DELETE",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/admin/products/1",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"admin",
										"products",
										"1"
									]
								}
							},
							"response": []
						},
						{
							"name": "Get All Products",
							"request": {
								"method": "GET",
								"header": [
									{
										"key": "Authorization",
										"value": "Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSIsImlhdCI6MTcxNTE4MzY0OSwiZXhwIjoxNzE1MTg2NjQ5fQ.XS0-JKPhMJMrULRonqYLQzhJFTFOXGxkeuFj4q4mxeE",
										"disabled": true
									}
								],
								"url": {
									"raw": "http://localhost:8080/api/public/products?sortBy=price&sortOrder=desc&pageSize=20",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"public",
										"products"
									],
									"query": [
										{
											"key": "pageNumber",
											"value": "1",
											"disabled": true
										},
										{
											"key": "sortBy",
											"value": "price"
										},
										{
											"key": "sortOrder",
											"value": "desc"
										},
										{
											"key": "keyword",
											"value": "blender",
											"disabled": true
										},
										{
											"key": "category",
											"value": "Electronics",
											"disabled": true
										},
										{
											"key": "pageSize",
											"value": "20"
										}
									]
								}
							},
							"response": []
						},
						{
							"name": "Get Products By Keyword",
							"request": {
								"method": "GET",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/public/products/keyword/rob?pageNumber=0&pageSize=10&sortBy=productName&sortOrder=desc",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"public",
										"products",
										"keyword",
										"rob"
									],
									"query": [
										{
											"key": "pageNumber",
											"value": "0"
										},
										{
											"key": "pageSize",
											"value": "10"
										},
										{
											"key": "sortBy",
											"value": "productName"
										},
										{
											"key": "sortOrder",
											"value": "desc"
										}
									]
								}
							},
							"response": []
						},
						{
							"name": "Get Products By Category",
							"request": {
								"method": "GET",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/public/categories/1/products?pageNumber=0&pageSize=10&sortBy=productId&sortOrder=desc",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"public",
										"categories",
										"1",
										"products"
									],
									"query": [
										{
											"key": "pageNumber",
											"value": "0"
										},
										{
											"key": "pageSize",
											"value": "10"
										},
										{
											"key": "sortBy",
											"value": "productId"
										},
										{
											"key": "sortOrder",
											"value": "desc"
										}
									]
								}
							},
							"response": []
						}
					]
				},
				{
					"name": "Category",
					"item": [
						{
							"name": "Get All Categories",
							"request": {
								"method": "GET",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/public/categories",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"public",
										"categories"
									],
									"query": [
										{
											"key": "pageNumber",
											"value": "0",
											"disabled": true
										},
										{
											"key": "pageSize",
											"value": "10",
											"disabled": true
										},
										{
											"key": "sortBy",
											"value": "categoryName",
											"disabled": true
										},
										{
											"key": "sortOrder",
											"value": "desc",
											"disabled": true
										}
									]
								}
							},
							"response": []
						},
						{
							"name": "DELETE Category",
							"request": {
								"method": "DELETE",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/admin/categories/4",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"admin",
										"categories",
										"4"
									]
								}
							},
							"response": []
						},
						{
							"name": "Create new Category",
							"request": {
								"method": "POST",
								"header": [],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"categoryName\":\"Sports & Fitness\"\r\n}",
									"options": {
										"raw": {
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "http://localhost:8080/api/public/categories",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"public",
										"categories"
									]
								}
							},
							"response": []
						},
						{
							"name": "Update Category",
							"request": {
								"method": "PUT",
								"header": [],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"categoryName\":\"Travel Updated\"\r\n}",
									"options": {
										"raw": {
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "http://localhost:8080/api/public/categories/1",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"public",
										"categories",
										"1"
									]
								}
							},
							"response": []
						}
					]
				},
				{
					"name": "Authentication",
					"item": [
						{
							"name": "Sign in",
							"request": {
								"method": "POST",
								"header": [],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"username\":\"user1\",\r\n    \"password\":\"password1\"\r\n}",
									"options": {
										"raw": {
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "http://localhost:8080/api/auth/signin",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"auth",
										"signin"
									]
								}
							},
							"response": []
						},
						{
							"name": "GetUserName",
							"request": {
								"method": "GET",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/auth/username",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"auth",
										"username"
									]
								}
							},
							"response": []
						},
						{
							"name": "GetUser",
							"request": {
								"method": "GET",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/auth/user",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"auth",
										"user"
									]
								}
							},
							"response": []
						},
						{
							"name": "Sign Out",
							"request": {
								"method": "POST",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/auth/signout",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"auth",
										"signout"
									]
								}
							},
							"response": []
						},
						{
							"name": "Sign up",
							"request": {
								"method": "POST",
								"header": [],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"username\":\"user3\",\r\n    \"email\":\"user3email@gmail.com\",\r\n    \"password\":\"password3\",\r\n    \"role\":[\"admin\"]\r\n}",
									"options": {
										"raw": {
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "http://localhost:8080/api/auth/signup",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"auth",
										"signup"
									]
								}
							},
							"response": []
						}
					]
				},
				{
					"name": "Cart",
					"item": [
						{
							"name": "Add product to cart",
							"request": {
								"auth": {
									"type": "noauth"
								},
								"method": "POST",
								"header": [
									{
										"key": "",
										"value": "",
										"disabled": true
									}
								],
								"url": {
									"raw": "http://localhost:8080/api/carts/products/1/quantity/1",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"carts",
										"products",
										"1",
										"quantity",
										"1"
									]
								}
							},
							"response": []
						},
						{
							"name": "Get all carts",
							"request": {
								"auth": {
									"type": "noauth"
								},
								"method": "GET",
								"header": [
									{
										"key": "",
										"value": "",
										"disabled": true
									}
								],
								"url": {
									"raw": "http://localhost:8080/api/carts",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"carts"
									]
								}
							},
							"response": []
						},
						{
							"name": "Get User Cart",
							"request": {
								"auth": {
									"type": "noauth"
								},
								"method": "GET",
								"header": [
									{
										"key": "",
										"value": "",
										"disabled": true
									}
								],
								"url": {
									"raw": "http://localhost:8080/api/carts/users/cart",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"carts",
										"users",
										"cart"
									]
								}
							},
							"response": []
						},
						{
							"name": "Update quantity of product in Cart",
							"request": {
								"auth": {
									"type": "noauth"
								},
								"method": "PUT",
								"header": [
									{
										"key": "",
										"value": "",
										"disabled": true
									}
								],
								"url": {
									"raw": "http://localhost:8080/api/cart/products/1/quantity/delete",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"cart",
										"products",
										"1",
										"quantity",
										"delete"
									]
								}
							},
							"response": []
						},
						{
							"name": "Delete product from cart",
							"request": {
								"auth": {
									"type": "noauth"
								},
								"method": "DELETE",
								"header": [
									{
										"key": "",
										"value": "",
										"disabled": true
									}
								],
								"url": {
									"raw": "http://localhost:8080/api/carts/1/product/1",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"carts",
										"1",
										"product",
										"1"
									]
								}
							},
							"response": []
						}
					]
				},
				{
					"name": "Addresses",
					"item": [
						{
							"name": "Create Address",
							"request": {
								"auth": {
									"type": "noauth"
								},
								"method": "POST",
								"header": [],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"country\": \"USA\",\r\n    \"city\": \"San Francisco\",\r\n    \"street\": \"Market Street\",\r\n    \"pincode\": \"94103\",\r\n    \"buildingName\": \"Bay Apartments\",\r\n    \"state\": \"California\"\r\n}\r\n",
									"options": {
										"raw": {
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "http://localhost:8080/api/addresses",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"addresses"
									]
								}
							},
							"response": []
						},
						{
							"name": "Update Address",
							"request": {
								"auth": {
									"type": "noauth"
								},
								"method": "PUT",
								"header": [],
								"body": {
									"mode": "raw",
									"raw": "{\r\n    \"country\": \"USA\",\r\n    \"city\": \"San Francisco\",\r\n    \"street\": \"Market Street\",\r\n    \"pincode\": \"94103\",\r\n    \"buildingName\": \"Bay Apartments Updated\",\r\n    \"state\": \"California\"\r\n}\r\n",
									"options": {
										"raw": {
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "http://localhost:8080/api/addresses/1",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"addresses",
										"1"
									]
								}
							},
							"response": []
						},
						{
							"name": "Get Addresses",
							"request": {
								"auth": {
									"type": "noauth"
								},
								"method": "GET",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/addresses",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"addresses"
									]
								}
							},
							"response": []
						},
						{
							"name": "Get Address By Id",
							"request": {
								"auth": {
									"type": "noauth"
								},
								"method": "GET",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/addresses/1",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"addresses",
										"1"
									]
								}
							},
							"response": []
						},
						{
							"name": "Delete Address",
							"request": {
								"auth": {
									"type": "noauth"
								},
								"method": "DELETE",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/addresses/2",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"addresses",
										"2"
									]
								}
							},
							"response": []
						},
						{
							"name": "Get User Addresses",
							"request": {
								"auth": {
									"type": "noauth"
								},
								"method": "GET",
								"header": [],
								"url": {
									"raw": "http://localhost:8080/api/users/addresses",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"users",
										"addresses"
									]
								}
							},
							"response": []
						}
					]
				},
				{
					"name": "Orders",
					"item": [
						{
							"name": "Place Order",
							"request": {
								"method": "POST",
								"header": [],
								"body": {
									"mode": "raw",
									"raw": "{\r\n  \"addressId\": 1,\r\n  \"pgName\": \"Stripe\",\r\n  \"pgPaymentId\": \"pi_1FHEhK2eZvKYlo2CcK4UJNdW\",\r\n  \"pgStatus\": \"succeeded\",\r\n  \"pgResponseMessage\": \"Payment successful\"\r\n}",
									"options": {
										"raw": {
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "http://localhost:8080/api/order/users/payments/CARD",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"order",
										"users",
										"payments",
										"CARD"
									]
								}
							},
							"response": []
						},
						{
							"name": "StripeClientSecret",
							"request": {
								"method": "POST",
								"header": [],
								"body": {
									"mode": "raw",
									"raw": "{\r\n  \"amount\": 2000,\r\n  \"currency\": \"usd\"\r\n}",
									"options": {
										"raw": {
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "http://localhost:8080/api/order/stripe-client-secret",
									"protocol": "http",
									"host": [
										"localhost"
									],
									"port": "8080",
									"path": [
										"api",
										"order",
										"stripe-client-secret"
									]
								}
							},
							"response": []
						}
					]
				}
			]
		}
	]
}

================================================
FILE: README.md
================================================
This is the Official repository of **Java Spring Boot: Professional eCommerce Project Masterclass** on Udemy

# The Ultimate Java and Spring Boot Mastery Roadmap

Welcome to your one-stop-shop for mastering Java and Spring Boot! This repository offers a comprehensive learning experience with high-quality resources and community support. Dive into over 150+ hours of premium content, with everything you need to excel at Java and Spring Boot development.

## 🎓 Learning Roadmap

Most of the courses below are available in **Udemy For Business**, so if you have subscription - you can get FREE access.
Here’s a structured path to enhance your skills with detailed courses available:

1. **[Spring Boot By Building Complex Projects Step by Step](https://link.embarkx.com/spring-boot) (90+ Hours of Content)**
2. **[Master Spring Boot Microservices by Building eCommerce Project](https://link.embarkx.com/microservices) (55+ Hours of Content)**
3. **[Full Stack AI DevOps for Software Developers (AWS, Azure, GCP)](https://link.embarkx.com/devops) (20+ Hours of Content)**
4. **[Learn Java with 60+ Hours of Content](http://link.embarkx.com/java) (60+ Hours of Content)**
5. **[Master Spring Security with React JS + OAuth2](https://link.embarkx.com/spring-security) (34+ Hours of Content)**
6. **[Master IntelliJ IDEA](http://link.embarkx.com/intellij) (3+ Hours of Content)**


## 🌟 With All Our Courses You Gain Access To

- 📝 **Notes:** Detailed and downloadable notes to accompany each lesson.
- 💻 **Source Code:** Full access to the source code used in the tutorials.
- 🤔 **Doubt Solving:** Responsive instructor and community support.
- 🎥 **High-Quality HD Videos:** Easy to understand, high-definition video tutorials.
- 🔄 **Free Lifetime Updates:** Continuous updates to course content at no extra cost.

## 📚 Why Choose This Mastery Series?

With this series, you're not just learning; you're preparing to dominate the field of Java and Spring Boot development. Our structured learning path ensures that you build your skills progressively, with each course designed to build on the knowledge gained from the previous one.

### Join Us Now!

Start your journey today to become a master at Java and Spring Boot. Our community and expert instructors are here to support your learning every step of the way. **Enroll and start building your future, today!**





# Usage Policy for Course Materials

## Instructor Information

**Instructor:** Faisal Memon  
**Company:** [EmbarkX.com](http://www.embarkx.com)

## Policy Overview

This document outlines the guidelines and restrictions concerning the use of course materials provided by EmbarkX, including but not limited to PDF presentations, code samples, and video tutorials.

### 1. Personal Use Only

The materials provided in this course are intended for **your personal use only**. They are to be used solely for the purpose of learning and completing this course.

### 2. No Unauthorized Sharing or Distribution

You are **not permitted** to share, distribute, or publicly post any course materials on any websites, social media platforms, or other public forums without prior written consent from the instructor.

### 3. Intellectual Property

All course materials are protected by copyright laws and are the intellectual property of Faisal Memon and EmbarkX. Unauthorized use, reproduction, or distribution of these materials is **strictly prohibited**.

### 4. Reporting Violations

If you become aware of any unauthorized sharing or distribution of course materials, please report it immediately to [embarkxofficial@gmail.com](mailto:embarkxofficial@gmail.com).

### 5. Legal Action

We reserve the right to take legal action against individuals or entities found to be violating this usage policy.

## Thank You

Thank you for respecting these guidelines and helping us maintain the integrity of our course materials.

## Contact Information

- **Email:** [embarkxofficial@gmail.com](mailto:embarkxofficial@gmail.com)
- **Website:** [www.embarkx.com](http://www.embarkx.com)




================================================
FILE: SpringExample/.gitignore
================================================
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store

================================================
FILE: SpringExample/.idea/.gitignore
================================================
# Default ignored files
/shelf/
/workspace.xml


================================================
FILE: SpringExample/.idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
  </component>
</project>

================================================
FILE: SpringExample/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ExternalStorageConfigurationManager" enabled="true" />
  <component name="MavenProjectsManager">
    <option name="originalFiles">
      <list>
        <option value="$PROJECT_DIR$/pom.xml" />
      </list>
    </option>
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/out" />
  </component>
</project>

================================================
FILE: SpringExample/.idea/uiDesigner.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Palette2">
    <group name="Swing">
      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
      </item>
      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
      </item>
      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
      </item>
      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
      </item>
      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
        <initial-values>
          <property name="text" value="Button" />
        </initial-values>
      </item>
      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
        <initial-values>
          <property name="text" value="RadioButton" />
        </initial-values>
      </item>
      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
        <initial-values>
          <property name="text" value="CheckBox" />
        </initial-values>
      </item>
      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
        <initial-values>
          <property name="text" value="Label" />
        </initial-values>
      </item>
      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
          <preferred-size width="150" height="-1" />
        </default-constraints>
      </item>
      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
          <preferred-size width="150" height="-1" />
        </default-constraints>
      </item>
      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
          <preferred-size width="150" height="-1" />
        </default-constraints>
      </item>
      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
          <preferred-size width="150" height="50" />
        </default-constraints>
      </item>
      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
          <preferred-size width="150" height="50" />
        </default-constraints>
      </item>
      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
          <preferred-size width="150" height="50" />
        </default-constraints>
      </item>
      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
      </item>
      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
          <preferred-size width="150" height="50" />
        </default-constraints>
      </item>
      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
          <preferred-size width="150" height="50" />
        </default-constraints>
      </item>
      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
          <preferred-size width="150" height="50" />
        </default-constraints>
      </item>
      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
          <preferred-size width="200" height="200" />
        </default-constraints>
      </item>
      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
          <preferred-size width="200" height="200" />
        </default-constraints>
      </item>
      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
      </item>
      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
      </item>
      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
      </item>
      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
      </item>
      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
          <preferred-size width="-1" height="20" />
        </default-constraints>
      </item>
      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
      </item>
      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
      </item>
    </group>
  </component>
</project>

================================================
FILE: SpringExample/.idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
  </component>
</project>

================================================
FILE: SpringExample/pom.xml
================================================
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>SpringExample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>6.1.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.1.6</version>
        </dependency>

    </dependencies>
</project>

================================================
FILE: SpringExample/src/main/java/car/example/bean/App.java
================================================
package car.example.bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("applicationBeanContext.xml");

        MyBean myBean = (MyBean) context.getBean("myBean");
        System.out.println(myBean);
    }
}


================================================
FILE: SpringExample/src/main/java/car/example/bean/MyBean.java
================================================
package car.example.bean;

public class MyBean {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public void showMessage(){
        System.out.println("Message: " + message);
    }

    @Override
    public String toString() {
        return "MyBean{" +
                "message='" + message + '\'' +
                '}';
    }
}


================================================
FILE: SpringExample/src/main/java/car/example/constructor/injection/App.java
================================================
package car.example.constructor.injection;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("applicationConstructorInjection.xml");
        Car myCar = (Car) context.getBean("myCar");
        myCar.displayDetails();
    }
}


================================================
FILE: SpringExample/src/main/java/car/example/constructor/injection/Car.java
================================================
package car.example.constructor.injection;

public class Car {
    private Specification specification;

    public Car(Specification specification) {
        this.specification = specification;
    }

    public void displayDetails(){
        System.out.println("Car Details: " + specification.toString());
    }
}


================================================
FILE: SpringExample/src/main/java/car/example/constructor/injection/Specification.java
================================================
package car.example.constructor.injection;

public class Specification {
    private String make;
    private String model;

    public String getMake() {
        return make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    @Override
    public String toString() {
        return "Specification{" +
                "make='" + make + '\'' +
                ", model='" + model + '\'' +
                '}';
    }
}


================================================
FILE: SpringExample/src/main/java/car/example/setter/injection/App.java
================================================
package car.example.setter.injection;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("applicationSetterInjection.xml");
        Car myCar = (Car) context.getBean("myCar");
        myCar.displayDetails();
    }
}


================================================
FILE: SpringExample/src/main/java/car/example/setter/injection/Car.java
================================================
package car.example.setter.injection;

public class Car {
    private Specification specification;

    public void setSpecification(Specification specification) {
        this.specification = specification;
    }

    public void displayDetails(){
        System.out.println("Car Details: " + specification.toString());
    }
}


================================================
FILE: SpringExample/src/main/java/car/example/setter/injection/Specification.java
================================================
package car.example.setter.injection;

public class Specification {
    private String make;
    private String model;

    public String getMake() {
        return make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    @Override
    public String toString() {
        return "Specification{" +
                "make='" + make + '\'' +
                ", model='" + model + '\'' +
                '}';
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/autowire/constructor/App.java
================================================
package com.example.autowire.constructor;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("autowireByConstructor.xml");
        Car myCar = (Car) context.getBean("myCar");
        myCar.displayDetails();
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/autowire/constructor/Car.java
================================================
package com.example.autowire.constructor;

public class Car {
    private Specification specification;

    public Car(Specification specification) {
        this.specification = specification;
    }

//    public void setSpecification(Specification specification) {
//        this.specification = specification;
//    }

    public void displayDetails(){
        System.out.println("Car Details: " + specification.toString());
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/autowire/constructor/Specification.java
================================================
package com.example.autowire.constructor;

public class Specification {
    private String make;
    private String model;

    public String getMake() {
        return make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    @Override
    public String toString() {
        return "Specification{" +
                "make='" + make + '\'' +
                ", model='" + model + '\'' +
                '}';
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/autowire/name/App.java
================================================
package com.example.autowire.name;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("autowireByName.xml");
        Car myCar = (Car) context.getBean("myCar");
        myCar.displayDetails();
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/autowire/name/Car.java
================================================
package com.example.autowire.name;

public class Car {
    private Specification specification;

    public void setSpecification(Specification specification) {
        this.specification = specification;
    }

    public void displayDetails(){
        System.out.println("Car Details: " + specification.toString());
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/autowire/name/Specification.java
================================================
package com.example.autowire.name;

public class Specification {
    private String make;
    private String model;

    public String getMake() {
        return make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    @Override
    public String toString() {
        return "Specification{" +
                "make='" + make + '\'' +
                ", model='" + model + '\'' +
                '}';
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/autowire/type/App.java
================================================
package com.example.autowire.type;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("autowireByType.xml");
        Car myCar = (Car) context.getBean("myCar");
        myCar.displayDetails();
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/autowire/type/Car.java
================================================
package com.example.autowire.type;

public class Car {
    private Specification specification;

    public void setSpecification(Specification specification) {
        this.specification = specification;
    }

    public void displayDetails(){
        System.out.println("Car Details: " + specification.toString());
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/autowire/type/Specification.java
================================================
package com.example.autowire.type;

public class Specification {
    private String make;
    private String model;

    public String getMake() {
        return make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    @Override
    public String toString() {
        return "Specification{" +
                "make='" + make + '\'' +
                ", model='" + model + '\'' +
                '}';
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/autowired/annotation/App.java
================================================
package com.example.autowired.annotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context
                = new AnnotationConfigApplicationContext(AppConfig.class);
        Employee employee = context.getBean("employee", Employee.class);
        System.out.println(employee.toString());


        Manager manager = context.getBean("manager", Manager.class);
        System.out.println(manager.toString());
    }
}



================================================
FILE: SpringExample/src/main/java/com/example/autowired/annotation/AppConfig.java
================================================
package com.example.autowired.annotation;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "com.example.autowired.annotation")
public class AppConfig {
}


================================================
FILE: SpringExample/src/main/java/com/example/autowired/annotation/Employee.java
================================================
package com.example.autowired.annotation;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("employee")
public class Employee {
    private int employeeId;

    @Value("Hello")
    private String firstName;

    @Value("${java.home}")
    private String lastName;

    @Value("#{4*4}")
    private double salary;

    public int getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "employeeId=" + employeeId +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", salary=" + salary +
                '}';
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/autowired/annotation/Manager.java
================================================
package com.example.autowired.annotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Manager {
    @Autowired
    @Qualifier("employee")
    private Employee employee;

    /*@Autowired
    public Manager(Employee employee) {
        this.employee = employee;
    }*/

    @Override
    public String toString() {
        return "Manager{" +
                "employee=" + employee +
                '}';
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/componentscan/App.java
================================================
package com.example.componentscan;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("componentScanDemo.xml");
        Employee employee = context.getBean("employee", Employee.class);
        System.out.println(employee.toString());
    }
}



================================================
FILE: SpringExample/src/main/java/com/example/componentscan/Employee.java
================================================
package com.example.componentscan;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("employee")
public class Employee {
    private int employeeId;

    @Value("Hello")
    private String firstName;

    @Value("${java.home}")
    private String lastName;

    @Value("#{4*4}")
    private double salary;

    public int getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "employeeId=" + employeeId +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", salary=" + salary +
                '}';
    }
}


================================================
FILE: SpringExample/src/main/java/com/example/componentscan/annotation/App.java
================================================
package com.example.componentscan.annotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context
                = new AnnotationConfigApplicationContext(AppConfig.class);
        Employee employee = context.getBean("employee", Employee.class);
        System.out.println(employee.toString());
    }
}



================================================
FILE: SpringExample/src/main/java/com/example/componentscan/annotation/AppConfig.java
================================================
package com.example.componentscan.annotation;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "com.example.componentscan.annotation")
public class AppConfig {
}


================================================
FILE: SpringExample/src/main/java/com/example/componentscan/annotation/Employee.java
================================================
package com.example.componentscan.annotation;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("employee")
public class Employee {
    private int employeeId;

    @Value("Hello")
    private String firstName;

    @Value("${java.home}")
    private String lastName;

    @Value("#{4*4}")
    private double salary;

    public int getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "employeeId=" + employeeId +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", salary=" + salary +
                '}';
    }
}


================================================
FILE: SpringExample/src/main/java/com/ioc/coupling/IOCExample.java
================================================
package com.ioc.coupling;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IOCExample {
    public static void main(String[] args) {
        ApplicationContext context
                = new ClassPathXmlApplicationContext("applicationIoCLooseCouplingExample.xml");

        UserManager userManagerWithDB =
                (UserManager) context.getBean("userManagerWithUserDataProvider");
        System.out.println(userManagerWithDB.getUserInfo());

       UserManager userManagerWithWS =
                (UserManager) context.getBean("userManagerWithWebServiceProvider");
        System.out.println(userManagerWithWS.getUserInfo());

      UserManager userManagerWithNewDB =
                (UserManager) context.getBean("userManagerWithNewDatabaseProvider");
        System.out.println(userManagerWithNewDB.getUserInfo());
    }
}


================================================
FILE: SpringExample/src/main/java/com/ioc/coupling/NewDatabaseProvider.java
================================================
package com.ioc.coupling;

public class NewDatabaseProvider implements UserDataProvider {
    @Override
    public String getUserDetails() {
        return "New Database in action";
    }
}


================================================
FILE: SpringExample/src/main/java/com/ioc/coupling/UserDataProvider.java
================================================
package com.ioc.coupling;

public interface UserDataProvider {
    String getUserDetails();
}


================================================
FILE: SpringExample/src/main/java/com/ioc/coupling/UserDatabaseProvider.java
================================================
package com.ioc.coupling;

// A - MySQL, PostgreSQL
// B - Web Service, MongoDB

public class UserDatabaseProvider implements UserDataProvider {
    @Override
    public String getUserDetails(){
        // Directly access database here
        return "User Details From Database";
    }
}


================================================
FILE: SpringExample/src/main/java/com/ioc/coupling/UserManager.java
================================================
package com.ioc.coupling;

public class UserManager {
    private UserDataProvider userDataProvider;

    public UserManager(UserDataProvider userDataProvider) {
        this.userDataProvider = userDataProvider;
    }

    public String getUserInfo(){
        return userDataProvider.getUserDetails();
    }
}


================================================
FILE: SpringExample/src/main/java/com/ioc/coupling/WebServiceDataProvider.java
================================================
package com.ioc.coupling;

public class WebServiceDataProvider implements UserDataProvider {

    @Override
    public String getUserDetails() {
        return "Fetching Data From WebService";
    }
}


================================================
FILE: SpringExample/src/main/java/com/loose/coupling/LooseCouplingExample.java
================================================
package com.loose.coupling;

public class LooseCouplingExample {
    public static void main(String[] args) {
        UserDataProvider databaseProvider = new UserDatabaseProvider();
        UserManager userManagerWithDB = new UserManager(databaseProvider);
        System.out.println(userManagerWithDB.getUserInfo());

        UserDataProvider webServiceProvider = new WebServiceDataProvider();
        UserManager userManagerWithWS = new UserManager(webServiceProvider);
        System.out.println(userManagerWithWS.getUserInfo());

        UserDataProvider newDatabaseProvider = new NewDatabaseProvider();
        UserManager userManagerWithNewDB = new UserManager(newDatabaseProvider);
        System.out.println(userManagerWithNewDB.getUserInfo());
    }
}


================================================
FILE: SpringExample/src/main/java/com/loose/coupling/NewDatabaseProvider.java
================================================
package com.loose.coupling;

public class NewDatabaseProvider implements UserDataProvider{
    @Override
    public String getUserDetails() {
        return "New Database in action";
    }
}


================================================
FILE: SpringExample/src/main/java/com/loose/coupling/UserDataProvider.java
================================================
package com.loose.coupling;

public interface UserDataProvider {
    String getUserDetails();
}


================================================
FILE: SpringExample/src/main/java/com/loose/coupling/UserDatabaseProvider.java
================================================
package com.loose.coupling;

// A - MySQL, PostgreSQL
// B - Web Service, MongoDB

public class UserDatabaseProvider implements UserDataProvider {
    @Override
    public String getUserDetails(){
        // Directly access database here
        return "User Details From Database";
    }
}


================================================
FILE: SpringExample/src/main/java/com/loose/coupling/UserManager.java
================================================
package com.loose.coupling;

public class UserManager {
    private UserDataProvider userDataProvider;

    public UserManager(UserDataProvider userDataProvider) {
        this.userDataProvider = userDataProvider;
    }

    public String getUserInfo(){
        return userDataProvider.getUserDetails();
    }
}


================================================
FILE: SpringExample/src/main/java/com/loose/coupling/WebServiceDataProvider.java
================================================
package com.loose.coupling;

public class WebServiceDataProvider implements UserDataProvider{

    @Override
    public String getUserDetails() {
        return "Fetching Data From WebService";
    }
}


================================================
FILE: SpringExample/src/main/java/com/tight/coupling/TightCouplingExample.java
================================================
package com.tight.coupling;

public class TightCouplingExample {
    public static void main(String[] args) {
        UserManager userManager = new UserManager();
        System.out.println(userManager.getUserInfo());
    }
}


================================================
FILE: SpringExample/src/main/java/com/tight/coupling/UserDatabase.java
================================================
package com.tight.coupling;

// A - MySQL, PostgreSQL
// B - Web Service, MongoDB

public class UserDatabase {
    public String getUserDetails(){
        // Directly access database here
        return "User Details From Database";
    }
}


================================================
FILE: SpringExample/src/main/java/com/tight/coupling/UserManager.java
================================================
package com.tight.coupling;

public class UserManager {
    private UserDatabase userDatabase = new UserDatabase();

    public String getUserInfo(){
        return userDatabase.getUserDetails();
    }
}


================================================
FILE: SpringExample/src/main/resources/applicationBeanContext.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- bean definitions here -->
    <bean id="myBean" class="car.example.bean.MyBean">
        <property name="message" value="I am a first bean"/>
    </bean>

</beans>

================================================
FILE: SpringExample/src/main/resources/applicationConstructorInjection.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- bean definitions here -->
    <bean id="carSpecification" class="car.example.constructor.injection.Specification">
        <property name="make" value="Toyota"/>
        <property name="model" value="Corolla"/>
    </bean>

    <bean id="myCar" class="car.example.constructor.injection.Car">
        <constructor-arg ref="carSpecification"/>
    </bean>

</beans>

================================================
FILE: SpringExample/src/main/resources/applicationIoCLooseCouplingExample.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- bean definitions here -->
    <bean id="userDataProvider"
          class="com.ioc.coupling.UserDatabaseProvider"/>

    <bean id="newDatabaseProvider"
          class="com.ioc.coupling.NewDatabaseProvider"/>

    <bean id="webServiceDataProvider"
          class="com.ioc.coupling.WebServiceDataProvider"/>

    <bean id="userManagerWithUserDataProvider" class="com.ioc.coupling.UserManager">
        <constructor-arg ref="userDataProvider"/>
    </bean>

    <bean id="userManagerWithNewDatabaseProvider" class="com.ioc.coupling.UserManager">
        <constructor-arg ref="newDatabaseProvider"/>
    </bean>

    <bean id="userManagerWithWebServiceProvider" class="com.ioc.coupling.UserManager">
        <constructor-arg ref="webServiceDataProvider"/>
    </bean>

</beans>

================================================
FILE: SpringExample/src/main/resources/applicationSetterInjection.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- bean definitions here -->
    <bean id="carSpecification" class="car.example.setter.injection.Specification">
        <property name="make" value="Toyota"/>
        <property name="model" value="Corolla"/>
    </bean>

    <bean id="myCar" class="car.example.setter.injection.Car">
        <property name="specification" ref="carSpecification"/>
    </bean>

</beans>

================================================
FILE: SpringExample/src/main/resources/autowireByConstructor.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- bean definitions here -->
    <bean id="specification1" class="com.example.autowire.constructor.Specification">
        <property name="make" value="Toyota"/>
        <property name="model" value="Corolla"/>
    </bean>

<!--    <bean id="specification" class="com.example.autowire.constructor.Specification">-->
<!--        <property name="make" value="Toyota1"/>-->
<!--        <property name="model" value="Corolla1"/>-->
<!--    </bean>-->

    <bean id="myCar" class="com.example.autowire.constructor.Car" autowire="constructor"/>

</beans>

================================================
FILE: SpringExample/src/main/resources/autowireByName.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- bean definitions here -->
    <bean id="specification" class="com.example.autowire.name.Specification">
        <property name="make" value="Toyota"/>
        <property name="model" value="Corolla"/>
    </bean>

    <bean id="specification1" class="com.example.autowire.name.Specification">
        <property name="make" value="Toyota1"/>
        <property name="model" value="Corolla1"/>
    </bean>

    <bean id="myCar" class="com.example.autowire.name.Car" autowire="byName"/>

</beans>

================================================
FILE: SpringExample/src/main/resources/autowireByType.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- bean definitions here -->
    <bean id="specification1" class="com.example.autowire.type.Specification">
        <property name="make" value="Toyota"/>
        <property name="model" value="Corolla"/>
    </bean>

<!--    <bean id="specification1" class="com.example.autowire.type.Specification">-->
<!--        <property name="make" value="Toyota1"/>-->
<!--        <property name="model" value="Corolla1"/>-->
<!--    </bean>-->

    <bean id="myCar" class="com.example.autowire.type.Car" autowire="byType"/>

</beans>

================================================
FILE: SpringExample/src/main/resources/componentScanDemo.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
		https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.example.componentscan"/>

</beans>

================================================
FILE: ecom-frontend/.gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

.env

================================================
FILE: ecom-frontend/README.md
================================================
# React + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh


================================================
FILE: ecom-frontend/eslint.config.js
================================================
import js from '@eslint/js'
import globals from 'globals'
import react from 'eslint-plugin-react'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'

export default [
  { ignores: ['dist'] },
  {
    files: ['**/*.{js,jsx}'],
    languageOptions: {
      ecmaVersion: 2020,
      globals: globals.browser,
      parserOptions: {
        ecmaVersion: 'latest',
        ecmaFeatures: { jsx: true },
        sourceType: 'module',
      },
    },
    settings: { react: { version: '18.3' } },
    plugins: {
      react,
      'react-hooks': reactHooks,
      'react-refresh': reactRefresh,
    },
    rules: {
      ...js.configs.recommended.rules,
      ...react.configs.recommended.rules,
      ...react.configs['jsx-runtime'].rules,
      ...reactHooks.configs.recommended.rules,
      'react/jsx-no-target-blank': 'off',
      'react-refresh/only-export-components': [
        'warn',
        { allowConstantExport: true },
      ],
    },
  },
]


================================================
FILE: ecom-frontend/index.html
================================================
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite + React</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.jsx"></script>
  </body>
</html>


================================================
FILE: ecom-frontend/package.json
================================================
{
  "name": "ecom-frontend",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "lint": "eslint .",
    "preview": "vite preview"
  },
  "dependencies": {
    "@emotion/react": "^11.14.0",
    "@emotion/styled": "^11.14.1",
    "@headlessui/react": "^2.2.9",
    "@mui/material": "^7.3.7",
    "@mui/x-data-grid": "^8.25.0",
    "@reduxjs/toolkit": "^2.11.2",
    "@stripe/react-stripe-js": "^5.4.1",
    "@stripe/stripe-js": "^8.6.3",
    "axios": "^1.13.2",
    "classnames": "^2.5.1",
    "react": "^19.2.3",
    "react-dom": "^19.2.3",
    "react-hook-form": "^7.71.1",
    "react-hot-toast": "^2.6.0",
    "react-icons": "^5.5.0",
    "react-loader-spinner": "^8.0.2",
    "react-redux": "^9.2.0",
    "react-router-dom": "^7.12.0",
    "swiper": "^12.0.3"
  },
  "devDependencies": {
    "@eslint/js": "^9.39.2",
    "@tailwindcss/postcss": "^4.1.18",
    "@types/react": "^19.2.9",
    "@types/react-dom": "^19.2.3",
    "@vitejs/plugin-react": "^5.1.2",
    "eslint": "^9.39.2",
    "eslint-plugin-react": "^7.37.5",
    "eslint-plugin-react-hooks": "^7.0.1",
    "eslint-plugin-react-refresh": "^0.4.26",
    "globals": "^17.0.0",
    "postcss": "^8.5.6",
    "tailwindcss": "^4.1.18",
    "vite": "^7.3.1"
  }
}


================================================
FILE: ecom-frontend/postcss.config.js
================================================
export default {
  plugins: {
    '@tailwindcss/postcss': {},
  },
}


================================================
FILE: ecom-frontend/src/App.css
================================================


================================================
FILE: ecom-frontend/src/App.jsx
================================================
import React, { useState } from 'react'
import './App.css'
import Products from './components/products/Products'
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'
import Home from './components/home/Home'
import Navbar from './components/shared/Navbar'
import About from './components/About'
import Contact from './components/Contact'
import { Toaster } from 'react-hot-toast'
import Cart from './components/cart/Cart'
import LogIn from './components/auth/LogIn'
import PrivateRoute from './components/PrivateRoute'
import Register from './components/auth/Register'
import Checkout from './components/checkout/Checkout'
import PaymentConfirmation from './components/checkout/PaymentConfirmation'
import AdminLayout from './components/admin/AdminLayout'
import Dashboard from './components/admin/dashboard/Dashboard'
import AdminProducts from './components/admin/products/AdminProducts'
import Sellers from './components/admin/sellers/Sellers'
import Category from './components/admin/categories/Category'
import Orders from './components/admin/orders/Orders'

function App() {
  return (
    <React.Fragment>
      <Router>
        <Navbar />
        <Routes>
          <Route path='/' element={ <Home />}/>
          <Route path='/products' element={ <Products />}/>
          <Route path='/about' element={ <About />}/>
          <Route path='/contact' element={ <Contact />}/>
          <Route path='/cart' element={ <Cart />}/>
        
          <Route path='/' element={<PrivateRoute />}>
            <Route path='/checkout' element={ <Checkout />}/>
            <Route path='/order-confirm' element={ <PaymentConfirmation />}/>
          </Route>

          <Route path='/' element={<PrivateRoute publicPage />}>
            <Route path='/login' element={ <LogIn />}/>
            <Route path='/register' element={ <Register />}/>
          </Route>

           <Route path='/' element={<PrivateRoute adminOnly />}>
            <Route path='/admin' element={ <AdminLayout />}>
              <Route path='' element={<Dashboard />} />
              <Route path='products' element={<AdminProducts />} />
              <Route path='sellers' element={<Sellers />} />
              <Route path='orders' element={<Orders />} />
              <Route path='categories' element={<Category />} />
            </Route>
          </Route>
        </Routes>
      </Router>
      <Toaster position='bottom-center'/>
    </React.Fragment>
  )
}

export default App


================================================
FILE: ecom-frontend/src/api/api.js
================================================
import axios from "axios";

const api = axios.create({
    baseURL: `${import.meta.env.VITE_BACK_END_URL}/api`,
    withCredentials: true,
});

export default api;

================================================
FILE: ecom-frontend/src/components/About.jsx
================================================
import ProductCard from "./shared/ProductCard";

const products = [
    {
        image: "https://embarkx.com/sample/placeholder.png",
        productName: "iPhone 13 Pro Max",
        description:
          "The iPhone 13 Pro Max offers exceptional performance with its A15 Bionic chip, stunning Super Retina XDR display, and advanced camera features for breathtaking photos.",
        specialPrice: 720,
        price: 780,
      },
      {
        image: "https://embarkx.com/sample/placeholder.png",
        productName: "Samsung Galaxy S21",
        description:
          "Experience the brilliance of the Samsung Galaxy S21 with its vibrant AMOLED display, powerful camera, and sleek design that fits perfectly in your hand.",
        specialPrice: 699,
        price: 799,
      },
      {
        image: "https://embarkx.com/sample/placeholder.png",
        productName: "Google Pixel 6",
        description:
          "The Google Pixel 6 boasts cutting-edge AI features, exceptional photo quality, and a stunning display, making it a perfect choice for Android enthusiasts.",
        price: 599,
        specialPrice: 400,
      }
];

const About = () => {
    return (
        <div className="max-w-7xl mx-auto px-4 py-8">
            <h1 className="text-slate-800 text-4xl font-bold text-center mb-12">
                About Us
            </h1>
           <div className="flex flex-col lg:flex-row justify-between items-center mb-12">
                <div className="w-full md:w-1/2 text-center md:text-left">
                    <p className="text-lg mb-4">
                        Welcome to our e-commerce store! We are dedicated to providing the
                        best products and services to our customers. Our mission is to offer
                        a seamless shopping experience while ensuring the highest quality of
                        our offerings.
                    </p>
                </div>

                <div className="w-full md:w-1/2 mb-6 md:mb-0">
                    <img
                        src="https://embarkx.com/sample/placeholder.png"
                        alt="About Us"
                        className="w-full h-auto rounded-lg shadow-lg transform transition-transform duration-300 hover:scale-105"></img>
                </div>
           </div>


           <div className="py-7 space-y-8">
            <h1 className="text-slate-800 text-4xl font-bold text-center">
                Our Products
            </h1>
            <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
               {products.map((product, index) => (
                <ProductCard 
                    key={index}
                    image={product.image}
                    productName={product.productName}
                    description={product.description}
                    specialPrice={product.specialPrice}
                    price={product.price}
                    about
                />
               ))
               }
                

            </div>
           </div>
        </div>
    );
}

export default About;

================================================
FILE: ecom-frontend/src/components/BackDrop.jsx
================================================
import React from 'react'

const BackDrop = ({ data }) => {
  return (
    <div
        className={`z-20 transition-all duration-200 opacity-50 w-screen h-screen bg-slate-300 fixed ${data ? "top-16" : "top-0"} left-0`}
    ></div>
  )
}

export default BackDrop

================================================
FILE: ecom-frontend/src/components/Contact.jsx
================================================
import { FaEnvelope, FaMapMarkedAlt, FaPhone } from "react-icons/fa";

const Contact = () => {
    return(
        <div
            className="flex flex-col items-center justify-center min-h-screen py-12 bg-cover bg-center"
            style={{backgroundImage: "url('')"}}>
            
            <div className="bg-white shadow-lg rounded-lg p-8 w-full max-w-lg">
                <h1 className="text-4xl font-bold text-center mb-6">Contact us</h1>
                <p className="text-gray-600 text-center mb-4">
                    We would love to hear from you! Please fill out the form below or contact us directly
                </p>

                <form className="space-y-4">
                    <div>
                        <label className="block text-sm font-medium text-gray-700">
                            Name
                        </label>
                        <input 
                            type="text"
                            required
                            className="mt-1 block w-full border border-gray-300 rounded-lg p-2 focus:outline-hidden focus:ring-2 focus: ring-blue-500"/>
                    </div>


                    <div>
                        <label className="block text-sm font-medium text-gray-700">
                            Email
                        </label>
                        <input 
                            type="email"
                            required
                            className="mt-1 block w-full border border-gray-300 rounded-lg p-2 focus:outline-hidden focus:ring-2 focus: ring-blue-500"/>
                    </div>

                    <div>
                        <label className="block text-sm font-medium text-gray-700">
                            Message
                        </label>
                        <textarea 
                            rows="4"
                            required
                            className="mt-1 block w-full border border-gray-300 rounded-lg p-2 focus:outline-hidden focus:ring-2 focus: ring-blue-500"/>
                    </div>

                    <button className="w-full bg-blue-500 text-white py-2 rounded-lg hover:bg-blue-600 transition duration-300">
                        Send Message
                    </button>
                </form>

                <div className="mt-8 text-center">
                    <h2 className="text-lg font-semibold">Contact Information</h2>
                    <div className="flex flex-col items-center space-y-2 mt-4">
                        <div className="flex items-center">
                            <FaPhone className="text-blue-500 mr-2"/>
                            <span className="text-gray-600">+4 8961 944 149</span>
                        </div>

                        <div className="flex items-center">
                            <FaEnvelope className="text-blue-500 mr-2"/>
                            <span className="text-gray-600">embarkxofficial@gmail.com</span>
                        </div>

                        <div className="flex items-center">
                            <FaMapMarkedAlt className="text-blue-500 mr-2"/>
                            <span className="text-gray-600">123 Main, Town, USA</span>
                        </div>
                    </div>
                </div>
            </div>
            
        </div>
    );
}

export default Contact;

================================================
FILE: ecom-frontend/src/components/PrivateRoute.jsx
================================================
import React from 'react'
import { useSelector } from 'react-redux'
import { Navigate, Outlet, useLocation } from 'react-router-dom';

const PrivateRoute = ({ publicPage = false, adminOnly = false }) => {
    const { user } = useSelector((state) => state.auth);
    const isAdmin = user && user?.roles?.includes("ROLE_ADMIN");
    const isSeller = user && user?.roles.includes("ROLE_SELLER");
    const location = useLocation();

    if (publicPage) {
        return user ? <Navigate to="/" /> : <Outlet />
    }

    if (adminOnly) {
        if (isSeller && !isAdmin) {
            const sellerAllowedPaths = ["/admin/orders", "/admin/products"];
            const sellerAllowed = sellerAllowedPaths.some(path => 
                location.pathname.startsWith(path)
            );
            if (!sellerAllowed) {
                return <Navigate to="/" replace />
            }
        }
    }

    if (!isAdmin && !isSeller) {
        return <Navigate to="/"/>
    }
    
    return user ? <Outlet /> : <Navigate to="/login" />;
}

export default PrivateRoute

================================================
FILE: ecom-frontend/src/components/UserMenu.jsx
================================================
import { Avatar, Button, Menu, MenuItem } from '@mui/material';
import React from 'react'
import { BiUser } from 'react-icons/bi';
import { FaShoppingCart, FaUserShield } from 'react-icons/fa';
import { IoExitOutline } from 'react-icons/io5';
import { useDispatch, useSelector } from 'react-redux';
import { Link, useNavigate } from 'react-router-dom';
import BackDrop from './BackDrop';
import { logOutUser } from '../store/actions';

const UserMenu = () => {
    const [anchorEl, setAnchorEl] = React.useState(null);
    const open = Boolean(anchorEl);
    const { user } = useSelector((state) => state.auth);
    const dispatch = useDispatch();
    const navigate = useNavigate();

    const isAdmin = user && user?.roles.includes("ROLE_ADMIN");
    const isSeller = user && user?.roles.includes("ROLE_SELLER");

    const handleClick = (event) => {
      setAnchorEl(event.currentTarget);
    };
    const handleClose = () => {
      setAnchorEl(null);
    };

    const logOutHandler = () => {
        dispatch(logOutUser(navigate));
      };
  
    return (
      <div className='relative z-30'>
        <div
        className='sm:border sm:border-slate-400 flex flex-row items-center gap-1 rounded-full cursor-pointer hover:shadow-md transition text-slate-700'
          onClick={handleClick}
        >
          <Avatar alt='Menu' src=''/>
        </div>
        <Menu
          sx={{ width:"400px" }}
          id="basic-menu"
          anchorEl={anchorEl}
          open={open}
          onClose={handleClose}
          MenuListProps={{
            'aria-labelledby': 'basic-button',
            sx: {width: 160},
          }}
        >

          <Link to="/profile">
            <MenuItem className="flex gap-2" 
                onClick={handleClose}>
                    <BiUser className='text-xl'/>
                    <span className='font-bold text-[16px] mt-1'>
                        {user?.username}
                    </span>
            </MenuItem>
          </Link>

          <Link to="/profile/orders">
            <MenuItem className="flex gap-2" 
                onClick={handleClose}>
                    <FaShoppingCart className='text-xl'/>
                    <span className='font-semibold'>
                        Order
                    </span>
            </MenuItem>
          </Link>

          { (isAdmin || isSeller) && (
          <Link to={isAdmin ? "/admin" : "/admin/orders"}>
            <MenuItem className="flex gap-2" 
                onClick={handleClose}>
                    <FaUserShield className='text-xl'/>
                    <span className='font-semibold'>
                        {isAdmin ? "Admin Panel" : "Seller Panel"}
                    </span>
            </MenuItem>
          </Link> )}

            <MenuItem className="flex gap-2" 
                onClick={logOutHandler}>
                    <div className='font-semibold w-full flex gap-2 items-center bg-button-gradient px-4 py-1 text-white rounded-xs'>
                    <IoExitOutline className='text-xl'/>
                    <span className='font-bold text-[16px] mt-1'>
                        LogOut
                    </span>
                    </div>
            </MenuItem>

        </Menu>

        {open && <BackDrop />}
      </div>
    );
}

export default UserMenu

================================================
FILE: ecom-frontend/src/components/admin/AdminLayout.jsx
================================================
import React, { useState } from 'react'
import Sidebar from '../shared/Sidebar'
import { Outlet } from 'react-router-dom'
import { Description, Dialog, DialogBackdrop, DialogPanel, DialogTitle, TransitionChild } from '@headlessui/react';
import { RxCross1 } from 'react-icons/rx';
import { FaBars } from 'react-icons/fa';

const AdminLayout = () => {
    let [sidebarOpen, setSidebarOpen] = useState(false);
  return (
    <div>
        <Dialog 
            open={sidebarOpen} 
            onClose={() => setSidebarOpen(false)} 
            className="relative z-50 xl:hidden">
        
        <DialogBackdrop 
        transition
        className="fixed inset-0 bg-gray-900/80 transition-opacity duration-300 ease-linear data-closed:opacity-0" />

        <div className="fixed inset-0 flex">
          <DialogPanel 
            transition
            className="relative mr-16 flex w-full max-w-xs flex-1 transform transition duration-300 ease-in-out data-closed:-translate-x-full">
                
           <TransitionChild>
            <div className='absolute left-full top-0 flex w-16 justify-center pt-5 duration-300 ease-in-out data-closed:opacity-0'>
                <button type='button'
                 onClick={() => setSidebarOpen(false)}
                 className='-m-2.5 p-2.5'>
                    <span className='sr-only'> Close Sidebar</span>
                    <RxCross1 className='text-white text-2xl'/>
                </button>
            </div>
           </TransitionChild>
           <Sidebar />
          </DialogPanel>
        </div>
      </Dialog>




        <div className='hidden xl:fixed xl:inset-y-0 xl:z-50 xl:flex xl:w-72 xl:flex-col'>
            <Sidebar />
        </div>

        <div className='xl:pl-72'>
            <button
                type='button'
                onClick={() => setSidebarOpen(true)}
                className='-m-2.5 text-gray-700 xl:hidden p-4'>
                    <span className='sr-only'> Open Sidebar</span>
                    <FaBars className='text-slate-800 text-2xl'/>
            </button>

            <main className=''>
                <div className='p-4 sm:p-6 xl:p-8'>
                    <Outlet />
                </div>
                
            </main>
        </div>
    </div>
  )
}

export default AdminLayout

================================================
FILE: ecom-frontend/src/components/admin/categories/AddCategoryForm.jsx
================================================
import React, { useEffect } from "react";
import { useForm } from "react-hook-form";
import { useDispatch } from "react-redux";
import toast from "react-hot-toast";

import {
  createCategoryDashboardAction,
  updateCategoryDashboardAction,
} from "../../../store/actions";
import InputField from "../../shared/InputField";

const AddCategoryForm = ({ setOpen, open, category, update = false }) => {
  const dispatch = useDispatch();

  const {
    register,
    handleSubmit,
    reset,
    setValue,
    formState: { errors },
  } = useForm({
    mode: "onTouched",
  });

  const addNewCategoryHandler = (data) => {
    if (!update) {
      //dispatch createCategoryDashboardAction
      dispatch(createCategoryDashboardAction(data, setOpen, reset, toast));
    } else {
      //dispatch updateCategoryDashboardAction
      dispatch(
        updateCategoryDashboardAction(data, setOpen, category.id, reset, toast)
      );
    }
  };
  useEffect(() => {
    if (update && category) {
      setValue("categoryName", category?.categoryName);
    }
  }, [update, category]);

  return (
    <div className="py-5 relative h-full ">
      <form
        className="space-y-4 "
        onSubmit={handleSubmit(addNewCategoryHandler)}
      >
        <div className="flex md:flex-row flex-col gap-4 w-full ">
          <InputField
            label="Category Name"
            required
            id="categoryName"
            type="text"
            message="This field is required*"
            placeholder="Category Name"
            register={register}
            errors={errors}
          />
        </div>

        <div className="flex  w-full justify-between items-center absolute bottom-14">
          <button
            disabled={open}
            onClick={() => setOpen(false)}
            type="button"
            className={`border border-borderColor rounded-[5px] font-metropolis  text-textColor py-[10px] px-4 text-sm font-medium`}
          >
            Cancel
          </button>
          <button
            disabled={open}
            type="submit"
            className={`font-metropolis rounded-[5px]  bg-custom-blue hover:bg-blue-800 text-white  py-[10px] px-4 text-sm font-medium`}
          >
            {open ? "Loading.." : update ? "Update" : "Save"}
          </button>
        </div>
      </form>
    </div>
  );
};

export default AddCategoryForm;

================================================
FILE: ecom-frontend/src/components/admin/categories/Category.jsx
================================================
import React, { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { useLocation, useNavigate, useSearchParams } from "react-router-dom";
import { DataGrid } from "@mui/x-data-grid";
import { FaFolderOpen, FaThList } from "react-icons/fa";
import toast from "react-hot-toast";

import Modal from "../../shared/Modal";
import AddCategoryForm from "./AddCategoryForm";
import Loader from "../../shared/Loader";
import { DeleteModal } from "../../../components/shared/DeleteModal";
import useCategoryFilter from "../../../hooks/useCategoryFilter";
import ErrorPage from "../../shared/ErrorPage";
import { deleteCategoryDashboardAction } from "../../../store/actions";
import { categoryTableColumns } from "../../helper/tableColumn";

const Category = () => {
  const [searchParams] = useSearchParams();
  const pathname = useLocation().pathname;
  const params = new URLSearchParams(searchParams);
  const navigate = useNavigate();

  const dispatch = useDispatch();
  const [openModal, setOpenModal] = useState(false);
  const [openUpdateModal, setOpenUpdateModal] = useState(false);
  const [openDeleteModal, setOpenDeleteModal] = useState(false);
  const [selectedCategory, setSelectedCategory] = useState(null);

  const { categoryLoader, errorMessage } = useSelector((state) => state.errors);
  const { categories, pagination } = useSelector((state) => state.products);
  const [currentPage, setCurrentPage] = useState(
    pagination?.pageNumber + 1 || 1
  );

  // Calling the `useCategoryFilter` custom hook to handle category fetching and pagination based on the current URL parameters.
  useCategoryFilter();

  const tableRecords = categories?.map((item) => ({
    id: item.categoryId,
    categoryName: item.categoryName,
    version: item.version,
  }));

  const handleEdit = (category) => {
    setOpenUpdateModal(true);
    setSelectedCategory(category);
  };

  const handleDelete = (category) => {
    setSelectedCategory(category);
    setOpenDeleteModal(true);
  };

  const onDeleteHandler = () => {
    dispatch(
      deleteCategoryDashboardAction(setOpenDeleteModal, selectedCategory?.id, toast)
    );
  };

  const handlePaginationChange = (paginationModel) => {
    const page = paginationModel.page + 1; // Adjust to 1-based index
    setCurrentPage(page);

    params.set("page", page.toString());
    navigate(`${pathname}?${params}`);
  };

  const emptyCategories = !categories || categories?.length === 0;

  if (errorMessage) return <ErrorPage message={errorMessage} />;

  return (
    <div>
      <div className="pt-6 pb-10 flex justify-end">
        <button
          onClick={() => setOpenModal(true)}
          className="bg-custom-blue hover:bg-blue-800 text-white font-semibold py-2 px-4 flex items-center gap-2 rounded-md shadow-md transition-colors hover:text-slate-300 duration-300"
        >
          <FaThList className="text-xl" />
          Add Category
        </button>
      </div>
      {!emptyCategories && (
        <h1 className="text-slate-800 text-3xl text-center font-bold pb-6 uppercase">
          All Categories
        </h1>
      )}

      {categoryLoader ? (
        <Loader />
      ) : (
        <>
          {emptyCategories ? (
            <div className="flex flex-col items-center justify-center text-gray-600 py-10">
              <FaFolderOpen size={50} className="mb-3" />
              <h2 className="text-2xl font-semibold">
                No Categories Created Yet
              </h2>
            </div>
          ) : (
            <div className="max-w-fit mx-auto">
              <DataGrid
                className="w-full"
                rows={tableRecords}
                columns={categoryTableColumns(handleEdit, handleDelete)}
                paginationMode="server"
                rowCount={pagination?.totalElements || 0}
                initialState={{
                  pagination: {
                    paginationModel: {
                      pageSize: pagination?.pageSize || 10,
                      page: currentPage - 1,
                    },
                  },
                }}
                onPaginationModelChange={handlePaginationChange}
                disableRowSelectionOnClick
                disableColumnResize
                pageSizeOptions={[pagination?.pageSize || 10]}
                pagination
                paginationOptions={{
                  showFirstButton: true,
                  showLastButton: true,
                  hideNextButton: currentPage === pagination?.totalPages,
                }}
              />
            </div>
          )}
        </>
      )}

      <Modal
        open={openUpdateModal || openModal}
        setOpen={openUpdateModal ? setOpenUpdateModal : setOpenModal}
        title={openUpdateModal ? "Update Category" : "Add Category"}
      >
        <AddCategoryForm
          setOpen={openUpdateModal ? setOpenUpdateModal : setOpenModal}
          open={categoryLoader}
          category={selectedCategory}
          update={openUpdateModal}
        />
      </Modal>

      <DeleteModal
        open={openDeleteModal}
        loader={categoryLoader}
        setOpen={setOpenDeleteModal}
        title="Are you want to delete this category"
        onDeleteHandler={onDeleteHandler}
      />
    </div>
  );
};

export default Category;

================================================
FILE: ecom-frontend/src/components/admin/dashboard/Dashboard.jsx
================================================
import React, { useEffect } from 'react'
import DashboardOverview from './DashboardOverview'
import { FaBoxOpen, FaDollarSign, FaShoppingCart } from 'react-icons/fa';
import { MdAttachMoney } from 'react-icons/md';
import { useDispatch, useSelector } from 'react-redux';
import { analyticsAction } from '../../../store/actions';
import Loader from '../../shared/Loader';
import ErrorPage from '../../shared/ErrorPage';

const Dashboard = () => {
  const dispatch = useDispatch();
  const {isLoading, errorMessage} = useSelector((state) => state.errors);
  const { 
    analytics: { productCount, totalRevenue, totalOrders },
   } = useSelector((state) => state.admin);

   useEffect(() => {
    dispatch(analyticsAction());
   }, [dispatch]);

   if (isLoading) {
    return <Loader />
   }

   if (errorMessage) {
    return <ErrorPage message={errorMessage}/>;
   }
  
  return (
    <div>
      <div className='flex md:flex-row mt-8 flex-col lg:justify-between 
          border border-slate-400 rounded-lg bg-linear-to-r
           from-blue-50 to-blue-100 shadow-lg'>
            <DashboardOverview 
              title="Total Products"
              amount={productCount}
              Icon={FaBoxOpen}
            />

            <DashboardOverview 
              title="Total Orders"
              amount={totalOrders}
              Icon={FaShoppingCart}
            />

            <DashboardOverview 
              title="Total Revenue"
              amount={totalRevenue}
              Icon={FaDollarSign}
              revenue
            />
      </div>
    </div>
  )
}

export default Dashboard

================================================
FILE: ecom-frontend/src/components/admin/dashboard/DashboardOverview.jsx
================================================
import { Icon } from '@mui/material';
import React from 'react'
import { formatRevenue } from '../../../utils/formatPrice';

const DashboardOverview = ({ title, amount, Icon, revenue = false }) => {
  
  const convertedAmount = revenue ? Number(amount).toFixed(2) : amount;

    return (
    <>
    <div className='xl:w-80 w-full space-y-4 text-center md:text-start px-5 py-8'>
        <div className='flex md:justify-start justify-center items-center gap-2'>
            <h3 className='uppercase text-2xl text-slate-700 font-semibold'>{title}</h3>
            <Icon className='text-slate-800 text-2xl' />
        </div>

        <h1 className='font-bold text-slate-800 text-3xl'>
            {revenue ? "$" : null}
            {revenue ? formatRevenue(convertedAmount) : convertedAmount}
        </h1>
    </div>
    </>
  )
}

export default DashboardOverview

================================================
FILE: ecom-frontend/src/components/admin/orders/OrderTable.jsx
================================================
import { DataGrid } from '@mui/x-data-grid'
import { adminOrderTableColumn } from '../../helper/tableColumn';
import { useState } from 'react';
import { useLocation, useNavigate, useSearchParams } from 'react-router-dom';
import Modal from '../../shared/Modal';
import UpdateOrderForm from './UpdateOrderForm';

const OrderTable = ({ adminOrder, pagination}) => {
  const [updateOpenModal, setUpdateOpenModal] = useState(false);
  const [selectedItem, setSelectedItem] = useState("");
  const [loader, setLoader] = useState(false);
  const navigate = useNavigate();
  const [currentPage, setCurrentPage] = useState(
    pagination?.pageNumber + 1 || 1
  );

  const [searchParams] = useSearchParams();
  const params = new URLSearchParams(searchParams);
  const pathname = useLocation().pathname;

const tableRecords = adminOrder?.map((item) => {
  return {
    id: item.orderId,
    email: item.email,
    totalAmount: item.totalAmount,
    status: item.orderStatus,
    date: item.orderDate,
  }
});

const handlePaginationChange = (paginationModel) => {
  const page = paginationModel.page + 1;
  setCurrentPage(page);
  params.set("page", page.toString());
  navigate(`${pathname}?${params}`)
}

const handleEdit = (order) => {
  setSelectedItem(order);
  setUpdateOpenModal(true);
}

  return (
    <div>
      <h1 className='text-slate-800 text-3xl text-center font-bold pb-6 uppercase'>
        All Orders
      </h1>

      <div>
         <DataGrid
         className='w-full'
            rows={tableRecords}
            columns={adminOrderTableColumn(handleEdit)}
            paginationMode='server'
            rowCount={pagination?.totalElements || 0}
            initialState={{
              pagination: {
                paginationModel: {
                  pageSize: pagination?.pageSize || 10,
                  page: currentPage - 1,
                },
              },
            }}
            onPaginationModelChange={handlePaginationChange}
            disableRowSelectionOnClick
            disableColumnResize
            pageSizeOptions={[pagination?.pageSize || 10]}
            pagination
            paginationOptions={{
              showFirstButton: true,
              showLastButton: true,
              hideNextButton: currentPage === pagination?.totalPages,
            }}
          />
      </div>

      <Modal
        open={updateOpenModal}
        setOpen={setUpdateOpenModal}
        title='Update Order Status'>
          <UpdateOrderForm
            setOpen={setUpdateOpenModal}
            open={updateOpenModal}
            loader={loader}
            setLoader={setLoader}
            selectedId={selectedItem.id}
            selectedItem={selectedItem}
            />
      </Modal>
    </div>
  )
}

export default OrderTable

================================================
FILE: ecom-frontend/src/components/admin/orders/Orders.jsx
================================================
import React from 'react'
import { FaShoppingCart } from 'react-icons/fa';
import OrderTable from './OrderTable';
import { useSelector } from 'react-redux';
import useOrderFilter from '../../../hooks/useOrderFilter';

const Orders = () => {
  // const adminOrder = [ { "orderId": 17, "email": "user1@example.com", "orderItems": [ { "orderItemId": 7, "product": { "productId": 153, "productName": "Running Shoes", "image": "0abca637-0c4e-4054-ae03-bdfc51cb3396.png", "description": "Comfortable and lightweight running shoes for daily fitness", "quantity": 49, "price": 80, "discount": 10, "specialPrice": 72 }, "quantity": 1, "discount": 10, "orderedProductPrice": 72 } ], "orderDate": "2025-02-15", "payment": { "paymentId": 17, "paymentMethod": "online", "pgPaymentId": "pi_3QsfCYLK9jOar8Y81NsK7PXG", "pgStatus": "succeeded", "pgResponseMessage": "Payment successful", "pgName": "Stripe" }, "totalAmount": 72, "orderStatus": "Order Accepted !", "addressId": 1 }, { "orderId": 18, "email": "user1@example.com", "orderItems": [ { "orderItemId": 8, "product": { "productId": 102, "productName": "Blender", "image": "39356dd0-6682-4821-adc8-b198ee85b358.png", "description": "High-performance Blender having powerful features for modern family", "quantity": 28, "price": 500, "discount": 19, "specialPrice": 405 }, "quantity": 1, "discount": 19, "orderedProductPrice": 405 } ], "orderDate": "2025-07-18", "payment": { "paymentId": 18, "paymentMethod": "online", "pgPaymentId": "pi_3Rm6zYLK9jOar8Y81iyMdnMg", "pgStatus": "succeeded", "pgResponseMessage": "Payment successful", "pgName": "Stripe" }, "totalAmount": 405, "orderStatus": "Order Accepted !", "addressId": 5 } ];
  // const pagination = { pageNumber: 0, pageSize: 50, totalElements: 11, totalPages: 1, lastPage: true };
  
  const {adminOrder, pagination} = useSelector((state) => state.order);

  useOrderFilter();

  const emptyOrder = !adminOrder || adminOrder?.length ===0;
  return (
    <div className='pb-6 pt-20'>
        {emptyOrder ? (
            <div className='flex flex-col items-center justify-center text-gray-600 py-10'>
                <FaShoppingCart size={50} className='mb-3'/>
                <h2 className='text-2xl font-semibold'>No Orders Placed Yet</h2>
            </div>
        ) : (
           <OrderTable adminOrder={adminOrder} pagination={pagination}/>
        )}
    </div>
  )
}

export default Orders

================================================
FILE: ecom-frontend/src/components/admin/orders/UpdateOrderForm.jsx
================================================
import { Button, FormControl, FormHelperText, InputLabel, MenuItem, Select } from '@mui/material'
import React, { useState } from 'react'
import { FaSpinner } from 'react-icons/fa';
import Spinners from '../../shared/Spinners';
import { useDispatch, useSelector } from 'react-redux';
import { updateOrderStatusFromDashboard } from '../../../store/actions';
import toast from 'react-hot-toast';

const ORDER_STATUSES = [
    "Pending",
    "Processing",
    "Shipped",
    "Delivered",
    "Cancelled",
    "Accepted",
];

const UpdateOrderForm = ({ setOpen, selectedId, selectedItem, loader, setLoader}) => {
    const [orderStatus, setOrderStatus] = useState(selectedItem?.status || 'Accepted');
    const [error, setError] = useState("");
    const dispatch = useDispatch();

    const { user } = useSelector((state) => state.auth);
    const isAdmin = user && user?.roles?.includes("ROLE_ADMIN");

    const updateOrderStatus = (e) => {
        e.preventDefault();
        if (!orderStatus) {
            setError("Order status is required");
            return;
        }
        dispatch(updateOrderStatusFromDashboard(
            selectedId,
            orderStatus,
            toast,
            setLoader,
            isAdmin
        ));
    };

  return (
    <div className='py-5 relative h-full'>
        <form className='space-y-4' onSubmit={updateOrderStatus}>
            <FormControl fullWidth variant='outlined' error={!!error}>
                <InputLabel id="order-status-label">Order Status</InputLabel>
                <Select
                    labelId='order-status-label'
                    label='Order Status'
                    value={orderStatus}
                    onChange={(e) => {
                        setOrderStatus(e.target.value);
                        setError("");
                    }}>
                    
                    {
                        ORDER_STATUSES.map((status) => (
                            <MenuItem key={status} value={status}>
                                {status}
                            </MenuItem>
                        ))
                    }

                </Select>

                {error && <FormHelperText>{error}</FormHelperText>}
            </FormControl>

            <div className='flex w-full justify-between items-center absolute bottom-14'>
                <Button disabled={loader}
                        onClick={() => setOpen(false)}
                        variant='outlined'
                        className='text-white py-[10px] px-4 text-sm font-medium'>
                    Cancel
                </Button>

                <Button
                    disabled={loader}
                    type='submit'
                    variant='contained'
                    color='primary'
                    className='bg-custom-blue text-white  py-[10px] px-4 text-sm font-medium'>
                    {loader ? (
                        <div className='flex gap-2 items-center'>
                            <Spinners /> Loading...
                        </div>
                    ) : (
                        "Update"
                    )}
                </Button>
            </div>
        </form>

    </div>
  )
}

export default UpdateOrderForm

================================================
FILE: ecom-frontend/src/components/admin/products/AddProductForm.jsx
================================================
import React, { useEffect, useState } from 'react'
import { useForm } from 'react-hook-form'
import InputField from '../../shared/InputField';
import { Button } from '@mui/material';
import { useDispatch, useSelector } from 'react-redux';
import { addNewProductFromDashboard, fetchCategories, updateProductFromDashboard } from '../../../store/actions';
import toast from 'react-hot-toast';
import Spinners from '../../shared/Spinners';
import SelectTextField from '../../shared/SelectTextField';
import Skeleton from '../../shared/Skeleton';
import ErrorPage from '../../shared/ErrorPage';

const AddProductForm = ({ setOpen, product, update=false}) => {
const [loader, setLoader] = useState(false);
const [selectedCategory, setSelectedCategory] = useState();
const { categories } = useSelector((state) => state.products);
const { categoryLoader, errorMessage } = useSelector((state) => state.errors);
const { user } = useSelector((state) => state.auth);
const isAdmin = user && user?.roles?.includes("ROLE_ADMIN");

const dispatch = useDispatch();
    const {
        register,
        handleSubmit,
        reset,
        setValue,
        formState: { errors }
    } = useForm({
        mode: "onTouched"
    });

    const saveProductHandler = (data) => {
        if(!update) {
            // create new product logic
            const sendData = {
                ...data,
                categoryId: selectedCategory.categoryId,
            };
            dispatch(addNewProductFromDashboard(
                sendData, toast, reset, setLoader, setOpen, isAdmin
            ));
        } else {
            const sendData = {
                ...data,
                id: product.id,
            };
            dispatch(updateProductFromDashboard(sendData, toast, reset, setLoader, setOpen, isAdmin));
        }
    };


    useEffect(() => {
        if (update && product) {
            setValue("productName", product?.productName);
            setValue("price", product?.price);
            setValue("quantity", product?.quantity);
            setValue("discount", product?.discount);
            setValue("specialPrice", product?.specialPrice);
            setValue("description", product?.description);
        }
    }, [update, product]);


    useEffect(() => {
        if (!update) {
            dispatch(fetchCategories());
        }
    }, [dispatch, update]);

    useEffect(() => {
        if (!categoryLoader && categories) {
            setSelectedCategory(categories[0]);
        }
    }, [categories, categoryLoader]);

    if (categoryLoader) return <Skeleton />
    if (errorMessage) return <ErrorPage message={errorMessage} />

  return (
    <div className='py-5 relative h-full'>
        <form className='space-y-4'
            onSubmit={handleSubmit(saveProductHandler)}>
            <div className='flex md:flex-row flex-col gap-4 w-full'>
                <InputField 
                    label="Product Name"
                    required
                    id="productName"
                    type="text"
                    message="This field is required*"
                    register={register}
                    placeholder="Product Name"
                    errors={errors}
                    />

                {!update && (
                    <SelectTextField
                        label="Select Categories"
                        select={selectedCategory}
                        setSelect={setSelectedCategory}
                        lists={categories}
                    />
                )}
            </div>

            <div className='flex md:flex-row flex-col gap-4 w-full'>
                <InputField 
                    label="Price"
                    required
                    id="price"
                    type="number"
                    message="This field is required*"
                    placeholder="Product Price"
                    register={register}
                    errors={errors}
                    />

                    <InputField 
                    label="Quantity"
                    required
                    id="quantity"
                    type="number"
                    message="This field is required*"
                    register={register}
                    placeholder="Product Quantity"
                    errors={errors}
                    />
            </div>
        <div className="flex md:flex-row flex-col gap-4 w-full">
          <InputField
            label="Discount"
            id="discount"
            type="number"
            message="This field is required*"
            placeholder="Product Discount"
            register={register}
            errors={errors}
          />
          <InputField
            label="Special Price"
            id="specialPrice"
            type="number"
            message="This field is required*"
            placeholder="Product Discount"
            register={register}
            errors={errors}
          />
        </div>

        <div className="flex flex-col gap-2 w-full">
            <label htmlFor='desc'
              className='font-semibold text-sm text-slate-800'>
                Description
            </label>

            <textarea
                rows={5}
                placeholder="Add product description...."
                className={`px-4 py-2 w-full border outline-hidden bg-transparent text-slate-800 rounded-md ${
                    errors["description"]?.message ? "border-red-500" : "border-slate-700" 
                }`}
                maxLength={255}
                {...register("description", {
                    required: {value: true, message:"Description is required"},
                })}
                />

                {errors["description"]?.message && (
                    <p className="text-sm font-semibold text-red-600 mt-0">
                        {errors["description"]?.message}
                    </p>
                )}
        </div>

        <div className='flex w-full justify-between items-center absolute bottom-14'>
            <Button disabled={loader}
                    onClick={() => setOpen(false)}
                    variant='outlined'
                    className='text-white py-[10px] px-4 text-sm font-medium'>
                Cancel
            </Button>

            <Button
                disabled={loader}
                type='submit'
                variant='contained'
                color='primary'
                className='bg-custom-blue text-white  py-[10px] px-4 text-sm font-medium'>
                {loader ? (
                    <div className='flex gap-2 items-center'>
                        <Spinners /> Loading...
                    </div>
                ) : (
                    "Save"
                )}
            </Button>
        </div>
        </form>
    </div>
  )
}

export default AddProductForm

================================================
FILE: ecom-frontend/src/components/admin/products/AdminProducts.jsx
================================================
import React, { useState } from 'react'
import { MdAddShoppingCart } from 'react-icons/md';
import { useDispatch, useSelector } from 'react-redux';
import Loader from '../../shared/Loader';
import { FaBoxOpen } from 'react-icons/fa';
import { DataGrid } from '@mui/x-data-grid';
import { adminProductTableColumn } from '../../helper/tableColumn';
import { useDashboardProductFilter } from '../../../hooks/useProductFilter';
import Modal from '../../shared/Modal';
import AddProductForm from './AddProductForm';
import DeleteModal from '../../shared/DeleteModal';
import { deleteProduct } from '../../../store/actions';
import toast from 'react-hot-toast';
import ImageUploadForm from './ImageUploadForm';
import ProductViewModal from '../../shared/ProductViewModal';
import { useLocation, useNavigate, useSearchParams } from 'react-router-dom';

const AdminProducts = () => {
  // const products = [{ "productId": 52, "productName": "iPad Pro", "image": "http://localhost:8080/images/7a7b38c4-2342-4d10-89e9-2c5b3c4fdb44.png", "description": "High-performance Tablet with a 4K display and powerful camera", "quantity": 30, "price": 1800.0, "discount": 43.0, "specialPrice": 1026.0 }, { "productId": 2, "productName": "iPhone 16 Pro Max", "image": "http://localhost:8080/images/22185fd1-024a-4708-9a10-832b8a50bfde.png", "description": "High-performance phone with a 4K display and powerful camera", "quantity": 19, "price": 1400.0, "discount": 23.0, "specialPrice": 1078.0 }];
  // const pagination = { pageNumber: 0, pageSize: 50, totalElements: 11, totalPages: 1, lastPage: true };
  
  const {products, pagination} = useSelector((state) => state.products);
  const { isLoading, errorMessage } = useSelector((state) => state.errors);
  const [currentPage, setCurrentPage] = useState(
      pagination?.pageNumber + 1 || 1
    );

  const dispatch = useDispatch();
  
  const [selectedProduct, setSelectedProduct] = useState('');
  const [openUpdateModal, setOpenUpdateModal] = useState(false);
  const [openAddModal, setOpenAddModal] = useState(false);
  const [openDeleteModal, setOpenDeleteModal] = useState(false);
  const [openProductViewModal, setOpenProductViewModal] = useState(false);
  const [openImageUploadModal, setOpenImageUploadModal] = useState(false);

  const [loader, setLoader] = useState(false);

  const navigate = useNavigate();
  const [searchParams] = useSearchParams();
  const params = new URLSearchParams(searchParams);
  const pathname = useLocation().pathname;

  const { user } = useSelector((state) => state.auth);
  const isAdmin = user && user?.roles?.includes("ROLE_ADMIN");

  useDashboardProductFilter();

  const tableRecords = products?.map((item) => {
  return {
    id: item.productId,
    productName: item.productName,
    description: item.description,
    discount: item.discount,
    image: item.image,
    price: item.price,
    quantity: item.quantity,
    specialPrice: item.specialPrice,
  }
});

const handleEdit = (product) => {
  setSelectedProduct(product);
  setOpenUpdateModal(true);
};

const handleDelete = (product) => {
  setSelectedProduct(product);
  setOpenDeleteModal(true);
};

const handleImageUpload = (product) => {
  setSelectedProduct(product);
  setOpenImageUploadModal(true);
};

const handleProductView = (product) => {
  setSelectedProduct(product);
  setOpenProductViewModal(true);
};


const handlePaginationChange = (paginationModel) => {
  const page = paginationModel.page + 1;
  setCurrentPage(page);
  params.set("page", page.toString());
  navigate(`${pathname}?${params}`)
};


const onDeleteHandler = () => {
  dispatch(deleteProduct(setLoader, selectedProduct?.id, toast, setOpenDeleteModal, isAdmin));
};

  const emptyProduct = !products || products?.length ===0;
  return (
    <div>
      <div className='pt-6 pb-10 flex justify-end'>
        <button
          onClick={() => setOpenAddModal(true)}
          className='bg-custom-blue hover:bg-blue-800 text-white font-semibold py-2 px-4 flex items-center gap-2 rounded-md shadow-md transition-colors hover:text-slate-300 duration-300'>
          <MdAddShoppingCart className='text-xl' />
          Add Product
        </button>
      </div>


    {!emptyProduct && (
      <h1 className='text-slate-800 text-3xl text-center font-bold pb-6 uppercase'>
        All Products</h1>
    )}
    {isLoading ? (
      <Loader />
    ) : (
      <>
      {emptyProduct ? (
        <div className='flex flex-col items-center justify-center text-gray-600 py-10'>
          <FaBoxOpen size={50} className='mb-3'/>
          <h2 className='text-2xl font-semibold'>
            No products created yet  
          </h2>
        </div>
      ) : (
        <div className='max-w-full'>
          <DataGrid
            className='w-full'
            rows={tableRecords}
            columns={adminProductTableColumn(
              handleEdit,
              handleDelete,
              handleImageUpload,
              handleProductView)}
            paginationMode='server'
            rowCount={pagination?.totalElements || 0}
            initialState={{
              pagination: {
                paginationModel: {
                  pageSize: pagination?.pageSize || 10,
                  page: currentPage - 1,
                },
              },
            }}
            onPaginationModelChange={handlePaginationChange}
            disableRowSelectionOnClick
            disableColumnResize
            pageSizeOptions={[pagination?.pageSize || 10]}
            pagination
            paginationOptions={{
              showFirstButton: true,
              showLastButton: true,
              hideNextButton: currentPage === pagination?.totalPages,
            }}
            />
        </div>
      )}
      </>
    )}

    <Modal
      open={openUpdateModal || openAddModal}
      setOpen={openUpdateModal ? setOpenUpdateModal : setOpenAddModal}
      title={openUpdateModal ? "Update Product" : "Add Product"}>
        <AddProductForm 
          setOpen={openUpdateModal ? setOpenUpdateModal : setOpenAddModal}
          product={selectedProduct}
          update={openUpdateModal}
          />
    </Modal>


    <Modal
      open={openImageUploadModal}
      setOpen={setOpenImageUploadModal}
      title="Add Product Image">
        <ImageUploadForm 
          setOpen={setOpenImageUploadModal}
          product={selectedProduct}
          />
    </Modal>


    <DeleteModal
      open={openDeleteModal}
      setOpen={setOpenDeleteModal}
      loader={loader}
      title="Delete Product"
      onDeleteHandler={onDeleteHandler} />

      <ProductViewModal 
        open={openProductViewModal}
        setOpen={setOpenProductViewModal}
        product={selectedProduct}
      />
    </div>
  )
}

export default AdminProducts

================================================
FILE: ecom-frontend/src/components/admin/products/ImageUploadForm.jsx
================================================
import React, { useRef, useState } from 'react'
import { FaCloudUploadAlt } from 'react-icons/fa'
import Spinners from '../../shared/Spinners';
import { Button } from '@mui/material';
import toast from 'react-hot-toast';
import { useDispatch, useSelector } from 'react-redux';
import { updateProductImageFromDashboard } from '../../../store/actions';

const ImageUploadForm = ({ setOpen, product }) => {
    const [loader, setLoader] = useState(false);
    const fileInputRef = useRef();
    const [previewImage, setPreviewImage] = useState(null);
    const [selectedFile, setSelectedFile] = useState(null);
    const dispatch = useDispatch();

    const { user } = useSelector((state) => state.auth);
    const isAdmin = user && user?.roles?.includes("ROLE_ADMIN");

    const onHandleImageChange = (e) => {
        const file = e.target.files[0];
        if (file && ["image/jpeg", "image/jpg", "image/png"].includes(file.type)) {
            const reader = new FileReader();
            reader.onloadend = () => {
                setPreviewImage(reader.result);
            };
            reader.readAsDataURL(file);
            setSelectedFile(file);
        } else {
            toast.error("Please select a valid image file (.jpeg, .jpg, .png)");
            setPreviewImage(null);
            setSelectedFile(null);
        }

    };

    const addNewImageHandler = async (event) => {
        event.preventDefault();
        if (!selectedFile) {
            toast.error("Please select an image before saving.");
            return;
        }

        const formData = new FormData();
        formData.append("image", selectedFile);

        dispatch(updateProductImageFromDashboard(formData, product.id, toast, setLoader, setOpen, isAdmin));
    };

    const handleClearImage = () => {
        setPreviewImage(null);
        setSelectedFile(null);
        fileInputRef.current.value = null;
    };

  return (
    <div className='py-5 relative h-full'>
        <form className='space-y-4' onSubmit={addNewImageHandler}>
            <div className='flex flex-col gap-4 w-full'>
                <label className='flex items-center gap-2 cursor-pointer text-custom-blue border border-dashed border-custom-blue rounded-md p-3 w-full justify-center'>
                    <FaCloudUploadAlt size={24}/>
                    <span>Upload Product Image</span>
                    <input 
                        type='file'
                        ref={fileInputRef}
                        onChange={onHandleImageChange}
                        className='hidden'
                        accept='.jpeg, .jpg, .png'/>
                </label>

                {previewImage && (
                    <div>
                        <img
                            src={previewImage}
                            alt='Image Preview'
                            className='h-60 rounded-md mb-2'/>

                        <button
                            type='button'
                            onClick={handleClearImage}
                            className='bg-rose-600 text-white px-2 py-1 rounded-md'>Clear Image</button>
                    </div>
                )}
            </div>

            <div className='flex w-full justify-between items-center absolute bottom-14'>
            <Button disabled={loader}
                    onClick={() => setOpen(false)}
                    variant='outlined'
                    className='text-white py-[10px] px-4 text-sm font-medium'>
                Cancel
            </Button>

            <Button
                disabled={loader}
                type='submit'
                variant='contained'
                color='primary'
                className='bg-custom-blue text-white  py-[10px] px-4 text-sm font-medium'>
                {loader ? (
                    <div className='flex gap-2 items-center'>
                        <Spinners /> Loading...
                    </div>
                ) : (
                    "Update"
                )}
            </Button>
        </div>
        </form>
    </div>
  )
}

export default ImageUploadForm

================================================
FILE: ecom-frontend/src/components/admin/sellers/AddSellerForm.jsx
================================================
import React, { useState } from "react";
import { useDispatch } from "react-redux";
import { useForm } from "react-hook-form";
import toast from "react-hot-toast";
import { addNewDashboardSeller } from "../../../store/actions";
import InputField from "../../shared/InputField";
import Spinners from "../../shared/Spinners";

const AddSellerForm = ({ setOpen }) => {
  const dispatch = useDispatch();
  const [loader, setLoader] = useState(false);

  const {
    register,
    handleSubmit,
    reset,
    formState: { errors },
  } = useForm({
    mode: "onTouched",
  });

  const addSellerHandler = (data) => {
    const sendData = {
      ...data,
      role: ["seller"],
    };

    dispatch(addNewDashboardSeller(sendData, toast, reset, setOpen, setLoader));
  };

  return (
    <div className="py-5 relative h-full ">
      <form className="space-y-4 " onSubmit={handleSubmit(addSellerHandler)}>
        <div className="flex  flex-col gap-4 w-full">
          <InputField
            label="UserName"
            required
            id="username"
            type="text"
            message="*UserName is required"
            placeholder="Enter your username"
            register={register}
            errors={errors}
          />
          <InputField
            label="Email"
            required
            id="email"
            type="email"
            message="*Email is required"
            placeholder="Enter your email"
            register={register}
            errors={errors}
          />
          <InputField
            label="Password"
            required
            id="password"
            type="password"
            message="*Password is required"
            placeholder="Enter your password"
            register={register}
            errors={errors}
          />
        </div>

        <div className="flex  w-full justify-between items-center absolute bottom-14">
          <button
            disabled={loader}
            onClick={() => setOpen(false)}
            type="button"
            className={`border border-blue-500 rounded-[5px] font-metropolis  text-textColor py-[10px] px-4 text-sm font-medium`}
          >
            Cancel
          </button>
          <button
            disabled={loader}
            type="submit"
            className={`font-metropolis rounded-[5px]  bg-custom-blue hover:bg-blue-800 text-white  py-[10px] px-4 text-sm font-medium`}
          >
            {loader ? (
              <div className="flex gap-2 items-center">
                <Spinners /> Loading..
              </div>
            ) : (
              "Add New Seller"
            )}
          </button>
        </div>
      </form>
    </div>
  );
};

export default AddSellerForm;

================================================
FILE: ecom-frontend/src/components/admin/sellers/SellerTable.jsx
================================================
import React, { useState } from "react";
import { useLocation, useNavigate, useSearchParams } from "react-router-dom";
import { DataGrid } from "@mui/x-data-grid";
import { sellerTableColumns } from "../../helper/tableColumn";

const SellerTable = ({ sellers, pagination }) => {
  const navigate = useNavigate();
  const [searchParams] = useSearchParams();
  const pathname = useLocation().pathname;
  const params = new URLSearchParams(searchParams);
  const [currentPage, setCurrentPage] = useState(pagination?.pageNumber || 1);

  const tableRecords = sellers?.map((item) => {
    return {
      id: item.userId,
      username: item.username,
      email: item.email,
    };
  });

  const handlePaginationChange = (paginationModel) => {
    const page = paginationModel.page + 1;
    setCurrentPage(page);

    params.set("page", page.toString());
    navigate(`${pathname}?${params}`);
  };

  return (
    <div>
      <div className="max-w-fit mx-auto">
        <DataGrid
          className="w-full"
          rows={tableRecords}
          paginationMode="server"
          rowCount={pagination?.totalElements || 0}
          columns={sellerTableColumns}
          initialState={{
            pagination: {
              paginationModel: {
                pageSize: pagination?.pageSize || 10,
                page: currentPage - 1,
              },
            },
          }}
          onPaginationModelChange={handlePaginationChange}
          disableRowSelectionOnClick
          disableColumnResize
          pagination
          pageSizeOptions={[pagination?.pageSize || 10]}
          paginationOptions={{
            showFirstButton: true,
            showLastButton: true,
            hideNextButton: currentPage === pagination?.totalPages,
          }}
        />
      </div>
    </div>
  );
};

export default SellerTable;

================================================
FILE: ecom-frontend/src/components/admin/sellers/Sellers.jsx
================================================
import React, { useState } from "react";
import { useSelector } from "react-redux";
import { MdPersonAdd } from "react-icons/md";

import SellerTable from "./SellerTable";
import ErrorPage from "../../shared/ErrorPage";
import Loader from "../../shared/Loader";
import Modal from "../../shared/Modal";
import AddSellerForm from "./AddSellerForm";
import useSellerFilter from "./useSellerFilter";

const Sellers = () => {
  const [openModal, setOpenModal] = useState(false);
  const { sellers, pagination } = useSelector((state) => state.seller);
  const { isLoading, errorMessage } = useSelector((state) => state.errors);

  // Calling the `useSellerFilter` custom hook to fetch sellers and pagination based on the current URL parameters.
  useSellerFilter();

  const emptySellers = !sellers || sellers?.length === 0;

  if (errorMessage) {
    return <ErrorPage message={errorMessage} />;
  }

  return (
    <React.Fragment>
      <div className="pt-6 pb-10 flex justify-end">
        <button
          onClick={() => setOpenModal(true)}
          className="bg-custom-blue hover:bg-blue-800 text-white font-semibold py-2 px-4 flex items-center gap-2 rounded-md shadow-md transition-colors hover:text-slate-300 duration-300"
        >
          <MdPersonAdd className="text-xl" />
          Add Seller
        </button>
      </div>

      {!emptySellers && (
        <h1 className="text-slate-800 text-3xl text-center font-bold pb-6 uppercase">
          All Sellers
        </h1>
      )}

      {isLoading ? (
        <Loader />
      ) : (
        <>
          {emptySellers ? (
            <>
              <div className="flex flex-col items-center justify-center text-gray-600 py-10">
                <h2 className="text-2xl font-semibold">
                  No Seller Created Yet
                </h2>
              </div>
            </>
          ) : (
            <SellerTable sellers={sellers} pagination={pagination} />
          )}
        </>
      )}

      <Modal open={openModal} setOpen={setOpenModal} title="Add New Seller">
        <AddSellerForm setOpen={setOpenModal} />
      </Modal>
    </React.Fragment>
  );
};

export default Sellers;

================================================
FILE: ecom-frontend/src/components/admin/sellers/useSellerFilter.jsx
================================================
import { useEffect } from "react";
import { useSearchParams } from "react-router-dom";
import { useDispatch } from "react-redux";

import { getAllSellersDashboard } from "../../../store/actions";

const useSellerFilter = () => {
  const [searchParams] = useSearchParams(); // Access search params from the URL
  const dispatch = useDispatch(); // Get the dispatch function to call actions

  useEffect(() => {
    const params = new URLSearchParams(); // Create new URLSearchParams object

    // Get current page from URL search params, defaulting to 1 if not present
    const currentPage = searchParams.get("page")
      ? Number(searchParams.get("page"))
      : 1;
    params.set("pageNumber", currentPage - 1); // Pagination starts from 0 for API

    // Convert params to a query string
    const queryString = params.toString();

    // Dispatch action to fetch all seller using the constructed query string
    dispatch(getAllSellersDashboard(queryString));
  }, [dispatch, searchParams]);
};

export default useSellerFilter;

================================================
FILE: ecom-frontend/src/components/auth/LogIn.jsx
================================================
import { useState } from "react";
import { useForm } from "react-hook-form";
import { AiOutlineLogin } from "react-icons/ai";
import { Link, useNavigate } from "react-router-dom";
import InputField from "../shared/InputField";
import { useDispatch } from "react-redux";
import { authenticateSignInUser } from "../../store/actions";
import toast from "react-hot-toast";
import Spinners from "../shared/Spinners";

const LogIn = () => {
    const navigate = useNavigate();
    const dispatch = useDispatch();
    const [loader, setLoader] = useState(false);

    const {
        register,
        handleSubmit,
        reset,
        formState: {errors},
    } = useForm({
        mode: "onTouched",
    });

    const loginHandler = async (data) => {
        console.log("Login Click");
        dispatch(authenticateSignInUser(data, toast, reset, navigate, setLoader));
    };

    return (
        <div className="min-h-[calc(100vh-64px)] flex justify-center items-center">
            <form
                onSubmit={handleSubmit(loginHandler)}
                className="sm:w-[450px] w-[360px] shadow-custom py-8 sm:px-8 px-4 rounded-md">
                    <div className="flex flex-col items-center justify-center space-y-4">
                        <AiOutlineLogin className="text-slate-800 text-5xl"/>
                        <h1 className="text-slate-800 text-center font-montserrat lg:text-3xl text-2xl font-bold">
                            Login Here
                        </h1>
                    </div>
            <hr className="mt-2 mb-5 text-black" />
            <div className="flex flex-col gap-3">
                <InputField
                    label="UserName"
                    required
                    id="username"
                    type="text"
                    message="*UserName is required"
                    placeholder="Enter your username"
                    register={register}
                    errors={errors}
                    />

                <InputField
                    label="Password"
                    required
                    id="password"
                    type="password"
                    message="*Password is required"
                    placeholder="Enter your password"
                    register={register}
                    errors={errors}
                    />
            </div>

            <button
                disabled={loader}
                className="bg-button-gradient flex gap-2 items-center justify-center font-semibold text-white w-full py-2 hover:text-slate-400 transition-colors duration-100 rounded-xs my-3"
                type="submit">
                {loader ? (
                    <>
                    <Spinners /> Loading...
                    </>
                ) : (
                    <>Login</>
                )}
            </button>

            <p className="text-center text-sm text-slate-700 mt-6">
              Don't have an account?
              <Link
                className="font-semibold underline hover:text-black"
                to="/register">
              <span> SignUp</span></Link>  
            </p>
            </form>
        </div>
    );
}

export default LogIn;

================================================
FILE: ecom-frontend/src/components/auth/Register.jsx
================================================
import React, { useState } from 'react'
import { useForm } from 'react-hook-form';
import { FaUserPlus } from 'react-icons/fa';
import { Link, useNavigate } from 'react-router-dom';
import InputField from '../shared/InputField';
import { useDispatch } from 'react-redux';
import { registerNewUser } from '../../store/actions';
import toast from 'react-hot-toast';
import Spinners from '../shared/Spinners';

const Register = () => {
    const navigate = useNavigate();
    const dispatch = useDispatch();
    const [loader, setLoader] = useState(false);

    const {
        register,
        handleSubmit,
        reset,
        formState: {errors},
    } = useForm({
        mode: "onTouched",
    });

    const registerHandler = async (data) => {
        console.log("Register Click");
        dispatch(registerNewUser(data, toast, reset, navigate, setLoader));
     };

    return (
        <div className="min-h-[calc(100vh-64px)] flex justify-center items-center">
            <form
                onSubmit={handleSubmit(registerHandler)}
                className="sm:w-[450px] w-[360px] shadow-custom py-8 sm:px-8 px-4 rounded-md">
                    <div className="flex flex-col items-center justify-center space-y-4">
                        <FaUserPlus className="text-slate-800 text-5xl"/>
                        <h1 className="text-slate-800 text-center font-montserrat lg:text-3xl text-2xl font-bold">
                            Register Here
                        </h1>
                    </div>
            <hr className="mt-2 mb-5 text-black" />
            <div className="flex flex-col gap-3">
                <InputField
                    label="UserName"
                    required
                    id="username"
                    type="text"
                    message="*UserName is required"
                    placeholder="Enter your username"
                    register={register}
                    errors={errors}
                    />

                <InputField
                    label="Email"
                    required
                    id="email"
                    type="email"
                    message="*Email is required"
                    placeholder="Enter your email"
                    register={register}
                    errors={errors}
                    />

                <InputField
                    label="Password"
                    required
                    id="password"
                    min={6}
                    type="password"
                    message="*Password is required"
                    placeholder="Enter your password"
                    register={register}
                    errors={errors}
                    />
            </div>

            <button
                disabled={loader}
                className="bg-button-gradient flex gap-2 items-center justify-center font-semibold text-white w-full py-2 hover:text-slate-400 transition-colors duration-100 rounded-xs my-3"
                type="submit">
                {loader ? (
                    <>
                    <Spinners /> Loading...
                    </>
                ) : (
                    <>Register</>
                )}
            </button>

            <p className="text-center text-sm text-slate-700 mt-6">
              Already have an account?
              <Link
                className="font-semibold underline hover:text-black"
                to="/login">
              <span> Login</span></Link>  
            </p>
            </form>
        </div>
    );
}

export default Register

================================================
FILE: ecom-frontend/src/components/cart/Cart.jsx
================================================
import { MdArrowBack, MdShoppingCart } from "react-icons/md";
import { useDispatch, useSelector } from "react-redux";
import { Link } from "react-router-dom";
import ItemContent from "./ItemContent";
import CartEmpty from "./CartEmpty";
import { formatPrice } from "../../utils/formatPrice";

const Cart = () => {
    const dispatch = useDispatch();
    const { cart } = useSelector((state) => state.carts);
    const newCart = { ...cart };

    newCart.totalPrice = cart?.reduce(
        (acc, cur) => acc + Number(cur?.specialPrice) * Number(cur?.quantity), 0
    );

    if (!cart || cart.length === 0) return <CartEmpty />;

    return (
        <div className="lg:px-14 sm:px-8 px-4 py-10">
            <div className="flex flex-col items-center mb-12">
                <h1 className="text-4xl font-bold text-gray-900 flex items-center gap-3">
                  <MdShoppingCart size={36} className="text-gray-700" />
                    Your Cart
                </h1>
                <p className="text-lg text-gray-600 mt-2">All your selected items</p>
            </div>

            <div className="grid md:grid-cols-5 grid-cols-4 gap-4 pb-2 font-semibold items-center">
                <div className="md:col-span-2 justify-self-start text-lg text-slate-800 lg:ps-4">
                    Product
                </div>

                <div className="justify-self-center text-lg text-slate-800">
                    Price
                </div>

                <div className="justify-self-center text-lg text-slate-800">
                    Quantity
                </div>

                <div className="justify-self-center text-lg text-slate-800">
                    Total
                </div>
            </div>

            <div>
                {cart && cart.length > 0 &&
                    cart.map((item, i) => <ItemContent key={i} {...item}/>)}
            </div>

            <div className="border-t-[1.5px] border-slate-200 py-4 flex sm:flex-row sm:px-0 px-2 flex-col sm:justify-between gap-4">
                <div></div>
                <div className="flex text-sm gap-1 flex-col">
                    <div className="flex justify-between w-full md:text-lg text-sm font-semibold">
                        <span>Subtotal</span>
                        <span>{formatPrice(newCart?.totalPrice)}</span>
                    </div>

                    <p className="text-slate-500">
                        Taxes and shipping calculated at checkout
                    </p>

                    <Link className="w-full flex justify-end" to="/checkout">
                    <button
                        onClick={() => {}}
                        className="font-semibold w-[300px] py-2 px-4 rounded-xs bg-custom-blue text-white flex items-center justify-center gap-2 hover:text-gray-300 transition duration-500">
                        <MdShoppingCart size={20} />
                        Checkout
                    </button>
                    </Link>

                    <Link className="flex gap-2 items-center mt-2 text-slate-500" to="/products">
                        <MdArrowBack />
                        <span>Continue Shopping</span>
                    </Link>
                </div>
            </div>
        </div>
    );
};

export default Cart;

================================================
FILE: ecom-frontend/src/components/cart/CartEmpty.jsx
================================================
import { MdArrowBack, MdShoppingCart } from "react-icons/md";
import { Link } from "react-router-dom";

const CartEmpty = () => {
 return (
    <div className="min-h-[800px] flex flex-col items-center justify-center">
        <div className="flex flex-col items-center">
            <MdShoppingCart size={80} className="mb-4 text-slate-500"/>
            <div className="text-3xl font-bold text-slate-700">
                Your cart is empty
            </div>
            <div className="text-lg text-slate-500 mt-2">
                Add some products to get started
            </div>
        </div>
        <div className="mt-6">
            <Link
                to="/"
                className="flex gap-2 items-center text-blue-500 hover:text-blue-600 transition">
                    <MdArrowBack size={24} />
                    <span className="font-medium">Start Shopping</span>
                </Link>
        </div>
    </div>
 )   
}

export default CartEmpty;

================================================
FILE: ecom-frontend/src/components/cart/ItemContent.jsx
================================================
import { useState } from "react";
import { HiOutlineTrash } from "react-icons/hi";
import SetQuantity from "./SetQuantity";
import { useDispatch } from "react-redux";
import { decreaseCartQuantity, increaseCartQuantity, removeFromCart } from "../../store/actions";
import toast from "react-hot-toast";
import { formatPrice } from "../../utils/formatPrice";
import truncateText from "../../utils/truncateText";

const ItemContent = ({
    productId,
    productName,
    image,
    description,
    quantity,
    price,
    discount,
    specialPrice,
    cartId,
  }) => {
    const [currentQuantity, setCurrentQuantity] = useState(quantity);
    const dispatch = useDispatch();

    const handleQtyIncrease = (cartItems) => {
        dispatch(increaseCartQuantity(
            cartItems,
            toast,
            currentQuantity,
            setCurrentQuantity
        ));
    };

    const handleQtyDecrease = (cartItems) => {
        if (currentQuantity > 1) {
            const newQuantity = currentQuantity - 1;
            setCurrentQuantity(newQuantity);
            dispatch(decreaseCartQuantity(cartItems, newQuantity));
        }
    };

    const removeItemFromCart = (cartItems) => {
        dispatch(removeFromCart(cartItems, toast));
    };
    
    return (
        <div className="grid md:grid-cols-5 grid-cols-4 md:text-md text-sm gap-4   items-center  border border-slate-200  rounded-md  lg:px-4  py-4 p-2">
            <div className="md:col-span-2 justify-self-start flex  flex-col gap-2 ">
                <div className="flex md:flex-row flex-col lg:gap-4 sm:gap-3 gap-0 items-start ">
                   <h3 className="lg:text-[17px] text-sm font-semibold text-slate-600">
                    {truncateText(productName)}
                   </h3>
                </div>

                <div className="md:w-36 sm:w-24 w-12">
                    <img 
                        src={`${import.meta.env.VITE_BACK_END_URL}/images/${image}`}
                        alt={productName}
                        className="md:h-36 sm:h-24 h-12 w-full object-cover rounded-md"/>
                

                <div className="flex items-start gap-5 mt-3">
                    <button
                        onClick={() => removeItemFromCart({
                            image,
                            productName,
                            description,
                            specialPrice,
                            price,
                            productId,
                            quantity,
                        })}
                        className="flex items-center font-semibold space-x-2 px-4 py-1 text-xs border border-rose-600 text-rose-600 rounded-md hover:bg-red-50 transition-colors duration-200">
                        <HiOutlineTrash size={16} className="text-rose-600"/>
                        Remove
                    </button>
                    </div>
                </div>
            </div>

            <div className="justify-self-center lg:text-[17px] text-sm text-slate-600 font-semibold">
                {formatPrice(Number(specialPrice))}
            </div>

            <div className="justify-self-center">
                <SetQuantity 
                    quantity={currentQuantity}
                    cardCounter={true}
                    handeQtyIncrease={() => handleQtyIncrease({
                        image,
                        productName,
                        description,
                        specialPrice,
                        price,
                        productId,
                        quantity,
                    })}
                    handleQtyDecrease={() => {handleQtyDecrease({
                        image,
                        productName,
                        description,
                        specialPrice,
                        price,
                        productId,
                        quantity,
                    })}}/>
            </div>

            <div className="justify-self-center lg:text-[17px] text-sm text-slate-600 font-semibold">
                {formatPrice(Number(currentQuantity) * Number(specialPrice))}
            </div>
        </div>
    )
};

export default ItemContent;

================================================
FILE: ecom-frontend/src/components/cart/SetQuantity.jsx
================================================

const btnStyles = "border-[1.2px] border-slate-800 px-3 py-1 rounded-sm";
const SetQuantity = ({
    quantity,
    cardCounter,
    handeQtyIncrease,
    handleQtyDecrease,
}) => {
   return (
   <div className="flex gap-8 items-center">
        {cardCounter ? null : <div className="font-semibold">QUANTITY</div>}
        <div className="flex md:flex-row flex-col gap-4 items-center lg:text-[22px] text-sm">
            <button
                disabled={quantity<=1}
                className={btnStyles}
                onClick={handleQtyDecrease}>
                -
            </button>
                <div className="text-red-500">{quantity}</div>
            <button
                className={btnStyles}
                onClick={handeQtyIncrease}>
                +
            </button>
        </div>
    </div>
   );
};

export default SetQuantity;

================================================
FILE: ecom-frontend/src/components/checkout/AddAddressForm.jsx
================================================
import React, { useEffect } from 'react'
import InputField from '../shared/InputField'
import { useForm } from 'react-hook-form';
import { FaAddressCard } from 'react-icons/fa';
import { useDispatch, useSelector } from 'react-redux';
import Spinners from '../shared/Spinners';
import toast from 'react-hot-toast';
import { addUpdateUserAddress } from '../../store/actions';

const AddAddressForm = ({ address, setOpenAddressModal }) => {
    const dispatch = useDispatch();
    const { btnLoader } = useSelector((state) => state.errors);
    const {
            register,
            handleSubmit,
            reset,
            setValue,
            formState: {errors},
        } = useForm({
            mode: "onTouched",
        });

        const onSaveAddressHandler = async (data) => {
            dispatch(addUpdateUserAddress(
                data,
                toast,
                address?.addressId,
                setOpenAddressModal
            ));
        };


        useEffect(() => {
            if (address?.addressId) {
                setValue("buildingName", address?.buildingName);
                setValue("city", address?.city);
                setValue("street", address?.street);
                setValue("state", address?.state);
                setValue("pincode", address?.pincode);
                setValue("country", address?.country);
            }
        }, [address]);

  return (
    <div className="">
            <form
                onSubmit={handleSubmit(onSaveAddressHandler)}
                className="">
                    <div className="flex justify-center items-center mb-4 font-semibold text-2xl text-slate-800 py-2 px-4">
                        <FaAddressCard className="mr-2 text-2xl"/>
                        {!address?.addressId ? 
                        "Add Address" :
                        "Update Address"
                        }
                        
                    </div>
            <div className="flex flex-col gap-4">
                <InputField
                    label="Building Name"
                    required
                    id="buildingName"
                    type="text"
                    message="*Building Name is required"
                    placeholder="Enter Building Name"
                    register={register}
                    errors={errors}
                    />

                <InputField
                    label="City"
                    required
                    id="city"
                    type="text"
                    message="*City is required"
                    placeholder="Enter City"
                    register={register}
                    errors={errors}
                    />

                <InputField
                    label="State"
                    required
                    id="state"
                    type="text"
                    message="*State is required"
                    placeholder="Enter State"
                    register={register}
                    errors={errors}
                    />

                <InputField
                    label="Pincode"
                    required
                    id="pincode"
                    type="text"
                    message="*Pincode is required"
                    placeholder="Enter Pincode"
                    register={register}
                    errors={errors}
                    />    
                <InputField
                    label="Street"
                    required
                    id="street"
                    type="text"
                    message="*Street is required"
                    placeholder="Enter Street"
                    register={register}
                    errors={errors}
                    />   

                <InputField
                    label="Country"
                    required
                    id="country"
                    type="text"
                    message="*Country is required"
                    placeholder="Enter Country"
                    register={register}
                    errors={errors}
                    />        
            </div>

            <button
                disabled={btnLoader}
                className="text-white bg-custom-blue px-4 py-2 rounded-md mt-4"
                type="submit">
                {btnLoader ? (
                    <>
                    <Spinners /> Loading...
                    </>
                ) : (
                    <>Save</>
                )}
            </button>
            </form>
        </div>
  )
}

export default AddAddressForm

================================================
FILE: ecom-frontend/src/components/checkout/AddressInfo.jsx
================================================

import React, { useState } from 'react'
import Skeleton from '../shared/Skeleton';
import { FaAddressBook } from 'react-icons/fa';
import AddressInfoModal from './AddressInfoModal';
import AddAddressForm from './AddAddressForm';
import { useDispatch, useSelector } from 'react-redux';
import AddressList from './AddressList';
import { DeleteModal } from './DeleteModal';
import toast from 'react-hot-toast';
import { deleteUserAddress } from '../../store/actions';

const AddressInfo = ({ address }) => {
    const [openAddressModal, setOpenAddressModal] = useState(false);
    const [openDeleteModal, setOpenDeleteModal] = useState(false);
    const [selectedAddress, setSelectedAddress] = useState("");
    const addNewAddressHandler = () => {
        setSelectedAddress("");
        setOpenAddressModal(true);
    };

    const dispatch = useDispatch();

    const deleteAddressHandler = () => {
        dispatch(deleteUserAddress(
            toast,
            selectedAddress?.addressId,
            setOpenDeleteModal
        ))
    };

    const noAddressExist = !address || address.length === 0;
    const { isLoading, btnLoader } = useSelector((state) => state.errors);
  return (
    <div className='pt-4'>
        {noAddressExist ? (
            <div className='p-6 rounded-lg max-w-md mx-auto flex flex-col items-center justify-center'>
                <FaAddressBook size={50} className='text-gray-500 mb-4' />
                <h1 className='mb-2 text-slate-900 text-center font-semibold text-2xl'>
                    No Address Added Yet
                </h1>
                <p className='mb-6 text-slate-800 text-center'>
                    Please add your address to complete purchase
                </p>

                <button
                    onClick={addNewAddressHandler}
                    className='px-4 py-2 bg-blue-600 text-white font-medium rounded-sm hover:bg-blue-700 transition-all'>
                    Add Address
                </button>
            </div>
        ) : (
            <div className='relative p-6 rounded-lg max-w-md mx-auto'>
                <h1 className='text-slate-800 text-center font-bold text-2xl'>
                    Select Address
                </h1>
            
            {isLoading ? (
                <div className='py-4 px-8'>
                    <Skeleton />
                </div>
            ) : (
                <>
                <div className='space-y-4 pt-6'>
                    <AddressList 
                        addresses={address}
                        setSelectedAddress={setSelectedAddress}
                        setOpenAddressModal={setOpenAddressModal}
                        setOpenDeleteModal={setOpenDeleteModal}
                        />
                </div>

                {address.length > 0 && (
                    <div className='mt-4'>
                        <button 
                            onClick={addNewAddressHandler}
                            className='px-4 py-2 bg-blue-600 text-white font-medium rounded-sm hover:bg-blue-700 transition-all'>
                                Add More
                        </button>
                    </div>
                )}
                </>
            )}
            </div>
        )}


        <AddressInfoModal
            open={openAddressModal}
            setOpen={setOpenAddressModal}>
                <AddAddressForm 
                    address={selectedAddress}
                    setOpenAddressModal={setOpenAddressModal}/>
        </AddressInfoModal>

        <DeleteModal 
            open={openDeleteModal}
            loader={btnLoader}
            setOpen={setOpenDeleteModal}
            title="Delete Address"
            onDeleteHandler={deleteAddressHandler}
        />
    </div>
  )
}

export default AddressInfo

================================================
FILE: ecom-frontend/src/components/checkout/AddressInfoModal.jsx
================================================
import { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react';
import React from 'react'
import { FaTimes } from 'react-icons/fa';

const AddressInfoModal = ({ open, setOpen, children }) => {
  return (
    <Dialog open={open} onClose={() => setOpen(false)} className="relative z-50">
        {/* The backdrop, rendered as a fixed sibling to the panel container */}
        <DialogBackdrop className="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity" />

        {/* Full-screen container to center the panel */}
        <div className="fixed inset-0 flex w-screen items-center justify-center p-4">
          {/* The actual dialog panel  */}
          <DialogPanel className="relative w-full max-w-md mx-auto transform overflow-hidden bg-white rounded-lg shadow-xl transition-all">
            <div className='px-6 py-6'>
                {children}
            </div>
            <div className='flex justify-end gap-4 absolute right-4 top-2'>
                <button onClick={() => setOpen(false)} type='button'>
                    <FaTimes className='text-slate-700' size={25} />
                </button>
            </div>
          </DialogPanel>
        </div>
      </Dialog>
  );
}

export default AddressInfoModal

================================================
FILE: ecom-frontend/src/components/checkout/AddressList.jsx
================================================
import React from 'react'
import { FaBuilding, FaCheckCircle, FaEdit, FaStreetView, FaTrash } from 'react-icons/fa';
import { MdLocationCity, MdPinDrop, MdPublic } from "react-icons/md";
import { useDispatch, useSelector } from 'react-redux'
import { selectUserCheckoutAddress } from '../../store/actions';

const AddressList = ({ addresses, setSelectedAddress, setOpenAddressModal, setOpenDeleteModal }) => {
    const dispatch = useDispatch();
    const { selectedUserCheckoutAddress } = useSelector((state) => state.auth);

    const onEditButtonHandler = (addresses) => {
        setSelectedAddress(addresses);
        setOpenAddressModal(true);
    };

    const onDeleteButtonHandler = (addresses) => {
        setSelectedAddress(addresses);
        setOpenDeleteModal(true);
    };

    const handleAddressSelection = (addresses) => {
        dispatch(selectUserCheckoutAddress(addresses));
    };

  return (
    <div className='space-y-4'>
        {addresses.map((address) => (
            <div
                key={address.addressId}
                onClick={() => handleAddressSelection(address)}
                className={`p-4 border rounded-md cursor-pointer relative ${
                    selectedUserCheckoutAddress?.addressId === address.addressId
                    ? "bg-green-100"
                    : "bg-white"
                }`}>
                <div className="flex items-start">
                    <div className="space-y-1">
                        <div className="flex items-center ">
                            <FaBuilding size={14} className='mr-2 text-gray-600' />
                            <p className='font-semibold'>{address.buildingName}</p>
                            {selectedUserCheckoutAddress?.addressId === address.addressId && (
                                <FaCheckCircle className='text-green-500 ml-2' />
                            )}
                        </div>

                        <div className="flex items-center ">
                            <FaStreetView size={17} className='mr-2 text-gray-600' />
                            <p>{address.street}</p>
                        </div>

                        <div className="flex items-center ">
                            <MdLocationCity size={17} className='mr-2 text-gray-600' />
                            <p>{address.city}, {address.state}</p>
                        </div>

                        <div className="flex items-center ">
                            <MdPinDrop size={17} className='mr-2 text-gray-600' />
                            <p>{address.pincode}</p>
                        </div>

                        <div className="flex items-center ">
                            <MdPublic size={17} className='mr-2 text-gray-600' />
                            <p>{address.country}</p>
                        </div>
                    </div>
                </div>


                <div className="flex gap-3 absolute top-4 right-2">
                    <button onClick={() => onEditButtonHandler(address)}>
                        <FaEdit size={18} className="text-teal-700" />
                    </button>
                    <button onClick={() => onDeleteButtonHandler(address)}>
                        <FaTrash size={17} className="text-rose-600" />
                    </button>
                </div>
            </div>
        ))}
    </div>
  )
}

export default AddressList

================================================
FILE: ecom-frontend/src/components/checkout/Checkout.jsx
================================================
import { Button, Step, StepLabel, Stepper } from '@mui/material';
import React, { useEffect, useState } from 'react'
import AddressInfo from './AddressInfo';
import { useDispatch, useSelector } from 'react-redux';
import { getUserAddresses } from '../../store/actions';
import toast from 'react-hot-toast';
import Skeleton from '../shared/Skeleton';
import ErrorPage from '../shared/ErrorPage';
import PaymentMethod from './PaymentMethod';
import OrderSummary from './OrderSummary';
import StripePayment from './StripePayment';
import PaypalPayment from './PaypalPayment';

const Checkout = () => {
    const [activeStep, setActiveStep] = useState(0);
    const dispatch = useDispatch();
    const { isLoading, errorMessage } = useSelector((state) => state.errors);
    const { cart, totalPrice } = useSelector((state) => state.carts);
    const { address, selectedUserCheckoutAddress } = useSelector(
        (state) => state.auth
    )
    const { paymentMethod } = useSelector((state) => state.payment);

    const handleBack = () => {
        setActiveStep((prevStep) => prevStep - 1);
    };

    const handleNext = () => {
        if(activeStep === 0 && !selectedUserCheckoutAddress) {
            toast.error("Please select checkout address before proceeding.");
            return;
        }

        if(activeStep === 1 && (!selectedUserCheckoutAddress || !paymentMethod)) {
            toast.error("Please select payment address before proceeding.");
            return;
        }
        
        setActiveStep((prevStep) => prevStep + 1);
    };

    const steps = [
        "Address",
        "Payment Method",
        "Order Summary",
        "Payment",
    ];
    
    useEffect(() => {
        dispatch(getUserAddresses());
    }, [dispatch]);

  return (
    <div className='py-14 min-h-[calc(100vh-100px)]'>
        <Stepper activeStep={activeStep} alternativeLabel>
            {steps.map((label, index) => (
                <Step key={index}>
                    <StepLabel>{label}</StepLabel>
                </Step>
            ))}
        </Stepper>

        {isLoading ? (
            <div className='lg:w-[80%] mx-auto py-5'>
                <Skeleton />
            </div>
        ) : (
            <div className='mt-5'>
                {activeStep === 0 && <AddressInfo address={address} />}
                {activeStep === 1 && <PaymentMethod />}
                {activeStep === 2 && <OrderSummary 
                                        totalPrice={totalPrice}
                                        cart={cart}
                                        address={selectedUserCheckoutAddress}
                                        paymentMethod={paymentMethod}/>}
                {activeStep === 3 && 
                    <>
                        {paymentMethod === "Stripe" ? (
                            <StripePayment />
                        ) : (
                            <PaypalPayment />
                        )}
                    </>}
            </div>
        )}
        

        <div
            className='flex justify-between items-center px-4 fixed z-50 h-24 bottom-0 bg-white left-0 w-full py-4 border-slate-200'
            style={{ boxShadow: "0 -2px 4px rgba(100, 100, 100, 0.15)" }}>
            <Button
                variant='outlined'
                disabled={activeStep === 0}
                onClick={handleBack}>
                    Back
            </Button>

            {activeStep !== steps.length - 1 && (
                <button
                    disabled={
                        errorMessage || (
                            (activeStep === 0 ? !selectedUserCheckoutAddress
                                : activeStep === 1 ? !paymentMethod
                                : false
                            )
                        )
                    }
                    className={`bg-custom-blue font-semibold px-6 h-1
Download .txt
gitextract_0gy1k5a8/

├── FirstSpring/
│   ├── .gitignore
│   ├── mvnw
│   ├── mvnw.cmd
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── embarkx/
│       │   │           └── FirstSpring/
│       │   │               ├── FirstSpringApplication.java
│       │   │               ├── HelloController.java
│       │   │               └── HelloResponse.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── embarkx/
│                       └── FirstSpring/
│                           └── FirstSpringApplicationTests.java
├── Java Spring Boot- Professional eCommerce Project Masterclass.postman_collection.json
├── README.md
├── SpringExample/
│   ├── .gitignore
│   ├── .idea/
│   │   ├── .gitignore
│   │   ├── encodings.xml
│   │   ├── misc.xml
│   │   ├── uiDesigner.xml
│   │   └── vcs.xml
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   ├── car/
│           │   │   └── example/
│           │   │       ├── bean/
│           │   │       │   ├── App.java
│           │   │       │   └── MyBean.java
│           │   │       ├── constructor/
│           │   │       │   └── injection/
│           │   │       │       ├── App.java
│           │   │       │       ├── Car.java
│           │   │       │       └── Specification.java
│           │   │       └── setter/
│           │   │           └── injection/
│           │   │               ├── App.java
│           │   │               ├── Car.java
│           │   │               └── Specification.java
│           │   └── com/
│           │       ├── example/
│           │       │   ├── autowire/
│           │       │   │   ├── constructor/
│           │       │   │   │   ├── App.java
│           │       │   │   │   ├── Car.java
│           │       │   │   │   └── Specification.java
│           │       │   │   ├── name/
│           │       │   │   │   ├── App.java
│           │       │   │   │   ├── Car.java
│           │       │   │   │   └── Specification.java
│           │       │   │   └── type/
│           │       │   │       ├── App.java
│           │       │   │       ├── Car.java
│           │       │   │       └── Specification.java
│           │       │   ├── autowired/
│           │       │   │   └── annotation/
│           │       │   │       ├── App.java
│           │       │   │       ├── AppConfig.java
│           │       │   │       ├── Employee.java
│           │       │   │       └── Manager.java
│           │       │   └── componentscan/
│           │       │       ├── App.java
│           │       │       ├── Employee.java
│           │       │       └── annotation/
│           │       │           ├── App.java
│           │       │           ├── AppConfig.java
│           │       │           └── Employee.java
│           │       ├── ioc/
│           │       │   └── coupling/
│           │       │       ├── IOCExample.java
│           │       │       ├── NewDatabaseProvider.java
│           │       │       ├── UserDataProvider.java
│           │       │       ├── UserDatabaseProvider.java
│           │       │       ├── UserManager.java
│           │       │       └── WebServiceDataProvider.java
│           │       ├── loose/
│           │       │   └── coupling/
│           │       │       ├── LooseCouplingExample.java
│           │       │       ├── NewDatabaseProvider.java
│           │       │       ├── UserDataProvider.java
│           │       │       ├── UserDatabaseProvider.java
│           │       │       ├── UserManager.java
│           │       │       └── WebServiceDataProvider.java
│           │       └── tight/
│           │           └── coupling/
│           │               ├── TightCouplingExample.java
│           │               ├── UserDatabase.java
│           │               └── UserManager.java
│           └── resources/
│               ├── applicationBeanContext.xml
│               ├── applicationConstructorInjection.xml
│               ├── applicationIoCLooseCouplingExample.xml
│               ├── applicationSetterInjection.xml
│               ├── autowireByConstructor.xml
│               ├── autowireByName.xml
│               ├── autowireByType.xml
│               └── componentScanDemo.xml
├── ecom-frontend/
│   ├── .gitignore
│   ├── README.md
│   ├── eslint.config.js
│   ├── index.html
│   ├── package.json
│   ├── postcss.config.js
│   ├── src/
│   │   ├── App.css
│   │   ├── App.jsx
│   │   ├── api/
│   │   │   └── api.js
│   │   ├── components/
│   │   │   ├── About.jsx
│   │   │   ├── BackDrop.jsx
│   │   │   ├── Contact.jsx
│   │   │   ├── PrivateRoute.jsx
│   │   │   ├── UserMenu.jsx
│   │   │   ├── admin/
│   │   │   │   ├── AdminLayout.jsx
│   │   │   │   ├── categories/
│   │   │   │   │   ├── AddCategoryForm.jsx
│   │   │   │   │   └── Category.jsx
│   │   │   │   ├── dashboard/
│   │   │   │   │   ├── Dashboard.jsx
│   │   │   │   │   └── DashboardOverview.jsx
│   │   │   │   ├── orders/
│   │   │   │   │   ├── OrderTable.jsx
│   │   │   │   │   ├── Orders.jsx
│   │   │   │   │   └── UpdateOrderForm.jsx
│   │   │   │   ├── products/
│   │   │   │   │   ├── AddProductForm.jsx
│   │   │   │   │   ├── AdminProducts.jsx
│   │   │   │   │   └── ImageUploadForm.jsx
│   │   │   │   └── sellers/
│   │   │   │       ├── AddSellerForm.jsx
│   │   │   │       ├── SellerTable.jsx
│   │   │   │       ├── Sellers.jsx
│   │   │   │       └── useSellerFilter.jsx
│   │   │   ├── auth/
│   │   │   │   ├── LogIn.jsx
│   │   │   │   └── Register.jsx
│   │   │   ├── cart/
│   │   │   │   ├── Cart.jsx
│   │   │   │   ├── CartEmpty.jsx
│   │   │   │   ├── ItemContent.jsx
│   │   │   │   └── SetQuantity.jsx
│   │   │   ├── checkout/
│   │   │   │   ├── AddAddressForm.jsx
│   │   │   │   ├── AddressInfo.jsx
│   │   │   │   ├── AddressInfoModal.jsx
│   │   │   │   ├── AddressList.jsx
│   │   │   │   ├── Checkout.jsx
│   │   │   │   ├── DeleteModal.jsx
│   │   │   │   ├── OrderSummary.jsx
│   │   │   │   ├── PaymentConfirmation.jsx
│   │   │   │   ├── PaymentForm.jsx
│   │   │   │   ├── PaymentMethod.jsx
│   │   │   │   ├── PaypalPayment.jsx
│   │   │   │   └── StripePayment.jsx
│   │   │   ├── helper/
│   │   │   │   └── tableColumn.jsx
│   │   │   ├── home/
│   │   │   │   ├── HeroBanner.jsx
│   │   │   │   └── Home.jsx
│   │   │   ├── products/
│   │   │   │   ├── Filter.jsx
│   │   │   │   └── Products.jsx
│   │   │   └── shared/
│   │   │       ├── DeleteModal.jsx
│   │   │       ├── ErrorPage.jsx
│   │   │       ├── InputField.jsx
│   │   │       ├── Loader.jsx
│   │   │       ├── Modal.jsx
│   │   │       ├── Navbar.jsx
│   │   │       ├── Paginations.jsx
│   │   │       ├── ProductCard.jsx
│   │   │       ├── ProductViewModal.jsx
│   │   │       ├── SelectTextField.jsx
│   │   │       ├── Sidebar.jsx
│   │   │       ├── Skeleton.jsx
│   │   │       ├── Spinners.jsx
│   │   │       └── Status.jsx
│   │   ├── hooks/
│   │   │   ├── useCategoryFilter.js
│   │   │   ├── useOrderFilter.js
│   │   │   └── useProductFilter.js
│   │   ├── index.css
│   │   ├── main.jsx
│   │   ├── store/
│   │   │   ├── actions/
│   │   │   │   └── index.js
│   │   │   └── reducers/
│   │   │       ├── ProductReducer.js
│   │   │       ├── adminReducer.js
│   │   │       ├── authReducer.js
│   │   │       ├── cartReducer.js
│   │   │       ├── errorReducer.js
│   │   │       ├── orderReducer.js
│   │   │       ├── paymentMethodReducer.js
│   │   │       ├── sellerReducer.js
│   │   │       └── store.js
│   │   └── utils/
│   │       ├── constant.js
│   │       ├── formatPrice.js
│   │       ├── index.js
│   │       └── truncateText.js
│   └── vite.config.js
├── media/
│   ├── .gitignore
│   ├── .mvn/
│   │   └── wrapper/
│   │       ├── maven-wrapper.jar
│   │       └── maven-wrapper.properties
│   ├── mvnw
│   ├── mvnw.cmd
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── social/
│       │   │           └── media/
│       │   │               ├── DataInitializer.java
│       │   │               ├── MediaApplication.java
│       │   │               ├── controllers/
│       │   │               │   └── SocialController.java
│       │   │               ├── models/
│       │   │               │   ├── Post.java
│       │   │               │   ├── SocialGroup.java
│       │   │               │   ├── SocialProfile.java
│       │   │               │   └── SocialUser.java
│       │   │               ├── repositories/
│       │   │               │   ├── PostRepository.java
│       │   │               │   ├── SocialGroupRepository.java
│       │   │               │   ├── SocialProfileRepository.java
│       │   │               │   └── SocialUserRepository.java
│       │   │               └── services/
│       │   │                   └── SocialService.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── social/
│                       └── media/
│                           └── MediaApplicationTests.java
└── sb-ecom/
    ├── .gitignore
    ├── .mvn/
    │   └── wrapper/
    │       ├── maven-wrapper.jar
    │       └── maven-wrapper.properties
    ├── mvnw
    ├── mvnw.cmd
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── java/
        │   │   └── com/
        │   │       └── ecommerce/
        │   │           └── project/
        │   │               ├── SbEcomApplication.java
        │   │               ├── config/
        │   │               │   ├── AppConfig.java
        │   │               │   ├── AppConstants.java
        │   │               │   ├── SwaggerConfig.java
        │   │               │   └── WebMvcConfig.java
        │   │               ├── controller/
        │   │               │   ├── AddressController.java
        │   │               │   ├── AnalyticsController.java
        │   │               │   ├── AuthController.java
        │   │               │   ├── CartController.java
        │   │               │   ├── CategoryController.java
        │   │               │   ├── OrderController.java
        │   │               │   └── ProductController.java
        │   │               ├── exceptions/
        │   │               │   ├── APIException.java
        │   │               │   ├── MyGlobalExceptionHandler.java
        │   │               │   └── ResourceNotFoundException.java
        │   │               ├── model/
        │   │               │   ├── Address.java
        │   │               │   ├── AppRole.java
        │   │               │   ├── Cart.java
        │   │               │   ├── CartItem.java
        │   │               │   ├── Category.java
        │   │               │   ├── Order.java
        │   │               │   ├── OrderItem.java
        │   │               │   ├── Payment.java
        │   │               │   ├── Product.java
        │   │               │   ├── Role.java
        │   │               │   └── User.java
        │   │               ├── payload/
        │   │               │   ├── APIResponse.java
        │   │               │   ├── AddressDTO.java
        │   │               │   ├── AnalyticsResponse.java
        │   │               │   ├── AuthenticationResult.java
        │   │               │   ├── CartDTO.java
        │   │               │   ├── CartItemDTO.java
        │   │               │   ├── CategoryDTO.java
        │   │               │   ├── CategoryResponse.java
        │   │               │   ├── OrderDTO.java
        │   │               │   ├── OrderItemDTO.java
        │   │               │   ├── OrderRequestDTO.java
        │   │               │   ├── OrderResponse.java
        │   │               │   ├── OrderStatusUpdateDto.java
        │   │               │   ├── PaymentDTO.java
        │   │               │   ├── ProductDTO.java
        │   │               │   ├── ProductResponse.java
        │   │               │   ├── StripePaymentDto.java
        │   │               │   ├── UserDTO.java
        │   │               │   └── UserResponse.java
        │   │               ├── repositories/
        │   │               │   ├── AddressRepository.java
        │   │               │   ├── CartItemRepository.java
        │   │               │   ├── CartRepository.java
        │   │               │   ├── CategoryRepository.java
        │   │               │   ├── OrderItemRepository.java
        │   │               │   ├── OrderRepository.java
        │   │               │   ├── PaymentRepository.java
        │   │               │   ├── ProductRepository.java
        │   │               │   ├── RoleRepository.java
        │   │               │   └── UserRepository.java
        │   │               ├── security/
        │   │               │   ├── WebConfig.java
        │   │               │   ├── WebSecurityConfig.java
        │   │               │   ├── jwt/
        │   │               │   │   ├── AuthEntryPointJwt.java
        │   │               │   │   ├── AuthTokenFilter.java
        │   │               │   │   └── JwtUtils.java
        │   │               │   ├── request/
        │   │               │   │   ├── LoginRequest.java
        │   │               │   │   └── SignupRequest.java
        │   │               │   ├── response/
        │   │               │   │   ├── MessageResponse.java
        │   │               │   │   └── UserInfoResponse.java
        │   │               │   └── services/
        │   │               │       ├── UserDetailsImpl.java
        │   │               │       └── UserDetailsServiceImpl.java
        │   │               ├── service/
        │   │               │   ├── AddressService.java
        │   │               │   ├── AddressServiceImpl.java
        │   │               │   ├── AnalyticsService.java
        │   │               │   ├── AnalyticsServiceImpl.java
        │   │               │   ├── AuthService.java
        │   │               │   ├── AuthServiceImpl.java
        │   │               │   ├── CartService.java
        │   │               │   ├── CartServiceImpl.java
        │   │               │   ├── CategoryService.java
        │   │               │   ├── CategoryServiceImpl.java
        │   │               │   ├── FileService.java
        │   │               │   ├── FileServiceImpl.java
        │   │               │   ├── OrderService.java
        │   │               │   ├── OrderServiceImpl.java
        │   │               │   ├── ProductService.java
        │   │               │   ├── ProductServiceImpl.java
        │   │               │   ├── StripeService.java
        │   │               │   └── StripeServiceImpl.java
        │   │               └── util/
        │   │                   └── AuthUtil.java
        │   └── resources/
        │       └── application.properties
        └── test/
            └── java/
                └── com/
                    └── ecommerce/
                        └── project/
                            └── SbEcomApplicationTests.java
Download .txt
SYMBOL INDEX (472 symbols across 148 files)

FILE: FirstSpring/src/main/java/com/embarkx/FirstSpring/FirstSpringApplication.java
  class FirstSpringApplication (line 6) | @SpringBootApplication
    method main (line 10) | public static void main(String[] args) {

FILE: FirstSpring/src/main/java/com/embarkx/FirstSpring/HelloController.java
  class HelloController (line 5) | @RestController
    method helloParam (line 8) | @GetMapping("/hello/{name}")
    method hello (line 13) | @GetMapping("/hello")
    method helloPost (line 18) | @PostMapping("/hello")

FILE: FirstSpring/src/main/java/com/embarkx/FirstSpring/HelloResponse.java
  class HelloResponse (line 3) | public class HelloResponse {
    method HelloResponse (line 6) | public HelloResponse(String message) {
    method getMessage (line 10) | public String getMessage() {
    method setMessage (line 14) | public void setMessage(String message) {

FILE: FirstSpring/src/test/java/com/embarkx/FirstSpring/FirstSpringApplicationTests.java
  class FirstSpringApplicationTests (line 6) | @SpringBootTest
    method contextLoads (line 9) | @Test

FILE: SpringExample/src/main/java/car/example/bean/App.java
  class App (line 6) | public class App {
    method main (line 7) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/car/example/bean/MyBean.java
  class MyBean (line 3) | public class MyBean {
    method setMessage (line 6) | public void setMessage(String message) {
    method showMessage (line 10) | public void showMessage(){
    method toString (line 14) | @Override

FILE: SpringExample/src/main/java/car/example/constructor/injection/App.java
  class App (line 6) | public class App {
    method main (line 7) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/car/example/constructor/injection/Car.java
  class Car (line 3) | public class Car {
    method Car (line 6) | public Car(Specification specification) {
    method displayDetails (line 10) | public void displayDetails(){

FILE: SpringExample/src/main/java/car/example/constructor/injection/Specification.java
  class Specification (line 3) | public class Specification {
    method getMake (line 7) | public String getMake() {
    method setMake (line 11) | public void setMake(String make) {
    method getModel (line 15) | public String getModel() {
    method setModel (line 19) | public void setModel(String model) {
    method toString (line 23) | @Override

FILE: SpringExample/src/main/java/car/example/setter/injection/App.java
  class App (line 6) | public class App {
    method main (line 7) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/car/example/setter/injection/Car.java
  class Car (line 3) | public class Car {
    method setSpecification (line 6) | public void setSpecification(Specification specification) {
    method displayDetails (line 10) | public void displayDetails(){

FILE: SpringExample/src/main/java/car/example/setter/injection/Specification.java
  class Specification (line 3) | public class Specification {
    method getMake (line 7) | public String getMake() {
    method setMake (line 11) | public void setMake(String make) {
    method getModel (line 15) | public String getModel() {
    method setModel (line 19) | public void setModel(String model) {
    method toString (line 23) | @Override

FILE: SpringExample/src/main/java/com/example/autowire/constructor/App.java
  class App (line 6) | public class App {
    method main (line 7) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/com/example/autowire/constructor/Car.java
  class Car (line 3) | public class Car {
    method Car (line 6) | public Car(Specification specification) {
    method displayDetails (line 14) | public void displayDetails(){

FILE: SpringExample/src/main/java/com/example/autowire/constructor/Specification.java
  class Specification (line 3) | public class Specification {
    method getMake (line 7) | public String getMake() {
    method setMake (line 11) | public void setMake(String make) {
    method getModel (line 15) | public String getModel() {
    method setModel (line 19) | public void setModel(String model) {
    method toString (line 23) | @Override

FILE: SpringExample/src/main/java/com/example/autowire/name/App.java
  class App (line 6) | public class App {
    method main (line 7) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/com/example/autowire/name/Car.java
  class Car (line 3) | public class Car {
    method setSpecification (line 6) | public void setSpecification(Specification specification) {
    method displayDetails (line 10) | public void displayDetails(){

FILE: SpringExample/src/main/java/com/example/autowire/name/Specification.java
  class Specification (line 3) | public class Specification {
    method getMake (line 7) | public String getMake() {
    method setMake (line 11) | public void setMake(String make) {
    method getModel (line 15) | public String getModel() {
    method setModel (line 19) | public void setModel(String model) {
    method toString (line 23) | @Override

FILE: SpringExample/src/main/java/com/example/autowire/type/App.java
  class App (line 6) | public class App {
    method main (line 7) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/com/example/autowire/type/Car.java
  class Car (line 3) | public class Car {
    method setSpecification (line 6) | public void setSpecification(Specification specification) {
    method displayDetails (line 10) | public void displayDetails(){

FILE: SpringExample/src/main/java/com/example/autowire/type/Specification.java
  class Specification (line 3) | public class Specification {
    method getMake (line 7) | public String getMake() {
    method setMake (line 11) | public void setMake(String make) {
    method getModel (line 15) | public String getModel() {
    method setModel (line 19) | public void setModel(String model) {
    method toString (line 23) | @Override

FILE: SpringExample/src/main/java/com/example/autowired/annotation/App.java
  class App (line 6) | public class App {
    method main (line 7) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/com/example/autowired/annotation/AppConfig.java
  class AppConfig (line 6) | @Configuration

FILE: SpringExample/src/main/java/com/example/autowired/annotation/Employee.java
  class Employee (line 6) | @Component("employee")
    method getEmployeeId (line 19) | public int getEmployeeId() {
    method setEmployeeId (line 23) | public void setEmployeeId(int employeeId) {
    method getFirstName (line 27) | public String getFirstName() {
    method setFirstName (line 31) | public void setFirstName(String firstName) {
    method getLastName (line 35) | public String getLastName() {
    method setLastName (line 39) | public void setLastName(String lastName) {
    method getSalary (line 43) | public double getSalary() {
    method setSalary (line 47) | public void setSalary(double salary) {
    method toString (line 51) | @Override

FILE: SpringExample/src/main/java/com/example/autowired/annotation/Manager.java
  class Manager (line 7) | @Component
    method toString (line 18) | @Override

FILE: SpringExample/src/main/java/com/example/componentscan/App.java
  class App (line 6) | public class App {
    method main (line 7) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/com/example/componentscan/Employee.java
  class Employee (line 6) | @Component("employee")
    method getEmployeeId (line 19) | public int getEmployeeId() {
    method setEmployeeId (line 23) | public void setEmployeeId(int employeeId) {
    method getFirstName (line 27) | public String getFirstName() {
    method setFirstName (line 31) | public void setFirstName(String firstName) {
    method getLastName (line 35) | public String getLastName() {
    method setLastName (line 39) | public void setLastName(String lastName) {
    method getSalary (line 43) | public double getSalary() {
    method setSalary (line 47) | public void setSalary(double salary) {
    method toString (line 51) | @Override

FILE: SpringExample/src/main/java/com/example/componentscan/annotation/App.java
  class App (line 7) | public class App {
    method main (line 8) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/com/example/componentscan/annotation/AppConfig.java
  class AppConfig (line 6) | @Configuration

FILE: SpringExample/src/main/java/com/example/componentscan/annotation/Employee.java
  class Employee (line 6) | @Component("employee")
    method getEmployeeId (line 19) | public int getEmployeeId() {
    method setEmployeeId (line 23) | public void setEmployeeId(int employeeId) {
    method getFirstName (line 27) | public String getFirstName() {
    method setFirstName (line 31) | public void setFirstName(String firstName) {
    method getLastName (line 35) | public String getLastName() {
    method setLastName (line 39) | public void setLastName(String lastName) {
    method getSalary (line 43) | public double getSalary() {
    method setSalary (line 47) | public void setSalary(double salary) {
    method toString (line 51) | @Override

FILE: SpringExample/src/main/java/com/ioc/coupling/IOCExample.java
  class IOCExample (line 6) | public class IOCExample {
    method main (line 7) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/com/ioc/coupling/NewDatabaseProvider.java
  class NewDatabaseProvider (line 3) | public class NewDatabaseProvider implements UserDataProvider {
    method getUserDetails (line 4) | @Override

FILE: SpringExample/src/main/java/com/ioc/coupling/UserDataProvider.java
  type UserDataProvider (line 3) | public interface UserDataProvider {
    method getUserDetails (line 4) | String getUserDetails();

FILE: SpringExample/src/main/java/com/ioc/coupling/UserDatabaseProvider.java
  class UserDatabaseProvider (line 6) | public class UserDatabaseProvider implements UserDataProvider {
    method getUserDetails (line 7) | @Override

FILE: SpringExample/src/main/java/com/ioc/coupling/UserManager.java
  class UserManager (line 3) | public class UserManager {
    method UserManager (line 6) | public UserManager(UserDataProvider userDataProvider) {
    method getUserInfo (line 10) | public String getUserInfo(){

FILE: SpringExample/src/main/java/com/ioc/coupling/WebServiceDataProvider.java
  class WebServiceDataProvider (line 3) | public class WebServiceDataProvider implements UserDataProvider {
    method getUserDetails (line 5) | @Override

FILE: SpringExample/src/main/java/com/loose/coupling/LooseCouplingExample.java
  class LooseCouplingExample (line 3) | public class LooseCouplingExample {
    method main (line 4) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/com/loose/coupling/NewDatabaseProvider.java
  class NewDatabaseProvider (line 3) | public class NewDatabaseProvider implements UserDataProvider{
    method getUserDetails (line 4) | @Override

FILE: SpringExample/src/main/java/com/loose/coupling/UserDataProvider.java
  type UserDataProvider (line 3) | public interface UserDataProvider {
    method getUserDetails (line 4) | String getUserDetails();

FILE: SpringExample/src/main/java/com/loose/coupling/UserDatabaseProvider.java
  class UserDatabaseProvider (line 6) | public class UserDatabaseProvider implements UserDataProvider {
    method getUserDetails (line 7) | @Override

FILE: SpringExample/src/main/java/com/loose/coupling/UserManager.java
  class UserManager (line 3) | public class UserManager {
    method UserManager (line 6) | public UserManager(UserDataProvider userDataProvider) {
    method getUserInfo (line 10) | public String getUserInfo(){

FILE: SpringExample/src/main/java/com/loose/coupling/WebServiceDataProvider.java
  class WebServiceDataProvider (line 3) | public class WebServiceDataProvider implements UserDataProvider{
    method getUserDetails (line 5) | @Override

FILE: SpringExample/src/main/java/com/tight/coupling/TightCouplingExample.java
  class TightCouplingExample (line 3) | public class TightCouplingExample {
    method main (line 4) | public static void main(String[] args) {

FILE: SpringExample/src/main/java/com/tight/coupling/UserDatabase.java
  class UserDatabase (line 6) | public class UserDatabase {
    method getUserDetails (line 7) | public String getUserDetails(){

FILE: SpringExample/src/main/java/com/tight/coupling/UserManager.java
  class UserManager (line 3) | public class UserManager {
    method getUserInfo (line 6) | public String getUserInfo(){

FILE: ecom-frontend/src/App.jsx
  function App (line 23) | function App() {

FILE: ecom-frontend/src/components/admin/orders/UpdateOrderForm.jsx
  constant ORDER_STATUSES (line 9) | const ORDER_STATUSES = [

FILE: ecom-frontend/src/components/shared/Modal.jsx
  function Modal (line 4) | function Modal({ open, setOpen, children, title = ""}) {

FILE: ecom-frontend/src/components/shared/ProductViewModal.jsx
  function ProductViewModal (line 7) | function ProductViewModal({open, setOpen, product, isAvailable}) {

FILE: media/src/main/java/com/social/media/DataInitializer.java
  class DataInitializer (line 16) | @Configuration
    method DataInitializer (line 24) | public DataInitializer(SocialUserRepository userRepository, SocialGrou...
    method initializeData (line 31) | @Bean

FILE: media/src/main/java/com/social/media/MediaApplication.java
  class MediaApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: media/src/main/java/com/social/media/controllers/SocialController.java
  class SocialController (line 12) | @RestController
    method getUsers (line 17) | @GetMapping("/social/users")
    method saveUser (line 22) | @PostMapping("/social/users")
    method deleteUser (line 27) | @DeleteMapping("/social/users/{userId}")

FILE: media/src/main/java/com/social/media/models/Post.java
  class Post (line 9) | @Entity

FILE: media/src/main/java/com/social/media/models/SocialGroup.java
  class SocialGroup (line 13) | @Entity
    method hashCode (line 26) | @Override

FILE: media/src/main/java/com/social/media/models/SocialProfile.java
  class SocialProfile (line 9) | @Entity
    method setSocialUser (line 25) | public void setSocialUser(SocialUser socialUser){

FILE: media/src/main/java/com/social/media/models/SocialUser.java
  class SocialUser (line 11) | @Entity
    method hashCode (line 36) | @Override
    method setSocialProfile (line 41) | public void setSocialProfile(SocialProfile socialProfile){

FILE: media/src/main/java/com/social/media/repositories/PostRepository.java
  type PostRepository (line 6) | public interface PostRepository extends JpaRepository<Post, Long> {

FILE: media/src/main/java/com/social/media/repositories/SocialGroupRepository.java
  type SocialGroupRepository (line 6) | public interface SocialGroupRepository extends JpaRepository<SocialGroup...

FILE: media/src/main/java/com/social/media/repositories/SocialProfileRepository.java
  type SocialProfileRepository (line 6) | public interface SocialProfileRepository extends JpaRepository<SocialPro...

FILE: media/src/main/java/com/social/media/repositories/SocialUserRepository.java
  type SocialUserRepository (line 6) | public interface SocialUserRepository extends JpaRepository<SocialUser,L...

FILE: media/src/main/java/com/social/media/services/SocialService.java
  class SocialService (line 10) | @Service
    method getAllUsers (line 15) | public List<SocialUser> getAllUsers() {
    method saveUser (line 19) | public SocialUser saveUser(SocialUser socialUser) {
    method deleteUser (line 23) | public SocialUser deleteUser(Long id) {

FILE: media/src/test/java/com/social/media/MediaApplicationTests.java
  class MediaApplicationTests (line 6) | @SpringBootTest
    method contextLoads (line 9) | @Test

FILE: sb-ecom/src/main/java/com/ecommerce/project/SbEcomApplication.java
  class SbEcomApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: sb-ecom/src/main/java/com/ecommerce/project/config/AppConfig.java
  class AppConfig (line 7) | @Configuration
    method modelMapper (line 10) | @Bean

FILE: sb-ecom/src/main/java/com/ecommerce/project/config/AppConstants.java
  class AppConstants (line 3) | public class AppConstants {

FILE: sb-ecom/src/main/java/com/ecommerce/project/config/SwaggerConfig.java
  class SwaggerConfig (line 14) | @Configuration
    method customOpenAPI (line 17) | @Bean

FILE: sb-ecom/src/main/java/com/ecommerce/project/config/WebMvcConfig.java
  class WebMvcConfig (line 7) | @Configuration
    method addResourceHandlers (line 9) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/controller/AddressController.java
  class AddressController (line 15) | @RestController
    method createAddress (line 25) | @PostMapping("/addresses")
    method getAddresses (line 32) | @GetMapping("/addresses")
    method getAddressById (line 38) | @GetMapping("/addresses/{addressId}")
    method getUserAddresses (line 45) | @GetMapping("/users/addresses")
    method updateAddress (line 52) | @PutMapping("/addresses/{addressId}")
    method updateAddress (line 59) | @DeleteMapping("/addresses/{addressId}")

FILE: sb-ecom/src/main/java/com/ecommerce/project/controller/AnalyticsController.java
  class AnalyticsController (line 12) | @RestController
    method getAnalytics (line 19) | @GetMapping("/admin/app/analytics")

FILE: sb-ecom/src/main/java/com/ecommerce/project/controller/AuthController.java
  class AuthController (line 20) | @RestController
    method authenticateUser (line 27) | @PostMapping("/signin")
    method registerUser (line 35) | @PostMapping("/signup")
    method currentUserName (line 40) | @GetMapping("/username")
    method getUserDetails (line 49) | @GetMapping("/user")
    method signoutUser (line 54) | @PostMapping("/signout")
    method getAllSellers (line 62) | @GetMapping("/sellers")

FILE: sb-ecom/src/main/java/com/ecommerce/project/controller/CartController.java
  class CartController (line 16) | @RestController
    method createOrUpdateCart (line 29) | @PostMapping("/cart/create")
    method addProductToCart (line 35) | @PostMapping("/carts/products/{productId}/quantity/{quantity}")
    method getCarts (line 42) | @GetMapping("/carts")
    method getCartById (line 48) | @GetMapping("/carts/users/cart")
    method updateCartProduct (line 57) | @PutMapping("/cart/products/{productId}/quantity/{operation}")
    method deleteProductFromCart (line 67) | @DeleteMapping("/carts/{cartId}/product/{productId}")

FILE: sb-ecom/src/main/java/com/ecommerce/project/controller/CategoryController.java
  class CategoryController (line 13) | @RestController
    method getAllCategories (line 20) | @GetMapping("/public/categories")
    method createCategory (line 30) | @PostMapping("/admin/categories")
    method deleteCategory (line 36) | @DeleteMapping("/admin/categories/{categoryId}")
    method updateCategory (line 43) | @PutMapping("/admin/categories/{categoryId}")

FILE: sb-ecom/src/main/java/com/ecommerce/project/controller/OrderController.java
  class OrderController (line 17) | @RestController
    method orderProducts (line 30) | @PostMapping("/order/users/payments/{paymentMethod}")
    method createStripeClientSecret (line 46) | @PostMapping("/order/stripe-client-secret")
    method getAllOrders (line 53) | @GetMapping("/admin/orders")
    method getAllSellerOrders (line 64) | @GetMapping("/seller/orders")
    method updateOrderStatus (line 75) | @PutMapping("/admin/orders/{orderId}/status")
    method updateOrderStatusSeller (line 82) | @PutMapping("/seller/orders/{orderId}/status")

FILE: sb-ecom/src/main/java/com/ecommerce/project/controller/ProductController.java
  class ProductController (line 16) | @RestController
    method addProduct (line 23) | @PostMapping("/admin/categories/{categoryId}/product")
    method addProductSeller (line 30) | @PostMapping("/seller/categories/{categoryId}/product")
    method getAllProducts (line 37) | @GetMapping("/public/products")
    method getProductsByCategory (line 50) | @GetMapping("/public/categories/{categoryId}/products")
    method getProductsByKeyword (line 60) | @GetMapping("/public/products/keyword/{keyword}")
    method updateProduct (line 70) | @PutMapping("/admin/products/{productId}")
    method deleteProduct (line 77) | @DeleteMapping("/admin/products/{productId}")
    method updateProductImage (line 83) | @PutMapping("/admin/products/{productId}/image")
    method getAllProductsForAdmin (line 91) | @GetMapping("/admin/products")
    method getAllProductsForSeller (line 103) | @GetMapping("/seller/products")
    method updateProductSeller (line 114) | @PutMapping("/seller/products/{productId}")
    method deleteProductSeller (line 121) | @DeleteMapping("/seller/products/{productId}")
    method updateProductImageSeller (line 127) | @PutMapping("/seller/products/{productId}/image")

FILE: sb-ecom/src/main/java/com/ecommerce/project/exceptions/APIException.java
  class APIException (line 3) | public class APIException extends RuntimeException {
    method APIException (line 6) | public APIException() {
    method APIException (line 9) | public APIException(String message) {

FILE: sb-ecom/src/main/java/com/ecommerce/project/exceptions/MyGlobalExceptionHandler.java
  class MyGlobalExceptionHandler (line 15) | @RestControllerAdvice
    method myMethodArgumentNotValidException (line 18) | @ExceptionHandler(MethodArgumentNotValidException.class)
    method myResourceNotFoundException (line 30) | @ExceptionHandler(ResourceNotFoundException.class)
    method myAPIException (line 37) | @ExceptionHandler(APIException.class)

FILE: sb-ecom/src/main/java/com/ecommerce/project/exceptions/ResourceNotFoundException.java
  class ResourceNotFoundException (line 3) | public class ResourceNotFoundException extends RuntimeException {
    method ResourceNotFoundException (line 9) | public ResourceNotFoundException() {
    method ResourceNotFoundException (line 12) | public ResourceNotFoundException(String resourceName, String field, St...
    method ResourceNotFoundException (line 19) | public ResourceNotFoundException(String resourceName, String field, Lo...

FILE: sb-ecom/src/main/java/com/ecommerce/project/model/Address.java
  class Address (line 14) | @Entity
    method Address (line 52) | public Address(String street, String buildingName, String city, String...

FILE: sb-ecom/src/main/java/com/ecommerce/project/model/AppRole.java
  type AppRole (line 3) | public enum AppRole {

FILE: sb-ecom/src/main/java/com/ecommerce/project/model/Cart.java
  class Cart (line 11) | @Entity

FILE: sb-ecom/src/main/java/com/ecommerce/project/model/CartItem.java
  class CartItem (line 8) | @Entity

FILE: sb-ecom/src/main/java/com/ecommerce/project/model/Category.java
  class Category (line 12) | @Entity(name = "categories")

FILE: sb-ecom/src/main/java/com/ecommerce/project/model/Order.java
  class Order (line 13) | @Entity

FILE: sb-ecom/src/main/java/com/ecommerce/project/model/OrderItem.java
  class OrderItem (line 8) | @Entity

FILE: sb-ecom/src/main/java/com/ecommerce/project/model/Payment.java
  class Payment (line 10) | @Entity
    method Payment (line 35) | public Payment(String paymentMethod, String pgPaymentId, String pgStatus,

FILE: sb-ecom/src/main/java/com/ecommerce/project/model/Product.java
  class Product (line 14) | @Entity

FILE: sb-ecom/src/main/java/com/ecommerce/project/model/Role.java
  class Role (line 9) | @Entity
    method Role (line 26) | public Role(AppRole roleName) {

FILE: sb-ecom/src/main/java/com/ecommerce/project/model/User.java
  class User (line 14) | @Entity
    method User (line 45) | public User(String userName, String email, String password) {

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/APIResponse.java
  class APIResponse (line 7) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/AddressDTO.java
  class AddressDTO (line 7) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/AnalyticsResponse.java
  class AnalyticsResponse (line 7) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/AuthenticationResult.java
  class AuthenticationResult (line 8) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/CartDTO.java
  class CartDTO (line 10) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/CartItemDTO.java
  class CartItemDTO (line 7) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/CategoryDTO.java
  class CategoryDTO (line 7) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/CategoryResponse.java
  class CategoryResponse (line 9) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/OrderDTO.java
  class OrderDTO (line 10) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/OrderItemDTO.java
  class OrderItemDTO (line 7) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/OrderRequestDTO.java
  class OrderRequestDTO (line 7) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/OrderResponse.java
  class OrderResponse (line 9) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/OrderStatusUpdateDto.java
  class OrderStatusUpdateDto (line 5) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/PaymentDTO.java
  class PaymentDTO (line 7) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/ProductDTO.java
  class ProductDTO (line 7) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/ProductResponse.java
  class ProductResponse (line 9) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/StripePaymentDto.java
  class StripePaymentDto (line 8) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/UserDTO.java
  class UserDTO (line 13) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/payload/UserResponse.java
  class UserResponse (line 9) | @Data

FILE: sb-ecom/src/main/java/com/ecommerce/project/repositories/AddressRepository.java
  type AddressRepository (line 6) | public interface AddressRepository extends JpaRepository<Address, Long> {

FILE: sb-ecom/src/main/java/com/ecommerce/project/repositories/CartItemRepository.java
  type CartItemRepository (line 8) | public interface CartItemRepository extends JpaRepository<CartItem, Long> {
    method findCartItemByProductIdAndCartId (line 9) | @Query("SELECT ci FROM CartItem ci WHERE ci.cart.id = ?1 AND ci.produc...
    method deleteCartItemByProductIdAndCartId (line 12) | @Modifying
    method deleteAllByCartId (line 16) | @Modifying

FILE: sb-ecom/src/main/java/com/ecommerce/project/repositories/CartRepository.java
  type CartRepository (line 9) | public interface CartRepository extends JpaRepository<Cart, Long> {
    method findCartByEmail (line 10) | @Query("SELECT c FROM Cart c WHERE c.user.email = ?1")
    method findCartByEmailAndCartId (line 13) | @Query("SELECT c FROM Cart c WHERE c.user.email = ?1 AND c.id = ?2")
    method findCartsByProductId (line 16) | @Query("SELECT c FROM Cart c JOIN FETCH c.cartItems ci JOIN FETCH ci.p...

FILE: sb-ecom/src/main/java/com/ecommerce/project/repositories/CategoryRepository.java
  type CategoryRepository (line 6) | public interface CategoryRepository extends JpaRepository<Category,Long> {
    method findByCategoryName (line 7) | Category findByCategoryName(String categoryName);

FILE: sb-ecom/src/main/java/com/ecommerce/project/repositories/OrderItemRepository.java
  type OrderItemRepository (line 9) | @Repository

FILE: sb-ecom/src/main/java/com/ecommerce/project/repositories/OrderRepository.java
  type OrderRepository (line 10) | @Repository
    method getTotalRevenue (line 13) | @Query("SELECT COALESCE(SUM(o.totalAmount), 0) FROM Order o")

FILE: sb-ecom/src/main/java/com/ecommerce/project/repositories/PaymentRepository.java
  type PaymentRepository (line 9) | @Repository

FILE: sb-ecom/src/main/java/com/ecommerce/project/repositories/ProductRepository.java
  type ProductRepository (line 12) | @Repository
    method findByCategoryOrderByPriceAsc (line 14) | Page<Product> findByCategoryOrderByPriceAsc(Category category, Pageabl...
    method findByProductNameLikeIgnoreCase (line 16) | Page<Product> findByProductNameLikeIgnoreCase(String keyword, Pageable...
    method findByUser (line 18) | Page<Product> findByUser(User user, Pageable pageDetails);

FILE: sb-ecom/src/main/java/com/ecommerce/project/repositories/RoleRepository.java
  type RoleRepository (line 9) | public interface RoleRepository extends JpaRepository<Role, Long> {
    method findByRoleName (line 10) | Optional<Role> findByRoleName(AppRole appRole);

FILE: sb-ecom/src/main/java/com/ecommerce/project/repositories/UserRepository.java
  type UserRepository (line 14) | @Repository
    method findByUserName (line 17) | Optional<User> findByUserName(String username);
    method existsByUserName (line 19) | Boolean existsByUserName(String username);
    method existsByEmail (line 21) | Boolean existsByEmail(String email);
    method findByRoleName (line 23) | @Query("SELECT u FROM User u JOIN u.roles r WHERE r.roleName = :role")

FILE: sb-ecom/src/main/java/com/ecommerce/project/security/WebConfig.java
  class WebConfig (line 8) | @Configuration
    method addCorsMappings (line 14) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/security/WebSecurityConfig.java
  class WebSecurityConfig (line 36) | @Configuration
    method authenticationJwtTokenFilter (line 46) | @Bean
    method authenticationProvider (line 52) | @Bean
    method authenticationManager (line 63) | @Bean
    method passwordEncoder (line 68) | @Bean
    method filterChain (line 75) | @Bean
    method webSecurityCustomizer (line 105) | @Bean
    method initData (line 116) | @Bean

FILE: sb-ecom/src/main/java/com/ecommerce/project/security/jwt/AuthEntryPointJwt.java
  class AuthEntryPointJwt (line 18) | @Component
    method commence (line 23) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/security/jwt/AuthTokenFilter.java
  class AuthTokenFilter (line 20) | @Component
    method doFilterInternal (line 30) | @Override
    method parseJwt (line 64) | private String parseJwt(HttpServletRequest request) {

FILE: sb-ecom/src/main/java/com/ecommerce/project/security/jwt/JwtUtils.java
  class JwtUtils (line 21) | @Component
    method getJwtFromCookies (line 34) | public String getJwtFromCookies(HttpServletRequest request) {
    method getJwtFromHeader (line 43) | public String getJwtFromHeader(HttpServletRequest request) {
    method generateJwtCookie (line 51) | public ResponseCookie generateJwtCookie(UserDetailsImpl userPrincipal) {
    method getCleanJwtCookie (line 62) | public ResponseCookie getCleanJwtCookie() {
    method generateTokenFromUsername (line 69) | public String generateTokenFromUsername(String username) {
    method getUserNameFromJwtToken (line 78) | public String getUserNameFromJwtToken(String token) {
    method key (line 85) | private Key key() {
    method validateJwtToken (line 89) | public boolean validateJwtToken(String authToken) {

FILE: sb-ecom/src/main/java/com/ecommerce/project/security/request/LoginRequest.java
  class LoginRequest (line 5) | public class LoginRequest {
    method getUsername (line 12) | public String getUsername() {
    method setUsername (line 16) | public void setUsername(String username) {
    method getPassword (line 20) | public String getPassword() {
    method setPassword (line 24) | public void setPassword(String password) {

FILE: sb-ecom/src/main/java/com/ecommerce/project/security/request/SignupRequest.java
  class SignupRequest (line 8) | @Data
    method getRole (line 25) | public Set<String> getRole() {
    method setRole (line 29) | public void setRole(Set<String> role) {

FILE: sb-ecom/src/main/java/com/ecommerce/project/security/response/MessageResponse.java
  class MessageResponse (line 3) | public class MessageResponse {
    method MessageResponse (line 6) | public MessageResponse(String message) {
    method getMessage (line 10) | public String getMessage() {
    method setMessage (line 14) | public void setMessage(String message) {

FILE: sb-ecom/src/main/java/com/ecommerce/project/security/response/UserInfoResponse.java
  class UserInfoResponse (line 5) | public class UserInfoResponse {
    method UserInfoResponse (line 12) | public UserInfoResponse(Long id, String username, List<String> roles, ...
    method UserInfoResponse (line 20) | public UserInfoResponse(Long id, String username, List<String> roles) {
    method getId (line 26) | public Long getId() {
    method setId (line 30) | public void setId(Long id) {
    method getJwtToken (line 34) | public String getJwtToken() {
    method setJwtToken (line 38) | public void setJwtToken(String jwtToken) {
    method getUsername (line 42) | public String getUsername() {
    method setUsername (line 46) | public void setUsername(String username) {
    method getRoles (line 50) | public List<String> getRoles() {
    method setRoles (line 54) | public void setRoles(List<String> roles) {
    method getEmail (line 58) | public String getEmail() {
    method setEmail (line 62) | public void setEmail(String email) {

FILE: sb-ecom/src/main/java/com/ecommerce/project/security/services/UserDetailsImpl.java
  class UserDetailsImpl (line 17) | @NoArgsConstructor
    method UserDetailsImpl (line 33) | public UserDetailsImpl(Long id, String username, String email, String ...
    method build (line 42) | public static UserDetailsImpl build(User user) {
    method getAuthorities (line 55) | @Override
    method getId (line 60) | public Long getId() {
    method getEmail (line 64) | public String getEmail() {
    method getPassword (line 68) | @Override
    method getUsername (line 73) | @Override
    method isAccountNonExpired (line 78) | @Override
    method isAccountNonLocked (line 83) | @Override
    method isCredentialsNonExpired (line 88) | @Override
    method isEnabled (line 93) | @Override
    method equals (line 98) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/security/services/UserDetailsServiceImpl.java
  class UserDetailsServiceImpl (line 15) | @Service
    method loadUserByUsername (line 20) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/AddressService.java
  type AddressService (line 8) | public interface AddressService {
    method createAddress (line 9) | AddressDTO createAddress(AddressDTO addressDTO, User user);
    method getAddresses (line 11) | List<AddressDTO> getAddresses();
    method getAddressesById (line 13) | AddressDTO getAddressesById(Long addressId);
    method getUserAddresses (line 15) | List<AddressDTO> getUserAddresses(User user);
    method updateAddress (line 17) | AddressDTO updateAddress(Long addressId, AddressDTO addressDTO);
    method deleteAddress (line 19) | String deleteAddress(Long addressId);

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/AddressServiceImpl.java
  class AddressServiceImpl (line 15) | @Service
    method createAddress (line 26) | @Override
    method getAddresses (line 37) | @Override
    method getAddressesById (line 45) | @Override
    method getUserAddresses (line 52) | @Override
    method updateAddress (line 60) | @Override
    method deleteAddress (line 82) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/AnalyticsService.java
  type AnalyticsService (line 5) | public interface AnalyticsService {
    method getAnalyticsData (line 6) | AnalyticsResponse getAnalyticsData();

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/AnalyticsServiceImpl.java
  class AnalyticsServiceImpl (line 9) | @Service
    method getAnalyticsData (line 18) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/AuthService.java
  type AuthService (line 14) | public interface AuthService {
    method login (line 16) | AuthenticationResult login(LoginRequest loginRequest);
    method register (line 18) | ResponseEntity<MessageResponse> register(SignupRequest signUpRequest);
    method getCurrentUserDetails (line 20) | UserInfoResponse getCurrentUserDetails(Authentication authentication);
    method logoutUser (line 22) | ResponseCookie logoutUser();
    method getAllSellers (line 24) | UserResponse getAllSellers(Pageable pageable);

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/AuthServiceImpl.java
  class AuthServiceImpl (line 36) | @Service
    method login (line 58) | @Override
    method register (line 79) | @Override
    method getCurrentUserDetails (line 129) | @Override
    method logoutUser (line 143) | @Override
    method getAllSellers (line 148) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/CartService.java
  type CartService (line 9) | public interface CartService {
    method addProductToCart (line 10) | CartDTO addProductToCart(Long productId, Integer quantity);
    method getAllCarts (line 12) | List<CartDTO> getAllCarts();
    method getCart (line 14) | CartDTO getCart(String emailId, Long cartId);
    method updateProductQuantityInCart (line 16) | @Transactional
    method deleteProductFromCart (line 19) | String deleteProductFromCart(Long cartId, Long productId);
    method updateProductInCarts (line 21) | void updateProductInCarts(Long cartId, Long productId);
    method createOrUpdateCartWithItems (line 23) | String createOrUpdateCartWithItems(List<CartItemDTO> cartItems);

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/CartServiceImpl.java
  class CartServiceImpl (line 24) | @Service
    method addProductToCart (line 41) | @Override
    method getAllCarts (line 94) | @Override
    method getCart (line 121) | @Override
    method updateProductQuantityInCart (line 137) | @Transactional
    method createCart (line 207) | private Cart createCart() {
    method deleteProductFromCart (line 222) | @Transactional
    method updateProductInCarts (line 243) | @Override
    method createOrUpdateCartWithItems (line 268) | @Transactional

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/CategoryService.java
  type CategoryService (line 7) | public interface CategoryService {
    method getAllCategories (line 8) | CategoryResponse getAllCategories(Integer pageNumber, Integer pageSize...
    method createCategory (line 9) | CategoryDTO createCategory(CategoryDTO categoryDTO);
    method deleteCategory (line 11) | CategoryDTO deleteCategory(Long categoryId);
    method updateCategory (line 13) | CategoryDTO updateCategory(CategoryDTO categoryDTO, Long categoryId);

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/CategoryServiceImpl.java
  class CategoryServiceImpl (line 19) | @Service
    method getAllCategories (line 28) | @Override
    method createCategory (line 55) | @Override
    method deleteCategory (line 65) | @Override
    method updateCategory (line 74) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/FileService.java
  type FileService (line 7) | public interface FileService {
    method uploadImage (line 8) | String uploadImage(String path, MultipartFile file) throws IOException;

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/FileServiceImpl.java
  class FileServiceImpl (line 12) | @Service
    method uploadImage (line 15) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/OrderService.java
  type OrderService (line 7) | public interface OrderService {
    method placeOrder (line 8) | @Transactional
    method getAllOrders (line 11) | OrderResponse getAllOrders(Integer pageNumber, Integer pageSize, Strin...
    method updateOrder (line 13) | OrderDTO updateOrder(Long orderId, String status);
    method getAllSellerOrders (line 15) | OrderResponse getAllSellerOrders(Integer pageNumber, Integer pageSize,...

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/OrderServiceImpl.java
  class OrderServiceImpl (line 25) | @Service
    method placeOrder (line 55) | @Override
    method getAllOrders (line 120) | @Override
    method updateOrder (line 141) | @Override
    method getAllSellerOrders (line 150) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/ProductService.java
  type ProductService (line 9) | public interface ProductService {
    method addProduct (line 10) | ProductDTO addProduct(Long categoryId, ProductDTO product);
    method getAllProducts (line 12) | ProductResponse getAllProducts(Integer pageNumber, Integer pageSize, S...
    method searchByCategory (line 14) | ProductResponse searchByCategory(Long categoryId, Integer pageNumber, ...
    method searchProductByKeyword (line 16) | ProductResponse searchProductByKeyword(String keyword, Integer pageNum...
    method updateProduct (line 18) | ProductDTO updateProduct(Long productId, ProductDTO product);
    method deleteProduct (line 20) | ProductDTO deleteProduct(Long productId);
    method updateProductImage (line 22) | ProductDTO updateProductImage(Long productId, MultipartFile image) thr...
    method getAllProductsForAdmin (line 24) | ProductResponse getAllProductsForAdmin(Integer pageNumber, Integer pag...
    method getAllProductsForSeller (line 26) | ProductResponse getAllProductsForSeller(Integer pageNumber, Integer pa...

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/ProductServiceImpl.java
  class ProductServiceImpl (line 31) | @Service
    method addProduct (line 60) | @Override
    method getAllProducts (line 91) | @Override
    method getAllProductsForAdmin (line 132) | @Override
    method getAllProductsForSeller (line 161) | @Override
    method constructImageUrl (line 192) | private String constructImageUrl(String imageName) {
    method searchByCategory (line 196) | @Override
    method searchProductByKeyword (line 229) | @Override
    method updateProduct (line 257) | @Override
    method deleteProduct (line 292) | @Override
    method updateProductImage (line 305) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/StripeService.java
  type StripeService (line 7) | public interface StripeService {
    method paymentIntent (line 9) | PaymentIntent paymentIntent(StripePaymentDto stripePaymentDto) throws ...

FILE: sb-ecom/src/main/java/com/ecommerce/project/service/StripeServiceImpl.java
  class StripeServiceImpl (line 17) | @Service
    method init (line 24) | @PostConstruct
    method paymentIntent (line 29) | @Override

FILE: sb-ecom/src/main/java/com/ecommerce/project/util/AuthUtil.java
  class AuthUtil (line 11) | @Component
    method loggedInEmail (line 17) | public String loggedInEmail(){
    method loggedInUserId (line 25) | public Long loggedInUserId(){
    method loggedInUser (line 33) | public User loggedInUser(){

FILE: sb-ecom/src/test/java/com/ecommerce/project/SbEcomApplicationTests.java
  class SbEcomApplicationTests (line 6) | @SpringBootTest
    method contextLoads (line 9) | @Test
Condensed preview — 266 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (536K chars).
[
  {
    "path": "FirstSpring/.gitignore",
    "chars": 395,
    "preview": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**/target/\n!**/src/test/**/target/\n\n### STS ###\n.apt_genera"
  },
  {
    "path": "FirstSpring/mvnw",
    "chars": 11290,
    "preview": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Softwa"
  },
  {
    "path": "FirstSpring/mvnw.cmd",
    "chars": 7592,
    "preview": "@REM ----------------------------------------------------------------------------\n@REM Licensed to the Apache Software F"
  },
  {
    "path": "FirstSpring/pom.xml",
    "chars": 1244,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "FirstSpring/src/main/java/com/embarkx/FirstSpring/FirstSpringApplication.java",
    "chars": 339,
    "preview": "package com.embarkx.FirstSpring;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.aut"
  },
  {
    "path": "FirstSpring/src/main/java/com/embarkx/FirstSpring/HelloController.java",
    "chars": 565,
    "preview": "package com.embarkx.FirstSpring;\n\nimport org.springframework.web.bind.annotation.*;\n\n@RestController\npublic class HelloC"
  },
  {
    "path": "FirstSpring/src/main/java/com/embarkx/FirstSpring/HelloResponse.java",
    "chars": 323,
    "preview": "package com.embarkx.FirstSpring;\n\npublic class HelloResponse {\n    private String message;\n\n    public HelloResponse(Str"
  },
  {
    "path": "FirstSpring/src/main/resources/application.properties",
    "chars": 16,
    "preview": "server.port=8080"
  },
  {
    "path": "FirstSpring/src/test/java/com/embarkx/FirstSpring/FirstSpringApplicationTests.java",
    "chars": 220,
    "preview": "package com.embarkx.FirstSpring;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context.Spring"
  },
  {
    "path": "Java Spring Boot- Professional eCommerce Project Masterclass.postman_collection.json",
    "chars": 23240,
    "preview": "{\n\t\"info\": {\n\t\t\"_postman_id\": \"e901da3d-88dd-479e-a9f9-2a1a38b6282b\",\n\t\t\"name\": \"Java Spring Boot: Professional eCommerc"
  },
  {
    "path": "README.md",
    "chars": 4124,
    "preview": "This is the Official repository of **Java Spring Boot: Professional eCommerce Project Masterclass** on Udemy\r\n\r\n# The Ul"
  },
  {
    "path": "SpringExample/.gitignore",
    "chars": 490,
    "preview": "target/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**/target/\n!**/src/test/**/target/\n\n### IntelliJ IDEA ###\n.idea/mod"
  },
  {
    "path": "SpringExample/.idea/.gitignore",
    "chars": 47,
    "preview": "# Default ignored files\n/shelf/\n/workspace.xml\n"
  },
  {
    "path": "SpringExample/.idea/encodings.xml",
    "chars": 261,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"file://$PROJEC"
  },
  {
    "path": "SpringExample/.idea/misc.xml",
    "chars": 526,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ExternalStorageConfigurationManager\" ena"
  },
  {
    "path": "SpringExample/.idea/uiDesigner.xml",
    "chars": 8792,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Palette2\">\n    <group name=\"Swing\">\n    "
  },
  {
    "path": "SpringExample/.idea/vcs.xml",
    "chars": 183,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping dire"
  },
  {
    "path": "SpringExample/pom.xml",
    "chars": 1230,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "SpringExample/src/main/java/car/example/bean/App.java",
    "chars": 446,
    "preview": "package car.example.bean;\n\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.sup"
  },
  {
    "path": "SpringExample/src/main/java/car/example/bean/MyBean.java",
    "chars": 399,
    "preview": "package car.example.bean;\n\npublic class MyBean {\n    private String message;\n\n    public void setMessage(String message)"
  },
  {
    "path": "SpringExample/src/main/java/car/example/constructor/injection/App.java",
    "chars": 459,
    "preview": "package car.example.constructor.injection;\n\nimport org.springframework.context.ApplicationContext;\nimport org.springfram"
  },
  {
    "path": "SpringExample/src/main/java/car/example/constructor/injection/Car.java",
    "chars": 316,
    "preview": "package car.example.constructor.injection;\n\npublic class Car {\n    private Specification specification;\n\n    public Car("
  },
  {
    "path": "SpringExample/src/main/java/car/example/constructor/injection/Specification.java",
    "chars": 585,
    "preview": "package car.example.constructor.injection;\n\npublic class Specification {\n    private String make;\n    private String mod"
  },
  {
    "path": "SpringExample/src/main/java/car/example/setter/injection/App.java",
    "chars": 449,
    "preview": "package car.example.setter.injection;\n\nimport org.springframework.context.ApplicationContext;\nimport org.springframework"
  },
  {
    "path": "SpringExample/src/main/java/car/example/setter/injection/Car.java",
    "chars": 329,
    "preview": "package car.example.setter.injection;\n\npublic class Car {\n    private Specification specification;\n\n    public void setS"
  },
  {
    "path": "SpringExample/src/main/java/car/example/setter/injection/Specification.java",
    "chars": 580,
    "preview": "package car.example.setter.injection;\n\npublic class Specification {\n    private String make;\n    private String model;\n\n"
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowire/constructor/App.java",
    "chars": 448,
    "preview": "package com.example.autowire.constructor;\n\nimport org.springframework.context.ApplicationContext;\nimport org.springframe"
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowire/constructor/Car.java",
    "chars": 436,
    "preview": "package com.example.autowire.constructor;\n\npublic class Car {\n    private Specification specification;\n\n    public Car(S"
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowire/constructor/Specification.java",
    "chars": 584,
    "preview": "package com.example.autowire.constructor;\n\npublic class Specification {\n    private String make;\n    private String mode"
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowire/name/App.java",
    "chars": 434,
    "preview": "package com.example.autowire.name;\n\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.co"
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowire/name/Car.java",
    "chars": 326,
    "preview": "package com.example.autowire.name;\n\npublic class Car {\n    private Specification specification;\n\n    public void setSpec"
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowire/name/Specification.java",
    "chars": 577,
    "preview": "package com.example.autowire.name;\n\npublic class Specification {\n    private String make;\n    private String model;\n\n   "
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowire/type/App.java",
    "chars": 434,
    "preview": "package com.example.autowire.type;\n\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.co"
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowire/type/Car.java",
    "chars": 326,
    "preview": "package com.example.autowire.type;\n\npublic class Car {\n    private Specification specification;\n\n    public void setSpec"
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowire/type/Specification.java",
    "chars": 577,
    "preview": "package com.example.autowire.type;\n\npublic class Specification {\n    private String make;\n    private String model;\n\n   "
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowired/annotation/App.java",
    "chars": 605,
    "preview": "package com.example.autowired.annotation;\n\nimport org.springframework.context.ApplicationContext;\nimport org.springframe"
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowired/annotation/AppConfig.java",
    "chars": 274,
    "preview": "package com.example.autowired.annotation;\n\nimport org.springframework.context.annotation.ComponentScan;\nimport org.sprin"
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowired/annotation/Employee.java",
    "chars": 1292,
    "preview": "package com.example.autowired.annotation;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springf"
  },
  {
    "path": "SpringExample/src/main/java/com/example/autowired/annotation/Manager.java",
    "chars": 570,
    "preview": "package com.example.autowired.annotation;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.spr"
  },
  {
    "path": "SpringExample/src/main/java/com/example/componentscan/App.java",
    "chars": 476,
    "preview": "package com.example.componentscan;\n\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.co"
  },
  {
    "path": "SpringExample/src/main/java/com/example/componentscan/Employee.java",
    "chars": 1285,
    "preview": "package com.example.componentscan;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframewor"
  },
  {
    "path": "SpringExample/src/main/java/com/example/componentscan/annotation/App.java",
    "chars": 565,
    "preview": "package com.example.componentscan.annotation;\n\nimport org.springframework.context.ApplicationContext;\nimport org.springf"
  },
  {
    "path": "SpringExample/src/main/java/com/example/componentscan/annotation/AppConfig.java",
    "chars": 282,
    "preview": "package com.example.componentscan.annotation;\n\nimport org.springframework.context.annotation.ComponentScan;\nimport org.s"
  },
  {
    "path": "SpringExample/src/main/java/com/example/componentscan/annotation/Employee.java",
    "chars": 1296,
    "preview": "package com.example.componentscan.annotation;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.spr"
  },
  {
    "path": "SpringExample/src/main/java/com/ioc/coupling/IOCExample.java",
    "chars": 928,
    "preview": "package com.ioc.coupling;\n\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.sup"
  },
  {
    "path": "SpringExample/src/main/java/com/ioc/coupling/NewDatabaseProvider.java",
    "chars": 190,
    "preview": "package com.ioc.coupling;\n\npublic class NewDatabaseProvider implements UserDataProvider {\n    @Override\n    public Strin"
  },
  {
    "path": "SpringExample/src/main/java/com/ioc/coupling/UserDataProvider.java",
    "chars": 94,
    "preview": "package com.ioc.coupling;\n\npublic interface UserDataProvider {\n    String getUserDetails();\n}\n"
  },
  {
    "path": "SpringExample/src/main/java/com/ioc/coupling/UserDatabaseProvider.java",
    "chars": 289,
    "preview": "package com.ioc.coupling;\n\n// A - MySQL, PostgreSQL\n// B - Web Service, MongoDB\n\npublic class UserDatabaseProvider imple"
  },
  {
    "path": "SpringExample/src/main/java/com/ioc/coupling/UserManager.java",
    "chars": 310,
    "preview": "package com.ioc.coupling;\n\npublic class UserManager {\n    private UserDataProvider userDataProvider;\n\n    public UserMan"
  },
  {
    "path": "SpringExample/src/main/java/com/ioc/coupling/WebServiceDataProvider.java",
    "chars": 201,
    "preview": "package com.ioc.coupling;\n\npublic class WebServiceDataProvider implements UserDataProvider {\n\n    @Override\n    public S"
  },
  {
    "path": "SpringExample/src/main/java/com/loose/coupling/LooseCouplingExample.java",
    "chars": 761,
    "preview": "package com.loose.coupling;\n\npublic class LooseCouplingExample {\n    public static void main(String[] args) {\n        Us"
  },
  {
    "path": "SpringExample/src/main/java/com/loose/coupling/NewDatabaseProvider.java",
    "chars": 191,
    "preview": "package com.loose.coupling;\n\npublic class NewDatabaseProvider implements UserDataProvider{\n    @Override\n    public Stri"
  },
  {
    "path": "SpringExample/src/main/java/com/loose/coupling/UserDataProvider.java",
    "chars": 96,
    "preview": "package com.loose.coupling;\n\npublic interface UserDataProvider {\n    String getUserDetails();\n}\n"
  },
  {
    "path": "SpringExample/src/main/java/com/loose/coupling/UserDatabaseProvider.java",
    "chars": 291,
    "preview": "package com.loose.coupling;\n\n// A - MySQL, PostgreSQL\n// B - Web Service, MongoDB\n\npublic class UserDatabaseProvider imp"
  },
  {
    "path": "SpringExample/src/main/java/com/loose/coupling/UserManager.java",
    "chars": 312,
    "preview": "package com.loose.coupling;\n\npublic class UserManager {\n    private UserDataProvider userDataProvider;\n\n    public UserM"
  },
  {
    "path": "SpringExample/src/main/java/com/loose/coupling/WebServiceDataProvider.java",
    "chars": 202,
    "preview": "package com.loose.coupling;\n\npublic class WebServiceDataProvider implements UserDataProvider{\n\n    @Override\n    public "
  },
  {
    "path": "SpringExample/src/main/java/com/tight/coupling/TightCouplingExample.java",
    "chars": 226,
    "preview": "package com.tight.coupling;\n\npublic class TightCouplingExample {\n    public static void main(String[] args) {\n        Us"
  },
  {
    "path": "SpringExample/src/main/java/com/tight/coupling/UserDatabase.java",
    "chars": 241,
    "preview": "package com.tight.coupling;\n\n// A - MySQL, PostgreSQL\n// B - Web Service, MongoDB\n\npublic class UserDatabase {\n    publi"
  },
  {
    "path": "SpringExample/src/main/java/com/tight/coupling/UserManager.java",
    "chars": 204,
    "preview": "package com.tight.coupling;\n\npublic class UserManager {\n    private UserDatabase userDatabase = new UserDatabase();\n\n   "
  },
  {
    "path": "SpringExample/src/main/resources/applicationBeanContext.xml",
    "chars": 475,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http"
  },
  {
    "path": "SpringExample/src/main/resources/applicationConstructorInjection.xml",
    "chars": 675,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http"
  },
  {
    "path": "SpringExample/src/main/resources/applicationIoCLooseCouplingExample.xml",
    "chars": 1087,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http"
  },
  {
    "path": "SpringExample/src/main/resources/applicationSetterInjection.xml",
    "chars": 679,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http"
  },
  {
    "path": "SpringExample/src/main/resources/autowireByConstructor.xml",
    "chars": 857,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http"
  },
  {
    "path": "SpringExample/src/main/resources/autowireByName.xml",
    "chars": 803,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http"
  },
  {
    "path": "SpringExample/src/main/resources/autowireByType.xml",
    "chars": 832,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http"
  },
  {
    "path": "SpringExample/src/main/resources/componentScanDemo.xml",
    "chars": 562,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http"
  },
  {
    "path": "ecom-frontend/.gitignore",
    "chars": 258,
    "preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndis"
  },
  {
    "path": "ecom-frontend/README.md",
    "chars": 451,
    "preview": "# React + Vite\n\nThis template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.\n\nCur"
  },
  {
    "path": "ecom-frontend/eslint.config.js",
    "chars": 1003,
    "preview": "import js from '@eslint/js'\nimport globals from 'globals'\nimport react from 'eslint-plugin-react'\nimport reactHooks from"
  },
  {
    "path": "ecom-frontend/index.html",
    "chars": 361,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/"
  },
  {
    "path": "ecom-frontend/package.json",
    "chars": 1297,
    "preview": "{\n  \"name\": \"ecom-frontend\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vit"
  },
  {
    "path": "ecom-frontend/postcss.config.js",
    "chars": 69,
    "preview": "export default {\n  plugins: {\n    '@tailwindcss/postcss': {},\n  },\n}\n"
  },
  {
    "path": "ecom-frontend/src/App.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "ecom-frontend/src/App.jsx",
    "chars": 2481,
    "preview": "import React, { useState } from 'react'\nimport './App.css'\nimport Products from './components/products/Products'\nimport "
  },
  {
    "path": "ecom-frontend/src/api/api.js",
    "chars": 163,
    "preview": "import axios from \"axios\";\n\nconst api = axios.create({\n    baseURL: `${import.meta.env.VITE_BACK_END_URL}/api`,\n    with"
  },
  {
    "path": "ecom-frontend/src/components/About.jsx",
    "chars": 3110,
    "preview": "import ProductCard from \"./shared/ProductCard\";\n\nconst products = [\n    {\n        image: \"https://embarkx.com/sample/pla"
  },
  {
    "path": "ecom-frontend/src/components/BackDrop.jsx",
    "chars": 261,
    "preview": "import React from 'react'\n\nconst BackDrop = ({ data }) => {\n  return (\n    <div\n        className={`z-20 transition-all "
  },
  {
    "path": "ecom-frontend/src/components/Contact.jsx",
    "chars": 3414,
    "preview": "import { FaEnvelope, FaMapMarkedAlt, FaPhone } from \"react-icons/fa\";\n\nconst Contact = () => {\n    return(\n        <div\n"
  },
  {
    "path": "ecom-frontend/src/components/PrivateRoute.jsx",
    "chars": 1062,
    "preview": "import React from 'react'\nimport { useSelector } from 'react-redux'\nimport { Navigate, Outlet, useLocation } from 'react"
  },
  {
    "path": "ecom-frontend/src/components/UserMenu.jsx",
    "chars": 3309,
    "preview": "import { Avatar, Button, Menu, MenuItem } from '@mui/material';\nimport React from 'react'\nimport { BiUser } from 'react-"
  },
  {
    "path": "ecom-frontend/src/components/admin/AdminLayout.jsx",
    "chars": 2313,
    "preview": "import React, { useState } from 'react'\nimport Sidebar from '../shared/Sidebar'\nimport { Outlet } from 'react-router-dom"
  },
  {
    "path": "ecom-frontend/src/components/admin/categories/AddCategoryForm.jsx",
    "chars": 2378,
    "preview": "import React, { useEffect } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { useDispatch } from \"react-"
  },
  {
    "path": "ecom-frontend/src/components/admin/categories/Category.jsx",
    "chars": 5333,
    "preview": "import React, { useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useLocation, u"
  },
  {
    "path": "ecom-frontend/src/components/admin/dashboard/Dashboard.jsx",
    "chars": 1609,
    "preview": "import React, { useEffect } from 'react'\nimport DashboardOverview from './DashboardOverview'\nimport { FaBoxOpen, FaDolla"
  },
  {
    "path": "ecom-frontend/src/components/admin/dashboard/DashboardOverview.jsx",
    "chars": 861,
    "preview": "import { Icon } from '@mui/material';\nimport React from 'react'\nimport { formatRevenue } from '../../../utils/formatPric"
  },
  {
    "path": "ecom-frontend/src/components/admin/orders/OrderTable.jsx",
    "chars": 2771,
    "preview": "import { DataGrid } from '@mui/x-data-grid'\nimport { adminOrderTableColumn } from '../../helper/tableColumn';\nimport { u"
  },
  {
    "path": "ecom-frontend/src/components/admin/orders/Orders.jsx",
    "chars": 2394,
    "preview": "import React from 'react'\nimport { FaShoppingCart } from 'react-icons/fa';\nimport OrderTable from './OrderTable';\nimport"
  },
  {
    "path": "ecom-frontend/src/components/admin/orders/UpdateOrderForm.jsx",
    "chars": 3264,
    "preview": "import { Button, FormControl, FormHelperText, InputLabel, MenuItem, Select } from '@mui/material'\nimport React, { useSta"
  },
  {
    "path": "ecom-frontend/src/components/admin/products/AddProductForm.jsx",
    "chars": 6890,
    "preview": "import React, { useEffect, useState } from 'react'\nimport { useForm } from 'react-hook-form'\nimport InputField from '../"
  },
  {
    "path": "ecom-frontend/src/components/admin/products/AdminProducts.jsx",
    "chars": 6763,
    "preview": "import React, { useState } from 'react'\nimport { MdAddShoppingCart } from 'react-icons/md';\nimport { useDispatch, useSel"
  },
  {
    "path": "ecom-frontend/src/components/admin/products/ImageUploadForm.jsx",
    "chars": 4113,
    "preview": "import React, { useRef, useState } from 'react'\nimport { FaCloudUploadAlt } from 'react-icons/fa'\nimport Spinners from '"
  },
  {
    "path": "ecom-frontend/src/components/admin/sellers/AddSellerForm.jsx",
    "chars": 2731,
    "preview": "import React, { useState } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { useForm } from \"react-hook-"
  },
  {
    "path": "ecom-frontend/src/components/admin/sellers/SellerTable.jsx",
    "chars": 1842,
    "preview": "import React, { useState } from \"react\";\nimport { useLocation, useNavigate, useSearchParams } from \"react-router-dom\";\ni"
  },
  {
    "path": "ecom-frontend/src/components/admin/sellers/Sellers.jsx",
    "chars": 2166,
    "preview": "import React, { useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { MdPersonAdd } from \"react-i"
  },
  {
    "path": "ecom-frontend/src/components/admin/sellers/useSellerFilter.jsx",
    "chars": 1034,
    "preview": "import { useEffect } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { useDispatch } from \"reac"
  },
  {
    "path": "ecom-frontend/src/components/auth/LogIn.jsx",
    "chars": 3220,
    "preview": "import { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { AiOutlineLogin } from \"react-icons"
  },
  {
    "path": "ecom-frontend/src/components/auth/Register.jsx",
    "chars": 3606,
    "preview": "import React, { useState } from 'react'\nimport { useForm } from 'react-hook-form';\nimport { FaUserPlus } from 'react-ico"
  },
  {
    "path": "ecom-frontend/src/components/cart/Cart.jsx",
    "chars": 3297,
    "preview": "import { MdArrowBack, MdShoppingCart } from \"react-icons/md\";\nimport { useDispatch, useSelector } from \"react-redux\";\nim"
  },
  {
    "path": "ecom-frontend/src/components/cart/CartEmpty.jsx",
    "chars": 974,
    "preview": "import { MdArrowBack, MdShoppingCart } from \"react-icons/md\";\nimport { Link } from \"react-router-dom\";\n\nconst CartEmpty "
  },
  {
    "path": "ecom-frontend/src/components/cart/ItemContent.jsx",
    "chars": 4244,
    "preview": "import { useState } from \"react\";\nimport { HiOutlineTrash } from \"react-icons/hi\";\nimport SetQuantity from \"./SetQuantit"
  },
  {
    "path": "ecom-frontend/src/components/cart/SetQuantity.jsx",
    "chars": 860,
    "preview": "\nconst btnStyles = \"border-[1.2px] border-slate-800 px-3 py-1 rounded-sm\";\nconst SetQuantity = ({\n    quantity,\n    card"
  },
  {
    "path": "ecom-frontend/src/components/checkout/AddAddressForm.jsx",
    "chars": 4632,
    "preview": "import React, { useEffect } from 'react'\nimport InputField from '../shared/InputField'\nimport { useForm } from 'react-ho"
  },
  {
    "path": "ecom-frontend/src/components/checkout/AddressInfo.jsx",
    "chars": 3813,
    "preview": "\nimport React, { useState } from 'react'\nimport Skeleton from '../shared/Skeleton';\nimport { FaAddressBook } from 'react"
  },
  {
    "path": "ecom-frontend/src/components/checkout/AddressInfoModal.jsx",
    "chars": 1256,
    "preview": "import { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react';\nimport React from 'react'\nimport {"
  },
  {
    "path": "ecom-frontend/src/components/checkout/AddressList.jsx",
    "chars": 3431,
    "preview": "import React from 'react'\nimport { FaBuilding, FaCheckCircle, FaEdit, FaStreetView, FaTrash } from 'react-icons/fa';\nimp"
  },
  {
    "path": "ecom-frontend/src/components/checkout/Checkout.jsx",
    "chars": 4480,
    "preview": "import { Button, Step, StepLabel, Stepper } from '@mui/material';\nimport React, { useEffect, useState } from 'react'\nimp"
  },
  {
    "path": "ecom-frontend/src/components/checkout/DeleteModal.jsx",
    "chars": 3563,
    "preview": "import React from \"react\";\nimport { FaExclamationTriangle } from \"react-icons/fa\";\nimport { FaTimes } from \"react-icons/"
  },
  {
    "path": "ecom-frontend/src/components/checkout/OrderSummary.jsx",
    "chars": 3319,
    "preview": "import React from 'react'\nimport { formatPriceCalculation } from '../../utils/formatPrice'\n\nconst OrderSummary = ({ tota"
  },
  {
    "path": "ecom-frontend/src/components/checkout/PaymentConfirmation.jsx",
    "chars": 2567,
    "preview": "import React, { useEffect, useState } from 'react'\nimport { FaCheckCircle } from 'react-icons/fa';\nimport { useDispatch,"
  },
  {
    "path": "ecom-frontend/src/components/checkout/PaymentForm.jsx",
    "chars": 1901,
    "preview": "import { Skeleton } from '@mui/material';\nimport { PaymentElement, useElements, useStripe } from '@stripe/react-stripe-j"
  },
  {
    "path": "ecom-frontend/src/components/checkout/PaymentMethod.jsx",
    "chars": 1966,
    "preview": "import { FormControl, FormControlLabel, Radio, RadioGroup } from '@mui/material'\nimport React, { useEffect } from 'react"
  },
  {
    "path": "ecom-frontend/src/components/checkout/PaypalPayment.jsx",
    "chars": 457,
    "preview": "import { Alert, AlertTitle } from '@mui/material'\nimport React from 'react'\n\nconst PaypalPayment = () => {\n  return (\n  "
  },
  {
    "path": "ecom-frontend/src/components/checkout/StripePayment.jsx",
    "chars": 1585,
    "preview": "import { Alert, AlertTitle, Skeleton } from '@mui/material'\nimport { Elements } from '@stripe/react-stripe-js';\nimport {"
  },
  {
    "path": "ecom-frontend/src/components/helper/tableColumn.jsx",
    "chars": 10609,
    "preview": "import { FaEdit, FaEye, FaImage, FaTrashAlt } from \"react-icons/fa\";\nimport { MdOutlineEmail } from \"react-icons/md\";\n\ne"
  },
  {
    "path": "ecom-frontend/src/components/home/HeroBanner.jsx",
    "chars": 2881,
    "preview": "// Import Swiper React components\nimport { Swiper, SwiperSlide } from 'swiper/react';\nimport 'swiper/css/navigation';\nim"
  },
  {
    "path": "ecom-frontend/src/components/home/Home.jsx",
    "chars": 2097,
    "preview": "import { useDispatch, useSelector } from \"react-redux\";\nimport HeroBanner from \"./HeroBanner\";\nimport { useEffect } from"
  },
  {
    "path": "ecom-frontend/src/components/products/Filter.jsx",
    "chars": 5221,
    "preview": "import { Button, FormControl, InputLabel, MenuItem, Select, Tooltip } from \"@mui/material\";\nimport { useEffect, useState"
  },
  {
    "path": "ecom-frontend/src/components/products/Products.jsx",
    "chars": 2073,
    "preview": "import { FaExclamationTriangle } from \"react-icons/fa\";\nimport ProductCard from \"../shared/ProductCard\";\nimport { useDis"
  },
  {
    "path": "ecom-frontend/src/components/shared/DeleteModal.jsx",
    "chars": 3622,
    "preview": "import React from \"react\";\nimport { FaExclamationTriangle } from \"react-icons/fa\";\nimport { FaTimes } from \"react-icons/"
  },
  {
    "path": "ecom-frontend/src/components/shared/ErrorPage.jsx",
    "chars": 460,
    "preview": "import React from 'react'\nimport { FaExclamationTriangle } from 'react-icons/fa'\n\nconst ErrorPage = ({ message}) => {\n  "
  },
  {
    "path": "ecom-frontend/src/components/shared/InputField.jsx",
    "chars": 2015,
    "preview": "const InputField = ({\n    label,\n    id,\n    type,\n    errors,\n    register,\n    required,\n    message,\n    className,\n "
  },
  {
    "path": "ecom-frontend/src/components/shared/Loader.jsx",
    "chars": 829,
    "preview": "import { RotatingLines } from \"react-loader-spinner\";\n\nconst Loader = ({ text }) => {\n    return (\n        <div classNam"
  },
  {
    "path": "ecom-frontend/src/components/shared/Modal.jsx",
    "chars": 2162,
    "preview": "import { Description, Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react'\nimport { RxCross1 } fr"
  },
  {
    "path": "ecom-frontend/src/components/shared/Navbar.jsx",
    "chars": 4746,
    "preview": "import { Badge } from \"@mui/material\";\nimport { useState } from \"react\";\nimport { FaShoppingCart, FaSignInAlt, FaStore }"
  },
  {
    "path": "ecom-frontend/src/components/shared/Paginations.jsx",
    "chars": 938,
    "preview": "import { Pagination } from \"@mui/material\";\nimport { useLocation, useNavigate, useSearchParams } from \"react-router-dom\""
  },
  {
    "path": "ecom-frontend/src/components/shared/ProductCard.jsx",
    "chars": 4517,
    "preview": "import { useState } from \"react\";\nimport { FaShoppingCart } from \"react-icons/fa\";\nimport ProductViewModal from \"./Produ"
  },
  {
    "path": "ecom-frontend/src/components/shared/ProductViewModal.jsx",
    "chars": 3451,
    "preview": "import { Button, Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react'\nimport { Divider } from '@m"
  },
  {
    "path": "ecom-frontend/src/components/shared/SelectTextField.jsx",
    "chars": 2045,
    "preview": "import { Listbox, ListboxButton, ListboxOption, ListboxOptions } from \"@headlessui/react\";\nimport { FaCheck } from \"reac"
  },
  {
    "path": "ecom-frontend/src/components/shared/Sidebar.jsx",
    "chars": 2138,
    "preview": "import React from 'react'\nimport { FaTachometerAlt } from 'react-icons/fa';\nimport { useSelector } from 'react-redux';\ni"
  },
  {
    "path": "ecom-frontend/src/components/shared/Skeleton.jsx",
    "chars": 4027,
    "preview": "import React from \"react\";\n\nconst Skeleton = () => {\n  return (\n    <div role=\"status\" className=\"space-y-2.5 animate-pu"
  },
  {
    "path": "ecom-frontend/src/components/shared/Spinners.jsx",
    "chars": 1341,
    "preview": "import React from 'react'\n\nconst Spinners = () => {\n  return (\n<div role=\"status\">\n    <svg aria-hidden=\"true\" class=\"w-"
  },
  {
    "path": "ecom-frontend/src/components/shared/Status.jsx",
    "chars": 261,
    "preview": "const Status = ({text, icon:Icon, bg, color}) => {\n    return (\n        <div\n            className={`${bg} ${color} px-2"
  },
  {
    "path": "ecom-frontend/src/hooks/useCategoryFilter.js",
    "chars": 1018,
    "preview": "import { useEffect } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport { useDispatch } from \"reac"
  },
  {
    "path": "ecom-frontend/src/hooks/useOrderFilter.js",
    "chars": 916,
    "preview": "import { useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useSearchParams } fr"
  },
  {
    "path": "ecom-frontend/src/hooks/useProductFilter.js",
    "chars": 1891,
    "preview": "import { useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useSearchParams } fr"
  },
  {
    "path": "ecom-frontend/src/index.css",
    "chars": 1283,
    "preview": "@import url('https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap')\nlayer(ba"
  },
  {
    "path": "ecom-frontend/src/main.jsx",
    "chars": 328,
    "preview": "import { StrictMode } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport './index.css'\nimport App from '."
  },
  {
    "path": "ecom-frontend/src/store/actions/index.js",
    "chars": 19698,
    "preview": "import api from \"../../api/api\"\n\nexport const fetchProducts = (queryString) => async (dispatch) => {\n    try {\n        d"
  },
  {
    "path": "ecom-frontend/src/store/reducers/ProductReducer.js",
    "chars": 1691,
    "preview": "const initialState = {\n    products: null,\n    categories: null,\n    pagination: {},\n};\n\nexport const productReducer = ("
  },
  {
    "path": "ecom-frontend/src/store/reducers/adminReducer.js",
    "chars": 340,
    "preview": "const initialState = {\n    analytics: {},\n};\n\nexport const adminReducer = (state = initialState, action) => {\n    switch"
  },
  {
    "path": "ecom-frontend/src/store/reducers/authReducer.js",
    "chars": 1019,
    "preview": "const initialState = {\n    user: null,\n    address: [],\n    clientSecret: null,\n    selectedUserCheckoutAddress: null,\n}"
  },
  {
    "path": "ecom-frontend/src/store/reducers/cartReducer.js",
    "chars": 1622,
    "preview": "const initialState = {\n    cart: [],\n    totalPrice: 0,\n    cartId: null,\n}\n\nexport const cartReducer = (state = initial"
  },
  {
    "path": "ecom-frontend/src/store/reducers/errorReducer.js",
    "chars": 1552,
    "preview": "const initialState = {\n    isLoading: false,\n    errorMessage: null,\n    categoryLoader: false,\n    categoryError: null,"
  },
  {
    "path": "ecom-frontend/src/store/reducers/orderReducer.js",
    "chars": 693,
    "preview": "const initialState = {\n    adminOrder: null,\n    pagination: {},\n};\n\nexport const orderReducer = (state = initialState, "
  },
  {
    "path": "ecom-frontend/src/store/reducers/paymentMethodReducer.js",
    "chars": 346,
    "preview": "const initialState = {\n    paymentMethod: null,\n};\n\nexport const paymentMethodReducer = (state = initialState, action) ="
  },
  {
    "path": "ecom-frontend/src/store/reducers/sellerReducer.js",
    "chars": 557,
    "preview": "const initialState = {\n  sellers: null,\n  pagination: {},\n};\n\nexport const sellerReducer = (state = initialState, action"
  },
  {
    "path": "ecom-frontend/src/store/reducers/store.js",
    "chars": 1287,
    "preview": "import { configureStore } from \"@reduxjs/toolkit\";\nimport { productReducer } from \"./ProductReducer\";\nimport { errorRedu"
  },
  {
    "path": "ecom-frontend/src/utils/constant.js",
    "chars": 245,
    "preview": "import bannerImageOne from \"../assets/sliders/s_1.webp\";\nimport bannerImageTwo from \"../assets/sliders/s_2.webp\";\nimport"
  },
  {
    "path": "ecom-frontend/src/utils/formatPrice.js",
    "chars": 573,
    "preview": "export const formatPrice = (amount) => {\n return new Intl.NumberFormat(\"en-US\", {\n    style: \"currency\",\n    currency: \""
  },
  {
    "path": "ecom-frontend/src/utils/index.js",
    "chars": 1462,
    "preview": "import { FaBoxOpen, FaHome, FaShoppingCart, FaStore, FaThList } from \"react-icons/fa\";\nimport { bannerImageOne, bannerIm"
  },
  {
    "path": "ecom-frontend/src/utils/truncateText.js",
    "chars": 189,
    "preview": "const truncateText = (text, charLimit = 90) => {\n    if (text?.length > charLimit) {\n        return text.slice(0, charLi"
  },
  {
    "path": "ecom-frontend/vite.config.js",
    "chars": 161,
    "preview": "import { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\n\n// https://vite.dev/config/\nexport default"
  },
  {
    "path": "media/.gitignore",
    "chars": 395,
    "preview": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**/target/\n!**/src/test/**/target/\n\n### STS ###\n.apt_genera"
  },
  {
    "path": "media/.mvn/wrapper/maven-wrapper.properties",
    "chars": 233,
    "preview": "distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip\nwrap"
  },
  {
    "path": "media/mvnw",
    "chars": 11290,
    "preview": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Softwa"
  },
  {
    "path": "media/mvnw.cmd",
    "chars": 7592,
    "preview": "@REM ----------------------------------------------------------------------------\n@REM Licensed to the Apache Software F"
  },
  {
    "path": "media/pom.xml",
    "chars": 1625,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "media/src/main/java/com/social/media/DataInitializer.java",
    "chars": 3874,
    "preview": "package com.social.media;\n\nimport com.social.media.repositories.PostRepository;\nimport com.social.media.repositories.Soc"
  },
  {
    "path": "media/src/main/java/com/social/media/MediaApplication.java",
    "chars": 306,
    "preview": "package com.social.media;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfig"
  },
  {
    "path": "media/src/main/java/com/social/media/controllers/SocialController.java",
    "chars": 1104,
    "preview": "package com.social.media.controllers;\n\nimport com.social.media.models.SocialUser;\nimport com.social.media.services.Socia"
  },
  {
    "path": "media/src/main/java/com/social/media/models/Post.java",
    "chars": 465,
    "preview": "package com.social.media.models;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport jakarta.persistence.*;\nimpo"
  },
  {
    "path": "media/src/main/java/com/social/media/models/SocialGroup.java",
    "chars": 640,
    "preview": "package com.social.media.models;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport jakarta.persistence.*;\nimpo"
  },
  {
    "path": "media/src/main/java/com/social/media/models/SocialProfile.java",
    "chars": 683,
    "preview": "package com.social.media.models;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport jakarta.persistence.*;\nimpo"
  },
  {
    "path": "media/src/main/java/com/social/media/models/SocialUser.java",
    "chars": 1192,
    "preview": "package com.social.media.models;\n\nimport jakarta.persistence.*;\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nim"
  },
  {
    "path": "media/src/main/java/com/social/media/repositories/PostRepository.java",
    "chars": 210,
    "preview": "package com.social.media.repositories;\n\nimport com.social.media.models.Post;\nimport org.springframework.data.jpa.reposit"
  },
  {
    "path": "media/src/main/java/com/social/media/repositories/SocialGroupRepository.java",
    "chars": 231,
    "preview": "package com.social.media.repositories;\n\nimport com.social.media.models.SocialGroup;\nimport org.springframework.data.jpa."
  },
  {
    "path": "media/src/main/java/com/social/media/repositories/SocialProfileRepository.java",
    "chars": 237,
    "preview": "package com.social.media.repositories;\n\nimport com.social.media.models.SocialProfile;\nimport org.springframework.data.jp"
  },
  {
    "path": "media/src/main/java/com/social/media/repositories/SocialUserRepository.java",
    "chars": 227,
    "preview": "package com.social.media.repositories;\n\nimport com.social.media.models.SocialUser;\nimport org.springframework.data.jpa.r"
  },
  {
    "path": "media/src/main/java/com/social/media/services/SocialService.java",
    "chars": 859,
    "preview": "package com.social.media.services;\n\nimport com.social.media.models.SocialUser;\nimport com.social.media.repositories.Soci"
  },
  {
    "path": "media/src/main/resources/application.properties",
    "chars": 173,
    "preview": "spring.application.name=media\nspring.h2.console.enabled=true\nspring.datasource.url=jdbc:h2:mem:test\n\nspring.jpa.show-sql"
  },
  {
    "path": "media/src/test/java/com/social/media/MediaApplicationTests.java",
    "chars": 207,
    "preview": "package com.social.media;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context.SpringBootTes"
  },
  {
    "path": "sb-ecom/.gitignore",
    "chars": 432,
    "preview": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**/target/\n!**/src/test/**/target/\n\n### STS ###\n.apt_genera"
  },
  {
    "path": "sb-ecom/.mvn/wrapper/maven-wrapper.properties",
    "chars": 233,
    "preview": "distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip\nwrap"
  },
  {
    "path": "sb-ecom/mvnw",
    "chars": 11290,
    "preview": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Softwa"
  },
  {
    "path": "sb-ecom/mvnw.cmd",
    "chars": 7592,
    "preview": "@REM ----------------------------------------------------------------------------\n@REM Licensed to the Apache Software F"
  },
  {
    "path": "sb-ecom/pom.xml",
    "chars": 3169,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/SbEcomApplication.java",
    "chars": 314,
    "preview": "package com.ecommerce.project;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoc"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/config/AppConfig.java",
    "chars": 320,
    "preview": "package com.ecommerce.project.config;\n\nimport org.modelmapper.ModelMapper;\nimport org.springframework.context.annotation"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/config/AppConstants.java",
    "chars": 466,
    "preview": "package com.ecommerce.project.config;\n\npublic class AppConstants {\n    public static final String PAGE_NUMBER = \"0\";\n   "
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/config/SwaggerConfig.java",
    "chars": 1940,
    "preview": "package com.ecommerce.project.config;\n\nimport io.swagger.v3.oas.models.Components;\nimport io.swagger.v3.oas.models.Exter"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/config/WebMvcConfig.java",
    "chars": 511,
    "preview": "package com.ecommerce.project.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springfra"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/controller/AddressController.java",
    "chars": 2391,
    "preview": "package com.ecommerce.project.controller;\n\nimport com.ecommerce.project.model.User;\nimport com.ecommerce.project.payload"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/controller/AnalyticsController.java",
    "chars": 897,
    "preview": "package com.ecommerce.project.controller;\n\nimport com.ecommerce.project.payload.AnalyticsResponse;\nimport com.ecommerce."
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/controller/AuthController.java",
    "chars": 2771,
    "preview": "package com.ecommerce.project.controller;\n\nimport com.ecommerce.project.config.AppConstants;\nimport com.ecommerce.projec"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/controller/CartController.java",
    "chars": 2905,
    "preview": "package com.ecommerce.project.controller;\n\nimport com.ecommerce.project.model.Cart;\nimport com.ecommerce.project.payload"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/controller/CategoryController.java",
    "chars": 2437,
    "preview": "package com.ecommerce.project.controller;\n\nimport com.ecommerce.project.config.AppConstants;\nimport com.ecommerce.projec"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/controller/OrderController.java",
    "chars": 4502,
    "preview": "package com.ecommerce.project.controller;\n\nimport com.ecommerce.project.config.AppConstants;\nimport com.ecommerce.projec"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/controller/ProductController.java",
    "chars": 8401,
    "preview": "package com.ecommerce.project.controller;\n\nimport com.ecommerce.project.config.AppConstants;\nimport com.ecommerce.projec"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/exceptions/APIException.java",
    "chars": 259,
    "preview": "package com.ecommerce.project.exceptions;\n\npublic class APIException extends RuntimeException {\n    private static final"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/exceptions/MyGlobalExceptionHandler.java",
    "chars": 1779,
    "preview": "package com.ecommerce.project.exceptions;\n\n\nimport com.ecommerce.project.payload.APIResponse;\nimport org.springframework"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/exceptions/ResourceNotFoundException.java",
    "chars": 822,
    "preview": "package com.ecommerce.project.exceptions;\n\npublic class ResourceNotFoundException extends RuntimeException {\n    String "
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/model/Address.java",
    "chars": 1598,
    "preview": "package com.ecommerce.project.model;\n\nimport jakarta.persistence.*;\nimport jakarta.validation.constraints.NotBlank;\nimpo"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/model/AppRole.java",
    "chars": 109,
    "preview": "package com.ecommerce.project.model;\n\npublic enum AppRole {\n    ROLE_USER,\n    ROLE_SELLER,\n    ROLE_ADMIN\n}\n"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/model/Cart.java",
    "chars": 692,
    "preview": "package com.ecommerce.project.model;\n\nimport jakarta.persistence.*;\nimport lombok.AllArgsConstructor;\nimport lombok.Data"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/model/CartItem.java",
    "chars": 604,
    "preview": "package com.ecommerce.project.model;\n\nimport jakarta.persistence.*;\nimport lombok.AllArgsConstructor;\nimport lombok.Data"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/model/Category.java",
    "chars": 695,
    "preview": "package com.ecommerce.project.model;\n\nimport jakarta.persistence.*;\nimport jakarta.validation.constraints.NotBlank;\nimpo"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/model/Order.java",
    "chars": 980,
    "preview": "package com.ecommerce.project.model;\n\nimport jakarta.persistence.*;\nimport jakarta.validation.constraints.Email;\nimport "
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/model/OrderItem.java",
    "chars": 618,
    "preview": "package com.ecommerce.project.model;\n\nimport jakarta.persistence.*;\nimport lombok.AllArgsConstructor;\nimport lombok.Data"
  },
  {
    "path": "sb-ecom/src/main/java/com/ecommerce/project/model/Payment.java",
    "chars": 1169,
    "preview": "package com.ecommerce.project.model;\n\nimport jakarta.persistence.*;\nimport jakarta.validation.constraints.NotBlank;\nimpo"
  }
]

// ... and 66 more files (download for full content)

About this extraction

This page contains the full source code of the EmbarkXOfficial/spring-boot-course GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 266 files (469.5 KB), approximately 117.8k tokens, and a symbol index with 472 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!