[REPO REFACTOR]: changed to a better git repository structure with branches

This commit is contained in:
2025-10-31 03:32:24 +01:00
parent ad689049d5
commit 8360c7e8e0
212 changed files with 15955 additions and 0 deletions

1
microservices/miarmacraft/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/target/

View File

@@ -0,0 +1,55 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.miarma.api</groupId>
<artifactId>miarmacraft</artifactId>
<version>1.2.0</version>
<properties>
<maven.compiler.source>23</maven.compiler.source>
<maven.compiler.target>23</maven.compiler.target>
</properties>
<repositories>
<repository>
<id>MiarmaGit</id>
<url>https://git.miarma.net/api/packages/Gallardo7761/maven</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>net.miarma.api</groupId>
<artifactId>backlib</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
<build>
<finalName>ME-MiarmaCraft</finalName>
<plugins>
<!-- Maven Shade Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>net.miarma.api.microservices.miarmacraft.MMCMainVerticle</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,131 @@
package net.miarma.api.microservices.miarmacraft.dao;
import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.db.DataAccessObject;
import net.miarma.api.backlib.db.DatabaseManager;
import net.miarma.api.backlib.db.QueryBuilder;
import net.miarma.api.backlib.http.QueryFilters;
import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.microservices.miarmacraft.entities.ModEntity;
import java.util.List;
import java.util.Map;
public class ModDAO implements DataAccessObject<ModEntity, Integer> {
private final DatabaseManager db;
public ModDAO(Pool pool) {
this.db = DatabaseManager.getInstance(pool);
}
@Override
public Future<List<ModEntity>> getAll() {
return getAll(new QueryParams(Map.of(), new QueryFilters()));
}
@Override
public Future<ModEntity> getById(Integer integer) {
Promise<ModEntity> promise = Promise.promise();
String query = QueryBuilder
.select(ModEntity.class)
.where(Map.of("mod_id", integer.toString()))
.build();
db.executeOne(query, ModEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
public Future<List<ModEntity>> getAll(QueryParams params) {
Promise<List<ModEntity>> promise = Promise.promise();
String query = QueryBuilder
.select(ModEntity.class)
.where(params.getFilters())
.orderBy(params.getQueryFilters().getSort(), params.getQueryFilters().getOrder())
.limit(params.getQueryFilters().getLimit())
.offset(params.getQueryFilters().getOffset())
.build();
db.execute(query, ModEntity.class,
list -> promise.complete(list.isEmpty() ? List.of() : list),
promise::fail
);
return promise.future();
}
@Override
public Future<ModEntity> insert(ModEntity mod) {
Promise<ModEntity> promise = Promise.promise();
String query = QueryBuilder.insert(mod).build();
db.executeOne(query, ModEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
@Override
public Future<ModEntity> upsert(ModEntity modEntity, String... conflictKeys) {
Promise<ModEntity> promise = Promise.promise();
String query = QueryBuilder.upsert(modEntity, conflictKeys).build();
db.executeOne(query, ModEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
@Override
public Future<ModEntity> update(ModEntity mod) {
Promise<ModEntity> promise = Promise.promise();
String query = QueryBuilder.update(mod).build();
db.executeOne(query, ModEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
@Override
public Future<Boolean> delete(Integer id) {
Promise<Boolean> promise = Promise.promise();
ModEntity mod = new ModEntity();
mod.setMod_id(id);
String query = QueryBuilder
.delete(mod)
.build();
db.executeOne(query, ModEntity.class,
result -> promise.complete(result != null),
promise::fail
);
return promise.future();
}
@Override
public Future<Boolean> exists(Integer id) {
Promise<Boolean> promise = Promise.promise();
String query = QueryBuilder
.select(ModEntity.class)
.where(Map.of("mod_id", id.toString()))
.build();
db.executeOne(query, ModEntity.class,
result -> promise.complete(result != null),
promise::fail
);
return promise.future();
}
}

View File

@@ -0,0 +1,100 @@
package net.miarma.api.microservices.miarmacraft.dao;
import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.db.DataAccessObject;
import net.miarma.api.backlib.db.DatabaseManager;
import net.miarma.api.backlib.db.QueryBuilder;
import net.miarma.api.backlib.http.QueryFilters;
import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.microservices.miarmacraft.entities.PlayerEntity;
import java.util.List;
import java.util.Map;
public class PlayerDAO implements DataAccessObject<PlayerEntity, Integer> {
private final DatabaseManager db;
public PlayerDAO(Pool pool) {
this.db = DatabaseManager.getInstance(pool);
}
@Override
public Future<List<PlayerEntity>> getAll() {
return getAll(new QueryParams(Map.of(), new QueryFilters()));
}
@Override
public Future<PlayerEntity> getById(Integer integer) {
Promise<PlayerEntity> promise = Promise.promise();
String query = QueryBuilder
.select(PlayerEntity.class)
.where(Map.of("user_id", integer.toString()))
.build();
db.executeOne(query, PlayerEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
public Future<List<PlayerEntity>> getAll(QueryParams params) {
Promise<List<PlayerEntity>> promise = Promise.promise();
String query = QueryBuilder
.select(PlayerEntity.class)
.where(params.getFilters())
.orderBy(params.getQueryFilters().getSort(), params.getQueryFilters().getOrder())
.limit(params.getQueryFilters().getLimit())
.offset(params.getQueryFilters().getOffset())
.build();
db.execute(query, PlayerEntity.class,
list -> promise.complete(list.isEmpty() ? List.of() : list),
promise::fail
);
return promise.future();
}
@Override
public Future<PlayerEntity> insert(PlayerEntity t) {
throw new UnsupportedOperationException("Insert not supported on view-based DAO");
}
@Override
public Future<PlayerEntity> upsert(PlayerEntity playerEntity, String... conflictKeys) {
throw new UnsupportedOperationException("Upsert not supported on view-based DAO");
}
@Override
public Future<PlayerEntity> update(PlayerEntity t) {
throw new UnsupportedOperationException("Insert not supported on view-based DAO");
}
@Override
public Future<Boolean> delete(Integer id) {
throw new UnsupportedOperationException("Insert not supported on view-based DAO");
}
@Override
public Future<Boolean> exists(Integer integer) {
Promise<Boolean> promise = Promise.promise();
String query = QueryBuilder
.select(PlayerEntity.class)
.where(Map.of("user_id", integer.toString()))
.build();
db.executeOne(query, PlayerEntity.class,
result -> promise.complete(result != null),
promise::fail
);
return promise.future();
}
}

View File

@@ -0,0 +1,125 @@
package net.miarma.api.microservices.miarmacraft.dao;
import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.db.DataAccessObject;
import net.miarma.api.backlib.db.DatabaseManager;
import net.miarma.api.backlib.db.QueryBuilder;
import net.miarma.api.backlib.http.QueryFilters;
import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.microservices.miarmacraft.entities.UserMetadataEntity;
import java.util.List;
import java.util.Map;
public class UserMetadataDAO implements DataAccessObject<UserMetadataEntity, Integer> {
private final DatabaseManager db;
public UserMetadataDAO(Pool pool) {
this.db = DatabaseManager.getInstance(pool);
}
@Override
public Future<List<UserMetadataEntity>> getAll() {
return getAll(new QueryParams(Map.of(), new QueryFilters()));
}
@Override
public Future<UserMetadataEntity> getById(Integer id) {
Promise<UserMetadataEntity> promise = Promise.promise();
String query = QueryBuilder
.select(UserMetadataEntity.class)
.where(Map.of("user_id", id.toString()))
.build();
db.executeOne(query, UserMetadataEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
public Future<List<UserMetadataEntity>> getAll(QueryParams params) {
Promise<List<UserMetadataEntity>> promise = Promise.promise();
String query = QueryBuilder
.select(UserMetadataEntity.class)
.where(params.getFilters())
.orderBy(params.getQueryFilters().getSort(), params.getQueryFilters().getOrder())
.limit(params.getQueryFilters().getLimit())
.offset(params.getQueryFilters().getOffset())
.build();
db.execute(query, UserMetadataEntity.class,
list -> promise.complete(list.isEmpty() ? List.of() : list),
promise::fail
);
return promise.future();
}
@Override
public Future<UserMetadataEntity> insert(UserMetadataEntity t) {
Promise<UserMetadataEntity> promise = Promise.promise();
String query = QueryBuilder.insert(t).build();
db.executeOne(query, UserMetadataEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
@Override
public Future<UserMetadataEntity> upsert(UserMetadataEntity userMetadataEntity, String... conflictKeys) {
Promise<UserMetadataEntity> promise = Promise.promise();
String query = QueryBuilder.upsert(userMetadataEntity, conflictKeys).build();
db.executeOne(query, UserMetadataEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
@Override
public Future<UserMetadataEntity> update(UserMetadataEntity t) {
Promise<UserMetadataEntity> promise = Promise.promise();
String query = QueryBuilder.update(t).build();
db.executeOne(query, UserMetadataEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
@Override
public Future<Boolean> delete(Integer id) {
Promise<Boolean> promise = Promise.promise();
UserMetadataEntity entity = new UserMetadataEntity();
entity.setUser_id(id);
String query = QueryBuilder.delete(entity).build();
db.executeOne(query, UserMetadataEntity.class,
result -> promise.complete(result != null),
promise::fail
);
return promise.future();
}
@Override
public Future<Boolean> exists(Integer integer) {
Promise<Boolean> promise = Promise.promise();
String query = QueryBuilder
.select(UserMetadataEntity.class)
.where(Map.of("user_id", integer.toString()))
.build();
db.executeOne(query, UserMetadataEntity.class,
result -> promise.complete(result != null),
promise::fail
);
return promise.future();
}
}

View File

@@ -0,0 +1,65 @@
package net.miarma.api.microservices.miarmacraft.entities;
import io.vertx.sqlclient.Row;
import net.miarma.api.backlib.Constants.MMCModStatus;
import net.miarma.api.backlib.annotations.Table;
import net.miarma.api.backlib.db.AbstractEntity;
import java.time.LocalDateTime;
@Table("miarmacraft_mods")
public class ModEntity extends AbstractEntity {
private Integer mod_id;
private String name;
private String url;
private MMCModStatus status;
private LocalDateTime created_at;
private LocalDateTime updated_at;
public ModEntity() {
super();
}
public ModEntity(Row row) {
super(row);
}
public Integer getMod_id() {
return mod_id;
}
public void setMod_id(Integer mod_id) {
this.mod_id = mod_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public MMCModStatus getStatus() {
return status;
}
public void setStatus(MMCModStatus status) {
this.status = status;
}
public LocalDateTime getCreated_at() {
return created_at;
}
public void setCreated_at(LocalDateTime created_at) {
this.created_at = created_at;
}
public LocalDateTime getUpdated_at() {
return updated_at;
}
public void setUpdated_at(LocalDateTime updated_at) {
this.updated_at = updated_at;
}
}

View File

@@ -0,0 +1,151 @@
package net.miarma.api.microservices.miarmacraft.entities;
import java.time.LocalDateTime;
import io.vertx.sqlclient.Row;
import net.miarma.api.backlib.Constants.CoreUserGlobalStatus;
import net.miarma.api.backlib.Constants.CoreUserRole;
import net.miarma.api.backlib.Constants.MMCUserRole;
import net.miarma.api.backlib.Constants.MMCUserStatus;
import net.miarma.api.backlib.annotations.APIDontReturn;
import net.miarma.api.backlib.annotations.Table;
import net.miarma.api.backlib.db.AbstractEntity;
import net.miarma.api.backlib.interfaces.IUser;
@Table("v_miarmacraft_players")
public class PlayerEntity extends AbstractEntity implements IUser {
private Integer user_id;
private String user_name;
private String email;
private String display_name;
@APIDontReturn
private String password;
private String avatar;
private MMCUserRole role;
private MMCUserStatus status;
private CoreUserGlobalStatus global_status;
private CoreUserRole global_role;
private LocalDateTime created_at;
private LocalDateTime updated_at;
public PlayerEntity() {
super();
}
public PlayerEntity(Row row) {
super(row);
}
public PlayerEntity(IUser user, UserMetadataEntity userMetadata) {
this.user_id = user.getUser_id();
this.user_name = user.getUser_name();
this.email = user.getEmail();
this.display_name = user.getDisplay_name();
this.password = user.getPassword();
this.avatar = user.getAvatar();
this.role = userMetadata.getRole();
this.status = userMetadata.getStatus();
this.global_status = user.getGlobal_status();
this.global_role = user.getGlobal_role();
this.created_at = user.getCreated_at();
this.updated_at = user.getUpdated_at();
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getDisplay_name() {
return display_name;
}
public void setDisplay_name(String display_name) {
this.display_name = display_name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public MMCUserRole getRole() {
return role;
}
public void setRole(MMCUserRole role) {
this.role = role;
}
public MMCUserStatus getStatus() {
return status;
}
public void setStatus(MMCUserStatus status) {
this.status = status;
}
public CoreUserGlobalStatus getGlobal_status() {
return global_status;
}
public void setGlobal_status(CoreUserGlobalStatus global_status) {
this.global_status = global_status;
}
public CoreUserRole getGlobal_role() {
return global_role;
}
public void setGlobal_role(CoreUserRole global_role) {
this.global_role = global_role;
}
public LocalDateTime getCreated_at() {
return created_at;
}
public void setCreated_at(LocalDateTime created_at) {
this.created_at = created_at;
}
public LocalDateTime getUpdated_at() {
return updated_at;
}
public void setUpdated_at(LocalDateTime updated_at) {
this.updated_at = updated_at;
}
}

View File

@@ -0,0 +1,54 @@
package net.miarma.api.microservices.miarmacraft.entities;
import io.vertx.sqlclient.Row;
import net.miarma.api.backlib.Constants.MMCUserRole;
import net.miarma.api.backlib.Constants.MMCUserStatus;
import net.miarma.api.backlib.annotations.Table;
import net.miarma.api.backlib.db.AbstractEntity;
@Table("miarmacraft_user_metadata")
public class UserMetadataEntity extends AbstractEntity {
private Integer user_id;
private MMCUserRole role;
private MMCUserStatus status;
public UserMetadataEntity() {
super();
}
public UserMetadataEntity(Row row) {
super(row);
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public MMCUserRole getRole() {
return role;
}
public void setRole(MMCUserRole role) {
this.role = role;
}
public MMCUserStatus getStatus() {
return status;
}
public void setStatus(MMCUserStatus status) {
this.status = status;
}
public static UserMetadataEntity fromPlayerEntity(PlayerEntity player) {
UserMetadataEntity userMetadata = new UserMetadataEntity();
userMetadata.setUser_id(player.getUser_id());
userMetadata.setRole(player.getRole());
userMetadata.setStatus(player.getStatus());
return userMetadata;
}
}

View File

@@ -0,0 +1,115 @@
package net.miarma.api.microservices.miarmacraft.handlers;
import io.vertx.ext.web.RoutingContext;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.http.ApiStatus;
import net.miarma.api.microservices.miarmacraft.entities.ModEntity;
import net.miarma.api.microservices.miarmacraft.services.ModService;
import net.miarma.api.backlib.util.JsonUtil;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class ModDataHandler {
final ModService modService;
public ModDataHandler(Pool pool) {
this.modService = new ModService(pool);
}
public void getAll(RoutingContext ctx) {
modService.getAll()
.onSuccess(mods -> JsonUtil.sendJson(ctx, ApiStatus.OK, mods))
.onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage()));
}
public void getById(RoutingContext ctx) {
Integer modId = Integer.parseInt(ctx.pathParam("mod_id"));
modService.getById(modId)
.onSuccess(mod -> JsonUtil.sendJson(ctx, ApiStatus.OK, mod))
.onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage()));
}
public void create(RoutingContext ctx) {
try {
String jsonData = ctx.request().getFormAttribute("data");
if (jsonData == null) {
JsonUtil.sendJson(ctx, ApiStatus.BAD_REQUEST, null, "Falta el campo 'data' con los datos del mod");
return;
}
ModEntity mod = Constants.GSON.fromJson(jsonData, ModEntity.class);
if (mod == null) {
JsonUtil.sendJson(ctx, ApiStatus.BAD_REQUEST, null, "JSON del mod inválido");
return;
}
var fileUploadOpt = ctx.fileUploads().stream().findFirst();
if (fileUploadOpt.isEmpty()) {
JsonUtil.sendJson(ctx, ApiStatus.BAD_REQUEST, null, "Falta el archivo .jar del mod");
return;
}
var fileUpload = fileUploadOpt.get();
String originalFileName = fileUpload.fileName();
if (!originalFileName.endsWith(".jar")) {
JsonUtil.sendJson(ctx, ApiStatus.BAD_REQUEST, null, "Solo se permiten archivos .jar");
return;
}
String sanitizedFileName = originalFileName.replaceAll("[^a-zA-Z0-9._-]", "_");
String modsDir = ConfigManager.getInstance().getModsDir();
Path tempPath = Paths.get(fileUpload.uploadedFileName());
Path modsDirPath = Paths.get(modsDir);
Path targetPath = modsDirPath.resolve(sanitizedFileName);
Files.createDirectories(modsDirPath);
Files.move(tempPath, targetPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING);
mod.setUrl("/files/miarmacraft/mods/" + sanitizedFileName);
modService.create(mod)
.onSuccess(result -> JsonUtil.sendJson(ctx, ApiStatus.CREATED, result))
.onFailure(err -> {
Constants.LOGGER.error(err.getMessage());
JsonUtil.sendJson(ctx, ApiStatus.INTERNAL_SERVER_ERROR, null, err.getMessage());
});
} catch (Exception e) {
Constants.LOGGER.error("Error al procesar la petición de creación de mod: {}", e.getMessage(), e);
JsonUtil.sendJson(ctx, ApiStatus.BAD_REQUEST, null, "Error procesando la petición: " + e.getMessage());
}
}
public void update(RoutingContext ctx) {
ModEntity mod = Constants.GSON.fromJson(ctx.body().asString(), ModEntity.class);
modService.update(mod)
.onSuccess(_ -> JsonUtil.sendJson(ctx, ApiStatus.NO_CONTENT, null))
.onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage()));
}
public void delete(RoutingContext ctx) {
Integer modId = Integer.parseInt(ctx.pathParam("mod_id"));
modService.getById(modId).onSuccess(mod -> {
String modsDir = ConfigManager.getInstance().getModsDir();
String filename = Paths.get(mod.getUrl()).getFileName().toString();
Path fullPath = Paths.get(modsDir, filename);
ctx.vertx().fileSystem().delete(fullPath.toString(), fileRes -> {
if (fileRes.failed()) {
Constants.LOGGER.warn("No se pudo eliminar el archivo del mod: {}", fullPath, fileRes.cause());
}
modService.delete(modId)
.onSuccess(_ -> JsonUtil.sendJson(ctx, ApiStatus.NO_CONTENT, null))
.onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage()));
});
}).onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage()));
}
}

View File

@@ -0,0 +1,5 @@
package net.miarma.api.microservices.miarmacraft.handlers;
public class ModLogicHandler {
}

View File

@@ -0,0 +1,51 @@
package net.miarma.api.microservices.miarmacraft.handlers;
import io.vertx.ext.web.RoutingContext;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.http.ApiStatus;
import net.miarma.api.microservices.miarmacraft.entities.PlayerEntity;
import net.miarma.api.microservices.miarmacraft.services.PlayerService;
import net.miarma.api.backlib.util.JsonUtil;
public class PlayerDataHandler {
private final PlayerService playerService;
public PlayerDataHandler(Pool pool) {
this.playerService = new PlayerService(pool);
}
public void getAll(RoutingContext ctx) {
playerService.getAll()
.onSuccess(players -> JsonUtil.sendJson(ctx, ApiStatus.OK, players))
.onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage()));
}
public void getById(RoutingContext ctx) {
Integer playerId = Integer.parseInt(ctx.pathParam("player_id"));
playerService.getById(playerId)
.onSuccess(player -> JsonUtil.sendJson(ctx, ApiStatus.OK, player))
.onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage()));
}
public void create(RoutingContext ctx) {
PlayerEntity player = Constants.GSON.fromJson(ctx.body().asString(), PlayerEntity.class);
playerService.create(player)
.onSuccess(result -> JsonUtil.sendJson(ctx, ApiStatus.CREATED, result))
.onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage()));
}
public void update(RoutingContext ctx) {
PlayerEntity player = Constants.GSON.fromJson(ctx.body().asString(), PlayerEntity.class);
playerService.update(player)
.onSuccess(_ -> JsonUtil.sendJson(ctx, ApiStatus.NO_CONTENT, null))
.onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage()));
}
public void delete(RoutingContext ctx) {
Integer playerId = Integer.parseInt(ctx.pathParam("player_id"));
playerService.delete(playerId)
.onSuccess(_ -> JsonUtil.sendJson(ctx, ApiStatus.NO_CONTENT, null))
.onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage()));
}
}

View File

@@ -0,0 +1,116 @@
package net.miarma.api.microservices.miarmacraft.handlers;
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.RoutingContext;
import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.http.ApiStatus;
import net.miarma.api.backlib.util.EventBusUtil;
import net.miarma.api.backlib.util.JsonUtil;
public class PlayerLogicHandler {
private final Vertx vertx;
public PlayerLogicHandler(Vertx vertx) {
this.vertx = vertx;
}
public void login(RoutingContext ctx) {
JsonObject body = ctx.body().asJsonObject();
JsonObject request = new JsonObject()
.put("action", "login")
.put("email", body.getString("email", null))
.put("userName", body.getString("userName", null))
.put("password", body.getString("password"))
.put("keepLoggedIn", body.getBoolean("keepLoggedIn", false));
vertx.eventBus().request(Constants.MMC_EVENT_BUS, request, ar -> {
if (ar.succeeded()) {
JsonObject result = (JsonObject) ar.result().body();
result.put("tokenTime", System.currentTimeMillis());
JsonUtil.sendJson(ctx, ApiStatus.OK, result);
} else {
EventBusUtil.handleReplyError(ctx, ar.cause(), "The player is inactive or banned");
}
});
}
public void getStatus(RoutingContext ctx) {
Integer playerId = Integer.parseInt(ctx.request().getParam("player_id"));
JsonObject request = new JsonObject().put("action", "getStatus").put("playerId", playerId);
vertx.eventBus().request(Constants.MMC_EVENT_BUS, request, ar -> {
if (ar.succeeded()) JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body());
else EventBusUtil.handleReplyError(ctx, ar.cause(), "Player not found");
});
}
public void updateStatus(RoutingContext ctx) {
Integer playerId = Integer.parseInt(ctx.request().getParam("player_id"));
JsonObject body = ctx.body().asJsonObject();
JsonObject request = new JsonObject().put("action", "updateStatus").put("playerId", playerId)
.put("status", body.getString("status"));
vertx.eventBus().request(Constants.MMC_EVENT_BUS, request, ar -> {
if (ar.succeeded()) JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body());
else EventBusUtil.handleReplyError(ctx, ar.cause(), "Player not found");
});
}
public void getRole(RoutingContext ctx) {
Integer playerId = Integer.parseInt(ctx.request().getParam("player_id"));
JsonObject request = new JsonObject().put("action", "getRole").put("playerId", playerId);
vertx.eventBus().request(Constants.MMC_EVENT_BUS, request, ar -> {
if (ar.succeeded()) JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body());
else EventBusUtil.handleReplyError(ctx, ar.cause(), "Player not found");
});
}
public void updateRole(RoutingContext ctx) {
Integer playerId = Integer.parseInt(ctx.request().getParam("player_id"));
JsonObject body = ctx.body().asJsonObject();
JsonObject request = new JsonObject().put("action", "updateRole").put("playerId", playerId)
.put("role", body.getString("role"));
vertx.eventBus().request(Constants.MMC_EVENT_BUS, request, ar -> {
if (ar.succeeded()) JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body());
else EventBusUtil.handleReplyError(ctx, ar.cause(), "Player not found");
});
}
public void getAvatar(RoutingContext ctx) {
Integer playerId = Integer.parseInt(ctx.request().getParam("player_id"));
JsonObject request = new JsonObject().put("action", "getAvatar").put("playerId", playerId);
vertx.eventBus().request(Constants.MMC_EVENT_BUS, request, ar -> {
if (ar.succeeded()) JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body());
else EventBusUtil.handleReplyError(ctx, ar.cause(), "Player not found");
});
}
public void updateAvatar(RoutingContext ctx) {
Integer playerId = Integer.parseInt(ctx.request().getParam("player_id"));
JsonObject body = ctx.body().asJsonObject();
JsonObject request = new JsonObject().put("action", "updateAvatar").put("playerId", playerId)
.put("avatar", body.getString("avatar"));
vertx.eventBus().request(Constants.MMC_EVENT_BUS, request, ar -> {
if (ar.succeeded()) JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body());
else EventBusUtil.handleReplyError(ctx, ar.cause(), "Player not found");
});
}
public void getInfo(RoutingContext ctx) {
String token = ctx.request().getHeader("Authorization").substring("Bearer ".length());
JsonObject request = new JsonObject().put("action", "getInfo").put("token", token);
vertx.eventBus().request(Constants.MMC_EVENT_BUS, request, ar -> {
if (ar.succeeded()) JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body());
else EventBusUtil.handleReplyError(ctx, ar.cause(), "Player not found");
});
}
public void playerExists(RoutingContext ctx) {
Integer playerId = Integer.parseInt(ctx.request().getParam("player_id"));
JsonObject request = new JsonObject().put("action", "playerExists").put("playerId", playerId);
vertx.eventBus().request(Constants.MMC_EVENT_BUS, request, ar -> {
if (ar.succeeded()) JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body());
else EventBusUtil.handleReplyError(ctx, ar.cause(), "Player not found");
});
}
}

