switch to spring boot, change some structure
							parent
							
								
									3873c8ae6d
								
							
						
					
					
						commit
						beff30babf
					
				| @ -1,4 +0,0 @@ | ||||
| * | ||||
| !target/*-runner | ||||
| !target/*-runner.jar | ||||
| !target/lib/* | ||||
| @ -0,0 +1,2 @@ | ||||
| /mvnw text eol=lf | ||||
| *.cmd text eol=crlf | ||||
| @ -1,35 +1,33 @@ | ||||
| # Eclipse | ||||
| .project | ||||
| HELP.md | ||||
| target/ | ||||
| !.mvn/wrapper/maven-wrapper.jar | ||||
| !**/src/main/**/target/ | ||||
| !**/src/test/**/target/ | ||||
| 
 | ||||
| ### STS ### | ||||
| .apt_generated | ||||
| .classpath | ||||
| .settings/ | ||||
| bin/ | ||||
| .factorypath | ||||
| .project | ||||
| .settings | ||||
| .springBeans | ||||
| .sts4-cache | ||||
| 
 | ||||
| # IntelliJ | ||||
| ### IntelliJ IDEA ### | ||||
| .idea | ||||
| *.ipr | ||||
| *.iml | ||||
| *.iws | ||||
| *.iml | ||||
| *.ipr | ||||
| 
 | ||||
| # NetBeans | ||||
| nb-configuration.xml | ||||
| 
 | ||||
| # Visual Studio Code | ||||
| .vscode | ||||
| 
 | ||||
| # OSX | ||||
| .DS_Store | ||||
| 
 | ||||
| # Vim | ||||
| *.swp | ||||
| *.swo | ||||
| 
 | ||||
| # patch | ||||
| *.orig | ||||
| *.rej | ||||
| ### NetBeans ### | ||||
| /nbproject/private/ | ||||
| /nbbuild/ | ||||
| /dist/ | ||||
| /nbdist/ | ||||
| /.nb-gradle/ | ||||
| build/ | ||||
| !**/src/main/**/build/ | ||||
| !**/src/test/**/build/ | ||||
| 
 | ||||
| # Maven | ||||
| target/ | ||||
| pom.xml.tag | ||||
| pom.xml.releaseBackup | ||||
| pom.xml.versionsBackup | ||||
| release.properties | ||||
| ### VS Code ### | ||||
| .vscode/ | ||||
|  | ||||
| @ -1,117 +0,0 @@ | ||||
| /* | ||||
|  * Copyright 2007-present the original author or authors. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *      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 = "0.5.5"; | ||||
|     /** | ||||
|      * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. | ||||
|      */ | ||||
|     private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" | ||||
|         + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; | ||||
| 
 | ||||
|     /** | ||||
|      * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to | ||||
|      * use instead of the default one. | ||||
|      */ | ||||
|     private static final String MAVEN_WRAPPER_PROPERTIES_PATH = | ||||
|             ".mvn/wrapper/maven-wrapper.properties"; | ||||
| 
 | ||||
|     /** | ||||
|      * Path where the maven-wrapper.jar will be saved to. | ||||
|      */ | ||||
|     private static final String MAVEN_WRAPPER_JAR_PATH = | ||||
|             ".mvn/wrapper/maven-wrapper.jar"; | ||||
| 
 | ||||
|     /** | ||||
|      * Name of the property which should be used to override the default download url for the wrapper. | ||||
|      */ | ||||
|     private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; | ||||
| 
 | ||||
|     public static void main(String args[]) { | ||||
|         System.out.println("- Downloader started"); | ||||
|         File baseDirectory = new File(args[0]); | ||||
|         System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); | ||||
| 
 | ||||
|         // If the maven-wrapper.properties exists, read it and check if it contains a custom
 | ||||
|         // wrapperUrl parameter.
 | ||||
