develop
Daniel Arroyo 3 years ago
parent b4ddc0b09c
commit 89b700d96b
  1. 2
      .gitignore
  2. 1
      .mvn/wrapper/.gitignore
  3. 142
      .mvn/wrapper/MavenWrapperDownloader.java
  4. 18
      .mvn/wrapper/maven-wrapper.properties
  5. 17
      .vscode/launch.json
  6. 3
      .vscode/settings.json
  7. 71
      .vscode/tasks.json
  8. 62
      README.md
  9. 316
      mvnw
  10. 188
      mvnw.cmd
  11. 141
      pom.xml
  12. 94
      src/main/docker/Dockerfile.jvm
  13. 90
      src/main/docker/Dockerfile.legacy-jar
  14. 27
      src/main/docker/Dockerfile.native
  15. 30
      src/main/docker/Dockerfile.native-micro
  16. 16
      src/main/java/api/menu/playa/GreetingResource.java
  17. 83
      src/main/java/api/menu/playa/controller/LoginController.java
  18. 114
      src/main/java/api/menu/playa/controller/OrdenController.java
  19. 112
      src/main/java/api/menu/playa/controller/ProductoController.java
  20. 11
      src/main/java/api/menu/playa/dao/DetalleDAO.java
  21. 15
      src/main/java/api/menu/playa/dao/OrdenDAO.java
  22. 23
      src/main/java/api/menu/playa/dao/PrecioDAO.java
  23. 20
      src/main/java/api/menu/playa/dao/ProductoDAO.java
  24. 15
      src/main/java/api/menu/playa/dao/UsuarioDAO.java
  25. 7
      src/main/java/api/menu/playa/enums/CambioCantidadEnum.java
  26. 7
      src/main/java/api/menu/playa/enums/EstadoOrdenEnum.java
  27. 8
      src/main/java/api/menu/playa/enums/MedioPagoEnum.java
  28. 7
      src/main/java/api/menu/playa/enums/RolesEnum.java
  29. 21
      src/main/java/api/menu/playa/exceptions/NegocioException.java
  30. 107
      src/main/java/api/menu/playa/helper/LoginHelper.java
  31. 212
      src/main/java/api/menu/playa/helper/OrdenHelper.java
  32. 166
      src/main/java/api/menu/playa/helper/ProductoHelper.java
  33. 48
      src/main/java/api/menu/playa/model/AbstractGeneral.java
  34. 78
      src/main/java/api/menu/playa/model/Detalle.java
  35. 73
      src/main/java/api/menu/playa/model/Orden.java
  36. 68
      src/main/java/api/menu/playa/model/Precio.java
  37. 124
      src/main/java/api/menu/playa/model/Producto.java
  38. 104
      src/main/java/api/menu/playa/model/Usuario.java
  39. 72
      src/main/java/api/menu/playa/util/TokenUtils.java
  40. 26
      src/main/java/api/menu/playa/vo/CambioCantidadVO.java
  41. 42
      src/main/java/api/menu/playa/vo/DetalleVO.java
  42. 70
      src/main/java/api/menu/playa/vo/OrdenVO.java
  43. 32
      src/main/java/api/menu/playa/vo/PagadoVO.java
  44. 29
      src/main/java/api/menu/playa/vo/ProductoIdVO.java
  45. 56
      src/main/java/api/menu/playa/vo/ProductoVO.java
  46. 29
      src/main/java/api/menu/playa/vo/RegistroVO.java
  47. 50
      src/main/java/api/menu/playa/vo/ResponseGlobal.java
  48. 22
      src/main/java/api/menu/playa/vo/UsuarioVO.java
  49. 286
      src/main/resources/META-INF/resources/index.html
  50. 35
      src/main/resources/application.properties
  51. 28
      src/main/resources/privatekey.pem
  52. 9
      src/main/resources/publickey.pem
  53. 8
      src/test/java/api/menu/playa/GreetingResourceIT.java
  54. 21
      src/test/java/api/menu/playa/GreetingResourceTest.java

2
.gitignore vendored

@ -24,3 +24,5 @@
hs_err_pid* hs_err_pid*
replay_pid* replay_pid*
target/

@ -0,0 +1 @@
maven-wrapper.jar

