diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f97022 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +target/ \ No newline at end of file diff --git a/helpapp/.gitattributes b/helpapp/.gitattributes deleted file mode 100644 index 3b41682..0000000 --- a/helpapp/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -/mvnw text eol=lf -*.cmd text eol=crlf diff --git a/helpapp/.gitignore b/helpapp/.gitignore deleted file mode 100644 index 549e00a..0000000 --- a/helpapp/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -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/ diff --git a/helpapp/.mvn/wrapper/maven-wrapper.properties b/helpapp/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index d58dfb7..0000000 --- a/helpapp/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,19 +0,0 @@ -# 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 -# -# http://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. -wrapperVersion=3.3.2 -distributionType=only-script -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/helpapp/README.md b/helpapp/README.md new file mode 100644 index 0000000..8a1bf77 --- /dev/null +++ b/helpapp/README.md @@ -0,0 +1,100 @@ +# Mini-Projet Architecture de Services + +## Objectif : + +Créer une application axée microservices en utilisant SOAP et REST + +## Installation + +``` +mvn compile +``` + +Une fois le projet compilé, lancer les différents services SOAP et REST via `Spring Boot` : + +``` +mvn spring-boot:run -pl rest-service +``` + + +``` +mvn spring-boot:run -pl soap-service +``` + +Vérifier le bon fonctionnement en accédant à `localhost:8080/hello` pour REST et `localhost:8081/ws` pour SOAP. + + + +# Specifications + +### **1. Objectifs de l'application** +- **Aider les personnes en besoin** : Faciliter la publication de demandes d’aide par des personnes en situation de vulnérabilité. +- **Mobiliser des volontaires** : Permettre aux volontaires de répondre à des demandes d’aide ou de proposer une aide spontanée. +- **Gérer l’administration** : Faciliter l’administration et le suivi des demandes. + +### **2. REST Microservices** + +#### **2.1 User Service** +- **Features:** + - Account creation for requesters, volunteers, and administrators. + - User profile management (modification and deletion). + - Authentication and role management (requester, volunteer, administrator). +- **Main Endpoints:** + - `POST /users`: Create a user. + - `GET /users/{id}`: View a user's profile. + - `PUT /users/{id}`: Update a user. + - `DELETE /users/{id}`: Delete a user. + +#### **2.2 Request Service** +- **Features:** + - Creation, validation, and management of help requests. + - Management of request statuses: Pending, validated, rejected, completed. + - Viewing and filtering requests by status. +- **Main Endpoints:** + - `POST /requests`: Create a request. + - `GET /requests`: List of requests (with possible filters). + - `GET /requests/{id}`: View a specific request. + - `PUT /requests/{id}`: Update the status or details of a request. + - `DELETE /requests/{id}`: Delete a request. + +#### **2.3 Volunteer Service** +- **Features:** + - Viewing available requests. + - Offering help for a specific request. + - Posting spontaneous help offers. +- **Main Endpoints:** + - `GET /volunteers/requests`: List of available requests. + - `POST /volunteers/{id}/help`: Respond to a specific request. + - `POST /volunteers/spontaneous`: Post a spontaneous help offer. + +#### **2.4 Feedback Service** +- **Features:** + - Recording and managing feedback after a request is completed. + - Viewing feedback associated with a request or user. +- **Main Endpoints:** + - `POST /feedbacks`: Add feedback. + - `GET /feedbacks`: View feedback (with possible filters). + +#### **2.5 Administration Service** +- **Features:** + - Validation or rejection of help requests. + - Management of rejection reasons. + - Viewing global statistics (e.g., number of completed requests). +- **Main Endpoints:** + - `GET /admin/requests`: List of requests to be validated. + - `PUT /admin/requests/{id}/validate`: Validate a request. + - `PUT /admin/requests/{id}/reject`: Reject a request with justification. + +### **3. Architecture technique** +- **Communication :** Chaque microservice expose une API REST avec des endpoints bien définis. +- **Base de données :** Chaque microservice possède sa propre base de données pour favoriser la décentralisation (database-per-service). +- **Authentification :** Utilisation de JWT pour sécuriser les communications. +- **Load Balancing et Gateway :** Utilisation d’un API Gateway pour la gestion des requêtes et la sécurité. +- **Monitoring :** Intégration de services comme Prometheus et Grafana pour le suivi des performances. + + + +### **4. Avantages de cette architecture** +- **Scalabilité** : Les microservices peuvent être déployés et mis à l'échelle individuellement. +- **Flexibilité** : Possibilité d’utiliser différentes technologies pour chaque service. +- **Maintenance** : Une meilleure isolation des fonctionnalités simplifie le débogage et les mises à jour. diff --git a/helpapp/administration-service/pom.xml b/helpapp/administration-service/pom.xml new file mode 100644 index 0000000..963e9af --- /dev/null +++ b/helpapp/administration-service/pom.xml @@ -0,0 +1,40 @@ + + + insa.application.helpapp + helpapp + 1.0-SNAPSHOT + + 4.0.0 + administration-service + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 3.1.4 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 21 + 21 + + + + + + diff --git a/helpapp/administration-service/src/main/java/insa/application/helpapp/rest/AdministrationServiceApplication.java b/helpapp/administration-service/src/main/java/insa/application/helpapp/rest/AdministrationServiceApplication.java new file mode 100644 index 0000000..f07ef42 --- /dev/null +++ b/helpapp/administration-service/src/main/java/insa/application/helpapp/rest/AdministrationServiceApplication.java @@ -0,0 +1,20 @@ +package insa.application.helpapp.rest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class AdministrationServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(AdministrationServiceApplication.class, args); + } + + @GetMapping("/hello") + public String hello() { + return "Hello from Administration Service!"; + } +} diff --git a/helpapp/administration-service/src/main/resources/application.properties b/helpapp/administration-service/src/main/resources/application.properties new file mode 100644 index 0000000..4c00e40 --- /dev/null +++ b/helpapp/administration-service/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port=8080 diff --git a/helpapp/feedback-service/pom.xml b/helpapp/feedback-service/pom.xml new file mode 100644 index 0000000..9d440c1 --- /dev/null +++ b/helpapp/feedback-service/pom.xml @@ -0,0 +1,40 @@ + + + insa.application.helpapp + helpapp + 1.0-SNAPSHOT + + 4.0.0 + feedback-service + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 3.1.4 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 21 + 21 + + + + + + diff --git a/helpapp/feedback-service/src/main/java/insa/application/helpapp/rest/FeedbackServiceApplication.java b/helpapp/feedback-service/src/main/java/insa/application/helpapp/rest/FeedbackServiceApplication.java new file mode 100644 index 0000000..242a16e --- /dev/null +++ b/helpapp/feedback-service/src/main/java/insa/application/helpapp/rest/FeedbackServiceApplication.java @@ -0,0 +1,20 @@ +package insa.application.helpapp.rest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class FeedbackServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(FeedbackServiceApplication.class, args); + } + + @GetMapping("/hello") + public String hello() { + return "Hello from FeedBack Service!"; + } +} diff --git a/helpapp/feedback-service/src/main/resources/application.properties b/helpapp/feedback-service/src/main/resources/application.properties new file mode 100644 index 0000000..4d360de --- /dev/null +++ b/helpapp/feedback-service/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port=8081 diff --git a/helpapp/mvnw b/helpapp/mvnw deleted file mode 100755 index 19529dd..0000000 --- a/helpapp/mvnw +++ /dev/null @@ -1,259 +0,0 @@ -#!/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 -# -# http://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.3.2 -# -# Optional ENV vars -# ----------------- -# JAVA_HOME - location of a JDK home dir, required when download maven via java source -# MVNW_REPOURL - repo url base for downloading maven distribution -# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven -# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output -# ---------------------------------------------------------------------------- - -set -euf -[ "${MVNW_VERBOSE-}" != debug ] || set -x - -# OS specific support. -native_path() { printf %s\\n "$1"; } -case "$(uname)" in -CYGWIN* | MINGW*) - [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" - native_path() { cygpath --path --windows "$1"; } - ;; -esac - -# set JAVACMD and JAVACCMD -set_java_home() { - # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched - 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" - JAVACCMD="$JAVA_HOME/jre/sh/javac" - else - JAVACMD="$JAVA_HOME/bin/java" - JAVACCMD="$JAVA_HOME/bin/javac" - - if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then - echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 - echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 - return 1 - fi - fi - else - JAVACMD="$( - 'set' +e - 'unset' -f command 2>/dev/null - 'command' -v java - )" || : - JAVACCMD="$( - 'set' +e - 'unset' -f command 2>/dev/null - 'command' -v javac - )" || : - - if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then - echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 - return 1 - fi - fi -} - -# hash string like Java String::hashCode -hash_string() { - str="${1:-}" h=0 - while [ -n "$str" ]; do - char="${str%"${str#?}"}" - h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) - str="${str#?}" - done - printf %x\\n $h -} - -verbose() { :; } -[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } - -die() { - printf %s\\n "$1" >&2 - exit 1 -} - -trim() { - # MWRAPPER-139: - # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. - # Needed for removing poorly interpreted newline sequences when running in more - # exotic environments such as mingw bash on Windows. - printf "%s" "${1}" | tr -d '[:space:]' -} - -# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties -while IFS="=" read -r key value; do - case "${key-}" in - distributionUrl) distributionUrl=$(trim "${value-}") ;; - distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; - esac -done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" -[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" - -case "${distributionUrl##*/}" in -maven-mvnd-*bin.*) - MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ - case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in - *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; - :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; - :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; - :Linux*x86_64*) distributionPlatform=linux-amd64 ;; - *) - echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 - distributionPlatform=linux-amd64 - ;; - esac - distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" - ;; -maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; -*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; -esac - -# apply MVNW_REPOURL and calculate MAVEN_HOME -# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ -[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" -distributionUrlName="${distributionUrl##*/}" -distributionUrlNameMain="${distributionUrlName%.*}" -distributionUrlNameMain="${distributionUrlNameMain%-bin}" -MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" -MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" - -exec_maven() { - unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : - exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" -} - -if [ -d "$MAVEN_HOME" ]; then - verbose "found existing MAVEN_HOME at $MAVEN_HOME" - exec_maven "$@" -fi - -case "${distributionUrl-}" in -*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; -*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; -esac - -# prepare tmp dir -if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then - clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } - trap clean HUP INT TERM EXIT -else - die "cannot create temp dir" -fi - -mkdir -p -- "${MAVEN_HOME%/*}" - -# Download and Install Apache Maven -verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." -verbose "Downloading from: $distributionUrl" -verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" - -# select .zip or .tar.gz -if ! command -v unzip >/dev/null; then - distributionUrl="${distributionUrl%.zip}.tar.gz" - distributionUrlName="${distributionUrl##*/}" -fi - -# verbose opt -__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' -[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v - -# normalize http auth -case "${MVNW_PASSWORD:+has-password}" in -'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; -has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; -esac - -if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then - verbose "Found wget ... using wget" - wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" -elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then - verbose "Found curl ... using curl" - curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" -elif set_java_home; then - verbose "Falling back to use Java to download" - javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" - targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" - cat >"$javaSource" <<-END - public class Downloader extends java.net.Authenticator - { - protected java.net.PasswordAuthentication getPasswordAuthentication() - { - return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); - } - public static void main( String[] args ) throws Exception - { - setDefault( new Downloader() ); - java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); - } - } - END - # For Cygwin/MinGW, switch paths to Windows format before running javac and java - verbose " - Compiling Downloader.java ..." - "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" - verbose " - Running Downloader.java ..." - "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" -fi - -# If specified, validate the SHA-256 sum of the Maven distribution zip file -if [ -n "${distributionSha256Sum-}" ]; then - distributionSha256Result=false - if [ "$MVN_CMD" = mvnd.sh ]; then - echo "Checksum validation is not supported for maven-mvnd." >&2 - echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 - exit 1 - elif command -v sha256sum >/dev/null; then - if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then - distributionSha256Result=true - fi - elif command -v shasum >/dev/null; then - if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then - distributionSha256Result=true - fi - else - echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 - echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 - exit 1 - fi - if [ $distributionSha256Result = false ]; then - echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 - echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 - exit 1 - fi -fi - -# unzip and move -if command -v unzip >/dev/null; then - unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" -else - tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" -fi -printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" -mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" - -clean || : -exec_maven "$@" diff --git a/helpapp/mvnw.cmd b/helpapp/mvnw.cmd deleted file mode 100644 index 249bdf3..0000000 --- a/helpapp/mvnw.cmd +++ /dev/null @@ -1,149 +0,0 @@ -<# : batch portion -@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 http://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.3.2 -@REM -@REM Optional ENV vars -@REM MVNW_REPOURL - repo url base for downloading maven distribution -@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven -@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output -@REM ---------------------------------------------------------------------------- - -@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) -@SET __MVNW_CMD__= -@SET __MVNW_ERROR__= -@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% -@SET PSModulePath= -@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( - IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) -) -@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% -@SET __MVNW_PSMODULEP_SAVE= -@SET __MVNW_ARG0_NAME__= -@SET MVNW_USERNAME= -@SET MVNW_PASSWORD= -@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) -@echo Cannot start maven from wrapper >&2 && exit /b 1 -@GOTO :EOF -: end batch / begin powershell #> - -$ErrorActionPreference = "Stop" -if ($env:MVNW_VERBOSE -eq "true") { - $VerbosePreference = "Continue" -} - -# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties -$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl -if (!$distributionUrl) { - Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" -} - -switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { - "maven-mvnd-*" { - $USE_MVND = $true - $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" - $MVN_CMD = "mvnd.cmd" - break - } - default { - $USE_MVND = $false - $MVN_CMD = $script -replace '^mvnw','mvn' - break - } -} - -# apply MVNW_REPOURL and calculate MAVEN_HOME -# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ -if ($env:MVNW_REPOURL) { - $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } - $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" -} -$distributionUrlName = $distributionUrl -replace '^.*/','' -$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' -$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" -if ($env:MAVEN_USER_HOME) { - $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" -} -$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' -$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" - -if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { - Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" - Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" - exit $? -} - -if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { - Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" -} - -# prepare tmp dir -$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile -$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" -$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null -trap { - if ($TMP_DOWNLOAD_DIR.Exists) { - try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } - catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } - } -} - -New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null - -# Download and Install Apache Maven -Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." -Write-Verbose "Downloading from: $distributionUrl" -Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" - -$webclient = New-Object System.Net.WebClient -if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { - $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) -} -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null - -# If specified, validate the SHA-256 sum of the Maven distribution zip file -$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum -if ($distributionSha256Sum) { - if ($USE_MVND) { - Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." - } - Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash - if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { - Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." - } -} - -# unzip and move -Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null -Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null -try { - Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null -} catch { - if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { - Write-Error "fail to move MAVEN_HOME" - } -} finally { - try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } - catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } -} - -Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/helpapp/pom.xml b/helpapp/pom.xml index d16cec9..6bfa614 100644 --- a/helpapp/pom.xml +++ b/helpapp/pom.xml @@ -1,66 +1,28 @@ - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.4.0 - - - insa.application - helpapp - 0.0.1-SNAPSHOT - helpapp - Exercice Application that ease voluntary help to others - - - - - - - - - - - - - - - 21 - - - - org.springframework.boot - spring-boot-starter - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + insa.application.helpapp + helpapp + 1.0-SNAPSHOT + pom - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.apache.cxf - cxf-spring-boot-starter-jaxws - 3.5.0 - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + user-service + request-service + volunteer-service + feedback-service + administration-service + + + + + org.springframework.boot + spring-boot-dependencies + 3.1.4 + pom + import + + + diff --git a/helpapp/request-service/pom.xml b/helpapp/request-service/pom.xml new file mode 100644 index 0000000..6c195a1 --- /dev/null +++ b/helpapp/request-service/pom.xml @@ -0,0 +1,40 @@ + + + insa.application.helpapp + helpapp + 1.0-SNAPSHOT + + 4.0.0 + request-service + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 3.1.4 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 21 + 21 + + + + + + diff --git a/helpapp/request-service/src/main/java/insa/application/helpapp/rest/RequestServiceApplication.java b/helpapp/request-service/src/main/java/insa/application/helpapp/rest/RequestServiceApplication.java new file mode 100644 index 0000000..f0e8f87 --- /dev/null +++ b/helpapp/request-service/src/main/java/insa/application/helpapp/rest/RequestServiceApplication.java @@ -0,0 +1,110 @@ +package insa.application.helpapp.rest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.concurrent.atomic.AtomicLong; + +@SpringBootApplication +@RestController +@RequestMapping("/requests") +public class RequestServiceApplication { + + private final Map requestDatabase = new HashMap<>(); + private final AtomicLong idGenerator = new AtomicLong(1); + + public static void main(String[] args) { + SpringApplication.run(RequestServiceApplication.class, args); + } + + // Create a new help request + @PostMapping + public HelpRequest createRequest(@RequestBody HelpRequest request) { + long id = idGenerator.getAndIncrement(); + request.setId(id); + request.setStatus("Pending"); + requestDatabase.put(id, request); + return request; + } + + // Get all requests (with optional status filter) + @GetMapping + public List getAllRequests(@RequestParam(required = false) String status) { + if (status == null) { + return new ArrayList<>(requestDatabase.values()); + } + List filteredRequests = new ArrayList<>(); + for (HelpRequest request : requestDatabase.values()) { + if (request.getStatus().equalsIgnoreCase(status)) { + filteredRequests.add(request); + } + } + return filteredRequests; + } + + // Get a specific request by ID + @GetMapping("/{id}") + public HelpRequest getRequest(@PathVariable Long id) { + return Optional.ofNullable(requestDatabase.get(id)) + .orElseThrow(() -> new RuntimeException("Request not found")); + } + + // Update a request (e.g., status or details) + @PutMapping("/{id}") + public HelpRequest updateRequest(@PathVariable Long id, @RequestBody HelpRequest updatedRequest) { + if (!requestDatabase.containsKey(id)) { + throw new RuntimeException("Request not found"); + } + HelpRequest existingRequest = requestDatabase.get(id); + if (updatedRequest.getDetails() != null) { + existingRequest.setDetails(updatedRequest.getDetails()); + } + if (updatedRequest.getStatus() != null) { + existingRequest.setStatus(updatedRequest.getStatus()); + } + return existingRequest; + } + + // Delete a request + @DeleteMapping("/{id}") + public String deleteRequest(@PathVariable Long id) { + if (requestDatabase.remove(id) == null) { + throw new RuntimeException("Request not found"); + } + return "Request deleted successfully"; + } + + // HelpRequest entity + static class HelpRequest { + private Long id; + private String details; + private String status; // e.g., Pending, Validated, Rejected, Completed + + // Getters and setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getDetails() { + return details; + } + + public void setDetails(String details) { + this.details = details; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + } +} diff --git a/helpapp/request-service/src/main/resources/application.properties b/helpapp/request-service/src/main/resources/application.properties new file mode 100644 index 0000000..3cf12af --- /dev/null +++ b/helpapp/request-service/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port=8082 diff --git a/helpapp/src/main/java/insa/application/helpapp/CustomErrorController.java b/helpapp/src/main/java/insa/application/helpapp/CustomErrorController.java deleted file mode 100644 index 32f0f72..0000000 --- a/helpapp/src/main/java/insa/application/helpapp/CustomErrorController.java +++ /dev/null @@ -1,17 +0,0 @@ -package insa.application.helpapp; - -import org.springframework.boot.web.servlet.error.ErrorController; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller -public class CustomErrorController implements ErrorController { - - @RequestMapping("/error") - @ResponseBody - public String handleError() { - // Return the inline HTML content for the custom error page - return "Error

