Skip to content

Commit 9f78283

Browse files
committed
fix(database): add dummy implementations for persistence services with conditional bindings
1 parent 5bfac9b commit 9f78283

5 files changed

Lines changed: 132 additions & 20 deletions

File tree

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package me.whereareiam.intercept.adapter.database;
22

33
import com.google.inject.AbstractModule;
4+
import com.google.inject.Provider;
45
import com.google.inject.Provides;
56
import com.google.inject.Singleton;
67
import me.whereareiam.intercept.adapter.database.message.DefaultMessagePersistenceService;
8+
import me.whereareiam.intercept.adapter.database.message.DummyMessagePersistenceService;
79
import me.whereareiam.intercept.adapter.database.player.DefaultPlayerPersistenceService;
10+
import me.whereareiam.intercept.adapter.database.player.DummyPlayerPersistenceService;
811
import me.whereareiam.intercept.adapter.database.player.PlayerDatabaseBridge;
912
import me.whereareiam.intercept.adapter.database.provider.JdbiProvider;
1013
import me.whereareiam.intercept.adapter.database.repository.message.MessageEntryRepository;
@@ -16,57 +19,95 @@
1619
import me.whereareiam.intercept.database.DatabaseService;
1720
import me.whereareiam.intercept.database.MessagePersistenceService;
1821
import me.whereareiam.intercept.database.PlayerPersistenceService;
22+
import me.whereareiam.intercept.event.EventManager;
23+
import me.whereareiam.intercept.model.config.Persistence;
1924
import org.jdbi.v3.core.Jdbi;
2025