@ -0,0 +1,142 @@
/*
* 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.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;
public class MavenWrapperDownloader
{
private static final String WRAPPER_VERSION = "3.1.1";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL =
"https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/" + WRAPPER_VERSION
+ "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to use instead of the
* default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH = ".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH = ".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main( String args[] )
{
System.out.println( "- Downloader started" );
File baseDirectory = new File( args[0] );
System.out.println( "- Using base directory: " + baseDirectory.getAbsolutePath() );
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File( baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH );
String url = DEFAULT_DOWNLOAD_URL;
if ( mavenWrapperPropertyFile.exists() )
{
FileInputStream mavenWrapperPropertyFileInputStream = null;
try
{
mavenWrapperPropertyFileInputStream = new FileInputStream( mavenWrapperPropertyFile );
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load( mavenWrapperPropertyFileInputStream );
url = mavenWrapperProperties.getProperty( PROPERTY_NAME_WRAPPER_URL, url );
}
catch ( IOException e )
{
System.out.println( "- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'" );
}
finally
{
try
{
if ( mavenWrapperPropertyFileInputStream != null )
{
mavenWrapperPropertyFileInputStream.close();
}
}
catch ( IOException e )
{
// Ignore ...
}
}
}
System.out.println( "- Downloading from: " + url );
File outputFile = new File( baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH );
if ( !outputFile.getParentFile().exists() )
{
if ( !outputFile.getParentFile().mkdirs() )
{
System.out.println( "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath()
+ "'" );
}
}
System.out.println( "- Downloading to: " + outputFile.getAbsolutePath() );
try
{
downloadFileFromURL( url, outputFile );
System.out.println( "Done" );
System.exit( 0 );
}
catch ( Throwable e )
{
System.out.println( "- Error downloading" );
e.printStackTrace();
System.exit( 1 );
}
}
private static void downloadFileFromURL( String urlString, File destination )
throws Exception
{
if ( System.getenv( "MVNW_USERNAME" ) != null && System.getenv( "MVNW_PASSWORD" ) != null )
{
String username = System.getenv( "MVNW_USERNAME" );
char[] password = System.getenv( "MVNW_PASSWORD" ).toCharArray();
Authenticator.setDefault( new Authenticator()
{
@Override
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication( username, password );
}
} );
}
URL website = new URL( urlString );
ReadableByteChannel rbc;
rbc = Channels.newChannel( website.openStream() );
FileOutputStream fos = new FileOutputStream( destination );
fos.getChannel().transferFrom( rbc, 0, Long.MAX_VALUE );
fos.close();
rbc.close();
}
}

@ -0,0 +1,18 @@
# 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.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar

@ -0,0 +1,17 @@
// A launch configuration that compiles the extension and then opens it inside a new window
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
{
"version": "0.2.0",
"configurations": [
{
"preLaunchTask": "quarkus:dev",
"type": "java",
"request": "attach",
"hostName": "localhost",
"name": "Debug Quarkus application",
"port": 5005
}
]
}

@ -0,0 +1,3 @@
{
"java.configuration.updateBuildConfiguration": "automatic"
}

71
.vscode/tasks.json vendored

@ -0,0 +1,71 @@
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"isBackground": true,
"problemMatcher": [
{
"owner": "quarkus",
"fileLocation": [
"relative",
"${workspaceFolder}/src/main/resources/templates"
],
"pattern": [
{
"regexp": "\\[(\\d+)\\]\\s(.*):(\\d+):(\\d+)\\s\\-\\s{(.*)}:\\s(.*)$",
"file": 2,
"line": 3,
"column": 4,
"message": 6
}
],
"background": {
"activeOnStart": true,
"beginsPattern": "^.*Scanning for projects...",
"endsPattern": "(^.*Quarkus .* started in .*\\.)|(^.* ERROR .* Failed to start)"
}
}
],
"group": "build",
"label": "quarkus:dev",
"command": "./mvnw quarkus:dev ",
"windows": {
"command": ".\\mvnw.cmd quarkus:dev "
}
},
{
"type": "shell",
"isBackground": true,
"problemMatcher": [
{
"owner": "quarkus",
"fileLocation": [
"relative",
"${workspaceFolder}/src/main/resources/templates"
],
"pattern": [
{
"regexp": "\\[(\\d+)\\]\\s(.*):(\\d+):(\\d+)\\s\\-\\s{(.*)}:\\s(.*)$",
"file": 2,
"line": 3,
"column": 4,
"message": 6
}
],
"background": {
"activeOnStart": true
}
}
],
"group": "build",
"label": "package -Pnative",
"command": "./mvnw package -Pnative ",
"windows": {
"command": ".\\mvnw.cmd package -Pnative "
}
}
]
}

@ -1,2 +1,62 @@
# api-menu-playa # api-menu-playa Project
This project uses Quarkus, the Supersonic Subatomic Java Framework.
If you want to learn more about Quarkus, please visit its website: https://quarkus.io/ .
## Running the application in dev mode
You can run your application in dev mode that enables live coding using:
```shell script
./mvnw compile quarkus:dev
```
> **_NOTE:_** Quarkus now ships with a Dev UI, which is available in dev mode only at http://localhost:8080/q/dev/.
## Packaging and running the application
The application can be packaged using:
```shell script
./mvnw package
```
It produces the `quarkus-run.jar` file in the `target/quarkus-app/` directory.
Be aware that it’s not an _über-jar_ as the dependencies are copied into the `target/quarkus-app/lib/` directory.
The application is now runnable using `java -jar target/quarkus-app/quarkus-run.jar`.
If you want to build an _über-jar_, execute the following command:
```shell script
./mvnw package -Dquarkus.package.type=uber-jar
```
The application, packaged as an _über-jar_, is now runnable using `java -jar target/*-runner.jar`.
## Creating a native executable
You can create a native executable using:
```shell script
./mvnw package -Pnative
```
Or, if you don't have GraalVM installed, you can run the native executable build in a container using:
```shell script
./mvnw package -Pnative -Dquarkus.native.container-build=true
```
You can then execute your native executable with: `./target/api-menu-playa-1.0.0-runner`
If you want to learn more about building native executables, please consult https://quarkus.io/guides/maven-tooling.
## Related Guides
- RESTEasy Reactive ([guide](https://quarkus.io/guides/resteasy-reactive)): A JAX-RS implementation utilizing build time processing and Vert.x. This extension is not compatible with the quarkus-resteasy extension, or any of the extensions that depend on it.
- Quarkus Extension for Spring Data JPA API ([guide](https://quarkus.io/guides/spring-data-jpa)): Use Spring Data JPA annotations to create your data access layer
- JDBC Driver - PostgreSQL ([guide](https://quarkus.io/guides/datasource)): Connect to the PostgreSQL database via JDBC
## Provided Code
### RESTEasy Reactive
Easily start your Reactive RESTful Web Services
[Related guide section...](https://quarkus.io/guides/getting-started-reactive#reactive-jax-rs-resources)

316
mvnw vendored

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

188
mvnw.cmd vendored

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

@ -0,0 +1,141 @@
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>api.menu.playa</groupId>
<artifactId>api-menu-playa</artifactId>
<version>1.1.1</version>
<properties>
<compiler-plugin.version>3.10.1</compiler-plugin.version>
<maven.compiler.release>11</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>2.15.1.Final</quarkus.platform.version>
<skipITs>true</skipITs>
<surefire-plugin.version>3.0.0-M7</surefire-plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>${quarkus.platform.artifact-id}</artifactId>
<version>${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-reactive-jackson</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-reactive</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-spring-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt-build</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.platform.version}</version>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>build</goal>
<goal>generate-code</goal>
<goal>generate-code-tests</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<systemPropertyVariables>
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>native</id>
<activation>
<property>
<name>native</name>
</property>
</activation>
<properties>
<skipITs>false</skipITs>
<quarkus.package.type>native</quarkus.package.type>
</properties>
</profile>
</profiles>
</project>

@ -0,0 +1,94 @@
####
# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode
#
# Before building the container image run:
#
# ./mvnw package
#
# Then, build the image with:
#
# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/api-menu-playa-jvm .
#
# Then run the container using:
#
# docker run -i --rm -p 8080:8080 quarkus/api-menu-playa-jvm
#
# If you want to include the debug port into your docker image
# you will have to expose the debug port (default 5005) like this : EXPOSE 8080 5005
#
# Then run the container using :
#
# docker run -i --rm -p 8080:8080 quarkus/api-menu-playa-jvm
#
# This image uses the `run-java.sh` script to run the application.
# This scripts computes the command line to execute your Java application, and
# includes memory/GC tuning.
# You can configure the behavior using the following environment properties:
# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class")
# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options
# in JAVA_OPTS (example: "-Dsome.property=foo")
# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is
# used to calculate a default maximal heap memory based on a containers restriction.
# If used in a container without any memory constraints for the container then this
# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio
# of the container available memory as set here. The default is `50` which means 50%
# of the available memory is used as an upper boundary. You can skip this mechanism by
# setting this value to `0` in which case no `-Xmx` option is added.
# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This
# is used to calculate a default initial heap memory based on the maximum heap memory.
# If used in a container without any memory constraints for the container then this
# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio
# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx`
# is used as the initial heap size. You can skip this mechanism by setting this value
# to `0` in which case no `-Xms` option is added (example: "25")
# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS.
# This is used to calculate the maximum value of the initial heap memory. If used in
# a container without any memory constraints for the container then this option has
# no effect. If there is a memory constraint then `-Xms` is limited to the value set
# here. The default is 4096MB which means the calculated value of `-Xms` never will
# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096")
# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output
# when things are happening. This option, if set to true, will set
# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true").
# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example:
# true").
# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787").
# - CONTAINER_CORE_LIMIT: A calculated core limit as described in
# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2")
# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024").
# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion.
# (example: "20")
# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking.
# (example: "40")
# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection.
# (example: "4")
# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus
# previous GC times. (example: "90")
# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20")
# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100")
# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should
# contain the necessary JRE command-line options to specify the required GC, which
# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC).
# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080")
# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080")
# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be
# accessed directly. (example: "foo.example.com,bar.example.com")
#
###
FROM registry.access.redhat.com/ubi8/openjdk-11:1.14
ENV LANGUAGE='en_US:en'
# We make four distinct layers so if there are application changes the library layers can be re-used
COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/
COPY --chown=185 target/quarkus-app/*.jar /deployments/
COPY --chown=185 target/quarkus-app/app/ /deployments/app/
COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/
EXPOSE 8080
USER 185
ENV AB_JOLOKIA_OFF=""
ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
ENV JAVA_APP_JAR="/deployments/quarkus-run.jar"

@ -0,0 +1,90 @@
####
# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode
#
# Before building the container image run:
#
# ./mvnw package -Dquarkus.package.type=legacy-jar
#
# Then, build the image with:
#
# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/api-menu-playa-legacy-jar .
#
# Then run the container using:
#
# docker run -i --rm -p 8080:8080 quarkus/api-menu-playa-legacy-jar
#
# If you want to include the debug port into your docker image
# you will have to expose the debug port (default 5005) like this : EXPOSE 8080 5005
#
# Then run the container using :
#
# docker run -i --rm -p 8080:8080 quarkus/api-menu-playa-legacy-jar
#
# This image uses the `run-java.sh` script to run the application.
# This scripts computes the command line to execute your Java application, and
# includes memory/GC tuning.
# You can configure the behavior using the following environment properties:
# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class")
# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options
# in JAVA_OPTS (example: "-Dsome.property=foo")
# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is
# used to calculate a default maximal heap memory based on a containers restriction.
# If used in a container without any memory constraints for the container then this
# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio
# of the container available memory as set here. The default is `50` which means 50%
# of the available memory is used as an upper boundary. You can skip this mechanism by
# setting this value to `0` in which case no `-Xmx` option is added.
# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This
# is used to calculate a default initial heap memory based on the maximum heap memory.
# If used in a container without any memory constraints for the container then this
# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio
# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx`
# is used as the initial heap size. You can skip this mechanism by setting this value
# to `0` in which case no `-Xms` option is added (example: "25")
# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS.
# This is used to calculate the maximum value of the initial heap memory. If used in
# a container without any memory constraints for the container then this option has
# no effect. If there is a memory constraint then `-Xms` is limited to the value set
# here. The default is 4096MB which means the calculated value of `-Xms` never will
# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096")
# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output
# when things are happening. This option, if set to true, will set
# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true").
# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example:
# true").
# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787").
# - CONTAINER_CORE_LIMIT: A calculated core limit as described in
# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2")
# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024").
# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion.
# (example: "20")
# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking.
# (example: "40")
# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection.
# (example: "4")
# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus
# previous GC times. (example: "90")
# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20")
# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100")
# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should
# contain the necessary JRE command-line options to specify the required GC, which
# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC).
# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080")
# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080")
# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be
# accessed directly. (example: "foo.example.com,bar.example.com")
#
###
FROM registry.access.redhat.com/ubi8/openjdk-11:1.14
ENV LANGUAGE='en_US:en'
COPY target/lib/* /deployments/lib/
COPY target/*-runner.jar /deployments/quarkus-run.jar
EXPOSE 8080
USER 185
ENV AB_JOLOKIA_OFF=""
ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
ENV JAVA_APP_JAR="/deployments/quarkus-run.jar"

@ -0,0 +1,27 @@
####
# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode.
#
# Before building the container image run:
#
# ./mvnw package -Pnative
#
# Then, build the image with:
#
# docker build -f src/main/docker/Dockerfile.native -t quarkus/api-menu-playa .
#
# Then run the container using:
#
# docker run -i --rm -p 8080:8080 quarkus/api-menu-playa
#
###
FROM registry.access.redhat.com/ubi8/ubi-minimal:8.6
WORKDIR /work/
RUN chown 1001 /work \
&& chmod "g+rwX" /work \
&& chown 1001:root /work
COPY --chown=1001:root target/*-runner /work/application
EXPOSE 8080
USER 1001
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

@ -0,0 +1,30 @@
####
# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode.
# It uses a micro base image, tuned for Quarkus native executables.
# It reduces the size of the resulting container image.
# Check https://quarkus.io/guides/quarkus-runtime-base-image for further information about this image.
#
# Before building the container image run:
#
# ./mvnw package -Pnative
#
# Then, build the image with:
#
# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/api-menu-playa .
#
# Then run the container using:
#
# docker run -i --rm -p 8080:8080 quarkus/api-menu-playa
#
###
FROM quay.io/quarkus/quarkus-micro-image:1.0
WORKDIR /work/
RUN chown 1001 /work \
&& chmod "g+rwX" /work \
&& chown 1001:root /work
COPY --chown=1001:root target/*-runner /work/application
EXPOSE 8080
USER 1001
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

@ -0,0 +1,16 @@
package api.menu.playa;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello from RESTEasy Reactive";
}
}

@ -0,0 +1,83 @@
package api.menu.playa.controller;
import javax.annotation.security.PermitAll;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import api.menu.playa.exceptions.NegocioException;
import api.menu.playa.helper.LoginHelper;
import api.menu.playa.vo.RegistroVO;
import api.menu.playa.vo.ResponseGlobal;
import api.menu.playa.vo.UsuarioVO;
@RequestScoped
@Path("/user")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class LoginController {
private static final String SUCCESS = "SUCCESS";
private static final String ERROR = "ERROR";
@Inject
LoginHelper loginHelper;
@POST
@Path("login")
@PermitAll
public Response login(UsuarioVO request) {
try {
String token = loginHelper.validarUsuario(request);
return Response.ok(new ResponseGlobal<>(0, SUCCESS, token)).build();
} catch (NegocioException e) {
return Response.ok(new ResponseGlobal<>(e.getCode(), e.getMessage())).build();
} catch (Exception e) {
return Response.ok(new ResponseGlobal<>(1, ERROR)).build();
}
}
@POST
@Path("register")
@PermitAll
public Response register(RegistroVO request) {
try {
validacionPassword(request);
loginHelper.registrarUsuario(request);
return Response.ok(new ResponseGlobal<>(0, SUCCESS)).build();
} catch (NegocioException e) {
return Response.ok(new ResponseGlobal<>(e.getCode(), e.getMessage())).build();
} catch (Exception e) {
return Response.ok(new ResponseGlobal<>(1, ERROR)).build();
}
}
private void validacionPassword(RegistroVO request) throws NegocioException {
if (request.getUser() == null || request.getUser().isEmpty()) {
throw new NegocioException("el campo usuario debe ser ingresado", 2);
}
if (request.getPass() == null || request.getPass().isEmpty()) {
throw new NegocioException("el campo contreseña debe ser ingresado", 2);
}
if (request.getPass2() == null || request.getPass2().isEmpty()) {
throw new NegocioException("el campo confirmar contraseña debe ser ingresado", 2);
}
if (!request.getPass().equals(request.getPass2())) {
throw new NegocioException("los campos de contraseña no son iguales", 2);
}
}
}

@ -0,0 +1,114 @@
package api.menu.playa.controller;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import api.menu.playa.exceptions.NegocioException;
import api.menu.playa.helper.OrdenHelper;
import api.menu.playa.vo.CambioCantidadVO;
import api.menu.playa.vo.OrdenVO;
import api.menu.playa.vo.PagadoVO;
import api.menu.playa.vo.ProductoIdVO;
import api.menu.playa.vo.ResponseGlobal;
import java.util.List;
import javax.annotation.security.RolesAllowed;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@RequestScoped
@Path("/order")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class OrdenController {
private static final String SUCCESS = "SUCCESS";
//private static final String ERROR = "ERROR";
@Inject
OrdenHelper ordenHelper;
/*
* Creacion de orden
*/
@RolesAllowed({"USER", "ADMIN"})
@GET
@Path("/create")
public Response create() {
Long id = ordenHelper.creacion();
return Response.ok(new ResponseGlobal<>(0, SUCCESS, id)).build();
}
@RolesAllowed({"USER", "ADMIN"})
@POST
@Path("/status")
public Response status(PagadoVO vo) {
try {
ordenHelper.actualizarOrden(vo);
return Response.ok(new ResponseGlobal<>(0, SUCCESS)).build();
} catch (NegocioException e) {
return Response.ok(new ResponseGlobal<>(e.getCode(), e.getMessage())).build();
}
}
/*
* Agregar nuevo producto a la orden
*/
@RolesAllowed({"USER", "ADMIN"})
@POST
@Path("/add")
public Response add(ProductoIdVO vo) {
ordenHelper.agregar(vo);
return Response.ok(new ResponseGlobal<>(0, SUCCESS)).build();
}
@RolesAllowed({"USER", "ADMIN"})
@POST
@Path("/detail")
public Response detail( CambioCantidadVO vo) {
ordenHelper.cambiar(vo);
return Response.ok(new ResponseGlobal<>(0, SUCCESS)).build();
}
/*
* Obtener todas las ordenes
*/
@RolesAllowed({"USER", "ADMIN"})
@GET
@Path("/getall")
public Response getAll() {
List<OrdenVO> ordenes = ordenHelper.obtenerTodo();
return Response.ok(new ResponseGlobal<>(0, SUCCESS, ordenes)).build();
}
@RolesAllowed({"USER", "ADMIN"})
@GET
@Path("/get/{id}")
public Response get(@PathParam("id") Long id) {
OrdenVO orden = ordenHelper.obtener(id);
return Response.ok(new ResponseGlobal<>(0, SUCCESS, orden)).build();
}
}