View File

@@ -0,0 +1,34 @@
package net.miarma.api.microservices.miarmacraft.routing;
import io.vertx.core.Vertx;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.Constants.MMCUserRole;
import net.miarma.api.microservices.miarmacraft.handlers.ModDataHandler;
import net.miarma.api.microservices.miarmacraft.handlers.PlayerDataHandler;
import net.miarma.api.microservices.miarmacraft.routing.middlewares.MMCAuthGuard;
import net.miarma.api.microservices.miarmacraft.services.PlayerService;
public class MMCDataRouter {
public static void mount(Router router, Vertx vertx, Pool pool) {
ModDataHandler hModData = new ModDataHandler(pool);
PlayerDataHandler hPlayerData = new PlayerDataHandler(pool);
PlayerService playerService = new PlayerService(pool);
MMCAuthGuard authGuard = new MMCAuthGuard(playerService);
router.route().handler(BodyHandler.create());
router.get(MMCEndpoints.MODS).handler(authGuard.check()).handler(hModData::getAll);
router.get(MMCEndpoints.MOD).handler(authGuard.check()).handler(hModData::getById);
router.post(MMCEndpoints.MODS).handler(BodyHandler.create().setBodyLimit(100 * 1024 * 1024)).handler(authGuard.check()).handler(hModData::create);
router.put(MMCEndpoints.MOD).handler(authGuard.check(MMCUserRole.ADMIN)).handler(hModData::update);
router.delete(MMCEndpoints.MOD).handler(authGuard.check(MMCUserRole.ADMIN)).handler(hModData::delete);
router.get(MMCEndpoints.PLAYERS).handler(authGuard.check(MMCUserRole.ADMIN)).handler(hPlayerData::getAll);
router.post(MMCEndpoints.PLAYERS).handler(authGuard.check(MMCUserRole.ADMIN)).handler(hPlayerData::create);
router.put(MMCEndpoints.PLAYER).handler(authGuard.check(MMCUserRole.ADMIN)).handler(hPlayerData::update);
router.delete(MMCEndpoints.PLAYER).handler(authGuard.check(MMCUserRole.ADMIN)).handler(hPlayerData::delete);
router.get(MMCEndpoints.PLAYER).handler(authGuard.check(MMCUserRole.ADMIN)).handler(hPlayerData::getById);
}
}

