Skip to content

Commit b876510

Browse files
committed
fix: update deps and imports to post api-impl split imports
1 parent a22dd17 commit b876510

18 files changed

+93
-55
lines changed

cloudnet-rest-module/build.gradle.kts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ repositories {
2828
dependencies {
2929
api(projects.webApi)
3030
moduleLibrary(libs.guava)
31+
moduleLibrary(libs.unirest)
32+
moduleLibrary(libs.caffeine)
3133

3234
implementation(projects.webJwtAuth)
3335
moduleLibrary(libs.jjwtApi)
@@ -53,8 +55,8 @@ dependencies {
5355
compileOnly(libs.logbackCore)
5456
compileOnly(libs.logbackClassic)
5557

56-
compileOnly("eu.cloudnetservice.cloudnet:node:4.0.0-RC12-SNAPSHOT")
57-
compileOnly("eu.cloudnetservice.cloudnet:bridge:4.0.0-RC12-SNAPSHOT")
58+
compileOnly("eu.cloudnetservice.cloudnet:node-impl:4.0.0-RC12-SNAPSHOT")
59+
compileOnly("eu.cloudnetservice.cloudnet:bridge-impl:4.0.0-RC12-SNAPSHOT")
5860
}
5961

6062
tasks.withType<Test> {

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/CloudNetRestModule.java

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@
1818

1919
import dev.derklaro.aerogel.SpecifiedInjector;
2020
import dev.derklaro.aerogel.binding.BindingBuilder;
21-
import eu.cloudnetservice.common.language.I18n;
2221
import eu.cloudnetservice.driver.document.DocumentFactory;
2322
import eu.cloudnetservice.driver.event.EventManager;
2423
import eu.cloudnetservice.driver.inject.InjectionLayer;
24+
import eu.cloudnetservice.driver.language.I18n;
25+
import eu.cloudnetservice.driver.language.PropertiesTranslationProvider;
2526
import eu.cloudnetservice.driver.module.ModuleLifeCycle;
2627
import eu.cloudnetservice.driver.module.ModuleProvider;
2728
import eu.cloudnetservice.driver.module.ModuleTask;
2829
import eu.cloudnetservice.driver.module.driver.DriverModule;
30+
import eu.cloudnetservice.driver.registry.Service;
2931
import eu.cloudnetservice.ext.modules.rest.config.RestConfiguration;
3032
import eu.cloudnetservice.ext.modules.rest.listener.CloudNetBridgeInitializer;
3133
import eu.cloudnetservice.ext.modules.rest.listener.RestUserUpdateListener;
@@ -48,10 +50,16 @@
4850
import eu.cloudnetservice.ext.rest.api.auth.RestUserManagementLoader;
4951
import eu.cloudnetservice.ext.rest.api.factory.HttpComponentFactoryLoader;
5052
import eu.cloudnetservice.ext.rest.validation.ValidationHandlerMethodContextDecorator;
51-
import eu.cloudnetservice.node.TickLoop;
5253
import eu.cloudnetservice.node.command.CommandProvider;
54+
import eu.cloudnetservice.node.tick.Scheduler;
55+
import eu.cloudnetservice.utils.base.io.FileUtil;
56+
import eu.cloudnetservice.utils.base.resource.ResourceResolver;
5357
import jakarta.inject.Named;
5458
import jakarta.inject.Singleton;
59+
import java.io.IOException;
60+
import java.nio.file.Files;
61+
import java.nio.file.Path;
62+
import java.util.Locale;
5563
import lombok.NonNull;
5664
import org.slf4j.Logger;
5765
import org.slf4j.LoggerFactory;
@@ -61,9 +69,30 @@ public final class CloudNetRestModule extends DriverModule {
6169

6270
private static final Logger LOGGER = LoggerFactory.getLogger(CloudNetRestModule.class);
6371

72+
public static void loadTranslations(@NonNull I18n i18n) {
73+
var resourcePath = Path.of(ResourceResolver.resolveCodeSourceOfClass(CloudNetRestModule.class));
74+
FileUtil.openZipFile(resourcePath, fs -> {
75+
// get the language directory
76+
var langDir = fs.getPath("lang/");
77+
if (Files.notExists(langDir) || !Files.isDirectory(langDir)) {
78+
throw new IllegalStateException("lang/ must be an existing directory inside the jar to load");
79+
}
80+
// visit each file and register it as a language source
81+
FileUtil.walkFileTree(langDir, ($, sub) -> {
82+
// try to load and register the language file
83+
try (var stream = Files.newInputStream(sub)) {
84+
var lang = sub.getFileName().toString().replace(".properties", "");
85+
i18n.registerProvider(Locale.forLanguageTag(lang), PropertiesTranslationProvider.fromProperties(stream));
86+
} catch (IOException exception) {
87+
LOGGER.error("Unable to open language file for reading @ {}", sub, exception);
88+
}
89+
}, false, "*.properties");
90+
});
91+
}
92+
6493
@ModuleTask(order = 127, lifecycle = ModuleLifeCycle.LOADED)
65-
public void loadLanguageFile() {
66-
I18n.loadFromLangPath(this.getClass());
94+
public void loadLanguageFile(@NonNull @Service I18n i18n) {
95+
loadTranslations(i18n);
6796
}
6897

6998
@ModuleTask(order = 127, lifecycle = ModuleLifeCycle.STARTED)
@@ -132,13 +161,13 @@ public void registerRestCommand(@NonNull CommandProvider commandProvider) {
132161

133162
@ModuleTask(lifecycle = ModuleLifeCycle.STARTED)
134163
public void scheduleBridgeInitialization(
135-
@NonNull TickLoop tickLoop,
164+
@NonNull Scheduler scheduler,
136165
@NonNull ModuleProvider moduleProvider,
137166
@NonNull HttpServer server,
138167
@NonNull @Named("module") InjectionLayer<SpecifiedInjector> moduleLayer
139168
) {
140169
// we want to register the bridge handlers after all modules are started
141-
tickLoop.runTask(() -> CloudNetBridgeInitializer.installBridgeHandler(moduleProvider, server, moduleLayer));
170+
scheduler.runTask(() -> CloudNetBridgeInitializer.installBridgeHandler(moduleProvider, server, moduleLayer));
142171
}
143172

144173
@ModuleTask(lifecycle = ModuleLifeCycle.STARTED)

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/RestCommand.java

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616

1717
package eu.cloudnetservice.ext.modules.rest;
1818

19-
import eu.cloudnetservice.common.language.I18n;
19+
import eu.cloudnetservice.driver.language.I18n;
20+
import eu.cloudnetservice.driver.registry.Service;
2021
import eu.cloudnetservice.ext.modules.rest.auth.DefaultRestUser;
2122
import eu.cloudnetservice.ext.rest.api.auth.AuthProvider;
2223
import eu.cloudnetservice.ext.rest.api.auth.AuthProviderLoader;
@@ -45,11 +46,13 @@
4546
@Description("module-rest-command-description")
4647
public final class RestCommand {
4748

49+
private final I18n i18n;
4850
private final AuthProvider authProvider;
4951
private final RestUserManagement restUserManagement;
5052

5153
@Inject
52-
public RestCommand(@NonNull RestUserManagement restUserManagement) {
54+
public RestCommand(@NonNull @Service I18n i18n, @NonNull RestUserManagement restUserManagement) {
55+
this.i18n = i18n;
5356
this.restUserManagement = restUserManagement;
5457
this.authProvider = AuthProviderLoader.resolveAuthProvider("basic");
5558
}
@@ -59,15 +62,15 @@ public RestCommand(@NonNull RestUserManagement restUserManagement) {
5962
var username = input.readString();
6063
var user = this.restUserManagement.restUserByUsername(username);
6164
if (user == null) {
62-
throw new ArgumentNotAvailableException(I18n.trans("module-rest-user-not-found", username));
65+
throw new ArgumentNotAvailableException(this.i18n.translate("module-rest-user-not-found", username));
6366
}
6467

6568
// this implementation is based on our rest user implementation
6669
if (user instanceof DefaultRestUser defaultRestUser) {
6770
return defaultRestUser;
6871
}
6972

70-
throw new ArgumentNotAvailableException(I18n.trans(
73+
throw new ArgumentNotAvailableException(this.i18n.translate(
7174
"module-rest-unknown-user-type",
7275
user.getClass().getSimpleName()));
7376
}
@@ -79,7 +82,7 @@ public RestCommand(@NonNull RestUserManagement restUserManagement) {
7982
return scope;
8083
}
8184

82-
throw new ArgumentNotAvailableException(I18n.trans(
85+
throw new ArgumentNotAvailableException(this.i18n.translate(
8386
"argument-parse-failure-regex",
8487
RestUser.SCOPE_NAMING_PATTERN.pattern(),
8588
scope));
@@ -92,7 +95,7 @@ public void createRestUser(
9295
@Argument("password") @Regex(DefaultRestUser.PASSWORD_REGEX) @NonNull String password
9396
) {
9497
if (this.restUserManagement.restUserByUsername(username) != null) {
95-
source.sendMessage(I18n.trans("module-rest-user-already-existing", username));
98+
source.sendMessage(this.i18n.translate("module-rest-user-already-existing", username));
9699
return;
97100
}
98101

@@ -105,13 +108,13 @@ public void createRestUser(
105108
.build();
106109
this.restUserManagement.saveRestUser(user);
107110

108-
source.sendMessage(I18n.trans("module-rest-user-create-successful", username));
111+
source.sendMessage(this.i18n.translate("module-rest-user-create-successful", username));
109112
}
110113

111114
@Command("rest user delete <username>")
112115
public void deleteRestUser(@NonNull CommandSource source, @Argument("username") @NonNull DefaultRestUser restUser) {
113116
this.restUserManagement.deleteRestUser(restUser.id());
114-
source.sendMessage(I18n.trans("module-rest-user-delete-successful", restUser.username()));
117+
source.sendMessage(this.i18n.translate("module-rest-user-delete-successful", restUser.username()));
115118
}
116119

117120
@Command("rest user <username>")
@@ -130,13 +133,13 @@ public void addScope(
130133
@Argument(value = "scope", parserName = "restUserScope") @NonNull String scope
131134
) {
132135
this.updateRestUser(source, restUser, builder -> builder.scope(scope));
133-
source.sendMessage(I18n.trans("module-rest-user-add-scope-successful", restUser.username(), scope));
136+
source.sendMessage(this.i18n.translate("module-rest-user-add-scope-successful", restUser.username(), scope));
134137
}
135138

136139
@Command("rest user <username> clear scopes")
137140
public void clearScopes(@NonNull CommandSource source, @Argument("username") @NonNull DefaultRestUser restUser) {
138141
this.updateRestUser(source, restUser, builder -> builder.scopes(Set.of()));
139-
source.sendMessage(I18n.trans("module-rest-user-clear-scopes-successful", restUser.username()));
142+
source.sendMessage(this.i18n.translate("module-rest-user-clear-scopes-successful", restUser.username()));
140143
}
141144

142145
@Command("rest user <username> remove scope <scope>")
@@ -146,7 +149,7 @@ public void removeScope(
146149
@Argument("scope") @NonNull String scope
147150
) {
148151
this.updateRestUser(source, restUser, builder -> builder.modifyScopes(scopes -> scopes.remove(scope)));
149-
source.sendMessage(I18n.trans("module-rest-user-remove-scope-successful", restUser.username(), scope));
152+
source.sendMessage(this.i18n.translate("module-rest-user-remove-scope-successful", restUser.username(), scope));
150153
}
151154

152155
@Command("rest user <username> set password <password>")
@@ -156,7 +159,7 @@ public void setPassword(
156159
@Argument("password") @NonNull String password
157160
) {
158161
this.updateRestUser(source, restUser, builder -> builder.password(password));
159-
source.sendMessage(I18n.trans("module-rest-user-password-changed", restUser.username()));
162+
source.sendMessage(this.i18n.translate("module-rest-user-password-changed", restUser.username()));
160163
}
161164

162165
@Command("rest user <username> verifyPassword <password>")
@@ -168,12 +171,12 @@ public void verifyPassword(
168171
if (this.authProvider instanceof BasicAuthProvider basicAuthProvider) {
169172
var valid = basicAuthProvider.validatePassword(restUser, password.getBytes(StandardCharsets.UTF_8));
170173
if (valid) {
171-
source.sendMessage(I18n.trans("module-rest-user-password-match", restUser.username()));
174+
source.sendMessage(this.i18n.translate("module-rest-user-password-match", restUser.username()));
172175
} else {
173-
source.sendMessage(I18n.trans("module-rest-user-password-mismatch", restUser.username()));
176+
source.sendMessage(this.i18n.translate("module-rest-user-password-mismatch", restUser.username()));
174177
}
175178
} else {
176-
source.sendMessage(I18n.trans("module-rest-user-verify-basic-auth-provider-missing"));
179+
source.sendMessage(this.i18n.translate("module-rest-user-verify-basic-auth-provider-missing"));
177180
}
178181
}
179182

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/auth/DefaultRestUser.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
package eu.cloudnetservice.ext.modules.rest.auth;
1818

1919
import com.google.common.base.Preconditions;
20-
import eu.cloudnetservice.common.util.StringUtil;
2120
import eu.cloudnetservice.ext.modules.rest.UUIDv7;
2221
import eu.cloudnetservice.ext.modules.rest.auth.util.PasswordEncryptionUtil;
2322
import eu.cloudnetservice.ext.rest.api.auth.RestUser;
2423
import eu.cloudnetservice.ext.rest.api.response.Response;
2524
import eu.cloudnetservice.ext.rest.api.response.type.JsonResponse;
25+
import eu.cloudnetservice.utils.base.StringUtil;
2626
import java.time.OffsetDateTime;
2727
import java.util.Collection;
2828
import java.util.HashMap;
@@ -194,8 +194,8 @@ Builder id(@NonNull UUID id) {
194194
public @NonNull Builder password(@NonNull String password) {
195195
this.validatePassword(password);
196196
var hashedPasswordInfo = PasswordEncryptionUtil.encrypt(password);
197-
this.properties.put(PASSWORD_KEY, hashedPasswordInfo.second());
198-
this.properties.put(PASSWORD_SALT_KEY, hashedPasswordInfo.first());
197+
this.properties.put(PASSWORD_KEY, hashedPasswordInfo._2());
198+
this.properties.put(PASSWORD_SALT_KEY, hashedPasswordInfo._1());
199199
return this;
200200
}
201201

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/auth/DefaultRestUserManagement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import eu.cloudnetservice.ext.rest.api.auth.RestUser;
2727
import eu.cloudnetservice.ext.rest.api.auth.RestUserManagement;
2828
import eu.cloudnetservice.node.database.LocalDatabase;
29-
import eu.cloudnetservice.node.database.NodeDatabaseProvider;
29+
import eu.cloudnetservice.node.impl.database.NodeDatabaseProvider;
3030
import java.time.Duration;
3131
import java.util.Collection;
3232
import java.util.UUID;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/auth/util/PasswordEncryptionUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package eu.cloudnetservice.ext.modules.rest.auth.util;
1818

19-
import eu.cloudnetservice.common.tuple.Tuple2;
19+
import io.vavr.Tuple2;
2020
import java.security.NoSuchAlgorithmException;
2121
import java.security.SecureRandom;
2222
import java.security.spec.InvalidKeySpecException;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/config/ConnectionInfoResolverConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
package eu.cloudnetservice.ext.modules.rest.config;
1818

1919
import com.google.common.net.HttpHeaders;
20-
import eu.cloudnetservice.common.util.StringUtil;
2120
import eu.cloudnetservice.driver.document.Document;
2221
import eu.cloudnetservice.driver.document.property.DefaultedDocPropertyHolder;
2322
import eu.cloudnetservice.driver.document.property.DocProperty;
2423
import eu.cloudnetservice.ext.rest.api.connection.HttpConnectionInfoResolver;
2524
import eu.cloudnetservice.ext.rest.api.connection.parse.ForwardedSyntaxConnectionInfoResolver;
2625
import eu.cloudnetservice.ext.rest.api.connection.parse.HostHeaderConnectionInfoResolver;
2726
import eu.cloudnetservice.ext.rest.api.connection.parse.XForwardSyntaxConnectionInfoResolver;
27+
import eu.cloudnetservice.utils.base.StringUtil;
2828
import lombok.NonNull;
2929
import org.jetbrains.annotations.Nullable;
3030

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/dto/JsonConfigurationDto.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package eu.cloudnetservice.ext.modules.rest.dto;
1818

1919
import eu.cloudnetservice.driver.document.Document;
20-
import eu.cloudnetservice.node.config.JsonConfiguration;
20+
import eu.cloudnetservice.node.impl.config.JsonConfiguration;
2121
import jakarta.validation.Valid;
2222
import jakarta.validation.constraints.NotBlank;
2323
import jakarta.validation.constraints.NotNull;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/dto/version/ServiceVersionDto.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import eu.cloudnetservice.driver.document.Document;
2020
import eu.cloudnetservice.ext.modules.rest.dto.Dto;
21-
import eu.cloudnetservice.node.version.ServiceVersion;
21+
import eu.cloudnetservice.node.impl.version.ServiceVersion;
2222
import jakarta.validation.constraints.NotBlank;
2323
import jakarta.validation.constraints.NotNull;
2424
import java.util.Map;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/dto/version/ServiceVersionTypeDto.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
package eu.cloudnetservice.ext.modules.rest.dto.version;
1818

1919
import eu.cloudnetservice.ext.modules.rest.dto.Dto;
20-
import eu.cloudnetservice.node.version.ServiceVersionType;
21-
import eu.cloudnetservice.node.version.execute.InstallStep;
20+
import eu.cloudnetservice.node.impl.version.ServiceVersionType;
21+
import eu.cloudnetservice.node.impl.version.execute.InstallStep;
2222
import jakarta.validation.Valid;
2323
import jakarta.validation.constraints.NotNull;
2424
import java.util.Collection;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/page/PageSortingMode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package eu.cloudnetservice.ext.modules.rest.page;
1818

19-
import eu.cloudnetservice.common.util.StringUtil;
19+
import eu.cloudnetservice.utils.base.StringUtil;
2020
import java.util.Comparator;
2121
import java.util.function.Function;
2222
import lombok.NonNull;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/v3/V3HttpHandlerModule.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package eu.cloudnetservice.ext.modules.rest.v3;
1818

19-
import eu.cloudnetservice.common.io.FileUtil;
20-
import eu.cloudnetservice.common.util.StringUtil;
2119
import eu.cloudnetservice.driver.document.DocumentFactory;
2220
import eu.cloudnetservice.driver.module.ModuleProvider;
2321
import eu.cloudnetservice.driver.module.ModuleWrapper;
@@ -35,9 +33,11 @@
3533
import eu.cloudnetservice.ext.rest.api.response.IntoResponse;
3634
import eu.cloudnetservice.ext.rest.api.response.type.JsonResponse;
3735
import eu.cloudnetservice.ext.updater.util.ChecksumUtil;
38-
import eu.cloudnetservice.node.Node;
39-
import eu.cloudnetservice.node.module.ModuleEntry;
40-
import eu.cloudnetservice.node.module.ModulesHolder;
36+
import eu.cloudnetservice.node.impl.Node;
37+
import eu.cloudnetservice.node.impl.module.ModuleEntry;
38+
import eu.cloudnetservice.node.impl.module.ModulesHolder;
39+
import eu.cloudnetservice.utils.base.StringUtil;
40+
import eu.cloudnetservice.utils.base.io.FileUtil;
4141
import jakarta.inject.Inject;
4242
import jakarta.inject.Singleton;
4343
import java.io.IOException;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/v3/V3HttpHandlerNode.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020
import ch.qos.logback.classic.spi.ILoggingEvent;
2121
import ch.qos.logback.core.ConsoleAppender;
2222
import ch.qos.logback.core.OutputStreamAppender;
23-
import eu.cloudnetservice.common.concurrent.TaskUtil;
24-
import eu.cloudnetservice.common.util.StringUtil;
2523
import eu.cloudnetservice.driver.CloudNetVersion;
2624
import eu.cloudnetservice.driver.module.ModuleProvider;
2725
import eu.cloudnetservice.driver.network.NetworkChannel;
@@ -48,10 +46,12 @@
4846
import eu.cloudnetservice.ext.rest.validation.EnableValidation;
4947
import eu.cloudnetservice.node.cluster.NodeServerProvider;
5048
import eu.cloudnetservice.node.command.CommandProvider;
51-
import eu.cloudnetservice.node.command.source.DriverCommandSource;
5249
import eu.cloudnetservice.node.config.Configuration;
53-
import eu.cloudnetservice.node.config.JsonConfiguration;
50+
import eu.cloudnetservice.node.impl.command.source.DriverCommandSource;
51+
import eu.cloudnetservice.node.impl.config.JsonConfiguration;
5452
import eu.cloudnetservice.node.service.CloudServiceManager;
53+
import eu.cloudnetservice.utils.base.StringUtil;
54+
import eu.cloudnetservice.utils.base.concurrent.TaskUtil;
5555
import jakarta.inject.Inject;
5656
import jakarta.inject.Named;
5757
import jakarta.inject.Singleton;

cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/v3/V3HttpHandlerService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package eu.cloudnetservice.ext.modules.rest.v3;
1818

19-
import eu.cloudnetservice.common.util.StringUtil;
2019
import eu.cloudnetservice.driver.provider.CloudServiceFactory;
2120
import eu.cloudnetservice.driver.provider.ServiceTaskProvider;
2221
import eu.cloudnetservice.driver.provider.SpecificCloudServiceProvider;
@@ -49,6 +48,7 @@
4948
import eu.cloudnetservice.node.service.CloudServiceManager;
5049
import eu.cloudnetservice.node.service.ServiceConsoleLineHandler;
5150
import eu.cloudnetservice.node.service.ServiceConsoleLogCache;
51+
import eu.cloudnetservice.utils.base.StringUtil;
5252
import jakarta.inject.Inject;
5353
import jakarta.inject.Singleton;
5454
import jakarta.validation.Valid;

0 commit comments

Comments
 (0)