@ -0,0 +1,112 @@
package api.menu.playa.controller;
import java.util.List;
import javax.annotation.security.PermitAll;
import javax.annotation.security.RolesAllowed;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import api.menu.playa.exceptions.NegocioException;
import api.menu.playa.helper.ProductoHelper;
import api.menu.playa.vo.ProductoVO;
import api.menu.playa.vo.ResponseGlobal;
@RequestScoped
@Path("/product")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ProductoController {
private static final String SUCCESS = "SUCCESS";
private static final String ERROR = "ERROR";
@Inject
ProductoHelper productoHelper;
@RolesAllowed({"ADMIN", "USER"})
@POST
@Path("/create")
public Response crearProducto(ProductoVO productoVO) {
productoHelper.creacion(productoVO);
return Response.ok(new ResponseGlobal<>(0, SUCCESS)).build();
}
@RolesAllowed({"ADMIN", "USER"})
@PUT
@Path("/update")
public Response actualizarProducto(ProductoVO productoVO) {
try {
productoHelper.actualizar(productoVO);
return Response.ok(new ResponseGlobal<>(0, SUCCESS)).build();
} catch (NegocioException e) {
return Response.ok(new ResponseGlobal<>(e.getCode(), e.getMessage())).build();
} catch (Exception e) {
return Response.ok(new ResponseGlobal<>(1, ERROR)).build();
}
}
@RolesAllowed({"ADMIN", "USER"})
@GET
@Path("/get/{id}")
public Response getProducto(@PathParam("id") Long id) {
try {
ProductoVO productoVO = productoHelper.obtener(id);
return Response.ok(new ResponseGlobal<>(0, SUCCESS, productoVO)).build();
} catch (NegocioException e) {
return Response.ok(new ResponseGlobal<>(e.getCode(), e.getMessage())).build();
} catch (Exception e) {
return Response.ok(new ResponseGlobal<>(1, ERROR)).build();
}
}
@RolesAllowed({"ADMIN", "USER"})
@GET
@Path("/getall")
public Response getProducts() {
List<ProductoVO> productos = productoHelper.obtenerProductos();
return Response.ok(new ResponseGlobal<>(0, SUCCESS, productos)).build();
}
@PermitAll
@GET
@Path("/getallmenu")
public Response getProductsMenu() {
List<ProductoVO> productos = productoHelper.obtenerProductosMenu();
return Response.ok(new ResponseGlobal<>(0, SUCCESS, productos)).build();
}
@RolesAllowed({"ADMIN", "USER"})
@DELETE
@Path("/delete/{id}")
public Response delete(@PathParam("id") Long id) {
try {
productoHelper.delete(id);
return Response.ok(new ResponseGlobal<>(0, SUCCESS)).build();
} catch (NegocioException e) {
return Response.ok(new ResponseGlobal<>(e.getCode(), e.getMessage())).build();
} catch (Exception e) {
return Response.ok(new ResponseGlobal<>(1, ERROR)).build();
}
}
}