2126
/**
2227
* Guice configuration module for database adapter.
2328
* Provides database-related services and bindings.
29+
* Conditionally provides real or dummy implementations based on persistence configuration.
2430
*/
2531
public class DatabaseConfiguration extends AbstractModule {
2632
@Override
2733
protected void configure() {
28-
bind(DatabaseService.class).to(DefaultDatabaseService.class).asEagerSingleton();
2934
bind(Jdbi.class).toProvider(JdbiProvider.class);
30-
bind(MessagePersistenceService.class).to(DefaultMessagePersistenceService.class);
31-
bind(PlayerPersistenceService.class).to(DefaultPlayerPersistenceService.class);
32-
33-
// Bridge registers itself as an event listener in constructor
34-
bind(PlayerDatabaseBridge.class).asEagerSingleton();
3535
}
3636

3737
@Provides
3838
@Singleton
39-
public MessageFileRepository provideMessageFileRepository(Jdbi jdbi) {
40-
return jdbi.onDemand(MessageFileRepository.class);
39+
public DatabaseService provideDatabaseService(
40+
Provider<DefaultDatabaseService> realServiceProvider,
41+
Provider<DummyDatabaseService> dummyServiceProvider,
42+
Persistence persistence
43+
) {
44+
return persistence.isEnabled() ? realServiceProvider.get() : dummyServiceProvider.get();
4145
}
4246

4347
@Provides
4448
@Singleton
45-
public MessageEntryRepository provideMessageEntryRepository(Jdbi jdbi) {
46-
return jdbi.onDemand(MessageEntryRepository.class);
49+
public MessagePersistenceService provideMessagePersistenceService(
50+
Provider<DefaultMessagePersistenceService> realServiceProvider,
51+
Provider<DummyMessagePersistenceService> dummyServiceProvider,
52+
Persistence persistence
53+
) {
54+
return persistence.isEnabled() ? realServiceProvider.get() : dummyServiceProvider.get();
4755
}
4856

4957
@Provides
5058
@Singleton
51-
public MessageTranslationRepository provideMessageTranslationRepository(Jdbi jdbi) {
52-
return jdbi.onDemand(MessageTranslationRepository.class);
59+
public PlayerPersistenceService providePlayerPersistenceService(
60+
Provider<DefaultPlayerPersistenceService> realServiceProvider,
61+
Provider<DummyPlayerPersistenceService> dummyServiceProvider,
62+
Persistence persistence
63+
) {
64+
return persistence.isEnabled() ? realServiceProvider.get() : dummyServiceProvider.get();
5365
}
5466

5567
@Provides
5668
@Singleton
57-
public MessageRegexPatternRepository provideMessageRegexPatternRepository(Jdbi jdbi) {
58-
return jdbi.onDemand(MessageRegexPatternRepository.class);
69+
public PlayerDatabaseBridge providePlayerDatabaseBridge(
70+
PlayerPersistenceService persistenceService,
71+
DatabaseService databaseService,
72+
EventManager eventManager
73+
) {
74+
// Always create the bridge - it checks databaseService.isInitialized() before operations
75+
return new PlayerDatabaseBridge(persistenceService, databaseService, eventManager);
5976
}
6077

6178
@Provides
6279
@Singleton
63-
public MessageRegexPlaceholderRepository provideMessageRegexPlaceholderRepository(Jdbi jdbi) {
64-
return jdbi.onDemand(MessageRegexPlaceholderRepository.class);
80+
public MessageFileRepository provideMessageFileRepository(Jdbi jdbi, Persistence persistence) {
81+
return persistence.isEnabled() ? jdbi.onDemand(MessageFileRepository.class) : null;
6582
}
6683

6784
@Provides
6885
@Singleton
69-
public PlayerRepository providePlayerRepository(Jdbi jdbi) {
70-
return jdbi.onDemand(PlayerRepository.class);
86+
public MessageEntryRepository provideMessageEntryRepository(Jdbi jdbi, Persistence persistence) {
87+
return persistence.isEnabled() ? jdbi.onDemand(MessageEntryRepository.class) : null;
88+
}
89+
90+
@Provides
91+
@Singleton
92+
public MessageTranslationRepository provideMessageTranslationRepository(Jdbi jdbi, Persistence persistence) {
93+
return persistence.isEnabled() ? jdbi.onDemand(MessageTranslationRepository.class) : null;
94+
}
95+
96+
@Provides
97+
@Singleton
98+
public MessageRegexPatternRepository provideMessageRegexPatternRepository(Jdbi jdbi, Persistence persistence) {
99+
return persistence.isEnabled() ? jdbi.onDemand(MessageRegexPatternRepository.class) : null;
100+
}
101+
102+
@Provides
103+
@Singleton
104+
public MessageRegexPlaceholderRepository provideMessageRegexPlaceholderRepository(Jdbi jdbi, Persistence persistence) {
105+
return persistence.isEnabled() ? jdbi.onDemand(MessageRegexPlaceholderRepository.class) : null;
106+
}
107+
108+
@Provides
109+
@Singleton
110+
public PlayerRepository providePlayerRepository(Jdbi jdbi, Persistence persistence) {
111+
return persistence.isEnabled() ? jdbi.onDemand(PlayerRepository.class) : null;
71112
}
72113
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package me.whereareiam.intercept.adapter.database;
2+
3+
import com.google.inject.Singleton;
4+
import me.whereareiam.intercept.database.DatabaseService;
5+
6+
/**
7+
* Dummy implementation of DatabaseService used when persistence is disabled.
8+
* Always reports database as not initialized.
9+
*/
10+
@Singleton
11+
public class DummyDatabaseService implements DatabaseService {
12+
@Override
13+
public boolean isInitialized() {
14+
return false;
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package me.whereareiam.intercept.adapter.database.message;
2+
3+
import com.google.inject.Singleton;
4+
import me.whereareiam.intercept.database.MessagePersistenceService;
5+
import me.whereareiam.intercept.model.messaging.snapshot.MessageSnapshot;
6+
7+
import java.util.Collections;
8+
9+
/**
10+
* Dummy implementation of MessagePersistenceService used when persistence is disabled.
11+
* All operations are silent no-ops.
12+
*/
13+
@Singleton
14+
public class DummyMessagePersistenceService implements MessagePersistenceService {
15+
@Override
16+
public void uploadMessages(MessageSnapshot snapshot) {
17+
// No-op
18+
}
19+
20+
@Override
21+
public MessageSnapshot downloadMessages() {
22+
// Return empty snapshot with empty maps
23+
return new MessageSnapshot(Collections.emptyMap(), Collections.emptyMap());
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package me.whereareiam.intercept.adapter.database.player;
2+
3+
import com.google.inject.Singleton;
4+
import me.whereareiam.intercept.database.PlayerPersistenceService;
5+
import me.whereareiam.intercept.model.player.InterceptPlayer;
6+
import me.whereareiam.intercept.model.player.PlayerData;
7+
8+
import java.util.Optional;
9+
import java.util.UUID;
10+
11+
/**
12+
* Dummy implementation of PlayerPersistenceService used when persistence is disabled.
13+
* All operations are silent no-ops.
14+
*/
15+
@Singleton
16+
public class DummyPlayerPersistenceService implements PlayerPersistenceService {
17+
@Override
18+
public Optional<PlayerData> loadPlayer(UUID playerId) {
19+
return Optional.empty();
20+
}
21+
22+
@Override
23+
public void savePlayer(InterceptPlayer player) {
24+
// No-op
25+
}
26+
27+
@Override
28+
public void deletePlayer(UUID playerId) {
29+
// No-op
30+
}
31+
}

intercept-api/src/main/java/me/whereareiam/intercept/InterceptAPI.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,5 +132,4 @@ public static PlayerRegistry getPlayerRegistry() {
132132
public static CommandService getCommandService() {
133133
return getService(CommandService.class);
134134
}
135-
}
136-
135+
}

0 commit comments

Comments
 (0)