View File

@@ -0,0 +1,19 @@
package net.miarma.api.microservices.miarmacraft.routing;
import net.miarma.api.backlib.Constants;
public class MMCEndpoints {
public static final String LOGIN = Constants.MMC_PREFIX + "/login"; // POST
public static final String MODS = Constants.MMC_PREFIX + "/mods"; // GET, POST, PUT, DELETE
public static final String MOD = Constants.MMC_PREFIX + "/mods/:mod_id"; // GET, PUT, DELETE
public static final String MOD_STATUS = Constants.MMC_PREFIX + "/mods/:mod_id/status"; // GET, PUT
public static final String PLAYERS = Constants.MMC_PREFIX + "/players"; // GET, POST, PUT, DELETE
public static final String PLAYER = Constants.MMC_PREFIX + "/players/:player_id"; // GET, PUT, DELETE
public static final String PLAYER_STATUS = Constants.MMC_PREFIX + "/players/:player_id/status"; // GET, PUT
public static final String PLAYER_ROLE = Constants.MMC_PREFIX + "/players/:player_id/role"; // GET, PUT
public static final String PLAYER_EXISTS = Constants.MMC_PREFIX + "/players/:player_id/exists"; // GET
public static final String PLAYER_AVATAR = Constants.MMC_PREFIX + "/players/:player_id/avatar"; // GET, PUT
public static final String PLAYER_INFO = Constants.MMC_PREFIX + "/players/me"; // GET
}