@ -0,0 +1,11 @@
package api.menu.playa.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import api.menu.playa.model.Detalle;
@Repository
public interface DetalleDAO extends JpaRepository<Detalle, Long> {
}

@ -0,0 +1,15 @@
package api.menu.playa.dao;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import api.menu.playa.model.Orden;
public interface OrdenDAO extends JpaRepository<Orden, Long> {
@Query("select o from Orden o where o.eliminado = false order by o.fechaCreacion desc")
List<Orden> getAll();
}

@ -0,0 +1,23 @@
package api.menu.playa.dao;
import java.util.Collection;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import api.menu.playa.model.Precio;
@Repository
public interface PrecioDAO extends JpaRepository<Precio, Long> {
@Query("select p from Precio p where p.eliminado = false and p.producto.id = :id")
Page<Precio> getPrecio(@Param("id") Long producto, Pageable pageable);
@Query("select p from Precio p where p.eliminado = false and p.producto.id = :id order by p.fechaCreacion desc")
Collection<Precio> getPrecio(@Param("id") Long producto);
}

@ -0,0 +1,20 @@
package api.menu.playa.dao;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import api.menu.playa.model.Producto;
@Repository
public interface ProductoDAO extends JpaRepository<Producto, Long> {
@Query("select p from Producto p where p.eliminado = false")
List<Producto> getAll();
@Query("select p from Producto p where p.eliminado = false and p.menu = true")
List<Producto> getAllMenu();
}

@ -0,0 +1,15 @@
package api.menu.playa.dao;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import api.menu.playa.model.Usuario;
public interface UsuarioDAO extends JpaRepository<Usuario, Long> {
@Query("select u from Usuario u where u.usuario = :usuario")
Usuario encontrarUsuario(@Param("usuario") String usuario);
}

@ -0,0 +1,7 @@
package api.menu.playa.enums;
public enum CambioCantidadEnum {
MINUS,
PLUS
}

@ -0,0 +1,7 @@
package api.menu.playa.enums;
public enum EstadoOrdenEnum {
CREADA,
PAGADO
}

@ -0,0 +1,8 @@
package api.menu.playa.enums;
public enum MedioPagoEnum {
EFECTIVO,
TRANSFERENCIA,
TARJETA
}

@ -0,0 +1,7 @@
package api.menu.playa.enums;
public enum RolesEnum {
ADMIN,
USER
}

@ -0,0 +1,21 @@
package api.menu.playa.exceptions;
public class NegocioException extends Exception {
private Integer code;
public NegocioException(String message, Integer code) {
super(message);
this.code = code;
}
public Integer getCode() {
return code;
}
@Override
public String getMessage() {
return super.getMessage();
}
}