|         File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); | ||||
|         String url = DEFAULT_DOWNLOAD_URL; | ||||
|         if(mavenWrapperPropertyFile.exists()) { | ||||
|             FileInputStream mavenWrapperPropertyFileInputStream = null; | ||||
|             try { | ||||
|                 mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); | ||||
|                 Properties mavenWrapperProperties = new Properties(); | ||||
|                 mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); | ||||
|                 url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); | ||||
|             } catch (IOException e) { | ||||
|                 System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); | ||||
|             } finally { | ||||
|                 try { | ||||
|                     if(mavenWrapperPropertyFileInputStream != null) { | ||||
|                         mavenWrapperPropertyFileInputStream.close(); | ||||
|                     } | ||||
|                 } catch (IOException e) { | ||||
|                     // Ignore ...
 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         System.out.println("- Downloading from: " + url); | ||||
| 
 | ||||
|         File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); | ||||
|         if(!outputFile.getParentFile().exists()) { | ||||
|             if(!outputFile.getParentFile().mkdirs()) { | ||||
|                 System.out.println( | ||||
|                         "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); | ||||
|             } | ||||
|         } | ||||
|         System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); | ||||
|         try { | ||||
|             downloadFileFromURL(url, outputFile); | ||||
|             System.out.println("Done"); | ||||
|             System.exit(0); | ||||
|         } catch (Throwable e) { | ||||
|             System.out.println("- Error downloading"); | ||||
|             e.printStackTrace(); | ||||
|             System.exit(1); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private static void downloadFileFromURL(String urlString, File destination) throws Exception { | ||||
|         if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { | ||||
|             String username = System.getenv("MVNW_USERNAME"); | ||||
|             char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); | ||||
|             Authenticator.setDefault(new Authenticator() { | ||||
|                 @Override | ||||
|                 protected PasswordAuthentication getPasswordAuthentication() { | ||||
|                     return new PasswordAuthentication(username, password); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|         URL website = new URL(urlString); | ||||
|         ReadableByteChannel rbc; | ||||
|         rbc = Channels.newChannel(website.openStream()); | ||||
|         FileOutputStream fos = new FileOutputStream(destination); | ||||
|         fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); | ||||
|         fos.close(); | ||||
|         rbc.close(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
											
												Binary file not shown.
											
										
									
								| @ -1,2 +1,20 @@ | ||||
| distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.1/apache-maven-3.6.1-bin.zip | ||||
| wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar | ||||
| # 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 | ||||
| distributionSha256Sum=4ec3f26fb1a692473aea0235c300bd20f0f9fe741947c82c1234cefd76ac3a3c | ||||
|  | ||||
| @ -1,182 +0,0 @@ | ||||
| @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 Maven2 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 key stroke before ending | ||||
| @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven | ||||
| @REM     e.g. to debug Maven itself, use | ||||
| @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 | ||||
| @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files | ||||
| @REM ---------------------------------------------------------------------------- | ||||
| 
 | ||||
| @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' | ||||
| @echo off | ||||
| @REM set title of command window | ||||
| title %0 | ||||
| @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' | ||||
| @if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO% | ||||
| 
 | ||||
| @REM set %HOME% to equivalent of $HOME | ||||
| if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") | ||||
| 
 | ||||
| @REM Execute a user defined script before this one | ||||
| if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre | ||||
| @REM check for pre script, once with legacy .bat ending and once with .cmd ending | ||||
| if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" | ||||
| if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" | ||||
| :skipRcPre | ||||
| 
 | ||||
| @setlocal | ||||
| 
 | ||||
| set ERROR_CODE=0 | ||||
| 
 | ||||
| @REM To isolate internal variables from possible post scripts, we use another setlocal | ||||
| @setlocal | ||||
| 
 | ||||
| @REM ==== START VALIDATION ==== | ||||
| if not "%JAVA_HOME%" == "" goto OkJHome | ||||
| 
 | ||||
| echo. | ||||
| echo Error: JAVA_HOME not found in your environment. >&2 | ||||
| echo Please set the JAVA_HOME variable in your environment to match the >&2 | ||||
| echo location of your Java installation. >&2 | ||||
| echo. | ||||
| goto error | ||||
| 
 | ||||
| :OkJHome | ||||
| if exist "%JAVA_HOME%\bin\java.exe" goto init | ||||
| 
 | ||||
| echo. | ||||
| echo Error: JAVA_HOME is set to an invalid directory. >&2 | ||||
| echo JAVA_HOME = "%JAVA_HOME%" >&2 | ||||
| echo Please set the JAVA_HOME variable in your environment to match the >&2 | ||||
| echo location of your Java installation. >&2 | ||||
| echo. | ||||
| goto error | ||||
| 
 | ||||
| @REM ==== END VALIDATION ==== | ||||
| 
 | ||||
| :init | ||||
| 
 | ||||
| @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". | ||||
| @REM Fallback to current working directory if not found. | ||||
| 
 | ||||
| set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% | ||||
| IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir | ||||
| 
 | ||||
| set EXEC_DIR=%CD% | ||||
| set WDIR=%EXEC_DIR% | ||||
| :findBaseDir | ||||
| IF EXIST "%WDIR%"\.mvn goto baseDirFound | ||||
| cd .. | ||||
| IF "%WDIR%"=="%CD%" goto baseDirNotFound | ||||
| set WDIR=%CD% | ||||
| goto findBaseDir | ||||
| 
 | ||||
| :baseDirFound | ||||
| set MAVEN_PROJECTBASEDIR=%WDIR% | ||||
| cd "%EXEC_DIR%" | ||||
| goto endDetectBaseDir | ||||
| 
 | ||||
| :baseDirNotFound | ||||
| set MAVEN_PROJECTBASEDIR=%EXEC_DIR% | ||||
| cd "%EXEC_DIR%" | ||||
| 
 | ||||
| :endDetectBaseDir | ||||
| 
 | ||||
| IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig | ||||
| 
 | ||||
| @setlocal EnableExtensions EnableDelayedExpansion | ||||
| for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a | ||||
| @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% | ||||
| 
 | ||||
| :endReadAdditionalConfig | ||||
| 
 | ||||
| SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" | ||||
| set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" | ||||
| set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain | ||||
| 
 | ||||
| set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" | ||||
| 
 | ||||
| FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( | ||||
|     IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B | ||||
| ) | ||||
| 
 | ||||
| @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central | ||||
| @REM This allows using the maven wrapper in projects that prohibit checking in binary data. | ||||
| if exist %WRAPPER_JAR% ( | ||||
|     if "%MVNW_VERBOSE%" == "true" ( | ||||
|         echo Found %WRAPPER_JAR% | ||||
|     ) | ||||
| ) else ( | ||||
|     if not "%MVNW_REPOURL%" == "" ( | ||||
|         SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar" | ||||
|     ) | ||||
|     if "%MVNW_VERBOSE%" == "true" ( | ||||
|         echo Couldn't find %WRAPPER_JAR%, downloading it ... | ||||
|         echo Downloading from: %DOWNLOAD_URL% | ||||
|     ) | ||||
| 
 | ||||
|     powershell -Command "&{"^ | ||||
| 		"$webclient = new-object System.Net.WebClient;"^ | ||||
| 		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ | ||||
| 		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ | ||||
| 		"}"^ | ||||
| 		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ | ||||
| 		"}" | ||||
|     if "%MVNW_VERBOSE%" == "true" ( | ||||
|         echo Finished downloading %WRAPPER_JAR% | ||||
|     ) | ||||
| ) | ||||
| @REM End of extension | ||||
| 
 | ||||
| @REM Provide a "standardized" way to retrieve the CLI args that will | ||||
| @REM work with both Windows and non-Windows executions. | ||||
| set MAVEN_CMD_LINE_ARGS=%* | ||||
| 
 | ||||
| %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* | ||||
| if ERRORLEVEL 1 goto error | ||||
| goto end | ||||
| 
 | ||||
| :error | ||||
| set ERROR_CODE=1 | ||||
| 
 | ||||
| :end | ||||
| @endlocal & set ERROR_CODE=%ERROR_CODE% | ||||
| 
 | ||||
| if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost | ||||
| @REM check for post script, once with legacy .bat ending and once with .cmd ending | ||||
| if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" | ||||
| if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" | ||||
| :skipRcPost | ||||
| 
 | ||||
| @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' | ||||
| if "%MAVEN_BATCH_PAUSE%" == "on" pause | ||||
| 
 | ||||
| if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% | ||||
| 
 | ||||
| exit /B %ERROR_CODE% | ||||
| @ -1,173 +1,103 @@ | ||||
| <?xml version="1.0"?> | ||||
| <project | ||||
|         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://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>de.joshavg</groupId> | ||||
|     <artifactId>alfred</artifactId> | ||||
|     <version>1</version> | ||||
|     <properties> | ||||
|         <compiler-plugin.version>3.8.1</compiler-plugin.version> | ||||
|         <kotlin.version>1.4.30</kotlin.version> | ||||
|         <maven.compiler.parameters>true</maven.compiler.parameters> | ||||
|         <maven.compiler.source>1.8</maven.compiler.source> | ||||
|         <maven.compiler.target>1.8</maven.compiler.target> | ||||
|         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
|         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | ||||
|         <quarkus-plugin.version>1.13.2.Final</quarkus-plugin.version> | ||||
|         <quarkus.platform.artifact-id>quarkus-universe-bom</quarkus.platform.artifact-id> | ||||
|         <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id> | ||||
|         <quarkus.platform.version>1.13.2.Final</quarkus.platform.version> | ||||
|         <surefire-plugin.version>2.22.1</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</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>io.quarkus</groupId> | ||||
|             <artifactId>quarkus-resteasy-jackson</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.jetbrains.kotlin</groupId> | ||||
|             <artifactId>kotlin-stdlib-jdk8</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-kotlin</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>io.quarkus</groupId> | ||||
|             <artifactId>quarkus-undertow</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>io.quarkus</groupId> | ||||
|             <artifactId>quarkus-scheduler</artifactId> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
|     <build> | ||||
|         <sourceDirectory>src/main/kotlin</sourceDirectory> | ||||
|         <testSourceDirectory>src/test/kotlin</testSourceDirectory> | ||||
|         <plugins> | ||||
|             <plugin> | ||||
|                 <groupId>io.quarkus</groupId> | ||||
|                 <artifactId>quarkus-maven-plugin</artifactId> | ||||
|                 <version>${quarkus-plugin.version}</version> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <goals> | ||||
|                             <goal>build</goal> | ||||
|                         </goals> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <artifactId>maven-compiler-plugin</artifactId> | ||||
|                 <version>${compiler-plugin.version}</version> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <version>${surefire-plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <systemProperties> | ||||
|                         <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> | ||||
|                     </systemProperties> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.jetbrains.kotlin</groupId> | ||||
|                 <artifactId>kotlin-maven-plugin</artifactId> | ||||
|                 <version>${kotlin.version}</version> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <id>compile</id> | ||||
|                         <goals> | ||||
|                             <goal>compile</goal> | ||||
|                         </goals> | ||||
|                     </execution> | ||||
|                     <execution> | ||||
|                         <id>test-compile</id> | ||||
|                         <goals> | ||||
|                             <goal>test-compile</goal> | ||||
|                         </goals> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|                 <dependencies> | ||||
|                     <dependency> | ||||
|                         <groupId>org.jetbrains.kotlin</groupId> | ||||
|                         <artifactId>kotlin-maven-allopen</artifactId> | ||||
|                         <version>${kotlin.version}</version> | ||||
|                     </dependency> | ||||
|                 </dependencies> | ||||
|                 <configuration> | ||||
|                     <compilerPlugins> | ||||
|                         <plugin>all-open</plugin> | ||||
|                     </compilerPlugins> | ||||
|                     <pluginOptions> | ||||
|                         <option>all-open:annotation=javax.ws.rs.Path</option> | ||||
|                         <option>all-open:annotation=javax.enterprise.context.ApplicationScoped</option> | ||||
|                     </pluginOptions> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|         </plugins> | ||||
|     </build> | ||||
|     <profiles> | ||||
|         <profile> | ||||
|             <id>native</id> | ||||
|             <activation> | ||||
|                 <property> | ||||
|                     <name>native</name> | ||||
|                 </property> | ||||
|             </activation> | ||||
|             <build> | ||||
|                 <plugins> | ||||
|                     <plugin> | ||||
|                         <artifactId>maven-failsafe-plugin</artifactId> | ||||
|                         <version>${surefire-plugin.version}</version> | ||||
|                         <executions> | ||||
|                             <execution> | ||||
|                                 <goals> | ||||
|                                     <goal>integration-test</goal> | ||||
|                                     <goal>verify</goal> | ||||
|                                 </goals> | ||||
|                                 <configuration> | ||||
|                                     <systemProperties> | ||||
|                                         <native.image.path> | ||||
|                                             ${project.build.directory}/${project.build.finalName}-runner | ||||
|                                         </native.image.path> | ||||
|                                     </systemProperties> | ||||
|                                 </configuration> | ||||
|                             </execution> | ||||
|                         </executions> | ||||
|                     </plugin> | ||||
|                 </plugins> | ||||
|             </build> | ||||
|             <properties> | ||||
|                 <quarkus.package.type>native</quarkus.package.type> | ||||
|             </properties> | ||||
|         </profile> | ||||
|     </profiles> | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
| 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 	<parent> | ||||
| 		<groupId>org.springframework.boot</groupId> | ||||
| 		<artifactId>spring-boot-starter-parent</artifactId> | ||||
| 		<version>3.3.4</version> | ||||
| 		<relativePath/> <!-- lookup parent from repository --> | ||||
| 	</parent> | ||||
| 	<groupId>alfred</groupId> | ||||
| 	<artifactId>web</artifactId> | ||||
| 	<version>0.0.1-SNAPSHOT</version> | ||||
| 	<name>web</name> | ||||
| 	<description>Alfred CI</description> | ||||
| 	<url/> | ||||
| 	<licenses> | ||||
| 		<license/> | ||||
| 	</licenses> | ||||
| 	<developers> | ||||
| 		<developer/> | ||||
| 	</developers> | ||||
| 	<scm> | ||||
| 		<connection/> | ||||
| 		<developerConnection/> | ||||
| 		<tag/> | ||||
| 		<url/> | ||||
| 	</scm> | ||||
| 	<properties> | ||||
| 		<java.version>17</java.version> | ||||
| 		<kotlin.version>1.9.25</kotlin.version> | ||||
| 	</properties> | ||||
| 	<dependencies> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter-actuator</artifactId> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter-web</artifactId> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>com.fasterxml.jackson.module</groupId> | ||||
| 			<artifactId>jackson-module-kotlin</artifactId> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>org.jetbrains.kotlin</groupId> | ||||
| 			<artifactId>kotlin-reflect</artifactId> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>org.jetbrains.kotlin</groupId> | ||||
| 			<artifactId>kotlin-stdlib</artifactId> | ||||
| 		</dependency> | ||||
| 
 | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-devtools</artifactId> | ||||
| 			<scope>runtime</scope> | ||||
| 			<optional>true</optional> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter-test</artifactId> | ||||
| 			<scope>test</scope> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>org.jetbrains.kotlin</groupId> | ||||
| 			<artifactId>kotlin-test-junit5</artifactId> | ||||
| 			<scope>test</scope> | ||||
| 		</dependency> | ||||
| 	</dependencies> | ||||
| 
 | ||||
| 	<build> | ||||
| 		<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory> | ||||
| 		<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory> | ||||
| 		<plugins> | ||||
| 			<plugin> | ||||
| 				<groupId>org.springframework.boot</groupId> | ||||
| 				<artifactId>spring-boot-maven-plugin</artifactId> | ||||
| 			</plugin> | ||||
| 			<plugin> | ||||
| 				<groupId>org.jetbrains.kotlin</groupId> | ||||
| 				<artifactId>kotlin-maven-plugin</artifactId> | ||||
| 				<configuration> | ||||
| 					<args> | ||||
| 						<arg>-Xjsr305=strict</arg> | ||||
| 					</args> | ||||
| 					<compilerPlugins> | ||||
| 						<plugin>spring</plugin> | ||||
| 					</compilerPlugins> | ||||
| 				</configuration> | ||||
| 				<dependencies> | ||||
| 					<dependency> | ||||
| 						<groupId>org.jetbrains.kotlin</groupId> | ||||
| 						<artifactId>kotlin-maven-allopen</artifactId> | ||||
| 						<version>${kotlin.version}</version> | ||||
| 					</dependency> | ||||
| 				</dependencies> | ||||
| 			</plugin> | ||||
| 		</plugins> | ||||
| 	</build> | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
| @ -1,86 +0,0 @@ | ||||
| package alfred.http | ||||
| 
 | ||||
| import alfred.* | ||||
| import alfred.running.GitRunner | ||||
| import alfred.running.Handles | ||||
| import alfred.running.ScriptRunner | ||||
| import javax.enterprise.inject.Default | ||||
| import javax.inject.Inject | ||||
| import javax.ws.rs.* | ||||
| import javax.ws.rs.core.MediaType | ||||
| import javax.ws.rs.core.Response | ||||
| import javax.ws.rs.core.Response.Status.PRECONDITION_REQUIRED | ||||
| 
 | ||||
| @Path("build") | ||||
| class Endpoints { | ||||
| 
 | ||||
|     @field:Inject | ||||
|     lateinit var builds: Builds | ||||
| 
 | ||||
|     @field:Inject | ||||
|     lateinit var security: Security | ||||
| 
 | ||||
|     @field:Inject | ||||
|     lateinit var scriptRunner: ScriptRunner | ||||
| 
 | ||||
|     @field:Inject | ||||
|     lateinit var gitRunner: GitRunner | ||||
| 
 | ||||
|     @field:Inject | ||||
|     lateinit var handles: Handles | ||||
| 
 | ||||
|     @GET | ||||
|     @Path("{build}/info") | ||||
|     @Produces(MediaType.APPLICATION_JSON) | ||||
|     fun info( | ||||
|         @PathParam("build") | ||||
|         build: BuildId, | ||||
|         @QueryParam("key") | ||||
|         key: String? | ||||
|     ) = security.requireKey(build, key) { | ||||
|         it | ||||
|     } | ||||
| 
 | ||||
|     @POST | ||||
|     @Path("{build}/trigger") | ||||
|     @Produces(MediaType.APPLICATION_JSON) | ||||
|     fun trigger( | ||||
|         @PathParam("build") | ||||
|         build: BuildId, | ||||
|         @QueryParam("key") | ||||
|         key: String?, | ||||
|         @QueryParam("rev") | ||||
|         rev: String? | ||||
|     ) = security.requireKey(build, key) { | ||||
|         if (rev == null) { | ||||
|             return@requireKey Response.status(PRECONDITION_REQUIRED).build() | ||||
|         } | ||||
| 
 | ||||
|         val info = if (builds.buildConfig(build).script != null) { | ||||
|             scriptRunner.run(build, rev) | ||||
|         } else { | ||||
|             gitRunner.run(build, rev) | ||||
|         } | ||||
| 
 | ||||
|         Response.ok( | ||||
|             mapOf( | ||||
|                 "log" to info.logFile.absolutePath, | ||||
|                 "pid" to info.pid | ||||
|             ) | ||||
|         ).build() | ||||
|     } | ||||
| 
 | ||||
|     @GET | ||||
|     @Path("{build}/handles") | ||||
|     @Produces(MediaType.APPLICATION_JSON) | ||||
|     fun handles( | ||||
|         @PathParam("build") | ||||
|         build: BuildId, | ||||
|         @QueryParam("key") | ||||
|         key: String? | ||||
|     ) = security.requireKey(build, key) { | ||||
|         handles.active(build) | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| @ -1,30 +0,0 @@ | ||||
| package alfred.http | ||||
| 
 | ||||
| import alfred.BuildConfig | ||||
| import alfred.BuildId | ||||
| import alfred.Builds | ||||
| import javax.enterprise.context.ApplicationScoped | ||||
| import javax.inject.Inject | ||||
| import javax.ws.rs.core.Response | ||||
| 
 | ||||
| @ApplicationScoped | ||||
| class Security { | ||||
| 
 | ||||
|     @field:Inject | ||||
|     lateinit var builds: Builds | ||||
| 
 | ||||
|     fun requireKey(build: BuildId, apikey: String?, block: (BuildConfig) -> Any): Response { | ||||
|         val buildConfig = builds.buildConfig(build) | ||||
|         if (buildConfig.apikey != "" && buildConfig.apikey != apikey) { | ||||
|             return Response.status(Response.Status.UNAUTHORIZED).build() | ||||
|         } | ||||
| 
 | ||||
|         val entity = block(buildConfig) | ||||
|         if (entity is Response) { | ||||
|             return entity | ||||
|         } | ||||
| 
 | ||||
|         return Response.ok(entity).build() | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,11 @@ | ||||
| package alfred.web | ||||
| 
 | ||||
| import org.springframework.boot.autoconfigure.SpringBootApplication | ||||
| import org.springframework.boot.runApplication | ||||
| 
 | ||||
| @SpringBootApplication | ||||
| class WebApplication | ||||
| 
 | ||||
| fun main(args: Array<String>) { | ||||
| 	runApplication<WebApplication>(*args) | ||||
| } | ||||
| @ -0,0 +1,37 @@ | ||||
| package alfred.web.core | ||||
| 
 | ||||
| import org.springframework.stereotype.Service | ||||
| import java.nio.file.Path | ||||
| import java.nio.file.Paths | ||||
| import java.util.UUID | ||||
| import kotlin.collections.isNotEmpty | ||||
| 
 | ||||
| @Service | ||||
| class Workspaces { | ||||
| 
 | ||||
|     fun withWorkspace(ctx: BuildContext, block: (Path) -> Unit) { | ||||
|         val workspacePath = Paths.get( | ||||
|             ctx.config.gitWorkspace, UUID.randomUUID().toString() | ||||
|         ) | ||||
|         val workspaceDir = workspacePath.toFile() | ||||
| 
 | ||||
|         ctx.logFile.header(ctx.buildId, ctx.rev, workspacePath) | ||||
| 
 | ||||
|         if (!workspaceDir.exists()) { | ||||
|             workspaceDir.mkdirs() | ||||
|         } | ||||
| 
 | ||||
|         val wsList = workspaceDir.list() | ||||
|         if (wsList != null && wsList.isNotEmpty()) { | ||||
|             throw WorkspaceIsNotEmpty(workspaceDir.toString()) | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|             block(workspaceDir.toPath()) | ||||
|         } finally { | ||||
|             ctx.logFile.footer() | ||||
|             workspaceDir.deleteRecursively() | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -1,7 +1,5 @@ | ||||
| package alfred.running | ||||
| package alfred.web.core | ||||
| 
 | ||||
| import alfred.BuildConfig | ||||
| import alfred.BuildId | ||||
| import java.io.File | ||||
| import java.nio.file.Path | ||||
| import java.time.ZonedDateTime | ||||
| @ -0,0 +1,80 @@ | ||||
| package alfred.web.http | ||||
| 
 | ||||
| import alfred.web.core.BuildId | ||||
| import alfred.web.core.Builds | ||||
| import alfred.web.core.GitRunner | ||||
| import alfred.web.core.Handles | ||||
| import alfred.web.core.ScriptRunner | ||||
| import org.springframework.http.MediaType | ||||
| import org.springframework.http.ResponseEntity | ||||
| import org.springframework.web.bind.annotation.GetMapping | ||||
| import org.springframework.web.bind.annotation.PathVariable | ||||
| import org.springframework.web.bind.annotation.PostMapping | ||||
| import org.springframework.web.bind.annotation.RequestMapping | ||||
| import org.springframework.web.bind.annotation.RequestParam | ||||
| import org.springframework.web.bind.annotation.RestController | ||||
| 
 | ||||
| @RestController | ||||
| @RequestMapping("build") | ||||
| class Endpoints( | ||||
|     val builds: Builds, | ||||
|     val security: Security, | ||||
|     val scriptRunner: ScriptRunner, | ||||
|     val gitRunner: GitRunner, | ||||
|     val handles: Handles | ||||
| ) { | ||||
| 
 | ||||
|     @GetMapping( | ||||
|         "{build}/info", | ||||
|         produces = [MediaType.APPLICATION_JSON_VALUE] | ||||
|     ) | ||||
|     fun info( | ||||
|         @PathVariable("build") | ||||
|         build: BuildId, | ||||
|         @RequestParam("key") | ||||
|         key: String? | ||||
|     ) = security.requireKey(build, key) { | ||||
|         it | ||||
|     } | ||||
| 
 | ||||
|     @PostMapping( | ||||
|         "{build}/trigger", | ||||
|         produces = [MediaType.APPLICATION_JSON_VALUE] | ||||
|     ) | ||||
|     fun trigger( | ||||
|         @PathVariable("build") | ||||
|         build: BuildId, | ||||
|         @RequestParam("key") | ||||
|         key: String?, | ||||
|         @RequestParam("rev") | ||||
|         rev: String | ||||
|     ) = security.requireKey(build, key) { | ||||
|         val info = if (builds.buildConfig(build).script != null) { | ||||
|             scriptRunner.run(build, rev) | ||||
|         } else { | ||||
|             gitRunner.run(build, rev) | ||||
|         } | ||||
| 
 | ||||
|         ResponseEntity.ok( | ||||
|             mapOf( | ||||
|                 "log" to info.logFile.absolutePath, | ||||
|                 "pid" to info.pid | ||||
|             ) | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|     @GetMapping( | ||||
|         "{build}/handles", | ||||
|         produces = [MediaType.APPLICATION_JSON_VALUE] | ||||
|     ) | ||||
|     fun handles( | ||||
|         @PathVariable("build") | ||||
|         build: BuildId, | ||||
|         @RequestParam("key") | ||||
|         key: String? | ||||
|     ) = security.requireKey(build, key) { | ||||
|         handles.active(build) | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| @ -0,0 +1,29 @@ | ||||
| package alfred.web.http | ||||
| 
 | ||||
| import alfred.web.core.BuildConfig | ||||
| import alfred.web.core.BuildId | ||||
| import alfred.web.core.Builds | ||||
| import org.springframework.http.HttpStatus | ||||
| import org.springframework.http.ResponseEntity | ||||
| import org.springframework.stereotype.Service | ||||
| 
 | ||||
| @Service | ||||
| class Security( | ||||
|     val builds: Builds | ||||
| ) { | ||||
| 
 | ||||
|     fun <T> requireKey(build: BuildId, apikey: String?, block: (BuildConfig) -> T): ResponseEntity<*> { | ||||
|         val buildConfig = builds.buildConfig(build) | ||||
|         if (buildConfig.apikey != "" && buildConfig.apikey != apikey) { | ||||
|             return ResponseEntity<T>(HttpStatus.UNAUTHORIZED) | ||||
|         } | ||||
| 
 | ||||
|         val entity = block(buildConfig) | ||||
|         if (entity is ResponseEntity<*>) { | ||||
|             return entity | ||||
|         } | ||||
| 
 | ||||
|         return ResponseEntity.ok(entity) | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,13 @@ | ||||
| package alfred.web | ||||
| 
 | ||||
| import org.junit.jupiter.api.Test | ||||
| import org.springframework.boot.test.context.SpringBootTest | ||||
| 
 | ||||
| @SpringBootTest | ||||
| class WebApplicationTests { | ||||
| 
 | ||||
| 	@Test | ||||
| 	fun contextLoads() { | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue
	
	 Josha von Gizycki
						Josha von Gizycki