Skip to content

Commit 068e926

Browse files
authored
Merge pull request #14 from AuthGuard/reactive-services
Initial reactive repositories
2 parents cefa7d6 + 407b025 commit 068e926

86 files changed

Lines changed: 867 additions & 555 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

dal/hibernate-dal/hibernate-cache/src/main/java/com/nexblocks/authguard/dal/hibernate/cache/HibernateAccountLocksRepository.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import com.nexblocks.authguard.dal.model.AccountLockDO;
99

1010
import java.util.Collection;
11-
import java.util.concurrent.CompletableFuture;
11+
import io.smallrye.mutiny.Uni;
1212
import java.util.function.Function;
1313

1414
public class HibernateAccountLocksRepository extends AbstractHibernateRepository<AccountLockDO>
@@ -24,11 +24,10 @@ public HibernateAccountLocksRepository(final ReactiveQueryExecutor queryExecutor
2424
}
2525

2626
@Override
27-
public CompletableFuture<Collection<AccountLockDO>> findByAccountId(final long accountId) {
27+
public Uni<Collection<AccountLockDO>> findByAccountId(final long accountId) {
2828
return queryExecutor
2929
.getAList(session -> session.createNamedQuery(GET_BY_ACCOUNT_ID, AccountLockDO.class)
3030
.setParameter(ACCOUNT_ID_FIELD, accountId))
31-
.subscribeAsCompletionStage()
32-
.thenApply(Function.identity());
31+
.map(Function.identity());
3332
}
3433
}

dal/hibernate-dal/hibernate-cache/src/main/java/com/nexblocks/authguard/dal/hibernate/cache/HibernateAccountTokensRepository.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import com.nexblocks.authguard.dal.model.AccountTokenDO;
99

1010
import java.util.Optional;
11-
import java.util.concurrent.CompletableFuture;
11+
import io.smallrye.mutiny.Uni;
1212