@ -0,0 +1,107 @@
package api.menu.playa.helper;
import java.security.Key;
import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.HashSet;
import java.util.Optional;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.eclipse.microprofile.jwt.Claims;
import api.menu.playa.dao.UsuarioDAO;
import api.menu.playa.enums.RolesEnum;
import api.menu.playa.exceptions.NegocioException;
import api.menu.playa.model.Usuario;
import api.menu.playa.util.TokenUtils;
import api.menu.playa.vo.RegistroVO;
import api.menu.playa.vo.UsuarioVO;
import io.smallrye.jwt.build.Jwt;
@ApplicationScoped
public class LoginHelper {
@Inject
UsuarioDAO usuarioDAO;
public void registrarUsuario(RegistroVO request) throws Exception {
Usuario user = usuarioDAO.encontrarUsuario(request.getUser());
if (user != null) {
throw new NegocioException("El usuario ya existe", 2);
}
Usuario usuario = new Usuario();
usuario.setActivo(false);
usuario.setUsuario(request.getUser());
usuario.setPass(encript(request.getPass()));
usuario.setRol(RolesEnum.USER);
usuario.setNombre(request.getUser());
usuarioDAO.save(usuario);
}
public String validarUsuario(UsuarioVO request) throws Exception {
Usuario user = usuarioDAO.encontrarUsuario(request.getUser());
if (user == null) {
throw new NegocioException("Usuario no existe en el sistema", 2);
}
String password = encript(request.getPass());
if (!user.getActivo()) {
throw new NegocioException("Usuario no se encuentra activo", 2);
}
if (!password.equals(user.getPass())) {
throw new NegocioException("Usuario o contraseña es incorrecto", 2);
}
String token = TokenUtils.generateToken(user.getUsuario(), Collections.singleton(user.getRol()), 36000L, "https://vodorod.cl");
//String token = tokenGenerator(user);
return token;
}
private static String ENCRYPT_KEY = "clave-compartida-no-reveloar-nun";
private String encript(String text) throws Exception {
Key aesKey = new SecretKeySpec(ENCRYPT_KEY.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
byte[] encrypted = cipher.doFinal(text.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
private static String decrypt(String encrypted) throws Exception {
byte[] encryptedBytes = Base64.getDecoder().decode(encrypted.replace("\n", ""));
Key aesKey = new SecretKeySpec(ENCRYPT_KEY.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, aesKey);
String decrypted = new String(cipher.doFinal(encryptedBytes));
return decrypted;
}
public int currentTimeInSecs() {
long currentTimeMS = System.currentTimeMillis();
return (int) (currentTimeMS / 1000);
}
}

@ -0,0 +1,212 @@
package api.menu.playa.helper;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import api.menu.playa.dao.DetalleDAO;
import api.menu.playa.dao.OrdenDAO;
import api.menu.playa.dao.PrecioDAO;
import api.menu.playa.dao.ProductoDAO;
import api.menu.playa.enums.EstadoOrdenEnum;
import api.menu.playa.exceptions.NegocioException;
import api.menu.playa.model.Detalle;
import api.menu.playa.model.Orden;
import api.menu.playa.model.Precio;
import api.menu.playa.model.Producto;
import api.menu.playa.vo.CambioCantidadVO;
import api.menu.playa.vo.DetalleVO;
import api.menu.playa.vo.OrdenVO;
import api.menu.playa.vo.PagadoVO;
import api.menu.playa.vo.ProductoIdVO;
@ApplicationScoped
public class OrdenHelper {
@Inject
OrdenDAO ordenDAO;
@Inject
ProductoDAO productoDAO;
@Inject
PrecioDAO precioDAO;
@Inject
DetalleDAO detalleDAO;
public Long creacion() {
Orden orden = new Orden();
orden.setEstado(EstadoOrdenEnum.CREADA);
orden = ordenDAO.save(orden);
return orden.getId();
}
public List<OrdenVO> obtenerTodo() {
List<Orden> ordenes = ordenDAO.getAll();
//List<OrdenVO> ordenVOs = mapperOrden(ordenes);
return mapperOrden(ordenes);
}
public OrdenVO obtener(Long id) {
Optional<Orden> orden = ordenDAO.findById(id);
if (orden.isEmpty()) {
}
return mapper(orden.get());
}
public void agregar(ProductoIdVO vo) {
Optional<Orden> orden = ordenDAO.findById(vo.getOrden());
if (orden.isEmpty()) {
}
Optional<Producto> producto = productoDAO.findById(vo.getProducto());
if (producto.isEmpty()) {
}
Collection<Precio> precios = precioDAO.getPrecio(vo.getProducto());
Precio precio = precios.stream().findFirst().get();
Detalle detalle = new Detalle();
detalle.setCantidad(vo.getCantidad());
detalle.setOrden(orden.get());
detalle.setProducto(producto.get());
detalle.setPrecio(precio);
detalleDAO.save(detalle);
}
public void cambiar(CambioCantidadVO vo) {
Optional<Detalle> detalle = detalleDAO.findById(vo.getDetalle());
if (detalle.isEmpty()) {
}
switch (vo.getDato()) {
case MINUS:
Integer valorMenor = detalle.get().getCantidad()-1;
if (valorMenor == 0) {
detalle.get().setEliminado(true);
} else {
detalle.get().setCantidad(valorMenor);
}
break;
case PLUS:
Integer valorMayor = detalle.get().getCantidad()+1;
detalle.get().setCantidad(valorMayor);
break;
default:
System.err.println("ERRROR");
}
detalleDAO.save(detalle.get());
}
private List<OrdenVO> mapperOrden(List<Orden> ordenes) {
List<OrdenVO> ordenVOs = new ArrayList<>();
for (Orden orden: ordenes) {
ordenVOs.add(mapper(orden));
}
return ordenVOs;
}
private OrdenVO mapper(Orden orden) {
OrdenVO ordenVO = new OrdenVO();
ordenVO.setNum(orden.getId());
ordenVO.setFecha(orden.getFechaCreacion());
ordenVO.setEstado(orden.getEstado());
ordenVO.setMedio(orden.getMedioPago());
Integer total = 0;
if (!orden.getDetalle().isEmpty()) {
ordenVO.setDetalles(mapperDetalleVO(orden.getDetalle()));
for (Detalle detalle: orden.getDetalle()) {
if (!detalle.isEliminado()) {
total = total + (detalle.getPrecio().getPrecio() * detalle.getCantidad());
}
}
}
ordenVO.setTotal(total);
return ordenVO;
}
private List<DetalleVO> mapperDetalleVO(List<Detalle> detalles) {
List<DetalleVO> detalleVOs = new ArrayList<>();
for (Detalle detalle: detalles) {
if (!detalle.isEliminado()) {
detalleVOs.add(mapper(detalle));
}
}
return detalleVOs;
}
private DetalleVO mapper(Detalle detalle) {
DetalleVO detalleVO = new DetalleVO();
detalleVO.setCantidad(detalle.getCantidad());
detalleVO.setNombre(detalle.getProducto().getNombre());
detalleVO.setId(detalle.getId());
detalleVO.setPrecio(detalle.getPrecio().getPrecio());
return detalleVO;
}
public void actualizarOrden(PagadoVO vo) throws NegocioException {
Optional<Orden> orden = ordenDAO.findById(vo.getOrden());
if (orden.isEmpty()) {
throw new NegocioException("Orden no existe", 2);
}
orden.get().setEstado(vo.getEstado());
orden.get().setMedioPago(vo.getMedio());
if (EstadoOrdenEnum.PAGADO.equals(vo.getEstado())) {
ordenDAO.save(orden.get());
} else {
throw new NegocioException("Seleccione estado PAGADO para realizar el cambio", 2);
}
}
}

@ -0,0 +1,166 @@
package api.menu.playa.helper;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import api.menu.playa.dao.PrecioDAO;
import api.menu.playa.dao.ProductoDAO;
import api.menu.playa.exceptions.NegocioException;
import api.menu.playa.model.Precio;
import api.menu.playa.model.Producto;
import api.menu.playa.vo.ProductoVO;
@ApplicationScoped
public class ProductoHelper {
@Inject
ProductoDAO productoDAO;
@Inject
PrecioDAO precioDAO;
public void creacion(ProductoVO productoVO) {
Producto producto = new Producto();
producto.setNombre(productoVO.getNombre());
producto.setDescripcion(productoVO.getDescripcion());
producto.setPosicion(1);
producto.setMostrar(productoVO.getMostrar());
producto = productoDAO.save(producto);
Precio precio = new Precio();
precio.setPrecio(productoVO.getPrecio());
precio.setProducto(producto);
precioDAO.save(precio);
}
public void actualizar(ProductoVO productoVO) throws NegocioException {
Optional<Producto> optional = productoDAO.findById(productoVO.getId());
if (optional.isEmpty()) {
throw new NegocioException("No existe producto", 2);
}
if (!"".equals(productoVO.getNombre())) {
optional.get().setNombre(productoVO.getNombre());
}
if (!"".equals(productoVO.getDescripcion())) {
optional.get().setDescripcion(productoVO.getDescripcion());
}
optional.get().setPosicion(productoVO.getPosicion());
optional.get().setMenu(productoVO.getMenu());
Producto producto = productoDAO.save(optional.get());
Collection<Precio> precios = precioDAO.getPrecio(optional.get().getId());
Integer valor = precios.stream().findFirst().get().getPrecio();
if (productoVO.getPrecio() != null && valor != productoVO.getPrecio()) {
Precio precio = new Precio();
precio.setPrecio(productoVO.getPrecio());
precio.setProducto(producto);
precioDAO.save(precio);
}
}
public ProductoVO obtener(Long id) throws NegocioException {
Optional<Producto> producto = productoDAO.findById(id);
if (producto.isEmpty()) {
throw new NegocioException("No existe producto", 2);
}
return mapper(producto.get());
}
public List<ProductoVO> obtenerProductos() {
List<Producto> productos = productoDAO.getAll();
List<ProductoVO> productoVOs = mapper(productos);
productoVOs.sort(Comparator.comparing(ProductoVO::getPosicion));
return productoVOs;
}
private List<ProductoVO> mapper(List<Producto> productos) {
List<ProductoVO> productoVOs = new ArrayList<>();
for (Producto producto: productos) {
productoVOs.add(mapper(producto));
}
return productoVOs;
}
private ProductoVO mapper(Producto producto) {
ProductoVO productoVO = new ProductoVO();
productoVO.setId(producto.getId());
productoVO.setNombre(producto.getNombre());
productoVO.setDescripcion(producto.getDescripcion());
productoVO.setPosicion(producto.getPosicion());
productoVO.setMostrar(producto.getMostrar());
productoVO.setMenu(producto.getMenu());
Collection<Precio> precios = precioDAO.getPrecio(producto.getId());
Integer valor = precios.stream().findFirst().get().getPrecio();
productoVO.setPrecio(valor);
return productoVO;
}
public void delete(Long id) throws NegocioException {
Optional<Producto> producto = productoDAO.findById(id);
if (producto.isEmpty()) {
throw new NegocioException("No existe producto", 2);
}
producto.get().setEliminado(true);
productoDAO.save(producto.get());
}
public List<ProductoVO> obtenerProductosMenu() {
List<Producto> productos = productoDAO.getAllMenu();
List<ProductoVO> productoVOs = mapper(productos);
productoVOs.sort(Comparator.comparing(ProductoVO::getPosicion));
return productoVOs;
}
}

@ -0,0 +1,48 @@
package api.menu.playa.model;
import java.time.LocalDate;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class AbstractGeneral {
@Column(name = "fecha_creacion", nullable = false)
private LocalDateTime fechaCreacion = LocalDateTime.now();
@Column(name = "eliminado", nullable = false)
private boolean eliminado = false;
@Column(name = "fecha_actualizacion")
private LocalDate fechaActualizacion;
abstract Long getId();
public LocalDateTime getFechaCreacion() {
return fechaCreacion;
}
public void setFechaCreacion(LocalDateTime fechaCreacion) {
this.fechaCreacion = fechaCreacion;
}
public boolean isEliminado() {
return eliminado;
}
public void setEliminado(boolean eliminado) {
this.eliminado = eliminado;
}
public LocalDate getFechaActualizacion() {
return fechaActualizacion;
}
public void setFechaActualizacion(LocalDate fechaActualizacion) {
this.fechaActualizacion = fechaActualizacion;
}
}

@ -0,0 +1,78 @@
package api.menu.playa.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "neg_detalle")
public class Detalle extends AbstractGeneral{
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "detalle_id_gen")
@SequenceGenerator(name = "detalle_id_gen", sequenceName = "detalle_seq", allocationSize = 1)
@Column(name = "id")
private Long id;
@Column(name = "cantidad")
private Integer cantidad;
@ManyToOne
@JoinColumn(name = "orden_id", nullable = false)
private Orden orden;
@ManyToOne
@JoinColumn(name = "producto_id", nullable = false)
private Producto producto;
@ManyToOne
@JoinColumn(name = "precio_id", nullable = false)
private Precio precio;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getCantidad() {
return cantidad;
}
public void setCantidad(Integer cantidad) {
this.cantidad = cantidad;
}
public Orden getOrden() {
return orden;
}
public void setOrden(Orden orden) {
this.orden = orden;
}
public Producto getProducto() {
return producto;
}
public void setProducto(Producto producto) {
this.producto = producto;
}
public Precio getPrecio() {
return precio;
}
public void setPrecio(Precio precio) {
this.precio = precio;
}
}

@ -0,0 +1,73 @@
package api.menu.playa.model;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import api.menu.playa.enums.EstadoOrdenEnum;
import api.menu.playa.enums.MedioPagoEnum;
@Entity
@Table(name = "neg_orden")
public class Orden extends AbstractGeneral{
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "orden_id_gen")
@SequenceGenerator(name = "orden_id_gen", sequenceName = "orden_seq", allocationSize = 1)
@Column(name = "id")
private Long id;
@Enumerated(EnumType.STRING)
@Column(name = "estado")
private EstadoOrdenEnum estado;
@Enumerated(EnumType.STRING)
@Column(name = "medio_pago")
private MedioPagoEnum medioPago;
@OneToMany(mappedBy = "orden")
private List<Detalle> detalle;
@Override
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public EstadoOrdenEnum getEstado() {
return estado;
}
public void setEstado(EstadoOrdenEnum estado) {
this.estado = estado;
}
public MedioPagoEnum getMedioPago() {
return medioPago;
}
public void setMedioPago(MedioPagoEnum medioPago) {
this.medioPago = medioPago;
}
public List<Detalle> getDetalle() {
return detalle;
}
public void setDetalle(List<Detalle> detalle) {
this.detalle = detalle;
}
}