View File

@@ -0,0 +1,29 @@
package net.miarma.api.microservices.miarmacraft.routing;
import io.vertx.core.Vertx;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool;
import net.miarma.api.microservices.miarmacraft.handlers.PlayerLogicHandler;
import net.miarma.api.microservices.miarmacraft.routing.middlewares.MMCAuthGuard;
import net.miarma.api.microservices.miarmacraft.services.PlayerService;
public class MMCLogicRouter {
public static void mount(Router router, Vertx vertx, Pool pool) {
PlayerLogicHandler hPlayerLogic = new PlayerLogicHandler(vertx);
PlayerService playerService = new PlayerService(pool);
MMCAuthGuard authGuard = new MMCAuthGuard(playerService);
router.route().handler(BodyHandler.create());
router.post(MMCEndpoints.LOGIN).handler(hPlayerLogic::login);
router.get(MMCEndpoints.PLAYER_STATUS).handler(authGuard.check()).handler(hPlayerLogic::getStatus);
router.put(MMCEndpoints.PLAYER_STATUS).handler(authGuard.check()).handler(hPlayerLogic::updateStatus);
router.get(MMCEndpoints.PLAYER_ROLE).handler(authGuard.check()).handler(hPlayerLogic::getRole);
router.put(MMCEndpoints.PLAYER_ROLE).handler(authGuard.check()).handler(hPlayerLogic::updateRole);
router.get(MMCEndpoints.PLAYER_AVATAR).handler(authGuard.check()).handler(hPlayerLogic::getAvatar);
router.put(MMCEndpoints.PLAYER_AVATAR).handler(authGuard.check()).handler(hPlayerLogic::updateAvatar);
router.get(MMCEndpoints.PLAYER_INFO).handler(authGuard.check()).handler(hPlayerLogic::getInfo);
router.get(MMCEndpoints.PLAYER_EXISTS).handler(authGuard.check()).handler(hPlayerLogic::playerExists);
}
}