Something went wrong!

We are sorry, but the page you are looking for does not exist.

Error Image"; - } -} \ No newline at end of file diff --git a/helpapp/src/main/java/insa/application/helpapp/HelpappApplication.java b/helpapp/src/main/java/insa/application/helpapp/HelpappApplication.java deleted file mode 100644 index ee1a710..0000000 --- a/helpapp/src/main/java/insa/application/helpapp/HelpappApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package insa.application.helpapp; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class HelpappApplication { - - public static void main(String[] args) { - SpringApplication.run(HelpappApplication.class, args); - } - -} diff --git a/helpapp/src/main/resources/application.properties b/helpapp/src/main/resources/application.properties deleted file mode 100644 index 42482f7..0000000 --- a/helpapp/src/main/resources/application.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.application.name=helpapp -server.port=8080 \ No newline at end of file diff --git a/helpapp/src/test/java/insa/application/helpapp/HelpappApplicationTests.java b/helpapp/src/test/java/insa/application/helpapp/HelpappApplicationTests.java deleted file mode 100644 index 34f598c..0000000 --- a/helpapp/src/test/java/insa/application/helpapp/HelpappApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package insa.application.helpapp; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class HelpappApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/helpapp/user-service/pom.xml b/helpapp/user-service/pom.xml new file mode 100644 index 0000000..49f044d --- /dev/null +++ b/helpapp/user-service/pom.xml @@ -0,0 +1,40 @@ + + + insa.application.helpapp + helpapp + 1.0-SNAPSHOT + + 4.0.0 + user-service + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 3.1.4 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 21 + 21 + + + + + + diff --git a/helpapp/user-service/src/main/java/insa/application/helpapp/rest/UserServiceApplication.java b/helpapp/user-service/src/main/java/insa/application/helpapp/rest/UserServiceApplication.java new file mode 100644 index 0000000..a2d7b66 --- /dev/null +++ b/helpapp/user-service/src/main/java/insa/application/helpapp/rest/UserServiceApplication.java @@ -0,0 +1,98 @@ +package insa.application.helpapp.rest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.concurrent.atomic.AtomicLong; + +@SpringBootApplication +@RestController +@RequestMapping("/users") +public class UserServiceApplication { + + private final Map userDatabase = new HashMap<>(); + private final AtomicLong idGenerator = new AtomicLong(1); + + public static void main(String[] args) { + SpringApplication.run(UserServiceApplication.class, args); + } + + // Create a new user + @PostMapping + public User createUser(@RequestBody User user) { + long id = idGenerator.getAndIncrement(); + user.setId(id); + userDatabase.put(id, user); + return user; + } + + // Get a user by ID + @GetMapping("/{id}") + public User getUser(@PathVariable Long id) { + return Optional.ofNullable(userDatabase.get(id)) + .orElseThrow(() -> new RuntimeException("User not found")); + } + + // Update a user by ID + @PutMapping("/{id}") + public User updateUser(@PathVariable Long id, @RequestBody User updatedUser) { + if (!userDatabase.containsKey(id)) { + throw new RuntimeException("User not found"); + } + updatedUser.setId(id); + userDatabase.put(id, updatedUser); + return updatedUser; + } + + // Delete a user by ID + @DeleteMapping("/{id}") + public String deleteUser(@PathVariable Long id) { + if (userDatabase.remove(id) == null) { + throw new RuntimeException("User not found"); + } + return "User deleted successfully"; + } + + // User entity + static class User { + private Long id; + private String name; + private String email; + private String role; + + // Getters and setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + } +} diff --git a/helpapp/user-service/src/main/resources/application.properties b/helpapp/user-service/src/main/resources/application.properties new file mode 100644 index 0000000..8f91ca7 --- /dev/null +++ b/helpapp/user-service/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port=8083 diff --git a/helpapp/volunteer-service/pom.xml b/helpapp/volunteer-service/pom.xml new file mode 100644 index 0000000..298515b --- /dev/null +++ b/helpapp/volunteer-service/pom.xml @@ -0,0 +1,40 @@ + + + insa.application.helpapp + helpapp + 1.0-SNAPSHOT + + 4.0.0 + volunteer-service + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 3.1.4 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 21 + 21 + + + + + + diff --git a/helpapp/volunteer-service/src/main/java/insa/application/helpapp/rest/VolunteerServiceApplication.java b/helpapp/volunteer-service/src/main/java/insa/application/helpapp/rest/VolunteerServiceApplication.java new file mode 100644 index 0000000..41dfd4c --- /dev/null +++ b/helpapp/volunteer-service/src/main/java/insa/application/helpapp/rest/VolunteerServiceApplication.java @@ -0,0 +1,20 @@ +package insa.application.helpapp.rest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class VolunteerServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(VolunteerServiceApplication.class, args); + } + + @GetMapping("/hello") + public String hello() { + return "Hello from Volunteer Service!"; + } +} diff --git a/helpapp/volunteer-service/src/main/resources/application.properties b/helpapp/volunteer-service/src/main/resources/application.properties new file mode 100644 index 0000000..5e3bb81 --- /dev/null +++ b/helpapp/volunteer-service/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port=8084