@ -0,0 +1,68 @@
package api.menu.playa.model;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "neg_precio")
public class Precio extends AbstractGeneral {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "precio_id_gen")
@SequenceGenerator(name = "precio_id_gen", sequenceName = "precio_seq", allocationSize = 1)
@Column(name = "id")
private Long id;
@Column(name = "precio")
private Integer precio;
@OneToMany(mappedBy = "precio")
private List<Detalle> detalle;
@ManyToOne
@JoinColumn(name = "producto_id", nullable = false)
private Producto producto;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getPrecio() {
return precio;
}
public void setPrecio(Integer precio) {
this.precio = precio;
}
public List<Detalle> getDetalle() {
return detalle;
}
public void setDetalle(List<Detalle> detalle) {
this.detalle = detalle;
}
public Producto getProducto() {
return producto;
}
public void setProducto(Producto producto) {
this.producto = producto;
}
}

@ -0,0 +1,124 @@
package api.menu.playa.model;
import java.util.Collection;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "dom_producto")
public class Producto extends AbstractGeneral {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "producto_id_gen")
@SequenceGenerator(name = "producto_id_gen", sequenceName = "producto_seq", allocationSize = 1)
@Column(name = "id")
private Long id;
@Column(name = "agotado")
private Boolean agotado = false;
@Column(name = "nombre")
private String nombre;
@Column(name = "descripcion")
private String descripcion;
@OneToMany(mappedBy = "producto")
private List<Detalle> detalles;
@OneToMany(mappedBy = "producto")
private Collection<Precio> precios;
@Column(name = "posicion")
private Integer posicion;
@Column(name = "mostrar_descripcion")
private Boolean mostrar = false;
@Column(name = "mostrar_menu")
private Boolean menu = false;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Boolean getAgotado() {
return agotado;
}
public void setAgotado(Boolean agotado) {
this.agotado = agotado;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public List<Detalle> getDetalles() {
return detalles;
}
public void setDetalles(List<Detalle> detalles) {
this.detalles = detalles;
}
public Collection<Precio> getPrecios() {
return precios;
}
public void setPrecios(Collection<Precio> precios) {
this.precios = precios;
}
public Integer getPosicion() {
return posicion;
}
public void setPosicion(Integer posicion) {
this.posicion = posicion;
}
public Boolean getMostrar() {
return mostrar;
}
public void setMostrar(Boolean mostrar) {
this.mostrar = mostrar;
}
public Boolean getMenu() {
return menu;
}
public void setMenu(Boolean menu) {
this.menu = menu;
}
}