View File

@@ -0,0 +1,37 @@
package net.miarma.api.microservices.miarmacraft.routing.middlewares;
import java.util.function.Consumer;
import io.vertx.ext.web.RoutingContext;
import net.miarma.api.backlib.Constants.MMCUserRole;
import net.miarma.api.backlib.middlewares.AbstractAuthGuard;
import net.miarma.api.microservices.miarmacraft.entities.PlayerEntity;
import net.miarma.api.microservices.miarmacraft.services.PlayerService;
public class MMCAuthGuard extends AbstractAuthGuard<PlayerEntity, MMCUserRole> {
private final PlayerService playerService;
public MMCAuthGuard(PlayerService playerService) {
this.playerService = playerService;
}
@Override
protected MMCUserRole parseRole(String roleStr) {
return MMCUserRole.valueOf(roleStr.toUpperCase());
}
@Override
protected void getUserEntity(int userId, RoutingContext ctx, Consumer<PlayerEntity> callback) {
playerService.getById(userId).onComplete(ar -> {
if (ar.succeeded()) callback.accept(ar.result());
else callback.accept(null);
});
}
@Override
protected boolean hasPermission(PlayerEntity user, MMCUserRole role) {
return user.getRole() == MMCUserRole.ADMIN;
}
}

View File

@@ -0,0 +1,84 @@
package net.miarma.api.microservices.miarmacraft.services;
import com.eduardomcb.discord.webhook.WebhookClient;
import com.eduardomcb.discord.webhook.WebhookManager;
import com.eduardomcb.discord.webhook.models.Message;
import io.vertx.core.Future;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.exceptions.NotFoundException;
import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.microservices.miarmacraft.dao.ModDAO;
import net.miarma.api.microservices.miarmacraft.entities.ModEntity;
import java.util.List;
public class ModService {
private final ModDAO modDAO;
private final ConfigManager configManager = ConfigManager.getInstance();
public ModService(Pool pool) {
this.modDAO = new ModDAO(pool);
}
private void sendWebhookMessage(Message message) {
WebhookManager webhookManager = new WebhookManager()
.setChannelUrl(configManager.getStringProperty("discord.webhook"))
.setMessage(message);
webhookManager.setListener(new WebhookClient.Callback() {
@Override
public void onSuccess(String response) {
Constants.LOGGER.info("Webhook sent successfully");
}
@Override
public void onFailure(int statusCode, String errorMessage) {
Constants.LOGGER.error("Failed to send webhook: {}", errorMessage);
}
});
webhookManager.exec();
}
public Future<List<ModEntity>> getAll() {
return modDAO.getAll();
}
public Future<List<ModEntity>> getAll(QueryParams params) {
return modDAO.getAll(params);
}
public Future<ModEntity> getById(Integer id) {
return modDAO.getById(id).compose(mod -> {
if (mod == null) {
return Future.failedFuture(new NotFoundException("Mod with id " + id));
}
return Future.succeededFuture(mod);
});
}
public Future<ModEntity> update(ModEntity mod) {
return modDAO.update(mod);
}
public Future<ModEntity> create(ModEntity mod) {
return modDAO.insert(mod).compose(createdMod -> {
Message message = new Message()
.setContent("Se ha añadido el mod **" + createdMod.getName() + "** a la lista @everyone");
sendWebhookMessage(message);
return Future.succeededFuture(createdMod);
});
}
public Future<Boolean> delete(Integer id) {
return getById(id).compose(mod -> {
if (mod == null) {
return Future.failedFuture(new NotFoundException("Mod with id " + id));
}
Message message = new Message()
.setContent("Se ha eliminado el mod **" + mod.getName() + "** de la lista @everyone");
sendWebhookMessage(message);
return modDAO.delete(id);
});
}
}