1313
public class HibernateAccountTokensRepository extends AbstractHibernateRepository<AccountTokenDO>
1414
implements AccountTokensRepository {
@@ -22,21 +22,20 @@ public HibernateAccountTokensRepository(final ReactiveQueryExecutor queryExecuto
2222
}
2323

2424
@Override
25-
public CompletableFuture<Optional<AccountTokenDO>> getByToken(final String token) {
25+
public Uni<Optional<AccountTokenDO>> getByToken(final String token) {
2626
return queryExecutor.getSingleResult(session -> session.createNamedQuery(GET_BY_TOKEN, AccountTokenDO.class)
27-
.setParameter(TOKEN_FIELD, token))
28-
.subscribeAsCompletionStage();
27+
.setParameter(TOKEN_FIELD, token));
2928
}
3029

3130
@Override
32-
public CompletableFuture<Optional<AccountTokenDO>> deleteToken(final String token) {
31+
public Uni<Optional<AccountTokenDO>> deleteToken(final String token) {
3332
return getByToken(token)
34-
.thenCompose(opt -> {
33+
.flatMap(opt -> {
3534
if (opt.isPresent()) {
36-
return delete(opt.get().getId()).subscribeAsCompletionStage();
35+
return delete(opt.get().getId());
3736
}
3837

39-
return CompletableFuture.completedFuture(Optional.empty());
38+
return Uni.createFrom().item(Optional.empty());
4039
});
4140
}
4241
}

dal/hibernate-dal/hibernate-cache/src/main/java/com/nexblocks/authguard/dal/hibernate/cache/HibernateSessionsRepository.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import java.util.List;
1111
import java.util.Optional;
12-
import java.util.concurrent.CompletableFuture;
12+
import io.smallrye.mutiny.Uni;
1313

1414
public class HibernateSessionsRepository extends AbstractHibernateRepository<SessionDO>
1515
implements SessionsRepository {
@@ -23,30 +23,28 @@ public HibernateSessionsRepository(final ReactiveQueryExecutor queryExecutor) {
2323
}
2424

2525
@Override
26-
public CompletableFuture<Optional<SessionDO>> getByToken(final String token) {
26+
public Uni<Optional<SessionDO>> getByToken(final String token) {
2727
return queryExecutor.getSingleResult(session -> session.createNamedQuery(GET_BY_TOKEN, SessionDO.class)
28-
.setParameter(TOKEN_FIELD, token))
29-
.subscribeAsCompletionStage();
28+
.setParameter(TOKEN_FIELD, token));
3029
}
3130

3231
@Override
33-
public CompletableFuture<Optional<SessionDO>> deleteByToken(final String sessionToken) {
32+
public Uni<Optional<SessionDO>> deleteByToken(final String sessionToken) {
3433
return getByToken(sessionToken)
35-
.thenCompose(opt -> {
34+
.flatMap(opt -> {
3635
if (opt.isPresent()) {
37-
return delete(opt.get().getId()).subscribeAsCompletionStage();
36+
return delete(opt.get().getId());
3837
}
3938

40-
return CompletableFuture.completedFuture(Optional.empty());
39+
return Uni.createFrom().item(Optional.empty());
4140
});
4241
}
4342

4443
@Override
45-
public CompletableFuture<List<SessionDO>> findByAccountId(final long accountId, final String domain) {
44+
public Uni<List<SessionDO>> findByAccountId(final long accountId, final String domain) {
4645
return queryExecutor.getAList(session -> session.createNamedQuery(GET_BY_ACCOUNT_ID, SessionDO.class)
4746
.setParameter(CommonFields.DOMAIN, domain)
48-
.setParameter(CommonFields.ACCOUNT_ID, accountId))
49-
.subscribeAsCompletionStage();
47+
.setParameter(CommonFields.ACCOUNT_ID, accountId));
5048

5149
}
5250
}

dal/hibernate-dal/hibernate-cache/src/test/java/com/nexblocks/authguard/dal/hibernate/cache/HibernateAccountLocksRepositoryTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@ void getByToken() {
5555
.build();
5656

5757
final AccountLockDO persisted = repository.save(accountLock).subscribeAsCompletionStage().join();
58-
final Collection<AccountLockDO> retrieved = repository.findByAccountId(accountLock.getAccountId()).join();
58+
final Collection<AccountLockDO> retrieved = repository.findByAccountId(accountLock.getAccountId()).subscribeAsCompletionStage().join();
5959

6060
assertThat(retrieved).containsOnly(persisted);
6161
}
6262

6363
@Test
6464
void getByTokenNonExistent() {
65-
assertThat(repository.findByAccountId(0).join()).isEmpty();
65+
assertThat(repository.findByAccountId(0).subscribeAsCompletionStage().join()).isEmpty();
6666
}
6767
}

dal/hibernate-dal/hibernate-cache/src/test/java/com/nexblocks/authguard/dal/hibernate/cache/HibernateAccountTokensRepositoryTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ void getByToken() {
7171
.build();
7272

7373
final AccountTokenDO persisted = repository.save(accountToken).subscribeAsCompletionStage().join();
74-
final Optional<AccountTokenDO> retrieved = repository.getByToken(token).join();
74+
final Optional<AccountTokenDO> retrieved = repository.getByToken(token).subscribeAsCompletionStage().join();
7575

7676
assertThat(retrieved).contains(persisted);
7777
}
7878

7979
@Test
8080
void getByTokenNonExistent() {
81-
assertThat(repository.getByToken("nothing").join()).isEmpty();
81+
assertThat(repository.getByToken("nothing").subscribeAsCompletionStage().join()).isEmpty();
8282
}
8383
}

dal/hibernate-dal/hibernate-cache/src/test/java/com/nexblocks/authguard/dal/hibernate/cache/HibernateSessionsRepositoryTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void getByToken() {
4545
.build();
4646

4747
final SessionDO persisted = repository.save(session).subscribeAsCompletionStage().join();
48-
final Optional<SessionDO> retrieved = repository.getByToken(token).join();
48+
final Optional<SessionDO> retrieved = repository.getByToken(token).subscribeAsCompletionStage().join();
4949

5050
assertThat(retrieved).contains(persisted);
5151
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.nexblocks.authguard.dal.hibernate.common;
2+
3+
import org.hibernate.boot.model.TypeContributions;
4+
import org.hibernate.boot.model.TypeContributor;
5+
import org.hibernate.service.ServiceRegistry;
6+
import org.hibernate.type.BasicType;
7+
import org.hibernate.type.descriptor.java.PrimitiveByteArrayJavaType;
8+
import org.hibernate.type.descriptor.jdbc.VarbinaryJdbcType;
9+
import org.hibernate.type.internal.BasicTypeImpl;
10+
11+
12+
public class ByteArrayTypeContributor implements TypeContributor {
13+
@Override
14+
public void contribute(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
15+
BasicType<?> byteArrayType = new BasicTypeImpl<>(
16+
new PrimitiveByteArrayJavaType(),
17+
new VarbinaryJdbcType()
18+
);
19+
20+
typeContributions.contributeType(byteArrayType);
21+
}
22+
}

dal/hibernate-dal/hibernate-common/src/main/java/com/nexblocks/authguard/dal/hibernate/common/QueryExecutor.java

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import jakarta.persistence.NoResultException;
88
import java.util.List;
99
import java.util.Optional;
10-
import java.util.concurrent.CompletableFuture;
10+
import io.smallrye.mutiny.Uni;
1111
import java.util.function.Consumer;
1212
import java.util.function.Function;
1313

@@ -20,27 +20,27 @@ public QueryExecutor(final SessionProvider sessionProvider) {
2020
this.sessionProvider = sessionProvider;
2121
}
2222

23-
public <T> CompletableFuture<T> persistAndReturn(final T entity) {
23+
public <T> Uni<T> persistAndReturn(final T entity) {
2424
return doInNewTransaction(session -> session.persist(entity))
25-
.thenApply(ignored -> entity);
25+
.map(ignored -> entity);
2626
}
2727

28-
public <T> CompletableFuture<Optional<T>> updateAndReturn(final T entity) {
28+
public <T> Uni<Optional<T>> updateAndReturn(final T entity) {
2929
return doInNewTransaction(session -> session.update(entity))
30-
.thenApply(ignored -> Optional.of(entity));
30+
.map(ignored -> Optional.of(entity));
3131
}
3232

33-
public <T> CompletableFuture<Optional<T>> getById(final String id, final Class<T> entityType) {
33+
public <T> Uni<Optional<T>> getById(final String id, final Class<T> entityType) {
3434
return inNewTransaction(session -> session.get(entityType, id))
35-
.thenApply(Optional::ofNullable);
35+
.map(Optional::ofNullable);
3636
}
3737

38-
public <T> CompletableFuture<Optional<T>> getById(final Long id, final Class<T> entityType) {
38+
public <T> Uni<Optional<T>> getById(final Long id, final Class<T> entityType) {
3939
return inNewTransaction(session -> session.get(entityType, id))
40-
.thenApply(Optional::ofNullable);
40+
.map(Optional::ofNullable);
4141
}
4242

43-
public <T> CompletableFuture<Optional<T>> getSingleResult(final Function<Session, Query<T>> sessionQuery) {
43+
public <T> Uni<Optional<T>> getSingleResult(final Function<Session, Query<T>> sessionQuery) {
4444
return inNewTransaction(session -> {
4545
final Query<T> query = sessionQuery.apply(session);
4646

@@ -52,14 +52,14 @@ public <T> CompletableFuture<Optional<T>> getSingleResult(final Function<Session
5252
});
5353
}
5454

55-
public <T> CompletableFuture<List<T>> getAList(final Function<Session, Query<T>> sessionQuery) {
55+
public <T> Uni<List<T>> getAList(final Function<Session, Query<T>> sessionQuery) {
5656
return inNewTransaction(session -> {
5757
final Query<T> query = sessionQuery.apply(session);
5858
return query.getResultList();
5959
});
6060
}
6161

62-
public <T> CompletableFuture<List<T>> getAList(final Function<Session, Query<T>> sessionQuery,
62+
public <T> Uni<List<T>> getAList(final Function<Session, Query<T>> sessionQuery,
6363
final int limit) {
6464
return inNewTransaction(session -> {
6565
final Query<T> query = sessionQuery.apply(session);
@@ -69,45 +69,46 @@ public <T> CompletableFuture<List<T>> getAList(final Function<Session, Query<T>>
6969
});
7070
}
7171

72-
public <T> CompletableFuture<Optional<T>> deleteById(final String id, final Class<T> entityType) {
72+
public <T> Uni<Optional<T>> deleteById(final String id, final Class<T> entityType) {
7373
return getById(id, entityType)
74-
.thenCompose(retrieved -> {
74+
.flatMap(retrieved -> {
7575
if (retrieved.isPresent()) {
7676
return doInNewTransaction(session -> session.delete(retrieved.get()))
77-
.thenApply(ignored -> retrieved);
77+
.map(ignored -> retrieved);
7878
} else {
79-
return CompletableFuture.completedFuture(Optional.empty());
79+
return Uni.createFrom().item(Optional.empty());
8080
}
8181
});
8282
}
8383

84-
public <T> CompletableFuture<Optional<T>> deleteById(final Long id, final Class<T> entityType) {
84+
public <T> Uni<Optional<T>> deleteById(final Long id, final Class<T> entityType) {
8585
return getById(id, entityType)
86-
.thenCompose(retrieved -> {
86+
.flatMap(retrieved -> {
8787
if (retrieved.isPresent()) {
8888
return doInNewTransaction(session -> session.delete(retrieved.get()))
89-
.thenApply(ignored -> retrieved);
89+
.map(ignored -> retrieved);
9090
} else {
91-
return CompletableFuture.completedFuture(Optional.empty());
91+
return Uni.createFrom().item(Optional.empty());
9292
}
9393
});
9494
}
9595

96-
CompletableFuture<Void> doInNewTransaction(final Consumer<Session> consumer) {
97-
return CompletableFuture.runAsync(() -> {
98-
96+
Uni<Void> doInNewTransaction(final Consumer<Session> consumer) {
97+
return Uni.createFrom().item(() -> {
9998
try (Session session = sessionProvider.newBlockingSession()) {
10099
session.beginTransaction();
101100

102101
consumer.accept(session);
103102

104103
session.getTransaction().commit();
105104
}
105+
106+
return null;
106107
});
107108
}
108109

109-
<T> CompletableFuture<T> inNewTransaction(final Function<Session, T> function) {
110-
return CompletableFuture.supplyAsync(() -> {
110+
<T> Uni<T> inNewTransaction(final Function<Session, T> function) {
111+
return Uni.createFrom().item(() -> {
111112
final Session session = sessionProvider.newBlockingSession();
112113

113114
session.beginTransaction();

dal/hibernate-dal/hibernate-common/src/main/java/com/nexblocks/authguard/dal/hibernate/common/ReactiveQueryExecutor.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
package com.nexblocks.authguard.dal.hibernate.common;
22

3+
import com.google.inject.Inject;
34
import io.smallrye.mutiny.Uni;
4-
import jakarta.inject.Inject;
55
import org.hibernate.reactive.mutiny.Mutiny;
66

77
import java.util.List;
88
import java.util.Map;
9-
import java.util.Objects;
109
import java.util.Optional;
1110
import java.util.function.Function;
1211

1312
public class ReactiveQueryExecutor {
1413
private final Mutiny.SessionFactory sessionFactory;
1514

16-
@Inject
1715
public ReactiveQueryExecutor(final Mutiny.SessionFactory sessionFactory) {
1816
this.sessionFactory = sessionFactory;
1917
}
2018

19+
public Mutiny.SessionFactory getSessionFactory() {
20+
return sessionFactory;
21+
}
22+
2123
@Inject
2224
public ReactiveQueryExecutor(final SessionProvider sessionProvider) {
2325
this.sessionFactory = sessionProvider.getFactory();

dal/hibernate-dal/hibernate-common/src/main/java/com/nexblocks/authguard/dal/hibernate/common/SessionProvider.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ public SessionProvider(final Properties hibernateProperties) {
2525
final Configuration configuration = entityMapping(new Configuration())
2626
.addProperties(hibernateProperties);
2727

28+
Properties extra = new Properties();
29+
30+
// extra.put("hibernate.type_contributors", ByteArrayTypeContributor.class.getCanonicalName());
31+
32+
configuration.addProperties(extra);
33+
2834
factory = configuration.buildSessionFactory(
2935
new ReactiveServiceRegistryBuilder()
3036
.applySettings(configuration.getProperties() )

0 commit comments

Comments
 (0)