@ -0,0 +1,104 @@
package api.menu.playa.model;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import api.menu.playa.enums.RolesEnum;
@Entity
@Table(name = "neg_usuario")
public class Usuario {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "usuario_id_gen")
@SequenceGenerator(name = "usuario_id_gen", sequenceName = "usuario_seq", allocationSize = 1)
@Column(name = "id")
private Long id;
@Column(name = "usuario", unique = true)
private String usuario;
@Column(name = "pass")
private String pass;
@Enumerated(EnumType.STRING)
@Column(name = "rol")
private RolesEnum rol;
@Column(name = "activo")
private Boolean activo;
@Column(name = "fecha_creacion")
private LocalDateTime fecha = LocalDateTime.now();
@Column(name = "nombre")
private String nombre;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getUsuario() {
return usuario;
}
public void setUsuario(String usuario) {
this.usuario = usuario;
}
public RolesEnum getRol() {
return rol;
}
public void setRol(RolesEnum rol) {
this.rol = rol;
}
public Boolean getActivo() {
return activo;
}
public void setActivo(Boolean activo) {
this.activo = activo;
}
public LocalDateTime getFecha() {
return fecha;
}
public void setFecha(LocalDateTime fecha) {
this.fecha = fecha;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}

@ -0,0 +1,72 @@
package api.menu.playa.util;
import java.io.InputStream;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import java.util.HashSet;
import java.util.Set;
import javax.management.relation.Role;
import api.menu.playa.enums.RolesEnum;
import io.smallrye.jwt.build.Jwt;
import io.smallrye.jwt.build.JwtClaimsBuilder;
public class TokenUtils {
public static String generateToken(String username, Set<RolesEnum> roles, Long duration, String issuer) throws Exception {
String privateKeyLocation = "/privatekey.pem";
PrivateKey privateKey = readPrivateKey(privateKeyLocation);
JwtClaimsBuilder claimsBuilder = Jwt.claims();
long currentTimeInSecs = currentTimeInSecs();
Set<String> groups = new HashSet<>();
for (RolesEnum role : roles) groups.add(role.toString());
claimsBuilder.issuer(issuer);
claimsBuilder.subject(username);
claimsBuilder.issuedAt(currentTimeInSecs);
claimsBuilder.expiresAt(currentTimeInSecs + duration);
claimsBuilder.groups(groups);
return claimsBuilder.jws().signatureKeyId(privateKeyLocation).sign(privateKey);
}
public static PrivateKey readPrivateKey(final String pemResName) throws Exception {
try (InputStream contentIS = TokenUtils.class.getResourceAsStream(pemResName)) {
byte[] tmp = new byte[4096];
int length = contentIS.read(tmp);
return decodePrivateKey(new String(tmp, 0, length, "UTF-8"));
}
}
public static PrivateKey decodePrivateKey(final String pemEncoded) throws Exception {
byte[] encodedBytes = toEncodedBytes(pemEncoded);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(keySpec);
}
public static byte[] toEncodedBytes(final String pemEncoded) {
final String normalizedPem = removeBeginEnd(pemEncoded);
return Base64.getDecoder().decode(normalizedPem);
}
public static String removeBeginEnd(String pem) {
pem = pem.replaceAll("-----BEGIN (.*)-----", "");
pem = pem.replaceAll("-----END (.*)----", "");
pem = pem.replaceAll("\r\n", "");
pem = pem.replaceAll("\n", "");
return pem.trim();
}
public static int currentTimeInSecs() {
long currentTimeMS = System.currentTimeMillis();
return (int) (currentTimeMS / 1000);
}
}

@ -0,0 +1,26 @@
package api.menu.playa.vo;
import api.menu.playa.enums.CambioCantidadEnum;
public class CambioCantidadVO {
private Long detalle;
private CambioCantidadEnum dato;
public CambioCantidadEnum getDato() {
return dato;
}
public void setDato(CambioCantidadEnum dato) {
this.dato = dato;
}
public Long getDetalle() {
return detalle;
}
public void setDetalle(Long detalle) {
this.detalle = detalle;
}
}