View File

@@ -0,0 +1,199 @@
package net.miarma.api.microservices.miarmacraft.services;
import io.vertx.core.Future;
import io.vertx.core.json.JsonObject;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.Constants.MMCUserRole;
import net.miarma.api.backlib.Constants.MMCUserStatus;
import net.miarma.api.backlib.exceptions.AlreadyExistsException;
import net.miarma.api.backlib.exceptions.BadRequestException;
import net.miarma.api.backlib.exceptions.ForbiddenException;
import net.miarma.api.backlib.exceptions.NotFoundException;
import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.backlib.security.JWTManager;
import net.miarma.api.backlib.security.PasswordHasher;
import net.miarma.api.backlib.core.dao.UserDAO;
import net.miarma.api.backlib.core.entities.UserEntity;
import net.miarma.api.backlib.core.services.UserService;
import net.miarma.api.microservices.miarmacraft.dao.PlayerDAO;
import net.miarma.api.microservices.miarmacraft.dao.UserMetadataDAO;
import net.miarma.api.microservices.miarmacraft.entities.PlayerEntity;
import net.miarma.api.microservices.miarmacraft.entities.UserMetadataEntity;
import java.util.List;
public class PlayerService {
private final UserDAO userDAO;
private final PlayerDAO playerDAO;
private final UserMetadataDAO userMetadataDAO;
private final UserService userService;
public PlayerService(Pool pool) {
this.userDAO = new UserDAO(pool);
this.playerDAO = new PlayerDAO(pool);
this.userMetadataDAO = new UserMetadataDAO(pool);
this.userService = new UserService(pool);
}
public Future<JsonObject> login(String emailOrUserName, String password, boolean keepLoggedIn) {
return userService.login(emailOrUserName, password, keepLoggedIn).compose(json -> {
JsonObject loggedUserJson = json.getJsonObject("loggedUser");
UserEntity user = Constants.GSON.fromJson(loggedUserJson.encode(), UserEntity.class);
if (user == null) {
return Future.failedFuture(new BadRequestException("Invalid credentials"));
}
if (user.getGlobal_status() != Constants.CoreUserGlobalStatus.ACTIVE) {
return Future.failedFuture(new ForbiddenException("User is not active"));
}
return userMetadataDAO.getById(user.getUser_id()).compose(metadata -> {
if (metadata == null) {
return Future.failedFuture(new NotFoundException("User metadata not found"));
}
if (metadata.getStatus() != MMCUserStatus.ACTIVE) {
return Future.failedFuture(new ForbiddenException("User is not active"));
}
PlayerEntity player = new PlayerEntity(user, metadata);
return Future.succeededFuture(new JsonObject()
.put("token", json.getString("token"))
.put("loggedUser", new JsonObject(Constants.GSON.toJson(player)))
);
});
});
}
public Future<List<PlayerEntity>> getAll() {
return playerDAO.getAll();
}
public Future<List<PlayerEntity>> getAll(QueryParams queryParams) {
return playerDAO.getAll(queryParams);
}
public Future<PlayerEntity> getById(Integer id) {
return playerDAO.getById(id).compose(player -> {
if (player == null) {
return Future.failedFuture(new NotFoundException("Player not found"));
}
return Future.succeededFuture(player);
});
}
public Future<MMCUserStatus> getStatus(Integer id) {
return getById(id).compose(player -> {
if (player == null) {
return Future.failedFuture(new NotFoundException("Player not found"));
}
return Future.succeededFuture(player.getStatus());
});
}
public Future<MMCUserRole> getRole(Integer id) {
return getById(id).compose(player -> {
if (player == null) {
return Future.failedFuture(new NotFoundException("Player not found"));
}
return Future.succeededFuture(player.getRole());
});
}
public Future<String> getAvatar(Integer id) {
return getById(id).compose(player -> {
if (player == null) {
return Future.failedFuture(new NotFoundException("Player not found"));
}
return Future.succeededFuture(player.getAvatar());
});
}
public Future<PlayerEntity> updateStatus(Integer id, MMCUserStatus status) {
PlayerEntity player = new PlayerEntity();
player.setUser_id(id);
player.setStatus(status);
return update(player);
}
public Future<PlayerEntity> updateRole(Integer id, MMCUserRole role) {
PlayerEntity player = new PlayerEntity();
player.setUser_id(id);
player.setRole(role);
return update(player);
}
public Future<PlayerEntity> updateAvatar(Integer id, String avatar) {
PlayerEntity player = new PlayerEntity();
player.setUser_id(id);
player.setAvatar(avatar);
return update(player);
}
public Future<PlayerEntity> create(PlayerEntity player) {
return getById(player.getUser_id()).compose(existingPlayer -> {
if (existingPlayer != null) {
return Future.failedFuture(new AlreadyExistsException("Player already exists"));
}
player.setPassword(PasswordHasher.hash(player.getPassword()));
return userDAO.insert(UserEntity.from(player)).compose(user -> {
UserMetadataEntity metadata = UserMetadataEntity.fromPlayerEntity(player);
metadata.setUser_id(user.getUser_id());
return userMetadataDAO.insert(metadata).map(_ -> player);
});
});
}
public Future<PlayerEntity> update(PlayerEntity player) {
return getById(player.getUser_id()).compose(existingPlayer -> {
if (existingPlayer == null) {
return Future.failedFuture(new NotFoundException("Player does not exist"));
}
return userDAO.update(UserEntity.from(player)).compose(user -> {
UserMetadataEntity userMetadata = UserMetadataEntity.fromPlayerEntity(player);
return userMetadataDAO.update(userMetadata).map(_ -> player);
});
});
}
public Future<PlayerEntity> delete(Integer id) {
return getById(id).compose(existingPlayer -> {
if (existingPlayer == null) {
return Future.failedFuture(new NotFoundException("Player does not exist"));
}
return userDAO.delete(id).compose(_ -> userMetadataDAO.delete(id).map(_ -> existingPlayer));
});
}
public Future<Boolean> playerExists(Integer id) {
return playerDAO.exists(id).compose(exists -> {
if (!exists) {
return Future.failedFuture(new NotFoundException("Player does not exist"));
}
return Future.succeededFuture(true);
});
}
public Future<PlayerEntity> getInfo(String token) {
Integer userId = JWTManager.getInstance().getUserId(token);
return getById(userId).compose(player -> {
if (player == null) {
return Future.failedFuture(new NotFoundException("Player not found"));
}
return Future.succeededFuture(player);
});
}
}

