From 3fb14a0cdd9bbe67cb6b2d3160b6dfe0b36bda6d Mon Sep 17 00:00:00 2001 From: Tamas Bunth <tamas.bunth@collabora.co.uk> Date: Sat, 17 Feb 2018 22:14:47 +0100 Subject: [PATCH] Mobil Data server - initial commit --- api.iml | 128 +++++++++++------- pom.xml | 16 ++- .../io/realworld/client/response/InLogin.kt | 5 - .../realworld/client/response/InRegister.kt | 5 - .../realworld/client/response/OutProfile.kt | 5 - .../io/realworld/client/response/OutUser.kt | 5 - .../kotlin/io/realworld/web/TagHandler.kt | 12 -- .../realworld => mobildata}/ApiApplication.kt | 20 ++- .../client/ProfileClient.kt | 4 +- .../client/TagClient.kt | 4 +- .../client/UserClient.kt | 8 +- .../mobildata/client/response/InLogin.kt | 5 + .../mobildata/client/response/InRegister.kt | 5 + .../mobildata/client/response/OutProfile.kt | 5 + .../client/response/OutTag.kt | 2 +- .../mobildata/client/response/OutUser.kt | 5 + .../exception/ForbiddenRequestException.kt | 2 +- .../exception/InvalidException.kt | 2 +- .../exception/InvalidLoginException.kt | 2 +- .../exception/NotFoundException.kt | 2 +- .../exception/UnauthorizedException.kt | 2 +- .../exception/UserExistException.kt | 2 +- .../jwt/ApiKeySecured.kt | 2 +- .../jwt/ApiKeySecuredAspect.kt | 8 +- .../jwt/ExposeResponseInterceptor.kt | 2 +- .../realworld => mobildata}/model/Article.kt | 2 +- .../realworld => mobildata}/model/Comment.kt | 2 +- .../{io/realworld => mobildata}/model/Tag.kt | 2 +- .../{io/realworld => mobildata}/model/User.kt | 6 +- .../model/inout/Article.kt | 6 +- .../model/inout/Comment.kt | 6 +- .../model/inout/Login.kt | 2 +- .../model/inout/NewArticle.kt | 2 +- .../model/inout/NewComment.kt | 2 +- .../model/inout/Profile.kt | 4 +- .../model/inout/Register.kt | 2 +- .../model/inout/UpdateArticle.kt | 2 +- .../model/inout/UpdateUser.kt | 2 +- .../repository/ArticleRepository.kt | 4 +- .../repository/CommentRepository.kt | 6 +- .../repository/TagRepository.kt | 4 +- .../repository/UserRepository.kt | 4 +- .../specification/ArticlesSpecifications.kt | 8 +- .../service/UserService.kt | 10 +- .../web/ArticleHandler.kt | 52 +++---- .../web/InvalidRequestHandler.kt | 4 +- .../web/ProfileHandler.kt | 14 +- .../kotlin/mobildata/web/SwaggerConfig.kt | 30 ++++ .../web/UserHandler.kt | 20 +-- src/main/resources/application.properties | 48 +++++-- .../ApiApplicationTests.kt | 23 ++-- 51 files changed, 307 insertions(+), 218 deletions(-) delete mode 100644 src/main/kotlin/io/realworld/client/response/InLogin.kt delete mode 100644 src/main/kotlin/io/realworld/client/response/InRegister.kt delete mode 100644 src/main/kotlin/io/realworld/client/response/OutProfile.kt delete mode 100644 src/main/kotlin/io/realworld/client/response/OutUser.kt delete mode 100644 src/main/kotlin/io/realworld/web/TagHandler.kt rename src/main/kotlin/{io/realworld => mobildata}/ApiApplication.kt (62%) rename src/main/kotlin/{io/realworld => mobildata}/client/ProfileClient.kt (89%) rename src/main/kotlin/{io/realworld => mobildata}/client/TagClient.kt (71%) rename src/main/kotlin/{io/realworld => mobildata}/client/UserClient.kt (63%) create mode 100644 src/main/kotlin/mobildata/client/response/InLogin.kt create mode 100644 src/main/kotlin/mobildata/client/response/InRegister.kt create mode 100644 src/main/kotlin/mobildata/client/response/OutProfile.kt rename src/main/kotlin/{io/realworld => mobildata}/client/response/OutTag.kt (59%) create mode 100644 src/main/kotlin/mobildata/client/response/OutUser.kt rename src/main/kotlin/{io/realworld => mobildata}/exception/ForbiddenRequestException.kt (86%) rename src/main/kotlin/{io/realworld => mobildata}/exception/InvalidException.kt (89%) rename src/main/kotlin/{io/realworld => mobildata}/exception/InvalidLoginException.kt (73%) rename src/main/kotlin/{io/realworld => mobildata}/exception/NotFoundException.kt (85%) rename src/main/kotlin/{io/realworld => mobildata}/exception/UnauthorizedException.kt (86%) rename src/main/kotlin/{io/realworld => mobildata}/exception/UserExistException.kt (73%) rename src/main/kotlin/{io/realworld => mobildata}/jwt/ApiKeySecured.kt (92%) rename src/main/kotlin/{io/realworld => mobildata}/jwt/ApiKeySecuredAspect.kt (96%) rename src/main/kotlin/{io/realworld => mobildata}/jwt/ExposeResponseInterceptor.kt (98%) rename src/main/kotlin/{io/realworld => mobildata}/model/Article.kt (96%) rename src/main/kotlin/{io/realworld => mobildata}/model/Comment.kt (95%) rename src/main/kotlin/{io/realworld => mobildata}/model/Tag.kt (93%) rename src/main/kotlin/{io/realworld => mobildata}/model/User.kt (82%) rename src/main/kotlin/{io/realworld => mobildata}/model/inout/Article.kt (91%) rename src/main/kotlin/{io/realworld => mobildata}/model/inout/Comment.kt (85%) rename src/main/kotlin/{io/realworld => mobildata}/model/inout/Login.kt (95%) rename src/main/kotlin/{io/realworld => mobildata}/model/inout/NewArticle.kt (94%) rename src/main/kotlin/{io/realworld => mobildata}/model/inout/NewComment.kt (90%) rename src/main/kotlin/{io/realworld => mobildata}/model/inout/Profile.kt (88%) rename src/main/kotlin/{io/realworld => mobildata}/model/inout/Register.kt (96%) rename src/main/kotlin/{io/realworld => mobildata}/model/inout/UpdateArticle.kt (90%) rename src/main/kotlin/{io/realworld => mobildata}/model/inout/UpdateUser.kt (95%) rename src/main/kotlin/{io/realworld => mobildata}/repository/ArticleRepository.kt (89%) rename src/main/kotlin/{io/realworld => mobildata}/repository/CommentRepository.kt (75%) rename src/main/kotlin/{io/realworld => mobildata}/repository/TagRepository.kt (77%) rename src/main/kotlin/{io/realworld => mobildata}/repository/UserRepository.kt (88%) rename src/main/kotlin/{io/realworld => mobildata}/repository/specification/ArticlesSpecifications.kt (86%) rename src/main/kotlin/{io/realworld => mobildata}/service/UserService.kt (91%) rename src/main/kotlin/{io/realworld => mobildata}/web/ArticleHandler.kt (91%) rename src/main/kotlin/{io/realworld => mobildata}/web/InvalidRequestHandler.kt (93%) rename src/main/kotlin/{io/realworld => mobildata}/web/ProfileHandler.kt (86%) create mode 100644 src/main/kotlin/mobildata/web/SwaggerConfig.kt rename src/main/kotlin/{io/realworld => mobildata}/web/UserHandler.kt (91%) rename src/test/kotlin/{io/realworld => mobildata}/ApiApplicationTests.kt (87%) diff --git a/api.iml b/api.iml index 4e66be8..357b9e2 100644 --- a/api.iml +++ b/api.iml @@ -4,25 +4,34 @@ <facet type="Spring" name="Spring"> <configuration /> </facet> + <facet type="web" name="Web"> + <configuration> + <webroots /> + <sourceRoots> + <root url="file://$MODULE_DIR$/src/main/kotlin" /> + <root url="file://$MODULE_DIR$/src/main/resources" /> + </sourceRoots> + </configuration> + </facet> <facet type="kotlin-language" name="Kotlin"> - <configuration version="2" platform="JVM 1.8" useProjectSettings="false"> + <configuration version="3" platform="JVM 1.8" useProjectSettings="false"> <compilerSettings /> <compilerArguments> <option name="jvmTarget" value="1.8" /> <option name="languageVersion" value="1.1" /> <option name="apiVersion" value="1.1" /> - <option name="pluginClasspaths"> - <array> - <option value="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-maven-allopen/1.1.2/kotlin-maven-allopen-1.1.2.jar" /> - </array> - </option> - <option name="coroutinesWarn" value="true" /> <option name="pluginOptions"> <array> <option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.stereotype.Component" /> <option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.transaction.annotation.Transactional" /> <option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.scheduling.annotation.Async" /> <option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.cache.annotation.Cacheable" /> + <option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.boot.test.context.SpringBootTest" /> + </array> + </option> + <option name="pluginClasspaths"> + <array> + <option value="$KOTLIN_BUNDLED$/lib/allopen-compiler-plugin.jar" /> </array> </option> </compilerArguments> @@ -47,80 +56,99 @@ <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.0.0.BUILD-SNAPSHOT" level="project" /> <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" /> <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" /> + <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.10.0" level="project" /> + <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.10.0" level="project" /> <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" /> - <orderEntry type="library" name="Maven: org.slf4j:log4j-over-slf4j:1.7.25" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.18" level="project" /> + <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.1" level="project" /> + <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.19" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.8.10" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.8.13" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.apache.tomcat:tomcat-jdbc:8.5.14" level="project" /> - <orderEntry type="library" name="Maven: org.apache.tomcat:tomcat-juli:8.5.14" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.hibernate:hibernate-core:5.2.10.Final" level="project" /> + <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:2.7.7" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.hibernate:hibernate-core:5.2.13.Final" level="project" /> <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.1.Final" level="project" /> <orderEntry type="library" name="Maven: org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final" level="project" /> - <orderEntry type="library" name="Maven: org.javassist:javassist:3.21.0-GA" level="project" /> + <orderEntry type="library" name="Maven: org.javassist:javassist:3.22.0-GA" level="project" /> <orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" /> <orderEntry type="library" name="Maven: org.jboss:jandex:2.0.3.Final" level="project" /> - <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.3" level="project" /> <orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" /> <orderEntry type="library" name="Maven: org.hibernate.common:hibernate-commons-annotations:5.0.1.Final" level="project" /> <orderEntry type="library" name="Maven: javax.transaction:javax.transaction-api:1.2" level="project" /> - <orderEntry type="library" name="Maven: org.springframework.data:spring-data-jpa:2.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-orm:5.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-context:5.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-aspects:5.0.0.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.data:spring-data-jpa:2.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-orm:5.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-context:5.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-aspects:5.0.4.BUILD-SNAPSHOT" level="project" /> <orderEntry type="library" name="Maven: org.mindrot:jbcrypt:0.4" level="project" /> <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.7.0" level="project" /> - <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.0.pr3" level="project" /> - <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.0.pr3" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.4" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.4" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.0.0.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.0.0.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.4" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.4" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.4" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.14" level="project" /> - <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.14" level="project" /> - <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.14" level="project" /> - <orderEntry type="library" name="Maven: org.hibernate:hibernate-validator:5.4.1.Final" level="project" /> - <orderEntry type="library" name="Maven: javax.validation:validation-api:1.1.0.Final" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-web:5.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.0.0.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.28" level="project" /> + <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.28" level="project" /> + <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.28" level="project" /> + <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.7.Final" level="project" /> + <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-web:5.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.0.4.BUILD-SNAPSHOT" level="project" /> <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.2" level="project" /> <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.2" level="project" /> <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-reflect:1.1.2" level="project" /> <orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.1.2" level="project" /> <orderEntry type="library" name="Maven: org.jetbrains:annotations:13.0" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-kotlin:2.8.7" level="project" /> - <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0.pr3" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.0.0.BUILD-SNAPSHOT" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.0.0.BUILD-SNAPSHOT" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.2.0" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.2.1" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.1" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.3" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.6.2" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.7.22" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.6.12" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.6.11" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.5" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.9.0" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.15.0" level="project" /> + <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.7.10" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.7.10" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" /> <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-core:5.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.0.0.BUILD-SNAPSHOT" level="project" /> - <orderEntry type="library" name="Maven: com.h2database:h2:1.4.195" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-core:5.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.0.4.BUILD-SNAPSHOT" level="project" /> + <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.5.1" level="project" /> + <orderEntry type="library" name="Maven: org.postgresql:postgresql:9.4-1206-jdbc42" level="project" /> <orderEntry type="library" name="Maven: com.netflix.feign:feign-core:8.18.0" level="project" /> <orderEntry type="library" scope="RUNTIME" name="Maven: org.jvnet:animal-sniffer-annotation:1.0" level="project" /> <orderEntry type="library" name="Maven: com.netflix.feign:feign-gson:8.18.0" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: com.google.code.gson:gson:2.8.0" level="project" /> + <orderEntry type="library" scope="RUNTIME" name="Maven: com.google.code.gson:gson:2.8.2" level="project" /> <orderEntry type="library" name="Maven: com.github.slugify:slugify:2.1.9" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.7.0" level="project" /> + <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.13" level="project" /> + <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.13" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.7.0" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.7.0" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.7.0" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.7.0" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.7.0" level="project" /> + <orderEntry type="library" name="Maven: org.reflections:reflections:0.9.11" level="project" /> + <orderEntry type="library" name="Maven: com.google.guava:guava:18.0" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.4" level="project" /> + <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.1.0.Final" level="project" /> </component> </module> \ No newline at end of file diff --git a/pom.xml b/pom.xml index 809a339..fa711de 100644 --- a/pom.xml +++ b/pom.xml @@ -3,13 +3,13 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <groupId>io.realworld</groupId> + <groupId>mobildata</groupId> <artifactId>api</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> - <name>api</name> - <description>Demo for realworld.io with Kotlin and Spring Boot Reactive</description> + <name>mobil-data-server</name> + <description>Server for collecting, storing, interpreting and visualizing mobile data</description> <parent> <groupId>org.springframework.boot</groupId> @@ -66,8 +66,9 @@ <scope>test</scope> </dependency> <dependency> - <groupId>com.h2database</groupId> - <artifactId>h2</artifactId> + <groupId>org.postgresql</groupId> + <artifactId>postgresql</artifactId> + <version>9.4-1206-jdbc42</version> </dependency> <dependency> <groupId>com.netflix.feign</groupId> @@ -84,6 +85,11 @@ <artifactId>slugify</artifactId> <version>2.1.9</version> </dependency> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger2</artifactId> + <version>2.7.0</version> + </dependency> </dependencies> <build> diff --git a/src/main/kotlin/io/realworld/client/response/InLogin.kt b/src/main/kotlin/io/realworld/client/response/InLogin.kt deleted file mode 100644 index ef0a8b2..0000000 --- a/src/main/kotlin/io/realworld/client/response/InLogin.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.realworld.client.response - -import io.realworld.model.inout.Login - -data class InLogin(val user: Login) diff --git a/src/main/kotlin/io/realworld/client/response/InRegister.kt b/src/main/kotlin/io/realworld/client/response/InRegister.kt deleted file mode 100644 index 87ec4e7..0000000 --- a/src/main/kotlin/io/realworld/client/response/InRegister.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.realworld.client.response - -import io.realworld.model.inout.Register - -data class InRegister(val user: Register) diff --git a/src/main/kotlin/io/realworld/client/response/OutProfile.kt b/src/main/kotlin/io/realworld/client/response/OutProfile.kt deleted file mode 100644 index 52255bf..0000000 --- a/src/main/kotlin/io/realworld/client/response/OutProfile.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.realworld.client.response - -import io.realworld.model.inout.Profile - -data class OutProfile(var profile: Profile? = null) diff --git a/src/main/kotlin/io/realworld/client/response/OutUser.kt b/src/main/kotlin/io/realworld/client/response/OutUser.kt deleted file mode 100644 index dc5ad89..0000000 --- a/src/main/kotlin/io/realworld/client/response/OutUser.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.realworld.client.response - -import io.realworld.model.User - -data class OutUser(var user: User = User()) diff --git a/src/main/kotlin/io/realworld/web/TagHandler.kt b/src/main/kotlin/io/realworld/web/TagHandler.kt deleted file mode 100644 index 4672974..0000000 --- a/src/main/kotlin/io/realworld/web/TagHandler.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.realworld.web - -import io.realworld.model.Tag -import io.realworld.repository.TagRepository -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RestController - -@RestController -class TagHandler(val repository: TagRepository) { - @GetMapping("/api/tags") - fun allTags() = mapOf("tags" to repository.findAll().map(Tag::name)) -} \ No newline at end of file diff --git a/src/main/kotlin/io/realworld/ApiApplication.kt b/src/main/kotlin/mobildata/ApiApplication.kt similarity index 62% rename from src/main/kotlin/io/realworld/ApiApplication.kt rename to src/main/kotlin/mobildata/ApiApplication.kt index 6549431..0d79b06 100644 --- a/src/main/kotlin/io/realworld/ApiApplication.kt +++ b/src/main/kotlin/mobildata/ApiApplication.kt @@ -1,6 +1,6 @@ -package io.realworld +package mobildata -import io.realworld.jwt.ExposeResponseInterceptor +import mobildata.jwt.ExposeResponseInterceptor import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.cache.annotation.EnableCaching @@ -8,15 +8,13 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean import org.springframework.validation.beanvalidation.MethodValidationPostProcessor -import org.springframework.web.servlet.config.annotation.CorsRegistry -import org.springframework.web.servlet.config.annotation.InterceptorRegistry -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter +import org.springframework.web.servlet.config.annotation.* @Configuration @EnableCaching @SpringBootApplication -class ApiApplication : WebMvcConfigurerAdapter() { +class ApiApplication : WebMvcConfigurer { override fun addInterceptors(registry: InterceptorRegistry?) { registry!!.addInterceptor(exposeResponseInterceptor()) @@ -32,6 +30,16 @@ class ApiApplication : WebMvcConfigurerAdapter() { super.addCorsMappings(registry) } + override fun addViewControllers(registry: ViewControllerRegistry) { + registry.addRedirectViewController("/documentation/v2/api-docs", "/v2/api-docs") + registry.addRedirectViewController("/documentation/configuration/ui", "/configuration/ui") + registry.addRedirectViewController("/documentation/configuration/security", "/configuration/security") + registry.addRedirectViewController("/documentation/swagger-resources", "/swagger-resources") + // no swagger-ui used + //registry.addRedirectViewController("/documentation", "/api/swagger-ui.html") + //registry.addRedirectViewController("/documentation/", "/api/swagger-ui.html") + } + @Bean fun exposeResponseInterceptor() = ExposeResponseInterceptor() diff --git a/src/main/kotlin/io/realworld/client/ProfileClient.kt b/src/main/kotlin/mobildata/client/ProfileClient.kt similarity index 89% rename from src/main/kotlin/io/realworld/client/ProfileClient.kt rename to src/main/kotlin/mobildata/client/ProfileClient.kt index f1f321c..b389d68 100644 --- a/src/main/kotlin/io/realworld/client/ProfileClient.kt +++ b/src/main/kotlin/mobildata/client/ProfileClient.kt @@ -1,9 +1,9 @@ -package io.realworld.client +package mobildata.client import feign.Headers import feign.Param import feign.RequestLine -import io.realworld.client.response.OutProfile +import mobildata.client.response.OutProfile @Headers("Content-Type: application/json", "Authorization: Token {token}") diff --git a/src/main/kotlin/io/realworld/client/TagClient.kt b/src/main/kotlin/mobildata/client/TagClient.kt similarity index 71% rename from src/main/kotlin/io/realworld/client/TagClient.kt rename to src/main/kotlin/mobildata/client/TagClient.kt index 3e7de69..c87fded 100644 --- a/src/main/kotlin/io/realworld/client/TagClient.kt +++ b/src/main/kotlin/mobildata/client/TagClient.kt @@ -1,8 +1,8 @@ -package io.realworld.client +package mobildata.client import feign.Headers import feign.RequestLine -import io.realworld.client.response.OutTag +import mobildata.client.response.OutTag interface TagClient { @RequestLine("GET /api/tags") diff --git a/src/main/kotlin/io/realworld/client/UserClient.kt b/src/main/kotlin/mobildata/client/UserClient.kt similarity index 63% rename from src/main/kotlin/io/realworld/client/UserClient.kt rename to src/main/kotlin/mobildata/client/UserClient.kt index f741aeb..dd2077a 100644 --- a/src/main/kotlin/io/realworld/client/UserClient.kt +++ b/src/main/kotlin/mobildata/client/UserClient.kt @@ -1,10 +1,10 @@ -package io.realworld.client +package mobildata.client import feign.Headers import feign.RequestLine -import io.realworld.client.response.InLogin -import io.realworld.client.response.InRegister -import io.realworld.client.response.OutUser +import mobildata.client.response.InLogin +import mobildata.client.response.InRegister +import mobildata.client.response.OutUser @Headers("Content-Type: application/json") interface UserClient { diff --git a/src/main/kotlin/mobildata/client/response/InLogin.kt b/src/main/kotlin/mobildata/client/response/InLogin.kt new file mode 100644 index 0000000..961a33d --- /dev/null +++ b/src/main/kotlin/mobildata/client/response/InLogin.kt @@ -0,0 +1,5 @@ +package mobildata.client.response + +import mobildata.model.inout.Login + +data class InLogin(val user: Login) diff --git a/src/main/kotlin/mobildata/client/response/InRegister.kt b/src/main/kotlin/mobildata/client/response/InRegister.kt new file mode 100644 index 0000000..4d49fd6 --- /dev/null +++ b/src/main/kotlin/mobildata/client/response/InRegister.kt @@ -0,0 +1,5 @@ +package mobildata.client.response + +import mobildata.model.inout.Register + +data class InRegister(val user: Register) diff --git a/src/main/kotlin/mobildata/client/response/OutProfile.kt b/src/main/kotlin/mobildata/client/response/OutProfile.kt new file mode 100644 index 0000000..a2e4e14 --- /dev/null +++ b/src/main/kotlin/mobildata/client/response/OutProfile.kt @@ -0,0 +1,5 @@ +package mobildata.client.response + +import mobildata.model.inout.Profile + +data class OutProfile(var profile: Profile? = null) diff --git a/src/main/kotlin/io/realworld/client/response/OutTag.kt b/src/main/kotlin/mobildata/client/response/OutTag.kt similarity index 59% rename from src/main/kotlin/io/realworld/client/response/OutTag.kt rename to src/main/kotlin/mobildata/client/response/OutTag.kt index 857f4b0..0c42ec8 100644 --- a/src/main/kotlin/io/realworld/client/response/OutTag.kt +++ b/src/main/kotlin/mobildata/client/response/OutTag.kt @@ -1,3 +1,3 @@ -package io.realworld.client.response +package mobildata.client.response data class OutTag(var tags: List<String> = listOf()) diff --git a/src/main/kotlin/mobildata/client/response/OutUser.kt b/src/main/kotlin/mobildata/client/response/OutUser.kt new file mode 100644 index 0000000..e7fc1e0 --- /dev/null +++ b/src/main/kotlin/mobildata/client/response/OutUser.kt @@ -0,0 +1,5 @@ +package mobildata.client.response + +import mobildata.model.User + +data class OutUser(var user: User = User()) diff --git a/src/main/kotlin/io/realworld/exception/ForbiddenRequestException.kt b/src/main/kotlin/mobildata/exception/ForbiddenRequestException.kt similarity index 86% rename from src/main/kotlin/io/realworld/exception/ForbiddenRequestException.kt rename to src/main/kotlin/mobildata/exception/ForbiddenRequestException.kt index 0dd5681..ed7e9b5 100644 --- a/src/main/kotlin/io/realworld/exception/ForbiddenRequestException.kt +++ b/src/main/kotlin/mobildata/exception/ForbiddenRequestException.kt @@ -1,4 +1,4 @@ -package io.realworld.exception +package mobildata.exception import org.springframework.http.HttpStatus import org.springframework.web.bind.annotation.ResponseStatus diff --git a/src/main/kotlin/io/realworld/exception/InvalidException.kt b/src/main/kotlin/mobildata/exception/InvalidException.kt similarity index 89% rename from src/main/kotlin/io/realworld/exception/InvalidException.kt rename to src/main/kotlin/mobildata/exception/InvalidException.kt index d8d6339..361c772 100644 --- a/src/main/kotlin/io/realworld/exception/InvalidException.kt +++ b/src/main/kotlin/mobildata/exception/InvalidException.kt @@ -1,4 +1,4 @@ -package io.realworld.exception +package mobildata.exception import org.springframework.validation.Errors diff --git a/src/main/kotlin/io/realworld/exception/InvalidLoginException.kt b/src/main/kotlin/mobildata/exception/InvalidLoginException.kt similarity index 73% rename from src/main/kotlin/io/realworld/exception/InvalidLoginException.kt rename to src/main/kotlin/mobildata/exception/InvalidLoginException.kt index 5dcbf9a..99de491 100644 --- a/src/main/kotlin/io/realworld/exception/InvalidLoginException.kt +++ b/src/main/kotlin/mobildata/exception/InvalidLoginException.kt @@ -1,3 +1,3 @@ -package io.realworld.exception +package mobildata.exception class InvalidLoginException(val field: String, val error: String) : RuntimeException() diff --git a/src/main/kotlin/io/realworld/exception/NotFoundException.kt b/src/main/kotlin/mobildata/exception/NotFoundException.kt similarity index 85% rename from src/main/kotlin/io/realworld/exception/NotFoundException.kt rename to src/main/kotlin/mobildata/exception/NotFoundException.kt index 27c2508..04a278b 100644 --- a/src/main/kotlin/io/realworld/exception/NotFoundException.kt +++ b/src/main/kotlin/mobildata/exception/NotFoundException.kt @@ -1,4 +1,4 @@ -package io.realworld.exception +package mobildata.exception import org.springframework.http.HttpStatus import org.springframework.web.bind.annotation.ResponseStatus diff --git a/src/main/kotlin/io/realworld/exception/UnauthorizedException.kt b/src/main/kotlin/mobildata/exception/UnauthorizedException.kt similarity index 86% rename from src/main/kotlin/io/realworld/exception/UnauthorizedException.kt rename to src/main/kotlin/mobildata/exception/UnauthorizedException.kt index 3cb598d..067bbe1 100644 --- a/src/main/kotlin/io/realworld/exception/UnauthorizedException.kt +++ b/src/main/kotlin/mobildata/exception/UnauthorizedException.kt @@ -1,4 +1,4 @@ -package io.realworld.exception +package mobildata.exception import org.springframework.http.HttpStatus import org.springframework.web.bind.annotation.ResponseStatus diff --git a/src/main/kotlin/io/realworld/exception/UserExistException.kt b/src/main/kotlin/mobildata/exception/UserExistException.kt similarity index 73% rename from src/main/kotlin/io/realworld/exception/UserExistException.kt rename to src/main/kotlin/mobildata/exception/UserExistException.kt index 8c5af5a..8960af9 100644 --- a/src/main/kotlin/io/realworld/exception/UserExistException.kt +++ b/src/main/kotlin/mobildata/exception/UserExistException.kt @@ -1,4 +1,4 @@ -package io.realworld.exception +package mobildata.exception /** * Created by alex on 30/04/2017. diff --git a/src/main/kotlin/io/realworld/jwt/ApiKeySecured.kt b/src/main/kotlin/mobildata/jwt/ApiKeySecured.kt similarity index 92% rename from src/main/kotlin/io/realworld/jwt/ApiKeySecured.kt rename to src/main/kotlin/mobildata/jwt/ApiKeySecured.kt index 89b3541..ea8c4b3 100644 --- a/src/main/kotlin/io/realworld/jwt/ApiKeySecured.kt +++ b/src/main/kotlin/mobildata/jwt/ApiKeySecured.kt @@ -1,4 +1,4 @@ -package io.realworld.jwt +package mobildata.jwt import java.lang.annotation.Documented import java.lang.annotation.Inherited diff --git a/src/main/kotlin/io/realworld/jwt/ApiKeySecuredAspect.kt b/src/main/kotlin/mobildata/jwt/ApiKeySecuredAspect.kt similarity index 96% rename from src/main/kotlin/io/realworld/jwt/ApiKeySecuredAspect.kt rename to src/main/kotlin/mobildata/jwt/ApiKeySecuredAspect.kt index 63d0fb7..2273cf8 100644 --- a/src/main/kotlin/io/realworld/jwt/ApiKeySecuredAspect.kt +++ b/src/main/kotlin/mobildata/jwt/ApiKeySecuredAspect.kt @@ -1,7 +1,7 @@ -package io.realworld.jwt +package mobildata.jwt -import io.realworld.model.User -import io.realworld.service.UserService +import mobildata.model.User +import mobildata.service.UserService import org.aspectj.lang.ProceedingJoinPoint import org.aspectj.lang.annotation.Around import org.aspectj.lang.annotation.Aspect @@ -34,7 +34,7 @@ class ApiKeySecuredAspect(@Autowired val userService: UserService) { @Autowired var request: HttpServletRequest? = null - @Pointcut(value = "execution(@io.realworld.jwt.ApiKeySecured * *.*(..))") + @Pointcut(value = "execution(@mobildata.jwt.ApiKeySecured * *.*(..))") fun securedApiPointcut() { } diff --git a/src/main/kotlin/io/realworld/jwt/ExposeResponseInterceptor.kt b/src/main/kotlin/mobildata/jwt/ExposeResponseInterceptor.kt similarity index 98% rename from src/main/kotlin/io/realworld/jwt/ExposeResponseInterceptor.kt rename to src/main/kotlin/mobildata/jwt/ExposeResponseInterceptor.kt index 895db98..f1c00ac 100644 --- a/src/main/kotlin/io/realworld/jwt/ExposeResponseInterceptor.kt +++ b/src/main/kotlin/mobildata/jwt/ExposeResponseInterceptor.kt @@ -1,4 +1,4 @@ -package io.realworld.jwt +package mobildata.jwt import org.springframework.web.servlet.handler.HandlerInterceptorAdapter diff --git a/src/main/kotlin/io/realworld/model/Article.kt b/src/main/kotlin/mobildata/model/Article.kt similarity index 96% rename from src/main/kotlin/io/realworld/model/Article.kt rename to src/main/kotlin/mobildata/model/Article.kt index 0aff74b..3552678 100644 --- a/src/main/kotlin/io/realworld/model/Article.kt +++ b/src/main/kotlin/mobildata/model/Article.kt @@ -1,4 +1,4 @@ -package io.realworld.model +package mobildata.model import java.time.OffsetDateTime import javax.persistence.* diff --git a/src/main/kotlin/io/realworld/model/Comment.kt b/src/main/kotlin/mobildata/model/Comment.kt similarity index 95% rename from src/main/kotlin/io/realworld/model/Comment.kt rename to src/main/kotlin/mobildata/model/Comment.kt index e63e0c1..84e0321 100644 --- a/src/main/kotlin/io/realworld/model/Comment.kt +++ b/src/main/kotlin/mobildata/model/Comment.kt @@ -1,4 +1,4 @@ -package io.realworld.model +package mobildata.model import java.time.OffsetDateTime import javax.persistence.* diff --git a/src/main/kotlin/io/realworld/model/Tag.kt b/src/main/kotlin/mobildata/model/Tag.kt similarity index 93% rename from src/main/kotlin/io/realworld/model/Tag.kt rename to src/main/kotlin/mobildata/model/Tag.kt index 8d31bc9..c746e15 100644 --- a/src/main/kotlin/io/realworld/model/Tag.kt +++ b/src/main/kotlin/mobildata/model/Tag.kt @@ -1,4 +1,4 @@ -package io.realworld.model +package mobildata.model import com.fasterxml.jackson.annotation.JsonIgnore import javax.persistence.Entity diff --git a/src/main/kotlin/io/realworld/model/User.kt b/src/main/kotlin/mobildata/model/User.kt similarity index 82% rename from src/main/kotlin/io/realworld/model/User.kt rename to src/main/kotlin/mobildata/model/User.kt index ec1188e..db61754 100644 --- a/src/main/kotlin/io/realworld/model/User.kt +++ b/src/main/kotlin/mobildata/model/User.kt @@ -1,11 +1,15 @@ -package io.realworld.model +package mobildata.model import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonRootName import javax.persistence.* +// user should be quoted, because this keyword might be resolved in +// various DBMS's (e.g. postgresql) + @Entity @JsonRootName("user") +@Table(name = "\"user\"") data class User(var email: String = "", @JsonIgnore var password: String = "", diff --git a/src/main/kotlin/io/realworld/model/inout/Article.kt b/src/main/kotlin/mobildata/model/inout/Article.kt similarity index 91% rename from src/main/kotlin/io/realworld/model/inout/Article.kt rename to src/main/kotlin/mobildata/model/inout/Article.kt index 6c928f5..b43cee7 100644 --- a/src/main/kotlin/io/realworld/model/inout/Article.kt +++ b/src/main/kotlin/mobildata/model/inout/Article.kt @@ -1,7 +1,7 @@ -package io.realworld.model.inout +package mobildata.model.inout import com.fasterxml.jackson.annotation.JsonRootName -import io.realworld.model.User +import mobildata.model.User import java.time.OffsetDateTime import java.time.ZoneId import java.time.format.DateTimeFormatter @@ -22,7 +22,7 @@ data class Article(var title: String? = null, return date.toZonedDateTime().withZoneSameInstant(ZoneId.of("Z")).format(DateTimeFormatter.ISO_ZONED_DATE_TIME) } - fun fromModel(model: io.realworld.model.Article, currentUser: User): Article { + fun fromModel(model: mobildata.model.Article, currentUser: User): Article { return Article( slug = model.slug, title = model.title, diff --git a/src/main/kotlin/io/realworld/model/inout/Comment.kt b/src/main/kotlin/mobildata/model/inout/Comment.kt similarity index 85% rename from src/main/kotlin/io/realworld/model/inout/Comment.kt rename to src/main/kotlin/mobildata/model/inout/Comment.kt index cff433e..fbb34c0 100644 --- a/src/main/kotlin/io/realworld/model/inout/Comment.kt +++ b/src/main/kotlin/mobildata/model/inout/Comment.kt @@ -1,7 +1,7 @@ -package io.realworld.model.inout +package mobildata.model.inout import com.fasterxml.jackson.annotation.JsonRootName -import io.realworld.model.User +import mobildata.model.User import java.time.OffsetDateTime import java.time.ZoneId import java.time.format.DateTimeFormatter @@ -17,7 +17,7 @@ data class Comment(val createdAt: String, return date.toZonedDateTime().withZoneSameInstant(ZoneId.of("Z")).format(DateTimeFormatter.ISO_ZONED_DATE_TIME) } - fun fromModel(model: io.realworld.model.Comment, currentUser: User): Comment { + fun fromModel(model: mobildata.model.Comment, currentUser: User): Comment { return Comment( id = model.id, body = model.body, diff --git a/src/main/kotlin/io/realworld/model/inout/Login.kt b/src/main/kotlin/mobildata/model/inout/Login.kt similarity index 95% rename from src/main/kotlin/io/realworld/model/inout/Login.kt rename to src/main/kotlin/mobildata/model/inout/Login.kt index 45803dd..66dba94 100644 --- a/src/main/kotlin/io/realworld/model/inout/Login.kt +++ b/src/main/kotlin/mobildata/model/inout/Login.kt @@ -1,4 +1,4 @@ -package io.realworld.model.inout +package mobildata.model.inout import com.fasterxml.jackson.annotation.JsonRootName import javax.validation.constraints.NotNull diff --git a/src/main/kotlin/io/realworld/model/inout/NewArticle.kt b/src/main/kotlin/mobildata/model/inout/NewArticle.kt similarity index 94% rename from src/main/kotlin/io/realworld/model/inout/NewArticle.kt rename to src/main/kotlin/mobildata/model/inout/NewArticle.kt index 554d37a..2c3e267 100644 --- a/src/main/kotlin/io/realworld/model/inout/NewArticle.kt +++ b/src/main/kotlin/mobildata/model/inout/NewArticle.kt @@ -1,4 +1,4 @@ -package io.realworld.model.inout +package mobildata.model.inout import com.fasterxml.jackson.annotation.JsonRootName import javax.validation.constraints.NotNull diff --git a/src/main/kotlin/io/realworld/model/inout/NewComment.kt b/src/main/kotlin/mobildata/model/inout/NewComment.kt similarity index 90% rename from src/main/kotlin/io/realworld/model/inout/NewComment.kt rename to src/main/kotlin/mobildata/model/inout/NewComment.kt index 2a8aced..e4d6d2b 100644 --- a/src/main/kotlin/io/realworld/model/inout/NewComment.kt +++ b/src/main/kotlin/mobildata/model/inout/NewComment.kt @@ -1,4 +1,4 @@ -package io.realworld.model.inout +package mobildata.model.inout import com.fasterxml.jackson.annotation.JsonRootName import javax.validation.constraints.NotNull diff --git a/src/main/kotlin/io/realworld/model/inout/Profile.kt b/src/main/kotlin/mobildata/model/inout/Profile.kt similarity index 88% rename from src/main/kotlin/io/realworld/model/inout/Profile.kt rename to src/main/kotlin/mobildata/model/inout/Profile.kt index 2cd7af6..cb79994 100644 --- a/src/main/kotlin/io/realworld/model/inout/Profile.kt +++ b/src/main/kotlin/mobildata/model/inout/Profile.kt @@ -1,7 +1,7 @@ -package io.realworld.model.inout +package mobildata.model.inout import com.fasterxml.jackson.annotation.JsonRootName -import io.realworld.model.User +import mobildata.model.User @JsonRootName("profile") data class Profile(var username: String, diff --git a/src/main/kotlin/io/realworld/model/inout/Register.kt b/src/main/kotlin/mobildata/model/inout/Register.kt similarity index 96% rename from src/main/kotlin/io/realworld/model/inout/Register.kt rename to src/main/kotlin/mobildata/model/inout/Register.kt index fee6ae1..4330448 100644 --- a/src/main/kotlin/io/realworld/model/inout/Register.kt +++ b/src/main/kotlin/mobildata/model/inout/Register.kt @@ -1,4 +1,4 @@ -package io.realworld.model.inout +package mobildata.model.inout import com.fasterxml.jackson.annotation.JsonRootName import javax.validation.constraints.NotNull diff --git a/src/main/kotlin/io/realworld/model/inout/UpdateArticle.kt b/src/main/kotlin/mobildata/model/inout/UpdateArticle.kt similarity index 90% rename from src/main/kotlin/io/realworld/model/inout/UpdateArticle.kt rename to src/main/kotlin/mobildata/model/inout/UpdateArticle.kt index 373e99e..0eed6fa 100644 --- a/src/main/kotlin/io/realworld/model/inout/UpdateArticle.kt +++ b/src/main/kotlin/mobildata/model/inout/UpdateArticle.kt @@ -1,4 +1,4 @@ -package io.realworld.model.inout +package mobildata.model.inout import com.fasterxml.jackson.annotation.JsonRootName diff --git a/src/main/kotlin/io/realworld/model/inout/UpdateUser.kt b/src/main/kotlin/mobildata/model/inout/UpdateUser.kt similarity index 95% rename from src/main/kotlin/io/realworld/model/inout/UpdateUser.kt rename to src/main/kotlin/mobildata/model/inout/UpdateUser.kt index a619a65..a2a039e 100644 --- a/src/main/kotlin/io/realworld/model/inout/UpdateUser.kt +++ b/src/main/kotlin/mobildata/model/inout/UpdateUser.kt @@ -1,4 +1,4 @@ -package io.realworld.model.inout +package mobildata.model.inout import com.fasterxml.jackson.annotation.JsonRootName import javax.validation.constraints.NotNull diff --git a/src/main/kotlin/io/realworld/repository/ArticleRepository.kt b/src/main/kotlin/mobildata/repository/ArticleRepository.kt similarity index 89% rename from src/main/kotlin/io/realworld/repository/ArticleRepository.kt rename to src/main/kotlin/mobildata/repository/ArticleRepository.kt index adb7c6e..0a85607 100644 --- a/src/main/kotlin/io/realworld/repository/ArticleRepository.kt +++ b/src/main/kotlin/mobildata/repository/ArticleRepository.kt @@ -1,6 +1,6 @@ -package io.realworld.repository +package mobildata.repository -import io.realworld.model.Article +import mobildata.model.Article import org.springframework.data.domain.Pageable import org.springframework.data.jpa.repository.JpaSpecificationExecutor import org.springframework.data.repository.PagingAndSortingRepository diff --git a/src/main/kotlin/io/realworld/repository/CommentRepository.kt b/src/main/kotlin/mobildata/repository/CommentRepository.kt similarity index 75% rename from src/main/kotlin/io/realworld/repository/CommentRepository.kt rename to src/main/kotlin/mobildata/repository/CommentRepository.kt index f384749..2b61104 100644 --- a/src/main/kotlin/io/realworld/repository/CommentRepository.kt +++ b/src/main/kotlin/mobildata/repository/CommentRepository.kt @@ -1,7 +1,7 @@ -package io.realworld.repository +package mobildata.repository -import io.realworld.model.Article -import io.realworld.model.Comment +import mobildata.model.Article +import mobildata.model.Comment import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository diff --git a/src/main/kotlin/io/realworld/repository/TagRepository.kt b/src/main/kotlin/mobildata/repository/TagRepository.kt similarity index 77% rename from src/main/kotlin/io/realworld/repository/TagRepository.kt rename to src/main/kotlin/mobildata/repository/TagRepository.kt index a2a3973..1188bbf 100644 --- a/src/main/kotlin/io/realworld/repository/TagRepository.kt +++ b/src/main/kotlin/mobildata/repository/TagRepository.kt @@ -1,6 +1,6 @@ -package io.realworld.repository +package mobildata.repository -import io.realworld.model.Tag +import mobildata.model.Tag import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository diff --git a/src/main/kotlin/io/realworld/repository/UserRepository.kt b/src/main/kotlin/mobildata/repository/UserRepository.kt similarity index 88% rename from src/main/kotlin/io/realworld/repository/UserRepository.kt rename to src/main/kotlin/mobildata/repository/UserRepository.kt index a16b738..dc78443 100644 --- a/src/main/kotlin/io/realworld/repository/UserRepository.kt +++ b/src/main/kotlin/mobildata/repository/UserRepository.kt @@ -1,6 +1,6 @@ -package io.realworld.repository +package mobildata.repository -import io.realworld.model.User +import mobildata.model.User import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Repository diff --git a/src/main/kotlin/io/realworld/repository/specification/ArticlesSpecifications.kt b/src/main/kotlin/mobildata/repository/specification/ArticlesSpecifications.kt similarity index 86% rename from src/main/kotlin/io/realworld/repository/specification/ArticlesSpecifications.kt rename to src/main/kotlin/mobildata/repository/specification/ArticlesSpecifications.kt index bf87e25..dddfa4d 100644 --- a/src/main/kotlin/io/realworld/repository/specification/ArticlesSpecifications.kt +++ b/src/main/kotlin/mobildata/repository/specification/ArticlesSpecifications.kt @@ -1,8 +1,8 @@ -package io.realworld.repository.specification +package mobildata.repository.specification -import io.realworld.model.Article -import io.realworld.model.Tag -import io.realworld.model.User +import mobildata.model.Article +import mobildata.model.Tag +import mobildata.model.User import org.springframework.data.jpa.domain.Specification import javax.persistence.criteria.Predicate diff --git a/src/main/kotlin/io/realworld/service/UserService.kt b/src/main/kotlin/mobildata/service/UserService.kt similarity index 91% rename from src/main/kotlin/io/realworld/service/UserService.kt rename to src/main/kotlin/mobildata/service/UserService.kt index 4090f9f..95d3e1d 100644 --- a/src/main/kotlin/io/realworld/service/UserService.kt +++ b/src/main/kotlin/mobildata/service/UserService.kt @@ -1,11 +1,11 @@ -package io.realworld.service +package mobildata.service import io.jsonwebtoken.Jwts import io.jsonwebtoken.SignatureAlgorithm -import io.realworld.exception.InvalidLoginException -import io.realworld.model.User -import io.realworld.model.inout.Login -import io.realworld.repository.UserRepository +import mobildata.exception.InvalidLoginException +import mobildata.model.User +import mobildata.model.inout.Login +import mobildata.repository.UserRepository import org.mindrot.jbcrypt.BCrypt import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Service diff --git a/src/main/kotlin/io/realworld/web/ArticleHandler.kt b/src/main/kotlin/mobildata/web/ArticleHandler.kt similarity index 91% rename from src/main/kotlin/io/realworld/web/ArticleHandler.kt rename to src/main/kotlin/mobildata/web/ArticleHandler.kt index da33df4..62fa278 100644 --- a/src/main/kotlin/io/realworld/web/ArticleHandler.kt +++ b/src/main/kotlin/mobildata/web/ArticleHandler.kt @@ -1,23 +1,23 @@ -package io.realworld.web +package mobildata.web import com.github.slugify.Slugify -import io.realworld.exception.ForbiddenRequestException -import io.realworld.exception.InvalidRequest -import io.realworld.exception.NotFoundException -import io.realworld.jwt.ApiKeySecured -import io.realworld.model.Article -import io.realworld.model.Comment -import io.realworld.model.Tag -import io.realworld.model.User -import io.realworld.model.inout.NewArticle -import io.realworld.model.inout.NewComment -import io.realworld.model.inout.UpdateArticle -import io.realworld.repository.ArticleRepository -import io.realworld.repository.CommentRepository -import io.realworld.repository.TagRepository -import io.realworld.repository.UserRepository -import io.realworld.repository.specification.ArticlesSpecifications -import io.realworld.service.UserService +import mobildata.exception.ForbiddenRequestException +import mobildata.exception.InvalidRequest +import mobildata.exception.NotFoundException +import mobildata.jwt.ApiKeySecured +import mobildata.model.Article +import mobildata.model.Comment +import mobildata.model.Tag +import mobildata.model.User +import mobildata.model.inout.NewArticle +import mobildata.model.inout.NewComment +import mobildata.model.inout.UpdateArticle +import mobildata.repository.ArticleRepository +import mobildata.repository.CommentRepository +import mobildata.repository.TagRepository +import mobildata.repository.UserRepository +import mobildata.repository.specification.ArticlesSpecifications +import mobildata.service.UserService import org.springframework.data.domain.PageRequest import org.springframework.data.domain.Sort import org.springframework.http.HttpStatus @@ -27,8 +27,8 @@ import org.springframework.web.bind.annotation.* import java.time.OffsetDateTime import java.util.* import javax.validation.Valid -import io.realworld.model.inout.Article as ArticleIO -import io.realworld.model.inout.Comment as CommentOut +import mobildata.model.inout.Article as ArticleIO +import mobildata.model.inout.Comment as CommentOut @RestController class ArticleHandler(val repository: ArticleRepository, @@ -36,7 +36,7 @@ class ArticleHandler(val repository: ArticleRepository, val userRepository: UserRepository, val commentRepository: CommentRepository, val tagRepository: TagRepository) { - +/* @ApiKeySecured(mandatory = false) @GetMapping("/api/articles") fun articles(@RequestParam(defaultValue = "20") limit: Int, @@ -55,6 +55,7 @@ class ArticleHandler(val repository: ArticleRepository, return articlesView(articles, userService.currentUser()) } + @ApiKeySecured @GetMapping("/api/articles/feed") fun feed(@RequestParam(defaultValue = "20") limit: Int, @@ -73,7 +74,7 @@ class ArticleHandler(val repository: ArticleRepository, } throw NotFoundException() } - +*/ @ApiKeySecured @PostMapping("/api/articles") fun newArticle(@Valid @RequestBody newArticle: NewArticle, errors: Errors): Any { @@ -98,7 +99,7 @@ class ArticleHandler(val repository: ArticleRepository, return articleView(repository.save(article), currentUser) } - +/* @ApiKeySecured @PutMapping("/api/articles/{slug}") fun updateArticle(@PathVariable slug: String, @RequestBody article: UpdateArticle): Any { @@ -228,12 +229,12 @@ class ArticleHandler(val repository: ArticleRepository, } throw NotFoundException() } - +*/ // helpers fun articleView(article: Article, currentUser: User) = mapOf("article" to ArticleIO.fromModel(article, currentUser)) - +/* fun articlesView(articles: List<Article>, currentUser: User) = mapOf("articles" to articles.map { ArticleIO.fromModel(it, userService.currentUser()) }, "articlesCount" to articles.size) @@ -243,4 +244,5 @@ class ArticleHandler(val repository: ArticleRepository, fun commentsView(comments: List<Comment>, currentUser: User) = mapOf("comments" to comments.map { CommentOut.fromModel(it, currentUser) }) +*/ } \ No newline at end of file diff --git a/src/main/kotlin/io/realworld/web/InvalidRequestHandler.kt b/src/main/kotlin/mobildata/web/InvalidRequestHandler.kt similarity index 93% rename from src/main/kotlin/io/realworld/web/InvalidRequestHandler.kt rename to src/main/kotlin/mobildata/web/InvalidRequestHandler.kt index 31743fc..fffce94 100644 --- a/src/main/kotlin/io/realworld/web/InvalidRequestHandler.kt +++ b/src/main/kotlin/mobildata/web/InvalidRequestHandler.kt @@ -1,6 +1,6 @@ -package io.realworld.web +package mobildata.web -import io.realworld.exception.InvalidException +import mobildata.exception.InvalidException import org.springframework.http.HttpStatus import org.springframework.stereotype.Component import org.springframework.web.bind.annotation.ExceptionHandler diff --git a/src/main/kotlin/io/realworld/web/ProfileHandler.kt b/src/main/kotlin/mobildata/web/ProfileHandler.kt similarity index 86% rename from src/main/kotlin/io/realworld/web/ProfileHandler.kt rename to src/main/kotlin/mobildata/web/ProfileHandler.kt index 92a8aff..2aa0bdb 100644 --- a/src/main/kotlin/io/realworld/web/ProfileHandler.kt +++ b/src/main/kotlin/mobildata/web/ProfileHandler.kt @@ -1,11 +1,11 @@ -package io.realworld.web +package mobildata.web -import io.realworld.exception.NotFoundException -import io.realworld.jwt.ApiKeySecured -import io.realworld.model.User -import io.realworld.model.inout.Profile -import io.realworld.repository.UserRepository -import io.realworld.service.UserService +import mobildata.exception.NotFoundException +import mobildata.jwt.ApiKeySecured +import mobildata.model.User +import mobildata.model.inout.Profile +import mobildata.repository.UserRepository +import mobildata.service.UserService import org.springframework.web.bind.annotation.* @RestController diff --git a/src/main/kotlin/mobildata/web/SwaggerConfig.kt b/src/main/kotlin/mobildata/web/SwaggerConfig.kt new file mode 100644 index 0000000..6787987 --- /dev/null +++ b/src/main/kotlin/mobildata/web/SwaggerConfig.kt @@ -0,0 +1,30 @@ +package mobildata.web + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import springfox.documentation.builders.PathSelectors +import springfox.documentation.builders.RequestHandlerSelectors +import springfox.documentation.spi.DocumentationType +import springfox.documentation.spring.web.plugins.Docket +import springfox.documentation.swagger2.annotations.EnableSwagger2 +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry + + + + + + +@Configuration +@EnableSwagger2 +class SwaggerConfig { + @Bean + fun api(): Docket { + return Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + } + +} \ No newline at end of file diff --git a/src/main/kotlin/io/realworld/web/UserHandler.kt b/src/main/kotlin/mobildata/web/UserHandler.kt similarity index 91% rename from src/main/kotlin/io/realworld/web/UserHandler.kt rename to src/main/kotlin/mobildata/web/UserHandler.kt index 2f73159..ba25439 100644 --- a/src/main/kotlin/io/realworld/web/UserHandler.kt +++ b/src/main/kotlin/mobildata/web/UserHandler.kt @@ -1,13 +1,13 @@ -package io.realworld.web - -import io.realworld.exception.* -import io.realworld.jwt.ApiKeySecured -import io.realworld.model.User -import io.realworld.model.inout.Login -import io.realworld.model.inout.Register -import io.realworld.model.inout.UpdateUser -import io.realworld.repository.UserRepository -import io.realworld.service.UserService +package mobildata.web + +import mobildata.exception.* +import mobildata.jwt.ApiKeySecured +import mobildata.model.User +import mobildata.model.inout.Login +import mobildata.model.inout.Register +import mobildata.model.inout.UpdateUser +import mobildata.repository.UserRepository +import mobildata.service.UserService import org.mindrot.jbcrypt.BCrypt import org.springframework.validation.BindException import org.springframework.validation.Errors diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index cfd9acd..ff374d8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,12 +1,42 @@ -spring.datasource.url=jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password= -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.datasource.url = jdbc:postgresql://localhost:5432/mobildata +spring.datasource.driverClassName=org.postgresql.Driver +spring.datasource.username=postgres +spring.datasource.password=postgres -spring.jackson.deserialization.UNWRAP_ROOT_VALUE=true +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect + +# create schema automatically. It can be more fine-grained with the commented stuff below. +# spring.jpa.generate-ddl=true + +# recreate the database on startup +spring.jpa.hibernate.ddl-auto=create-drop + +# restart server: +# sudo service postgresql restart + +spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl + +# for logging, debugging, etc.: +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true + +# Disable feature detection by this undocumented parameter. Check the org.hibernate.engine.jdbc.internal.JdbcServiceImpl.configure method for more details. +spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false -jwt.secret=Em3u7dCZ2QSvSGSGSRFUTfrwgu3WjfU2rHZxSjNSqU5x89C3jXPL6WLMW7dTE6rd9NRgWAwUWHkj8ZLfbCNU8uVfv9kuBmWCYPkk776A5jQ2LeJ76bZbdhXN -jwt.issuer=Kotlin&Spring -#logging.level.org.springframework.web=DEBUG \ No newline at end of file +# log sql statements +#logging.level.org.hibernate.SQL=INFO +#logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE + +# log values too +#logging.level.org.hibernate.type=TRACE + +logging.level.org.springframework.web=INFO +logging.level.org.hibernate=INFO +logging.file=/home/wastack/intellij/onlab/database/log.txt + + +spring.jackson.deserialization.UNWRAP_ROOT_VALUE=true + +jwt.secret=fsdMVZ0BPMjvTef89G22IvmLeJMSntRWodTrNywPNLGK1HRUmTr1J3bDqSVNqxM +jwt.issuer=MobilDataServer \ No newline at end of file diff --git a/src/test/kotlin/io/realworld/ApiApplicationTests.kt b/src/test/kotlin/mobildata/ApiApplicationTests.kt similarity index 87% rename from src/test/kotlin/io/realworld/ApiApplicationTests.kt rename to src/test/kotlin/mobildata/ApiApplicationTests.kt index 18ed1c4..d1fb107 100644 --- a/src/test/kotlin/io/realworld/ApiApplicationTests.kt +++ b/src/test/kotlin/mobildata/ApiApplicationTests.kt @@ -1,15 +1,15 @@ -package io.realworld +package mobildata import feign.Feign import feign.gson.GsonDecoder import feign.gson.GsonEncoder -import io.realworld.client.ProfileClient -import io.realworld.client.TagClient -import io.realworld.client.UserClient -import io.realworld.client.response.InLogin -import io.realworld.client.response.InRegister -import io.realworld.model.inout.Login -import io.realworld.model.inout.Register +import mobildata.client.ProfileClient +import mobildata.client.TagClient +import mobildata.client.UserClient +import mobildata.client.response.InLogin +import mobildata.client.response.InRegister +import mobildata.model.inout.Login +import mobildata.model.inout.Register import org.hamcrest.Matchers import org.junit.Assert import org.junit.Before @@ -28,7 +28,6 @@ class ApiApplicationTests { var randomServerPort: Int = 0 @Autowired var environment: Environment? = null - var tagClient: TagClient? = null var userClient: UserClient? = null var profileClient: ProfileClient? = null @@ -43,16 +42,10 @@ class ApiApplicationTests { @Before fun before() { - tagClient = buildClient(TagClient::class.java) userClient = buildClient(UserClient::class.java) profileClient = buildClient(ProfileClient::class.java) } - @Test - fun retrieveTags() { - println("> tags: " + tagClient?.tags()?.tags) - } - @Test fun userAndProfileTest() { val fooRegister = userClient?.register( -- GitLab