@ -0,0 +1,42 @@
package api.menu.playa.vo;
public class DetalleVO {
private Long id;
private String nombre;
private String descripcion;
private Integer cantidad;
private Integer precio;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public Integer getCantidad() {
return cantidad;
}
public void setCantidad(Integer cantidad) {
this.cantidad = cantidad;
}
public Integer getPrecio() {
return precio;
}
public void setPrecio(Integer precio) {
this.precio = precio;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}

@ -0,0 +1,70 @@
package api.menu.playa.vo;
import java.time.LocalDateTime;
import java.util.List;
import api.menu.playa.enums.EstadoOrdenEnum;
import api.menu.playa.enums.MedioPagoEnum;
public class OrdenVO {
private Long num;
private Integer total;
private LocalDateTime fecha;
private EstadoOrdenEnum estado;
private MedioPagoEnum medio;
private List<DetalleVO> detalles;
public Long getNum() {
return num;
}
public void setNum(Long num) {
this.num = num;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public List<DetalleVO> getDetalles() {
return detalles;
}
public void setDetalles(List<DetalleVO> detalles) {
this.detalles = detalles;
}
public LocalDateTime getFecha() {
return fecha;
}
public void setFecha(LocalDateTime fecha) {
this.fecha = fecha;
}
public EstadoOrdenEnum getEstado() {
return estado;
}
public void setEstado(EstadoOrdenEnum estado) {
this.estado = estado;
}
public MedioPagoEnum getMedio() {
return medio;
}
public void setMedio(MedioPagoEnum medio) {
this.medio = medio;
}
}

@ -0,0 +1,32 @@
package api.menu.playa.vo;
import api.menu.playa.enums.EstadoOrdenEnum;
import api.menu.playa.enums.MedioPagoEnum;
public class PagadoVO {
private Long orden;
private EstadoOrdenEnum estado;
private MedioPagoEnum medio;
public Long getOrden() {
return orden;
}
public void setOrden(Long orden) {
this.orden = orden;
}
public EstadoOrdenEnum getEstado() {
return estado;
}
public void setEstado(EstadoOrdenEnum estado) {
this.estado = estado;
}
public MedioPagoEnum getMedio() {
return medio;
}
public void setMedio(MedioPagoEnum medio) {
this.medio = medio;
}
}

@ -0,0 +1,29 @@
package api.menu.playa.vo;
public class ProductoIdVO {
private Long orden;
private Long producto;
private Integer cantidad;
public Long getOrden() {
return orden;
}
public void setOrden(Long orden) {
this.orden = orden;
}
public Long getProducto() {
return producto;
}
public void setProducto(Long producto) {
this.producto = producto;
}
public Integer getCantidad() {
return cantidad;
}
public void setCantidad(Integer cantidad) {
this.cantidad = cantidad;
}
}

@ -0,0 +1,56 @@
package api.menu.playa.vo;
public class ProductoVO {
private Long id;
private String nombre;
private String descripcion;
private Integer precio;
private Integer posicion;
private Boolean mostrar;
private Boolean menu;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public Integer getPrecio() {
return precio;
}
public void setPrecio(Integer precio) {
this.precio = precio;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getPosicion() {
return posicion;
}
public void setPosicion(Integer posicion) {
this.posicion = posicion;
}
public Boolean getMostrar() {
return mostrar;
}
public void setMostrar(Boolean mostrar) {
this.mostrar = mostrar;
}
public Boolean getMenu() {
return menu;
}
public void setMenu(Boolean menu) {
this.menu = menu;
}
}

@ -0,0 +1,29 @@
package api.menu.playa.vo;
public class RegistroVO {
private String user;
private String pass;
private String pass2;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getPass2() {
return pass2;
}
public void setPass2(String pass2) {
this.pass2 = pass2;
}
}

@ -0,0 +1,50 @@
package api.menu.playa.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.quarkus.runtime.annotations.RegisterForReflection;
@RegisterForReflection
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseGlobal<T> {
private Integer code;
private String message;
private T result;
public ResponseGlobal(Integer code, String message, T result) {
this.code = code;
this.message = message;
this.result = result;
}
public ResponseGlobal(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
}

@ -0,0 +1,22 @@
package api.menu.playa.vo;
public class UsuarioVO {
private String user;
private String pass;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,35 @@
quarkus.http.port=${MS_PORT:8181}
quarkus.http.root-path=/beach
quarkus.http.cors=true
quarkus.http.cors.origins=http://localhost:4200
quarkus.http.host=0.0.0.0
quarkus.datasource.username=postgres
quarkus.datasource.password=13467982
quarkus.datasource.jdbc.url=jdbc:postgresql://192.168.1.17:5432/postgres?currentSchema=playa
quarkus.datasource.users.jdbc.max-size=11
quarkus.datasource.jdbc.idle-removal-interval= 10
quarkus.datasource.inventory.jdbc.max-size=12
quarkus.hibernate-orm.database.generation=update
mp.jwt.verify.publickey.location=publickey.pem
mp.jwt.verify.issuer=https://vodorod.cl
quarkus.smallrye-jwt.enabled=true
quarkus.log.file.enable=true
quarkus.log.file.path=logs/quarkus.log
quarkus.log.file.level=DEBUG
quarkus.log.file.format=%d{HH:mm:ss} %-5p [%c{2.}]] (%t) %s%e%n
quarkus.log.file.rotation.max-file-size=20M
quarkus.log.file.rotation.max-backup-index=30
# ED8eqKY5ZyQAH9px
%prod.quarkus.http.cors.origins=https://tienda.vodorod.cl,https://menu.vodorod.cl
%prod.quarkus.datasource.username=playa_tienda
%prod.quarkus.datasource.password=ED8eqKY5ZyQAH9px
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/postgres?currentSchema=playa

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC8NiwFmUjkYToz
awPKjJzGzucjskI7tZbo274EGescwsQL+W8AyE+0nyF8IPHeSJhcU+VXBS3qvxh9
QXJb2mG98LVnkoZKxQgDmpVzkN/2MzCIRDkgyBZ8sOcZ4Oj8gkuI5s/qxwwD/d5W
0RsR4sgGCX9SZwiTdWapZDdM1xpGPAegmh9+atvNVZHj/6+h+jSHTDrgqGRiYQg7
+YN7RfQwBaY6loMcrrIN2Ymzo7e2j4i9K6MRZhuCanziW30TTDk6has6wKVA+qr4
Czu/w4xmH59yJZyH+6WFSrzmxsDaoD01OLOSMnjrrfnjfZz2gxGgwlNd/cxymgEN
/ZhfbXYXAgMBAAECggEAUS8YzA1ziLd7sGQvzXXbxlHHF/mzYigRAT6P9xrq9Iv6
nqOoQvEkmGevvOhFDDnKJsE1gtTEGqb1PEo3tvE7CgBDb3qfnK7ipxNN9fx+7qbj
/1NWRRKpyH1SIjKGrSzSwim1c7MKNsqR1mb6QzvMRfZgyj2RUHHqp5SH2ghK2BIc
35MXkWo3o1FhXiJ3ZjiwNb/qEbe1c9oCX9DnC3UZFKKctCNqFwf1XdEqoFX+Qq2f
Et8LIRWfBXcXjODBJpF4MBHbz5BmwIqkXwtKUfnAzQd+TxkuGpRn291A4f7DLFZy
03+S/rFWIdqQdVsDiqInmQwa+9UFge/KZsaUBRII8QKBgQDsfOXSaOUdVXw4QbrG
3GZ0DE/CtY4dDLqkwYnGtdAi5lGU2kSUD9NWDoe/fcgqIvU2a3tkMF74Sil6KcE5
r/fAtFXp5/ZZqmNtUlJKpSSBE2RYEb50cDssGHsz9GxSQqKWhl1f7swtTOd5TVBk
DswrREc9uEKY21pA/YG4/+j/vwKBgQDLvZTr2MTFtT9gUkxkxHQUY1TIpFzRzXa8
EHG4zTXzZQloPgZC0Bd1oKBq+XVhJHhtgBSe5/naB49AykuDZFILyR4yawyG5UO1
242yYXbtxqAwjzxEKLfJKM8qe5kUMn8H2AMRgo9f1Mc5U6qJxKAx2VrM1sAkmD4S
ZSWy6XufqQKBgA05mtyecxml2zGGM3zFfJFG0vsPjif/uzxVem/7YO1itfM+FZG2
JNpuK5dA4H3CwLXPYvIiZl06QIGNbjncpl1HeHqBN1yiU7ccYG++NoFlZTorm9wF
HroDkHhCVgBvq4oBb51azF5IK7Wz5igCT9anldhUwpyrv6tcwfFnlk8fAoGBAMRS
r2DAJYRZzXMUepaTE0PeH4Gjl+l28hXwRpUL8RPTZUg0lDXnbOOk30+Vh70OtpjV
VYl2ATVOGYUWKcO3dLP0nYt5yb1myGNB5/1em4ot3ohMTYdkMQy+rTnDldN3gR7e
0L4br+ppD3w3GdrdRHwkdLFzsfzRUubI3pXTFJPZAoGADkaG7jsoqTIc3ZYtZWzn
vX1T32VQNwgSyAlutRhPKZO9KJ+zlODHyIW5akQBQevC66RrhY6A79NkdQYuicrn
kU9uHPv8+UT8sqsteMPIXryeytRs+QVpBVvcoomyPmbzWItn/RTxnRaXoPr7IIoS
ySryjnf3b8RX4xTt8vSj7No=
-----END PRIVATE KEY-----

@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvDYsBZlI5GE6M2sDyoyc
xs7nI7JCO7WW6Nu+BBnrHMLEC/lvAMhPtJ8hfCDx3kiYXFPlVwUt6r8YfUFyW9ph
vfC1Z5KGSsUIA5qVc5Df9jMwiEQ5IMgWfLDnGeDo/IJLiObP6scMA/3eVtEbEeLI
Bgl/UmcIk3VmqWQ3TNcaRjwHoJoffmrbzVWR4/+vofo0h0w64KhkYmEIO/mDe0X0
MAWmOpaDHK6yDdmJs6O3to+IvSujEWYbgmp84lt9E0w5OoWrOsClQPqq+As7v8OM
Zh+fciWch/ulhUq85sbA2qA9NTizkjJ46635432c9oMRoMJTXf3McpoBDf2YX212
FwIDAQAB
-----END PUBLIC KEY-----

@ -0,0 +1,8 @@
package api.menu.playa;
import io.quarkus.test.junit.QuarkusIntegrationTest;
@QuarkusIntegrationTest
public class GreetingResourceIT extends GreetingResourceTest {
// Execute the same tests but in packaged mode.
}

@ -0,0 +1,21 @@
package api.menu.playa;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;
@QuarkusTest
public class GreetingResourceTest {
@Test
public void testHelloEndpoint() {
given()
.when().get("/hello")
.then()
.statusCode(200)
.body(is("Hello from RESTEasy Reactive"));
}
}
Loading…
Cancel
Save

Powered by TurnKey Linux.