View File

@@ -0,0 +1,106 @@
package net.miarma.api.microservices.miarmacraft.verticles;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.Constants.MMCUserRole;
import net.miarma.api.backlib.Constants.MMCUserStatus;
import net.miarma.api.backlib.db.DatabaseProvider;
import net.miarma.api.backlib.util.EventBusUtil;
import net.miarma.api.backlib.util.RouterUtil;
import net.miarma.api.microservices.miarmacraft.routing.MMCDataRouter;
import net.miarma.api.microservices.miarmacraft.services.PlayerService;
public class MMCDataVerticle extends AbstractVerticle {
private ConfigManager configManager;
private PlayerService playerService;
@Override
public void start(Promise<Void> startPromise) {
configManager = ConfigManager.getInstance();
Pool pool = DatabaseProvider.createPool(vertx, configManager);
playerService = new PlayerService(pool);
Router router = Router.router(vertx);
RouterUtil.attachLogger(router);
MMCDataRouter.mount(router, vertx, pool);
registerLogicVerticleConsumer();
vertx.createHttpServer()
.requestHandler(router)
.listen(configManager.getIntProperty("mmc.data.port"), res -> {
if (res.succeeded()) startPromise.complete();
else startPromise.fail(res.cause());
});
}
private void registerLogicVerticleConsumer() {
vertx.eventBus().consumer(Constants.MMC_EVENT_BUS, message -> {
JsonObject body = (JsonObject) message.body();
String action = body.getString("action");
switch(action) {
case "login" -> {
String email = body.getString("email", null);
String userName = body.getString("userName", null);
String password = body.getString("password");
boolean keepLoggedIn = body.getBoolean("keepLoggedIn", false);
playerService.login(email != null ? email : userName, password, keepLoggedIn)
.onSuccess(message::reply)
.onFailure(EventBusUtil.fail(message));
}
case "getStatus" -> playerService.getStatus(body.getInteger("playerId"))
.onSuccess(player -> message.reply(new JsonObject(Constants.GSON.toJson(player))))
.onFailure(EventBusUtil.fail(message));
case "getRole" -> playerService.getRole(body.getInteger("playerId"))
.onSuccess(role -> message.reply(new JsonObject(Constants.GSON.toJson(role))))
.onFailure(EventBusUtil.fail(message));
case "getAvatar" -> playerService.getAvatar(body.getInteger("playerId"))
.onSuccess(avatar -> message.reply(new JsonObject(Constants.GSON.toJson(avatar))))
.onFailure(EventBusUtil.fail(message));
case "updateStatus" -> {
MMCUserStatus status = MMCUserStatus.fromInt(body.getInteger("status"));
playerService.updateStatus(body.getInteger("playerId"), status)
.onSuccess(result -> message.reply(new JsonObject(Constants.GSON.toJson(result))))
.onFailure(EventBusUtil.fail(message));
}
case "updateRole" -> {
MMCUserRole role = MMCUserRole.fromInt(body.getInteger("role"));
playerService.updateRole(body.getInteger("playerId"), role)
.onSuccess(result -> message.reply(new JsonObject(Constants.GSON.toJson(result))))
.onFailure(EventBusUtil.fail(message));
}
case "updateAvatar" -> {
String avatar = body.getString("avatar");
playerService.updateAvatar(body.getInteger("playerId"), avatar)
.onSuccess(result -> message.reply(new JsonObject(Constants.GSON.toJson(result))))
.onFailure(EventBusUtil.fail(message));
}
case "playerExists" -> playerService.playerExists(body.getInteger("playerId"))
.onSuccess(exists -> message.reply(new JsonObject(Constants.GSON.toJson(exists))))
.onFailure(EventBusUtil.fail(message));
case "getInfo" -> playerService.getInfo(body.getString("token"))
.onSuccess(player -> message.reply(new JsonObject(Constants.GSON.toJson(player))))
.onFailure(EventBusUtil.fail(message));
default -> EventBusUtil.fail(message).handle(new IllegalArgumentException("Unknown action: " + action));
}
});
}
}

