From 0a3fb00301ab6e9d39cdb3c7ad6a65dff39afb58 Mon Sep 17 00:00:00 2001 From: Steffen Nitschke Date: Wed, 13 Jan 2021 23:07:31 +0100 Subject: [PATCH] Add AccessRepository --- Multi-Chess.xml | 16 +++++ build.gradle | 12 ++-- fh.fd.ci.server/build.gradle | 9 +++ .../java/de/fd/fh/server/access/Access.java | 46 +++++++++++++++ .../fd/fh/server/access/AccessRepository.java | 58 +++++++++++++++++++ .../java/de/fd/fh/server/access/Role.java | 6 ++ .../server/access/AccessRepositoryTest.java | 42 ++++++++++++++ .../fd/fh/server/access/AccessTokenTest.java | 31 ++++++++++ 8 files changed, 216 insertions(+), 4 deletions(-) create mode 100644 Multi-Chess.xml create mode 100644 fh.fd.ci.server/src/main/java/de/fd/fh/server/access/Access.java create mode 100644 fh.fd.ci.server/src/main/java/de/fd/fh/server/access/AccessRepository.java create mode 100644 fh.fd.ci.server/src/main/java/de/fd/fh/server/access/Role.java create mode 100644 fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessRepositoryTest.java create mode 100644 fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessTokenTest.java diff --git a/Multi-Chess.xml b/Multi-Chess.xml new file mode 100644 index 0000000..60ceb42 --- /dev/null +++ b/Multi-Chess.xml @@ -0,0 +1,16 @@ + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4fc1d1f..1c6072a 100644 --- a/build.gradle +++ b/build.gradle @@ -10,10 +10,6 @@ repositories { jcenter() } -dependencies { - testCompile group: 'junit', name: 'junit', version: '4.12' -} - subprojects { apply plugin: 'java' @@ -27,7 +23,15 @@ subprojects { compileOnly 'org.projectlombok:lombok:1.18.16' annotationProcessor 'org.projectlombok:lombok:1.18.16' + testImplementation('org.junit.jupiter:junit-jupiter:5.7.0') + testImplementation('org.mockito:mockito-core:3.7.0') + testImplementation('org.hamcrest:hamcrest-core:2.2') + testCompileOnly 'org.projectlombok:lombok:1.18.16' testAnnotationProcessor 'org.projectlombok:lombok:1.18.16' } + + test { + useJUnitPlatform() + } } diff --git a/fh.fd.ci.server/build.gradle b/fh.fd.ci.server/build.gradle index ad6ace5..2bf768e 100644 --- a/fh.fd.ci.server/build.gradle +++ b/fh.fd.ci.server/build.gradle @@ -2,4 +2,13 @@ dependencies { implementation project(':fh.fd.ci.shared') compile 'com.sparkjava:spark-core:2.9.3' + compile 'dev.morphia.morphia:core:1.5.3' + compile 'com.fasterxml.jackson.core:jackson-databind:2.9.5' + + task startServer(type: JavaExec){ + main = "de.fd.fh.ServerApp" + description = "Start server" + classpath = sourceSets.main.runtimeClasspath + } + } \ No newline at end of file diff --git a/fh.fd.ci.server/src/main/java/de/fd/fh/server/access/Access.java b/fh.fd.ci.server/src/main/java/de/fd/fh/server/access/Access.java new file mode 100644 index 0000000..d3ab03b --- /dev/null +++ b/fh.fd.ci.server/src/main/java/de/fd/fh/server/access/Access.java @@ -0,0 +1,46 @@ +package de.fd.fh.server.access; + +import de.fd.fh.server.user.UserId; +import dev.morphia.annotations.Embedded; +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity("login") +@NoArgsConstructor +@AllArgsConstructor +@Getter +public class Access +{ + @Id + private String _id; + + private String name; + + private String password; + + @Embedded + private UserId userId; + + @Embedded + private AccessToken token; + + private Role role; + + void removeToken() + { + this.token = null; + } + + void setToken(final AccessToken token) + { + this.token = token; + } + + void updatePassword(final String newPassword) + { + this.password = newPassword; + } +} diff --git a/fh.fd.ci.server/src/main/java/de/fd/fh/server/access/AccessRepository.java b/fh.fd.ci.server/src/main/java/de/fd/fh/server/access/AccessRepository.java new file mode 100644 index 0000000..7149cf6 --- /dev/null +++ b/fh.fd.ci.server/src/main/java/de/fd/fh/server/access/AccessRepository.java @@ -0,0 +1,58 @@ +package de.fd.fh.server.access; + +import com.mongodb.MongoClient; +import com.mongodb.WriteResult; +import de.fd.fh.server.user.UserId; +import dev.morphia.Datastore; +import dev.morphia.Key; +import dev.morphia.Morphia; + +public class AccessRepository +{ + private final Datastore datastore; + + public AccessRepository() + { + System.out.println("AccessRepo"); + final Morphia morphia = new Morphia(); + + morphia.mapPackage("de.fd.fh.server.access"); + + this.datastore = morphia.createDatastore(new MongoClient(), "smartwarfare"); + datastore.ensureIndexes(); + } + + AccessRepository(Datastore datastore) + { + this.datastore = datastore; + } + + public Key save(final Access access) + { + return datastore.save(access); + } + + Access findByUserName(final String name) + { + return datastore.createQuery(Access.class) + .field("name").equal(name).first(); + } + + Access findByToken(final String token) + { + return datastore.createQuery(Access.class) + .field("token.token").equal(token).first(); + } + + Access findByUserId(final UserId userId) + { + return datastore.createQuery(Access.class) + .field("userId.identifier").equal(userId.getIdentifier()).first(); + } + + WriteResult deleteLoginByUserId(final UserId userId) + { + return datastore.delete(datastore.createQuery(Access.class) + .field("userId.identifier").equal(userId.getIdentifier()).first()); + } +} diff --git a/fh.fd.ci.server/src/main/java/de/fd/fh/server/access/Role.java b/fh.fd.ci.server/src/main/java/de/fd/fh/server/access/Role.java new file mode 100644 index 0000000..66db360 --- /dev/null +++ b/fh.fd.ci.server/src/main/java/de/fd/fh/server/access/Role.java @@ -0,0 +1,6 @@ +package de.fd.fh.server.access; + +public enum Role +{ + ADMIN, USER +} diff --git a/fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessRepositoryTest.java b/fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessRepositoryTest.java new file mode 100644 index 0000000..488d332 --- /dev/null +++ b/fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessRepositoryTest.java @@ -0,0 +1,42 @@ +package de.fd.fh.server.access; + +import de.fd.fh.server.user.UserId; +import dev.morphia.Datastore; +import dev.morphia.Key; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.then; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class AccessRepositoryTest +{ + @Mock + private Datastore datastore; + + @BeforeEach + public void before() + { + datastore = mock(Datastore.class); + } + + @Test + void given_newUser_when_saveUser_should_storeUserInDatabase() + { + when(datastore.save(any(Access.class))) + .thenReturn(new Key<>(Access.class, "collection", "id")); + + final Access access = new Access("testId", "testName", "testPwd", UserId.of("userId"), + null, Role.USER); + + final Key result = new AccessRepository(datastore).save(access); + + assertThat("Key is null", result, notNullValue()); + then(datastore).should().save(any(Access.class)); + } +} \ No newline at end of file diff --git a/fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessTokenTest.java b/fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessTokenTest.java new file mode 100644 index 0000000..1872e62 --- /dev/null +++ b/fh.fd.ci.server/src/test/java/de/fd/fh/server/access/AccessTokenTest.java @@ -0,0 +1,31 @@ +package de.fd.fh.server.access; + +import de.fd.fh.server.user.UserId; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.jupiter.api.Assertions.*; + +class AccessTokenTest +{ + @Test + void given_accessData_when_createAccessToken_should_createGeneratedToken() + { + final Access access = new Access( + "testId", + "testName", + "testPwd", + UserId.of("12345"), + null, + Role.USER); + + final AccessToken result = AccessToken.of(access); + + assertNotNull(result.getCreatedDate()); + assertNotNull(result.getToken()); + assertThat(result.getToken().length(), equalTo(64)); + assertEquals(result.getRole(), Role.USER); + assertEquals(result.getUserId(), UserId.of("12345")); + } +} \ No newline at end of file