View File

@@ -0,0 +1,31 @@
package net.miarma.api.microservices.miarmacraft.verticles;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.db.DatabaseProvider;
import net.miarma.api.backlib.util.RouterUtil;
import net.miarma.api.microservices.miarmacraft.routing.MMCLogicRouter;
public class MMCLogicVerticle extends AbstractVerticle {
private ConfigManager configManager;
@Override
public void start(Promise<Void> startPromise) {
configManager = ConfigManager.getInstance();
Pool pool = DatabaseProvider.createPool(vertx, configManager);
Router router = Router.router(vertx);
RouterUtil.attachLogger(router);
MMCLogicRouter.mount(router, vertx, pool);
vertx.createHttpServer()
.requestHandler(router)
.listen(configManager.getIntProperty("mmc.logic.port"), res -> {
if (res.succeeded()) startPromise.complete();
else startPromise.fail(res.cause());
});
}
}

View File

@@ -0,0 +1,57 @@
package net.miarma.api.microservices.miarmacraft.verticles;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.LogAccumulator;
import net.miarma.api.backlib.util.DeploymentUtil;
public class MMCMainVerticle extends AbstractVerticle {
private ConfigManager configManager;
@Override
public void start(Promise<Void> startPromise) {
try {
this.configManager = ConfigManager.getInstance();
deployVerticles();
startPromise.complete();
} catch (Exception e) {
Constants.LOGGER.error(DeploymentUtil.failMessage(MMCMainVerticle.class, e));
startPromise.fail(e);
}
}
private void deployVerticles() {
vertx.deployVerticle(new MMCDataVerticle(), result -> {
if (result.succeeded()) {
String message = String.join("\n\r ",
DeploymentUtil.successMessage(MMCDataVerticle.class),
DeploymentUtil.apiUrlMessage(
configManager.getHost(),
configManager.getIntProperty("mmc.data.port")
)
);
LogAccumulator.add(message);
} else {
LogAccumulator.add(DeploymentUtil.failMessage(MMCDataVerticle.class, result.cause()));
}
});
vertx.deployVerticle(new MMCLogicVerticle(), result -> {
if (result.succeeded()) {
String message = String.join("\n\r ",
DeploymentUtil.successMessage(MMCLogicVerticle.class),
DeploymentUtil.apiUrlMessage(
configManager.getHost(),
configManager.getIntProperty("mmc.logic.port")
)
);
LogAccumulator.add(message);
} else {
LogAccumulator.add(DeploymentUtil.failMessage(MMCLogicVerticle.class, result.cause()));
}
});
}
}