bump: backlib and all microservices to v2.0, add: decoupled auth from identity using new Credential Entity model, still ongoing changes...

This commit is contained in:
Jose
2025-12-21 06:03:45 +01:00
parent 18c2f0f00b
commit 5136a67fba
105 changed files with 1506 additions and 1405 deletions

View File

@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>net.miarma.api</groupId> <groupId>net.miarma.api</groupId>
<artifactId>backlib</artifactId> <artifactId>backlib</artifactId>
<version>1.2.1</version> <version>2.0.0</version>
<properties> <properties>
<maven.compiler.source>23</maven.compiler.source> <maven.compiler.source>23</maven.compiler.source>
@@ -24,11 +24,11 @@
<distributionManagement> <distributionManagement>
<repository> <repository>
<id>gitea</id> <id>MiarmaGit</id>
<url>https://git.miarma.net/api/packages/Gallardo7761/maven</url> <url>https://git.miarma.net/api/packages/Gallardo7761/maven</url>
</repository> </repository>
<snapshotRepository> <snapshotRepository>
<id>gitea</id> <id>MiarmaGit</id>
<url>https://git.miarma.net/api/packages/Gallardo7761/maven</url> <url>https://git.miarma.net/api/packages/Gallardo7761/maven</url>
</snapshotRepository> </snapshotRepository>
</distributionManagement> </distributionManagement>

View File

@@ -1,469 +0,0 @@
package net.miarma.api.backlib;
import java.time.LocalDateTime;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import io.vertx.core.json.JsonObject;
import net.miarma.api.backlib.gson.APIDontReturnExclusionStrategy;
import net.miarma.api.backlib.gson.JsonObjectTypeAdapter;
import net.miarma.api.backlib.gson.LocalDateTimeAdapter;
import net.miarma.api.backlib.gson.ValuableEnumDeserializer;
import net.miarma.api.backlib.gson.ValuableEnumTypeAdapter;
import net.miarma.api.backlib.interfaces.IUserRole;
/**
* Clase que contiene constantes y enumeraciones utilizadas en la API de MiarmaCore.
* @author José Manuel Amador Gallardo
*/
public class Constants {
public static final String APP_NAME = "MiarmaCoreAPI";
public static final String BASE_PREFIX = "/api";
public static final String CORE_PREFIX = BASE_PREFIX + "/core/v1"; // tabla de usuarios central
public static final String AUTH_PREFIX = "/auth/v1";
public static final String HUERTOS_PREFIX = BASE_PREFIX + "/huertos/v1";
public static final String MMC_PREFIX = BASE_PREFIX + "/mmc/v1";
public static final String CINE_PREFIX = BASE_PREFIX + "/cine/v1";
public static final String MPASTE_PREFIX = BASE_PREFIX + "/mpaste/v1";
public static final String AUTH_EVENT_BUS = "auth.eventbus";
public static final String CORE_EVENT_BUS = "core.eventbus";
public static final String HUERTOS_EVENT_BUS = "huertos.eventbus";
public static final String MMC_EVENT_BUS = "mmc.eventbus";
public static final String CINE_EVENT_BUS = "cine.eventbus";
public static final String MPASTE_EVENT_BUS = "mpaste.eventbus";
public static final List<String> HUERTOS_ALLOWED_FOLDERS =
List.of("INBOX", "Drafts", "Sent", "Spam", "Trash");
public static final Logger LOGGER = LoggerFactory.getLogger(Constants.APP_NAME);
public static final Gson GSON = new GsonBuilder()
.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeAdapter())
.registerTypeAdapter(JsonObject.class, new JsonObjectTypeAdapter())
.registerTypeHierarchyAdapter(ValuableEnum.class, new ValuableEnumTypeAdapter())
.registerTypeAdapter(CoreUserGlobalStatus.class, new ValuableEnumDeserializer())
.registerTypeAdapter(CoreUserRole.class, new ValuableEnumDeserializer())
.registerTypeAdapter(HuertosUserType.class, new ValuableEnumDeserializer())
.registerTypeAdapter(HuertosUserStatus.class, new ValuableEnumDeserializer())
.registerTypeAdapter(HuertosUserRole.class, new ValuableEnumDeserializer())
.registerTypeAdapter(HuertosRequestStatus.class, new ValuableEnumDeserializer())
.registerTypeAdapter(HuertosRequestType.class, new ValuableEnumDeserializer())
.registerTypeAdapter(HuertosPaymentType.class, new ValuableEnumDeserializer())
.registerTypeAdapter(HuertosPaymentFrequency.class, new ValuableEnumDeserializer())
.registerTypeAdapter(HuertosAnnouncePriority.class, new ValuableEnumDeserializer())
.registerTypeAdapter(MMCUserStatus.class, new ValuableEnumDeserializer())
.registerTypeAdapter(MMCUserRole.class, new ValuableEnumDeserializer())
.registerTypeAdapter(CoreFileContext.class, new ValuableEnumDeserializer())
.registerTypeAdapter(MMCModStatus.class, new ValuableEnumDeserializer())
.registerTypeAdapter(CineUserRole.class, new ValuableEnumDeserializer())
.registerTypeAdapter(CineUserStatus.class, new ValuableEnumDeserializer())
.addSerializationExclusionStrategy(new APIDontReturnExclusionStrategy())
.create();
public enum CoreUserRole implements IUserRole {
USER(0),
ADMIN(1);
private final int value;
CoreUserRole(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static CoreUserRole fromInt(int i) {
for (CoreUserRole role : values()) {
if (role.value == i) return role;
}
throw new IllegalArgumentException("Invalid CoreUserRole value: " + i);
}
}
public enum CoreUserGlobalStatus implements ValuableEnum {
INACTIVE(0),
ACTIVE(1);
private final int value;
CoreUserGlobalStatus(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static CoreUserGlobalStatus fromInt(int i) {
for (CoreUserGlobalStatus status : values()) {
if (status.value == i) return status;
}
throw new IllegalArgumentException("Invalid CoreUserGlobalStatus value: " + i);
}
}
public enum CoreFileContext implements ValuableEnum {
CORE(0),
HUERTOS(1),
MMC(2),
CINE(3);
private final int value;
CoreFileContext(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public String toCtxString() {
return switch(this) {
case CORE -> "core";
case HUERTOS -> "huertos";
case MMC -> "miarmacraft";
case CINE -> "cine";
};
}
public static CoreFileContext fromInt(int i) {
for (CoreFileContext context : values()) {
if (context.value == i) return context;
}
throw new IllegalArgumentException("Invalid CoreFileContext value: " + i);
}
}
public enum HuertosUserRole implements IUserRole {
USER(0),
ADMIN(1),
DEV(2);
private final int value;
HuertosUserRole(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosUserRole fromInt(int i) {
for (HuertosUserRole role : values()) {
if (role.value == i) return role;
}
throw new IllegalArgumentException("Invalid HuertosUserRole value: " + i);
}
}
public enum HuertosUserType implements ValuableEnum {
WAIT_LIST(0),
MEMBER(1),
WITH_GREENHOUSE(2),
COLLABORATOR(3),
DEVELOPER(5),
SUBSIDY(4);
private final int value;
HuertosUserType(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosUserType fromInt(int i) {
for (HuertosUserType type : values()) {
if (type.value == i) return type;
}
throw new IllegalArgumentException("Invalid HuertosUserType value: " + i);
}
}
public enum HuertosUserStatus implements ValuableEnum {
INACTIVE(0),
ACTIVE(1);
private final int value;
HuertosUserStatus(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosUserStatus fromInt(int i) {
for (HuertosUserStatus status : values()) {
if (status.value == i) return status;
}
throw new IllegalArgumentException("Invalid HuertosUserStatus value: " + i);
}
}
public enum HuertosRequestStatus implements ValuableEnum {
PENDING(0),
APPROVED(1),
REJECTED(2);
private final int value;
HuertosRequestStatus(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosRequestStatus fromInt(int i) {
for (HuertosRequestStatus status : values()) {
if (status.value == i) return status;
}
throw new IllegalArgumentException("Invalid HuertoRequestStatus value: " + i);
}
}
public enum HuertosPaymentType implements ValuableEnum {
BANK(0),
CASH(1);
private final int value;
HuertosPaymentType(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosPaymentType fromInt(int i) {
for (HuertosPaymentType type : values()) {
if (type.value == i) return type;
}
throw new IllegalArgumentException("Invalid HuertoPaymentType value: " + i);
}
}
public enum HuertosRequestType implements ValuableEnum {
REGISTER(0),
UNREGISTER(1),
ADD_COLLABORATOR(2),
REMOVE_COLLABORATOR(3),
ADD_GREENHOUSE(4),
REMOVE_GREENHOUSE(5);
private final int value;
HuertosRequestType(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosRequestType fromInt(int i) {
for (HuertosRequestType type : values()) {
if (type.value == i) return type;
}
throw new IllegalArgumentException("Invalid HuertoRequestType value: " + i);
}
}
public enum HuertosAnnouncePriority implements ValuableEnum {
LOW(0),
MEDIUM(1),
HIGH(2);
private final int value;
HuertosAnnouncePriority(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosAnnouncePriority fromInt(int i) {
for (HuertosAnnouncePriority priority : values()) {
if (priority.value == i) return priority;
}
throw new IllegalArgumentException("Invalid HuertoAnnouncePriority value: " + i);
}
}
public enum HuertosPaymentFrequency implements ValuableEnum {
BIYEARLY(0),
YEARLY(1);
private final int value;
HuertosPaymentFrequency(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosPaymentFrequency fromInt(int i) {
for (HuertosPaymentFrequency frequency : values()) {
if (frequency.value == i) return frequency;
}
throw new IllegalArgumentException("Invalid HuertoPaymentFrequency value: " + i);
}
}
public enum MMCUserRole implements IUserRole {
PLAYER(0),
ADMIN(1);
private final int value;
MMCUserRole(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static MMCUserRole fromInt(int i) {
for (MMCUserRole role : values()) {
if (role.value == i) return role;
}
throw new IllegalArgumentException("Invalid MMCUserRole value: " + i);
}
}
public enum MMCUserStatus implements ValuableEnum {
INACTIVE(0),
ACTIVE(1);
private final int value;
MMCUserStatus(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static MMCUserStatus fromInt(int i) {
for (MMCUserStatus status : values()) {
if (status.value == i) return status;
}
throw new IllegalArgumentException("Invalid MMCUserStatus value: " + i);
}
}
public enum MMCModStatus implements ValuableEnum {
ACTIVE(0),
INACTIVE(1);
private final int value;
MMCModStatus(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static MMCModStatus fromInt(int i) {
for (MMCModStatus status : values()) {
if (status.value == i) return status;
}
throw new IllegalArgumentException("Invalid MiarmacraftModStatus value: " + i);
}
}
public enum CineUserStatus implements ValuableEnum {
ACTIVE(1),
INACTIVE(0);
private final int value;
CineUserStatus(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static CineUserStatus fromInt(int i) {
for (CineUserStatus status : values()) {
if (status.value == i) return status;
}
throw new IllegalArgumentException("Invalid CineUserStatus value: " + i);
}
}
public enum CineUserRole implements IUserRole {
USER(0),
ADMIN(1);
private final int value;
CineUserRole(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static CineUserRole fromInt(int i) {
for (CineUserRole role : values()) {
if (role.value == i) return role;
}
throw new IllegalArgumentException("Invalid CineUserRole value: " + i);
}
}
// Private constructor to prevent instantiation
private Constants() {
throw new AssertionError("Utility class cannot be instantiated.");
}
}

View File

@@ -1,4 +1,4 @@
package net.miarma.api.backlib; package net.miarma.api.backlib.config;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@@ -8,6 +8,10 @@ import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Properties; import java.util.Properties;
import org.slf4j.Logger;
import net.miarma.api.backlib.log.LoggerProvider;
/** /**
* Gestión de toda la configuración de la aplicación. * Gestión de toda la configuración de la aplicación.
* Se encarga de cargar, guardar y proporcionar acceso a las propiedades de configuración. * Se encarga de cargar, guardar y proporcionar acceso a las propiedades de configuración.
@@ -19,14 +23,16 @@ import java.util.Properties;
*/ */
public class ConfigManager { public class ConfigManager {
private static ConfigManager instance; private static ConfigManager instance;
private final String appName;
private final File configFile; private final File configFile;
private final Properties config; private final Properties config;
private static final String CONFIG_FILE_NAME = "config.properties"; private static final String CONFIG_FILE_NAME = "config.properties";
private final Logger LOGGER = LoggerProvider.getLogger();
private ConfigManager() { private ConfigManager() {
String path = getBaseDir() + CONFIG_FILE_NAME; this.appName = System.getenv().getOrDefault("APP_NAME", "miarma-backend");
this.configFile = new File(path);
this.config = new Properties(); this.config = new Properties();
this.configFile = new File(getBaseDir() + CONFIG_FILE_NAME);
} }
public static synchronized ConfigManager getInstance() { public static synchronized ConfigManager getInstance() {
@@ -41,7 +47,7 @@ public class ConfigManager {
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8)) { InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8)) {
config.load(isr); config.load(isr);
} catch (IOException e) { } catch (IOException e) {
Constants.LOGGER.error("Error loading configuration file: ", e); LOGGER.error("Error loading configuration file: ", e);
} }
} }
public File getConfigFile() { public File getConfigFile() {
@@ -138,9 +144,9 @@ public class ConfigManager {
private void saveConfig() { private void saveConfig() {
try (FileOutputStream fos = new FileOutputStream(configFile)) { try (FileOutputStream fos = new FileOutputStream(configFile)) {
config.store(fos, "Configuration for: " + Constants.APP_NAME); config.store(fos, "Configuration for: " + this.appName);
} catch (IOException e) { } catch (IOException e) {
Constants.LOGGER.error("Error saving configuration file: ", e); LOGGER.error("Error saving configuration file: ", e);
} }
} }
} }

View File

@@ -1,4 +1,4 @@
package net.miarma.api.backlib; package net.miarma.api.backlib.config;
/** /**
* Enum que representa los diferentes tipos de sistemas operativos soportados * Enum que representa los diferentes tipos de sistemas operativos soportados

View File

@@ -1,83 +0,0 @@
package net.miarma.api.backlib.core.entities;
import io.vertx.sqlclient.Row;
import net.miarma.api.backlib.Constants.CoreFileContext;
import net.miarma.api.backlib.annotations.Table;
import net.miarma.api.backlib.db.AbstractEntity;
import java.time.LocalDateTime;
@Table("files")
public class FileEntity extends AbstractEntity {
private Integer file_id;
private String file_name;
private String file_path;
private String mime_type;
private Integer uploaded_by;
private CoreFileContext context;
private LocalDateTime uploaded_at;
public FileEntity() {
super();
}
public FileEntity(Row row) {
super(row);
}
public Integer getFile_id() {
return file_id;
}
public void setFile_id(Integer file_id) {
this.file_id = file_id;
}
public String getFile_name() {
return file_name;
}
public void setFile_name(String file_name) {
this.file_name = file_name;
}
public String getFile_path() {
return file_path;
}
public void setFile_path(String file_path) {
this.file_path = file_path;
}
public String getMime_type() {
return mime_type;
}
public void setMime_type(String mime_type) {
this.mime_type = mime_type;
}
public Integer getUploaded_by() {
return uploaded_by;
}
public void setUploaded_by(Integer uploaded_by) {
this.uploaded_by = uploaded_by;
}
public CoreFileContext getContext() {
return context;
}
public void setContext(CoreFileContext context) {
this.context = context;
}
public LocalDateTime getUploaded_at() {
return uploaded_at;
}
public void setUploaded_at(LocalDateTime uploaded_at) {
this.uploaded_at = uploaded_at;
}
}

View File

@@ -1,63 +0,0 @@
package net.miarma.api.backlib.core.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.annotations.APIDontReturn;
import net.miarma.api.backlib.annotations.Table;
import net.miarma.api.backlib.db.AbstractEntity;
import net.miarma.api.backlib.interfaces.IUser;
@Table("users")
public class UserEntity 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 CoreUserGlobalStatus global_status;
private CoreUserRole role;
private LocalDateTime created_at;
private LocalDateTime updated_at;
public UserEntity() { }
public UserEntity(Row row) { super(row); }
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 CoreUserGlobalStatus getGlobal_status() { return global_status; }
public void setGlobal_status(CoreUserGlobalStatus global_status) { this.global_status = global_status; }
public CoreUserRole getGlobal_role() { return role; }
public void setGlobal_role(CoreUserRole role) { this.role = 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; }
public static UserEntity from(IUser user) {
UserEntity entity = new UserEntity();
entity.setUser_id(user.getUser_id());
entity.setUser_name(user.getUser_name());
entity.setDisplay_name(user.getDisplay_name());
entity.setEmail(user.getEmail());
entity.setPassword(user.getPassword());
entity.setAvatar(user.getAvatar());
entity.setGlobal_status(user.getGlobal_status());
entity.setGlobal_role(user.getGlobal_role());
return entity;
}
}

View File

@@ -1,209 +0,0 @@
package net.miarma.api.backlib.core.services;
import java.util.List;
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.CoreUserGlobalStatus;
import net.miarma.api.backlib.Constants.CoreUserRole;
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.exceptions.UnauthorizedException;
import net.miarma.api.backlib.exceptions.ValidationException;
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.validators.UserValidator;
public class UserService {
private final UserDAO userDAO;
private final UserValidator userValidator;
public UserService(Pool pool) {
this.userDAO = new UserDAO(pool);
this.userValidator = new UserValidator();
}
/* AUTHENTICATION */
public Future<JsonObject> login(String emailOrUsername, String plainPassword, boolean keepLoggedIn) {
return getByEmail(emailOrUsername).compose(user -> {
if (user == null) {
return getByUserName(emailOrUsername).compose(user2 -> {
if (user2 == null) {
return Future.succeededFuture(null);
}
return Future.succeededFuture(user2);
});
}
return Future.succeededFuture(user);
}).compose(user -> {
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"));
}
if (!PasswordHasher.verify(plainPassword, user.getPassword())) {
return Future.failedFuture(new BadRequestException("Invalid credentials"));
}
JWTManager jwtManager = JWTManager.getInstance();
String token = jwtManager.generateToken(user.getUser_name(), user.getUser_id(), user.getGlobal_role(), keepLoggedIn);
JsonObject response = new JsonObject()
.put("token", token)
.put("loggedUser", new JsonObject(user.encode()));
return Future.succeededFuture(response);
});
}
public Future<JsonObject> loginValidate(Integer userId, String password) {
return getById(userId).compose(user -> {
if (user == null) {
return Future.failedFuture(new NotFoundException("User not found"));
}
if (!PasswordHasher.verify(password, user.getPassword())) {
return Future.failedFuture(new BadRequestException("Invalid credentials"));
}
JsonObject response = new JsonObject()
.put("valid", true);
return Future.succeededFuture(response);
});
}
public Future<UserEntity> register(UserEntity user) {
return getByEmail(user.getEmail()).compose(existing -> {
if (existing != null) {
return Future.failedFuture(new AlreadyExistsException("Email already exists"));
}
user.setPassword(PasswordHasher.hash(user.getPassword()));
user.setGlobal_role(CoreUserRole.USER);
user.setGlobal_status(CoreUserGlobalStatus.ACTIVE);
return userValidator.validate(user).compose(validation -> {
if (!validation.isValid()) {
return Future.failedFuture(new ValidationException(Constants.GSON.toJson(validation.getErrors())));
}
return userDAO.insert(user);
});
});
}
public Future<UserEntity> changePassword(int userId, String newPassword) {
return getById(userId).compose(user -> {
if (user == null) {
return Future.failedFuture(new NotFoundException("User not found"));
}
user.setPassword(PasswordHasher.hash(newPassword));
return userDAO.update(user);
});
}
public Future<Boolean> validateToken(String token) {
JWTManager jwtManager = JWTManager.getInstance();
return jwtManager.isValid(token) ?
Future.succeededFuture(true) :
Future.failedFuture(new UnauthorizedException("Invalid token"));
}
/* USERS OPERATIONS */
public Future<List<UserEntity>> getAll(QueryParams params) {
return userDAO.getAll(params);
}
public Future<UserEntity> getById(Integer id) {
return userDAO.getById(id).compose(user -> {
if (user == null) {
return Future.failedFuture(new NotFoundException("User not found in the database"));
}
return Future.succeededFuture(user);
});
}
public Future<UserEntity> getByEmail(String email) {
return userDAO.getByEmail(email);
}
public Future<UserEntity> getByUserName(String userName) {
return userDAO.getByUserName(userName);
}
public Future<UserEntity> updateRole(Integer userId, CoreUserRole role) {
return getById(userId).compose(user -> {
if (user == null) {
return Future.failedFuture(new NotFoundException("User not found in the database"));
}
user.setGlobal_role(role);
return userDAO.update(user);
});
}
public Future<UserEntity> updateStatus(Integer userId, CoreUserGlobalStatus status) {
return getById(userId).compose(user -> {
if (user == null) {
return Future.failedFuture(new NotFoundException("User not found in the database"));
}
user.setGlobal_status(status);
return userDAO.update(user);
});
}
/* CRUD OPERATIONS */
public Future<UserEntity> create(UserEntity user) {
return userValidator.validate(user).compose(validation -> {
if (!validation.isValid()) {
return Future.failedFuture(new ValidationException(Constants.GSON.toJson(validation.getErrors())));
}
return userDAO.insert(user);
});
}
public Future<UserEntity> update(UserEntity user) {
return userValidator.validate(user).compose(validation -> {
if (!validation.isValid()) {
return Future.failedFuture(new ValidationException(Constants.GSON.toJson(validation.getErrors())));
}
if (user.getPassword() == null || user.getPassword().isEmpty()) {
user.setPassword(null);
}
return userDAO.update(user);
});
}
public Future<UserEntity> upsert(UserEntity user) {
return userValidator.validate(user).compose(validation -> {
if (!validation.isValid()) {
return Future.failedFuture(new ValidationException(Constants.GSON.toJson(validation.getErrors())));
}
if (user.getPassword() != null && !user.getPassword().isEmpty()) {
user.setPassword(PasswordHasher.hash(user.getPassword()));
}
return userDAO.upsert(user, "user_id", "email", "user_name");
});
}
public Future<Boolean> delete(Integer id) {
return getById(id).compose(user -> {
if (user == null) {
return Future.failedFuture(new NotFoundException("User not found in the database"));
}
return userDAO.delete(id);
});
}
}

View File

@@ -1,84 +0,0 @@
package net.miarma.api.backlib.core.validators;
import io.vertx.core.Future;
import net.miarma.api.backlib.validation.ValidationResult;
import net.miarma.api.backlib.core.entities.FileEntity;
public class FileValidator {
public Future<ValidationResult> validate(FileEntity file, int size) {
ValidationResult result = new ValidationResult();
if (file == null) {
return Future.succeededFuture(result.addError("file", "El archivo no puede ser nulo"));
}
if (file.getFile_name() == null || file.getFile_name().isBlank()) {
result.addError("file_name", "El nombre del archivo es obligatorio");
}
if (file.getMime_type() == null || file.getMime_type().isBlank()) {
result.addError("mime_type", "El tipo MIME es obligatorio");
}
if (file.getContext() == null) {
result.addError("context", "El contexto del archivo es obligatorio");
}
if (file.getUploaded_by() == null || file.getUploaded_by() <= 0) {
result.addError("uploaded_by", "El ID del usuario que subió el archivo es obligatorio y debe ser válido");
}
if (size <= 0) {
result.addError("size", "El archivo debe pesar más de 0 bytes");
}
if (file.getFile_name() != null && file.getFile_name().length() > 255) {
result.addError("file_name", "El nombre del archivo es demasiado largo");
}
if (size > 10485760) { // 10 MB limit
result.addError("size", "El archivo no puede pesar más de 10 MB");
}
return Future.succeededFuture(result);
}
public Future<ValidationResult> validate(FileEntity file) {
ValidationResult result = new ValidationResult();
if (file == null) {
return Future.succeededFuture(result.addError("file", "File cannot be null"));
}
if (file.getFile_name() == null || file.getFile_name().isBlank()) {
result.addError("file_name", "File name is required");
}
if (file.getFile_path() == null || file.getFile_path().isBlank()) {
result.addError("file_path", "File path is required");
}
if (file.getMime_type() == null || file.getMime_type().isBlank()) {
result.addError("mime_type", "MIME type is required");
}
if (file.getContext() == null) {
result.addError("context", "File context is required");
}
if (file.getUploaded_by() == null || file.getUploaded_by() <= 0) {
result.addError("uploaded_by", "Uploader user ID is required and must be valid");
}
if (file.getFile_name() != null && file.getFile_name().length() > 255) {
result.addError("file_name", "File name is too long");
}
if (file.getFile_path() != null && file.getFile_path().length() > 255) {
result.addError("file_path", "File path is too long");
}
return Future.succeededFuture(result);
}
}

View File

@@ -1,44 +0,0 @@
package net.miarma.api.backlib.core.validators;
import io.vertx.core.Future;
import net.miarma.api.backlib.validation.ValidationResult;
import net.miarma.api.backlib.core.entities.UserEntity;
public class UserValidator {
public Future<ValidationResult> validate(UserEntity user) {
ValidationResult result = new ValidationResult();
if (user == null) {
return Future.succeededFuture(result.addError("user", "El usuario no puede ser nulo"));
}
if (user.getUser_name() == null || user.getUser_name().isBlank()) {
result.addError("user_name", "El nombre de usuario es obligatorio");
}
if (user.getDisplay_name() == null || user.getDisplay_name().isBlank()) {
result.addError("display_name", "El nombre para mostrar es obligatorio");
}
if (user.getEmail() != null && !user.getEmail().isBlank()) {
if (!user.getEmail().matches("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$")) {
result.addError("email", "El correo electrónico no es válido");
}
}
if (user.getPassword() == null || user.getPassword().isBlank()) {
result.addError("password", "La contraseña es obligatoria");
}
if (user.getGlobal_status() == null) {
result.addError("global_status", "El estado global del usuario es obligatorio");
}
if (user.getGlobal_role() == null) {
result.addError("role", "El rol del usuario es obligatorio");
}
return Future.succeededFuture(result);
}
}

View File

@@ -1,12 +1,14 @@
package net.miarma.api.backlib.db; package net.miarma.api.backlib.db;
import java.lang.reflect.Field;
import org.slf4j.Logger;
import io.vertx.core.json.JsonObject; import io.vertx.core.json.JsonObject;
import io.vertx.sqlclient.Row; import io.vertx.sqlclient.Row;
import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.ValuableEnum;
import net.miarma.api.backlib.annotations.APIDontReturn; import net.miarma.api.backlib.annotations.APIDontReturn;
import net.miarma.api.backlib.interfaces.IValuableEnum;
import java.lang.reflect.Field; import net.miarma.api.backlib.log.LoggerProvider;
/** /**
* Clase base para todas las entidades persistentes del sistema. * Clase base para todas las entidades persistentes del sistema.
@@ -24,6 +26,7 @@ import java.lang.reflect.Field;
* @author José Manuel Amador Gallardo * @author José Manuel Amador Gallardo
*/ */
public abstract class AbstractEntity { public abstract class AbstractEntity {
private final Logger LOGGER = LoggerProvider.getLogger();
/** /**
* Constructor por defecto. Requerido para instanciación sin datos. * Constructor por defecto. Requerido para instanciación sin datos.
@@ -86,7 +89,7 @@ public abstract class AbstractEntity {
} }
} }
default -> { default -> {
Constants.LOGGER.error("Type not supported yet: {} for field {}", type.getName(), name); LOGGER.error("Type not supported yet: {} for field {}", type.getName(), name);
yield null; yield null;
} }
}; };
@@ -95,7 +98,7 @@ public abstract class AbstractEntity {
field.set(this, value); field.set(this, value);
} catch (Exception e) { } catch (Exception e) {
Constants.LOGGER.error("Error populating field {}: {}", field.getName(), e.getMessage()); LOGGER.error("Error populating field {}: {}", field.getName(), e.getMessage());
} }
} }
} }
@@ -103,7 +106,7 @@ public abstract class AbstractEntity {
/** /**
* Codifica esta entidad como un objeto JSON, omitiendo los campos anotados con {@link APIDontReturn}. * Codifica esta entidad como un objeto JSON, omitiendo los campos anotados con {@link APIDontReturn}.
* *
* <p>Si un campo implementa {@link ValuableEnum}, se usará su valor en lugar del nombre del enum.</p> * <p>Si un campo implementa {@link IValuableEnum}, se usará su valor en lugar del nombre del enum.</p>
* *
* @return Representación JSON de esta entidad. * @return Representación JSON de esta entidad.
*/ */
@@ -119,13 +122,13 @@ public abstract class AbstractEntity {
try { try {
Object value = field.get(this); Object value = field.get(this);
if (value instanceof ValuableEnum ve) { if (value instanceof IValuableEnum ve) {
json.put(field.getName(), ve.getValue()); json.put(field.getName(), ve.getValue());
} else { } else {
json.put(field.getName(), value); json.put(field.getName(), value);
} }
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
Constants.LOGGER.error("Error accessing field {}: {}", field.getName(), e.getMessage()); LOGGER.error("Error accessing field {}: {}", field.getName(), e.getMessage());
} }
} }
clazz = clazz.getSuperclass(); clazz = clazz.getSuperclass();
@@ -150,7 +153,7 @@ public abstract class AbstractEntity {
try { try {
sb.append(field.getName()).append("= ").append(field.get(this)).append(", "); sb.append(field.getName()).append("= ").append(field.get(this)).append(", ");
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
Constants.LOGGER.error("Error stringing field {}: {}", field.getName(), e.getMessage()); LOGGER.error("Error stringing field {}: {}", field.getName(), e.getMessage());
} }
} }
sb.append("]"); sb.append("]");

View File

@@ -1,16 +1,18 @@
package net.miarma.api.backlib.db; package net.miarma.api.backlib.db;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import io.vertx.core.Future; import io.vertx.core.Future;
import io.vertx.core.Handler; import io.vertx.core.Handler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import io.vertx.sqlclient.Row; import io.vertx.sqlclient.Row;
import io.vertx.sqlclient.RowSet; import io.vertx.sqlclient.RowSet;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.log.LoggerProvider;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
/** /**
* Gestor centralizado de acceso a la base de datos utilizando Vert.x SQL Client. * Gestor centralizado de acceso a la base de datos utilizando Vert.x SQL Client.
@@ -23,6 +25,7 @@ import java.util.List;
*/ */
public class DatabaseManager { public class DatabaseManager {
private final Logger LOGGER = LoggerProvider.getLogger();
private static DatabaseManager instance; private static DatabaseManager instance;
private final Pool pool; private final Pool pool;
@@ -86,7 +89,7 @@ public class DatabaseManager {
results.add(constructor.newInstance(row)); results.add(constructor.newInstance(row));
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException } catch (NoSuchMethodException | InstantiationException | IllegalAccessException
| InvocationTargetException e) { | InvocationTargetException e) {
Constants.LOGGER.error("Error instantiating class: {}", e.getMessage()); LOGGER.error("Error instantiating class: {}", e.getMessage());
} }
} }
return results; return results;
@@ -116,7 +119,7 @@ public class DatabaseManager {
Constructor<T> constructor = clazz.getConstructor(Row.class); Constructor<T> constructor = clazz.getConstructor(Row.class);
return constructor.newInstance(row); return constructor.newInstance(row);
} catch (Exception e) { } catch (Exception e) {
Constants.LOGGER.error("Error instantiating class: {}", e.getMessage()); LOGGER.error("Error instantiating class: {}", e.getMessage());
} }
} }
return null; // Si no hay filas return null; // Si no hay filas

View File

@@ -4,7 +4,7 @@ import io.vertx.core.Vertx;
import io.vertx.mysqlclient.MySQLConnectOptions; import io.vertx.mysqlclient.MySQLConnectOptions;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import io.vertx.sqlclient.PoolOptions; import io.vertx.sqlclient.PoolOptions;
import net.miarma.api.backlib.ConfigManager; import net.miarma.api.backlib.config.ConfigManager;
/** /**
* Factoría de {@link Pool} para conexiones MySQL usando Vert.x. * Factoría de {@link Pool} para conexiones MySQL usando Vert.x.

View File

@@ -1,14 +1,24 @@
package net.miarma.api.backlib.db; package net.miarma.api.backlib.db;
import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.annotations.Table;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.StringJoiner;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.slf4j.Logger;
import net.miarma.api.backlib.annotations.Table;
import net.miarma.api.backlib.log.LoggerProvider;
/** /**
* Clase utilitaria para construir queries SQL dinámicamente mediante reflexión, * Clase utilitaria para construir queries SQL dinámicamente mediante reflexión,
* usando entidades anotadas con {@link Table}. * usando entidades anotadas con {@link Table}.
@@ -21,6 +31,7 @@ import java.util.stream.Collectors;
* @author José Manuel Amador Gallardo * @author José Manuel Amador Gallardo
*/ */
public class QueryBuilder { public class QueryBuilder {
private final static Logger LOGGER = LoggerProvider.getLogger();
private final StringBuilder query; private final StringBuilder query;
private String sort; private String sort;
private String order; private String order;
@@ -141,7 +152,7 @@ public class QueryBuilder {
String value = entry.getValue(); String value = entry.getValue();
if (!validFields.contains(key)) { if (!validFields.contains(key)) {
Constants.LOGGER.warn("[QueryBuilder] Ignorando campo invalido en WHERE: {}", key); LOGGER.warn("[QueryBuilder] Ignorando campo invalido en WHERE: {}", key);
continue; continue;
} }
@@ -186,7 +197,7 @@ public class QueryBuilder {
if (fieldValue != null) { if (fieldValue != null) {
String key = field.getName(); String key = field.getName();
if (!validFields.contains(key)) { if (!validFields.contains(key)) {
Constants.LOGGER.warn("[QueryBuilder] Ignorando campo invalido en WHERE: {}", key); LOGGER.warn("[QueryBuilder] Ignorando campo invalido en WHERE: {}", key);
continue; continue;
} }
Object value = extractValue(fieldValue); Object value = extractValue(fieldValue);
@@ -197,7 +208,7 @@ public class QueryBuilder {
} }
} }
} catch (IllegalArgumentException | IllegalAccessException e) { } catch (IllegalArgumentException | IllegalAccessException e) {
Constants.LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage()); LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage());
} }
} }
this.query.append(joiner).append(" "); this.query.append(joiner).append(" ");
@@ -239,7 +250,7 @@ public class QueryBuilder {
values.add("NULL"); values.add("NULL");
} }
} catch (IllegalArgumentException | IllegalAccessException e) { } catch (IllegalArgumentException | IllegalAccessException e) {
Constants.LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage()); LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage());
} }
} }
qb.query.append(columns).append(") "); qb.query.append(columns).append(") ");
@@ -289,7 +300,7 @@ public class QueryBuilder {
setJoiner.add(fieldName + " = " + (value instanceof String setJoiner.add(fieldName + " = " + (value instanceof String
|| value instanceof LocalDateTime ? "'" + value + "'" : value)); || value instanceof LocalDateTime ? "'" + value + "'" : value));
} catch (Exception e) { } catch (Exception e) {
Constants.LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage()); LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage());
} }
} }
@@ -343,7 +354,7 @@ public class QueryBuilder {
setJoiner.add(fieldName + " = " + (value instanceof String || value instanceof LocalDateTime ? "'" + value + "'" : value)); setJoiner.add(fieldName + " = " + (value instanceof String || value instanceof LocalDateTime ? "'" + value + "'" : value));
} }
} catch (Exception e) { } catch (Exception e) {
Constants.LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage()); LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage());
} }
} }
@@ -394,7 +405,7 @@ public class QueryBuilder {
} }
} catch (Exception e) { } catch (Exception e) {
Constants.LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage()); LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage());
} }
} }
@@ -436,7 +447,7 @@ public class QueryBuilder {
|| value instanceof LocalDateTime ? "'" + value + "'" : value.toString())); || value instanceof LocalDateTime ? "'" + value + "'" : value.toString()));
} }
} catch (Exception e) { } catch (Exception e) {
Constants.LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage()); LOGGER.error("(REFLECTION) Error reading field: {}", e.getMessage());
} }
} }
@@ -460,7 +471,7 @@ public class QueryBuilder {
.anyMatch(f -> f.equals(c)); .anyMatch(f -> f.equals(c));
if (!isValid) { if (!isValid) {
Constants.LOGGER.warn("[QueryBuilder] Ignorando campo invalido en ORDER BY: {}", c); LOGGER.warn("[QueryBuilder] Ignorando campo invalido en ORDER BY: {}", c);
return; return;
} }
} }

View File

@@ -0,0 +1,27 @@
package net.miarma.api.backlib.gson;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import io.vertx.core.json.JsonObject;
import net.miarma.api.backlib.interfaces.IValuableEnum;
import java.time.LocalDateTime;
public class GsonProvider {
private static final Gson INSTANCE = createGson();
private static Gson createGson() {
return new GsonBuilder()
.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeAdapter())
.registerTypeAdapter(JsonObject.class, new JsonObjectTypeAdapter())
.registerTypeHierarchyAdapter(IValuableEnum.class, new ValuableEnumDeserializer())
.registerTypeHierarchyAdapter(IValuableEnum.class, new ValuableEnumTypeAdapter())
.addSerializationExclusionStrategy(new APIDontReturnExclusionStrategy())
.create();
}
public static Gson get() {
return INSTANCE;
}
private GsonProvider() {}
}

View File

@@ -4,7 +4,8 @@ import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer; import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonParseException; import com.google.gson.JsonParseException;
import net.miarma.api.backlib.ValuableEnum;
import net.miarma.api.backlib.interfaces.IValuableEnum;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Arrays; import java.util.Arrays;
@@ -15,15 +16,15 @@ import java.util.Arrays;
* *
* @author José Manuel Amador Gallardo * @author José Manuel Amador Gallardo
*/ */
public class ValuableEnumDeserializer implements JsonDeserializer<ValuableEnum> { public class ValuableEnumDeserializer implements JsonDeserializer<IValuableEnum> {
@Override @Override
public ValuableEnum deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { public IValuableEnum deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Class<?> enumClass = (Class<?>) typeOfT; Class<?> enumClass = (Class<?>) typeOfT;
int value = json.getAsInt(); int value = json.getAsInt();
return (ValuableEnum) Arrays.stream(enumClass.getEnumConstants()) return (IValuableEnum) Arrays.stream(enumClass.getEnumConstants())
.filter(e -> ((ValuableEnum) e).getValue() == value) .filter(e -> ((IValuableEnum) e).getValue() == value)
.findFirst() .findFirst()
.orElseThrow(() -> new JsonParseException("Invalid enum value: " + value)); .orElseThrow(() -> new JsonParseException("Invalid enum value: " + value));
} }

View File

@@ -4,7 +4,8 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive; import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer; import com.google.gson.JsonSerializer;
import net.miarma.api.backlib.ValuableEnum;
import net.miarma.api.backlib.interfaces.IValuableEnum;
import java.lang.reflect.Type; import java.lang.reflect.Type;
@@ -14,10 +15,10 @@ import java.lang.reflect.Type;
* *
* @author José Manuel Amador Gallardo * @author José Manuel Amador Gallardo
*/ */
public class ValuableEnumTypeAdapter implements JsonSerializer<ValuableEnum> { public class ValuableEnumTypeAdapter implements JsonSerializer<IValuableEnum> {
@Override @Override
public JsonElement serialize(ValuableEnum src, Type typeOfSrc, JsonSerializationContext context) { public JsonElement serialize(IValuableEnum src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.getValue()); return new JsonPrimitive(src.getValue());
} }
} }

View File

@@ -1,21 +0,0 @@
package net.miarma.api.backlib.interfaces;
import java.time.LocalDateTime;
import net.miarma.api.backlib.Constants.CoreUserGlobalStatus;
import net.miarma.api.backlib.Constants.CoreUserRole;
public interface IUser {
Integer getUser_id();
String getUser_name();
String getEmail();
String getDisplay_name();
String getPassword();
String getAvatar();
CoreUserGlobalStatus getGlobal_status();
CoreUserRole getGlobal_role();
LocalDateTime getCreated_at();
default LocalDateTime getUpdated_at() {
return null;
}
}

View File

@@ -1,7 +1,5 @@
package net.miarma.api.backlib.interfaces; package net.miarma.api.backlib.interfaces;
import net.miarma.api.backlib.ValuableEnum; public interface IUserRole extends IValuableEnum {
public interface IUserRole extends ValuableEnum {
String name(); String name();
} }

View File

@@ -1,9 +1,9 @@
package net.miarma.api.backlib; package net.miarma.api.backlib.interfaces;
/** /**
* Interfaz que define un enum con un valor entero asociado * Interfaz que define un enum con un valor entero asociado
* @author José Manuel Amador Gallardo * @author José Manuel Amador Gallardo
*/ */
public interface ValuableEnum { public interface IValuableEnum {
int getValue(); int getValue();
} }

View File

@@ -1,4 +1,4 @@
package net.miarma.api.backlib; package net.miarma.api.backlib.log;
import org.slf4j.Logger; import org.slf4j.Logger;

View File

@@ -1,4 +1,4 @@
package net.miarma.api.backlib; package net.miarma.api.backlib.log;
public record LogEntry(int order, String message) { public record LogEntry(int order, String message) {
public static LogEntry of(int order, String message) { public static LogEntry of(int order, String message) {

View File

@@ -0,0 +1,11 @@
package net.miarma.api.backlib.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LoggerProvider {
public static Logger getLogger() {
String className = Thread.currentThread().getStackTrace()[2].getClassName();
return LoggerFactory.getLogger(className);
}
}

View File

@@ -1,5 +1,6 @@
package net.miarma.api.backlib.middlewares; package net.miarma.api.backlib.middlewares;
import java.util.UUID;
import java.util.function.Consumer; import java.util.function.Consumer;
import io.vertx.core.Handler; import io.vertx.core.Handler;
@@ -18,7 +19,7 @@ import net.miarma.api.backlib.util.JsonUtil;
public abstract class AbstractAuthGuard<U, R extends Enum<R> & IUserRole> { public abstract class AbstractAuthGuard<U, R extends Enum<R> & IUserRole> {
protected abstract R parseRole(String roleStr); protected abstract R parseRole(String roleStr);
protected abstract void getUserEntity(int userId, RoutingContext ctx, Consumer<U> callback); protected abstract void getUserEntity(UUID userId, RoutingContext ctx, Consumer<U> callback);
protected abstract boolean hasPermission(U user, R role); protected abstract boolean hasPermission(U user, R role);
public Handler<RoutingContext> check(R... allowedRoles) { public Handler<RoutingContext> check(R... allowedRoles) {
@@ -29,7 +30,7 @@ public abstract class AbstractAuthGuard<U, R extends Enum<R> & IUserRole> {
return; return;
} }
int userId = JWTManager.getInstance().extractUserId(token); UUID userId = JWTManager.getInstance().extractUserId(token);
String roleStr = JWTManager.getInstance().extractRole(token); String roleStr = JWTManager.getInstance().extractRole(token);
R role; R role;

View File

@@ -1,83 +1,87 @@
package net.miarma.api.backlib.security; package net.miarma.api.backlib.security;
import java.util.Date; import java.util.Date;
import java.util.UUID;
import com.auth0.jwt.JWT; import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier; import com.auth0.jwt.interfaces.JWTVerifier;
import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.interfaces.IUserRole; import net.miarma.api.backlib.interfaces.IUserRole;
/**
* Clase de gestión de JSON Web Tokens (JWT).
* Proporciona métodos para generar, verificar y decodificar tokens JWT.
* <p>
* Esta clase sigue el patron Singleton para asegurar una sola instancia.
*
* @author José Manuel Amador Gallardo
*/
public class JWTManager { public class JWTManager {
private final ConfigManager config = ConfigManager.getInstance(); private final ConfigManager config = ConfigManager.getInstance();
private final Algorithm algorithm; private final Algorithm algorithm;
private final JWTVerifier verifier; private final JWTVerifier verifier;
private static JWTManager instance; private static JWTManager instance;
private JWTManager() { private JWTManager() {
this.algorithm = Algorithm.HMAC256(config.getStringProperty("jwt.secret")); this.algorithm = Algorithm.HMAC256(config.getStringProperty("jwt.secret"));
this.verifier = JWT.require(algorithm).build(); this.verifier = JWT.require(algorithm).build();
} }
/**
* Obtiene la instancia única de JWTManager.
*
* @return La instancia única de JWTManager.
*/
public static synchronized JWTManager getInstance() { public static synchronized JWTManager getInstance() {
if (instance == null) { if (instance == null) {
instance = new JWTManager(); instance = new JWTManager();
} }
return instance; return instance;
}
/**
* Genera un token JWT para un usuario.
*
* @param user El usuario para el cual se generará el token.
* @param keepLoggedIn Indica si el token debe tener una duración prolongada.
* @return El token JWT generado.
*/
public String generateToken(String user_name, Integer user_id, IUserRole role, boolean keepLoggedIn) {
final long EXPIRATION_TIME_MS = 1000L * (keepLoggedIn ? config.getIntProperty("jwt.expiration") : config.getIntProperty("jwt.expiration.short"));
return JWT.create()
.withSubject(user_name)
.withClaim("userId", user_id)
.withClaim("role", role.name())
.withClaim("isAdmin", role == Constants.CoreUserRole.ADMIN)
.withIssuedAt(new Date())
.withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME_MS))
.sign(algorithm);
} }
/** /**
* Decodifica un token JWT sin verificar su firma. * Genera un token JWT usando UUID para el usuario.
*
* @param token El token JWT a decodificar.
* @return Un objeto DecodedJWT que contiene la información del token.
*/ */
public DecodedJWT decodeWithoutVerification(String token) { public String generateToken(
return JWT.decode(token); String userName,
UUID userId,
IUserRole role,
Integer serviceId,
boolean keepLoggedIn
) {
final long expiration = 1000L * (
keepLoggedIn
? config.getIntProperty("jwt.expiration")
: config.getIntProperty("jwt.expiration.short")
);
return JWT.create()
.withSubject(userName)
.withClaim("userId", userId.toString())
.withClaim("serviceId", serviceId)
.withClaim("role", role.name())
.withIssuedAt(new Date())
.withExpiresAt(new Date(System.currentTimeMillis() + expiration))
.sign(algorithm);
}
public UUID extractUserId(String token) {
try {
DecodedJWT jwt = verifier.verify(token);
String uuidStr = jwt.getClaim("userId").asString();
return UUID.fromString(uuidStr);
} catch (Exception e) {
return null;
}
}
public Integer extractServiceId(String token) {
try {
DecodedJWT jwt = verifier.verify(token);
return jwt.getClaim("serviceId").asInt();
} catch (Exception e) {
return -1;
}
}
public String extractRole(String token) {
try {
DecodedJWT jwt = verifier.verify(token);
return jwt.getClaim("role").asString();
} catch (Exception e) {
return null;
}
} }
/**
* Verifica la validez de un token JWT.
*
* @param token El token JWT a verificar.
* @return true si el token es válido, false en caso contrario.
*/
public boolean isValid(String token) { public boolean isValid(String token) {
try { try {
verifier.verify(token); verifier.verify(token);
@@ -86,77 +90,4 @@ public class JWTManager {
return false; return false;
} }
} }
/**
* Verifica si un token JWT pertenece a un usuario administrador.
*
* @param token El token JWT a verificar.
* @return true si el token pertenece a un administrador, false en caso contrario.
*/
public boolean isAdmin(String token) {
try {
DecodedJWT jwt = verifier.verify(token);
return jwt.getClaim("isAdmin").asBoolean();
} catch (Exception e) {
return false;
}
}
/**
* Obtiene el ID de usuario a partir de un token JWT.
*
* @param token El token JWT del cual se extraerá el ID de usuario.
* @return El ID de usuario si el token es válido, -1 en caso contrario.
*/
public int getUserId(String token) {
try {
DecodedJWT jwt = verifier.verify(token);
return jwt.getClaim("userId").asInt();
} catch (Exception e) {
return -1;
}
}
/**
* Obtiene el sub especificado en un token JWT, que generalmente es el nombre de usuario.
*
* @param token El token JWT del cual se extraerá el nombre de usuario.
* @return El nombre de usuario si el token es válido, null en caso contrario.
*/
public String getSubject(String token) {
try {
DecodedJWT jwt = verifier.verify(token);
return jwt.getSubject();
} catch (Exception e) {
return null;
}
}
/**
* Extrae el ID de usuario de un token JWT.
* @param token El token JWT del cual se extraerá el ID de usuario.
* @return El ID de usuario si el token es válido, -1 en caso contrario.
*/
public int extractUserId(String token) {
try {
DecodedJWT jwt = verifier.verify(token);
return jwt.getClaim("userId").asInt();
} catch (Exception e) {
return -1;
}
}
/**
* Extrae el rol de usuario de un token JWT.
* @param token El token JWT del cual se extraerá el ID de usuario.
* @return El rol de usuario si el token es válido, null en caso contrario.
*/
public String extractRole(String token) {
try {
DecodedJWT jwt = verifier.verify(token);
return jwt.getClaim("role").asString();
} catch (Exception e) {
return null;
}
}
} }

View File

@@ -1,7 +1,5 @@
package net.miarma.api.backlib.security; package net.miarma.api.backlib.security;
import net.miarma.api.backlib.ConfigManager;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
@@ -10,6 +8,8 @@ import java.security.SecureRandom;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import net.miarma.api.backlib.config.ConfigManager;
/** /**
* Clase encargada de generar los secrets necesarios para la autenticación JWT. * Clase encargada de generar los secrets necesarios para la autenticación JWT.
* Si el secret ya existe en el archivo de configuración, lo devuelve. * Si el secret ya existe en el archivo de configuración, lo devuelve.

View File

@@ -3,7 +3,7 @@ package net.miarma.api.backlib.util;
import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject; import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.gson.GsonProvider;
import net.miarma.api.backlib.http.ApiResponse; import net.miarma.api.backlib.http.ApiResponse;
import net.miarma.api.backlib.http.ApiStatus; import net.miarma.api.backlib.http.ApiStatus;
@@ -26,7 +26,7 @@ public class JsonUtil {
.put("data", data); .put("data", data);
ctx.response().end(response.encode()); ctx.response().end(response.encode());
} else { } else {
ctx.response().end(Constants.GSON.toJson(new ApiResponse<>(status, message, data))); ctx.response().end(GsonProvider.get().toJson(new ApiResponse<>(status, message, data)));
} }
} }

View File

@@ -1,13 +1,16 @@
package net.miarma.api.backlib.util; package net.miarma.api.backlib.util;
import org.slf4j.Logger;
import io.vertx.ext.web.Router; import io.vertx.ext.web.Router;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.log.LoggerProvider;
/** /**
* Clase de utilidad para adjuntar un logger a un router de Vert.x. * Clase de utilidad para adjuntar un logger a un router de Vert.x.
* @author José Manuel Amador Gallardo * @author José Manuel Amador Gallardo
*/ */
public class RouterUtil { public class RouterUtil {
private final static Logger LOGGER = LoggerProvider.getLogger();
public static void attachLogger(Router router) { public static void attachLogger(Router router) {
router.route().handler(ctx -> { router.route().handler(ctx -> {
@@ -46,7 +49,7 @@ public class RouterUtil {
duration duration
); );
Constants.LOGGER.info(log); LOGGER.info(log);
}); });
ctx.next(); ctx.next();

View File

@@ -5,8 +5,8 @@
<parent> <parent>
<groupId>net.miarma.api</groupId> <groupId>net.miarma.api</groupId>
<artifactId>miarma-ecosystem</artifactId> <artifactId>miarma-backend</artifactId>
<version>1.2.1</version> <version>2.0.0</version>
</parent> </parent>
<artifactId>bootstrap</artifactId> <artifactId>bootstrap</artifactId>
@@ -51,7 +51,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.miarma.api</groupId> <groupId>net.miarma.api</groupId>
<artifactId>miarmacraft</artifactId> <artifactId>minecraft</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency> <dependency>

View File

@@ -1,18 +1,19 @@
package net.miarma.api; package net.miarma.api;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.security.SecretManager;
import net.miarma.api.backlib.vertx.VertxJacksonConfig;
import net.miarma.api.backlib.util.MessageUtil;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import org.slf4j.Logger;
import io.vertx.core.Launcher; import io.vertx.core.Launcher;
import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.log.LoggerProvider;
import net.miarma.api.backlib.security.SecretManager;
import net.miarma.api.backlib.util.MessageUtil;
import net.miarma.api.backlib.vertx.VertxJacksonConfig;
/** /**
* Punto de entrada para inicializar la aplicación. * Punto de entrada para inicializar la aplicación.
@@ -24,12 +25,13 @@ import io.vertx.core.Launcher;
* - Desplegar el Verticle Master * - Desplegar el Verticle Master
*/ */
public class AppInitializer { public class AppInitializer {
private final static Logger LOGGER = LoggerProvider.getLogger();
public static void main(String[] args) { public static void main(String[] args) {
AppInitializer initializer = new AppInitializer(); AppInitializer initializer = new AppInitializer();
initializer.init(); initializer.init();
initializer.deployMaster(); initializer.deployMaster();
Constants.LOGGER.info("✅ App initialized successfully!"); LOGGER.info("✅ App initialized successfully!");
} }
private final ConfigManager configManager; private final ConfigManager configManager;
@@ -49,7 +51,7 @@ public class AppInitializer {
private void initializeDirectories() { private void initializeDirectories() {
File baseDir = new File(configManager.getBaseDir()); File baseDir = new File(configManager.getBaseDir());
if (!baseDir.exists() && baseDir.mkdirs()) { if (!baseDir.exists() && baseDir.mkdirs()) {
Constants.LOGGER.info("Created base directory: " + baseDir.getAbsolutePath()); LOGGER.info("Created base directory: " + baseDir.getAbsolutePath());
} }
} }
@@ -59,12 +61,12 @@ public class AppInitializer {
try (InputStream in = getClass().getClassLoader().getResourceAsStream("default.properties")) { try (InputStream in = getClass().getClassLoader().getResourceAsStream("default.properties")) {
if (in != null) { if (in != null) {
Files.copy(in, configFile.toPath(), StandardCopyOption.REPLACE_EXISTING); Files.copy(in, configFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
Constants.LOGGER.info("Copied default.properties to: " + configFile.getAbsolutePath()); LOGGER.info("Copied default.properties to: " + configFile.getAbsolutePath());
} else { } else {
Constants.LOGGER.error(MessageUtil.notFound("Default config", "resources")); LOGGER.error(MessageUtil.notFound("Default config", "resources"));
} }
} catch (IOException e) { } catch (IOException e) {
Constants.LOGGER.error(MessageUtil.failedTo("copy", "default config", e)); LOGGER.error(MessageUtil.failedTo("copy", "default config", e));
} }
} }
} }

View File

@@ -1,32 +1,36 @@
package net.miarma.api; package net.miarma.api;
import java.util.Set; import org.slf4j.Logger;
import io.vertx.core.AbstractVerticle; import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future; import io.vertx.core.Future;
import io.vertx.core.Promise; import io.vertx.core.Promise;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.log.LogAccumulator;
import net.miarma.api.backlib.LogAccumulator; import net.miarma.api.backlib.log.LoggerProvider;
import net.miarma.api.backlib.util.DeploymentUtil; import net.miarma.api.backlib.util.DeploymentUtil;
import net.miarma.api.microservices.core.verticles.CoreMainVerticle; import net.miarma.api.microservices.core.verticles.CoreMainVerticle;
import net.miarma.api.microservices.huertos.verticles.HuertosMainVerticle; import net.miarma.api.microservices.huertos.verticles.HuertosMainVerticle;
import net.miarma.api.microservices.huertosdecine.verticles.CineMainVerticle; import net.miarma.api.microservices.huertosdecine.verticles.CineMainVerticle;
import net.miarma.api.microservices.miarmacraft.verticles.MMCMainVerticle; import net.miarma.api.microservices.minecraft.verticles.MMCMainVerticle;
import net.miarma.api.microservices.mpaste.verticles.MPasteMainVerticle; import net.miarma.api.microservices.mpaste.verticles.MPasteMainVerticle;
@SuppressWarnings("unused")
public class MasterVerticle extends AbstractVerticle { public class MasterVerticle extends AbstractVerticle {
private final Logger LOGGER = LoggerProvider.getLogger();
@Override @Override
public void start(Promise<Void> startPromise) { public void start(Promise<Void> startPromise) {
deploy() deploy()
.onSuccess(v -> { .onSuccess(v -> {
vertx.setTimer(300, id -> { vertx.setTimer(300, id -> {
LogAccumulator.flushToLogger(Constants.LOGGER); LogAccumulator.flushToLogger(LOGGER);
startPromise.complete(); startPromise.complete();
}); });
}) })
.onFailure(startPromise::fail); .onFailure(startPromise::fail);
} }
@SuppressWarnings("unused")
private Future<Void> deploy() { private Future<Void> deploy() {
Promise<Void> promise = Promise.promise(); Promise<Void> promise = Promise.promise();

View File

@@ -1,3 +1,25 @@
# App Configuration
app.name=miarma-backend
app.version=v2
# API Configuration
api.base=/api
api.core.prefix=/core/${app.version}
api.auth.prefix=/auth/${app.version}
api.huertos.prefix=/huertos/${app.version}
api.minecraft.prefix=/minecraft/${app.version}
api.cine.prefix=/cine/${app.version}
api.mpaste.prefix=/mpaste/${app.version}
# EventBus Configuration
eventbus.auth.address=auth.eventbus
eventbus.core.address=core.eventbus
eventbus.huertos.address=huertos.eventbus
eventbus.minecraft.address=minecraft.eventbus
eventbus.cine.address=cine.eventbus
eventbus.mpaste.address=mpaste.eventbus
# DB Configuration # DB Configuration
db.protocol=jdbc:mariadb db.protocol=jdbc:mariadb
db.host=localhost db.host=localhost
@@ -11,8 +33,8 @@ dp.poolSize=5
inet.host=localhost inet.host=localhost
sso.logic.port=8080 sso.logic.port=8080
sso.data.port=8081 sso.data.port=8081
mmc.logic.port=8100 minecraft.logic.port=8100
mmc.data.port=8101 minecraft.data.port=8101
huertos.logic.port=8120 huertos.logic.port=8120
huertos.data.port=8121 huertos.data.port=8121
cine.data.port = 8140 cine.data.port = 8140

View File

@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>net.miarma.api</groupId> <groupId>net.miarma.api</groupId>
<artifactId>core</artifactId> <artifactId>core</artifactId>
<version>1.2.1</version> <version>2.0.0</version>
<properties> <properties>
<maven.compiler.source>23</maven.compiler.source> <maven.compiler.source>23</maven.compiler.source>
@@ -20,7 +20,7 @@
<dependency> <dependency>
<groupId>net.miarma.api</groupId> <groupId>net.miarma.api</groupId>
<artifactId>backlib</artifactId> <artifactId>backlib</artifactId>
<version>1.2.1</version> <version>2.0.0</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -0,0 +1,172 @@
package net.miarma.api.microservices.core.dao;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.sqlclient.Pool;
import net.miarma.api.microservices.core.entities.CredentialEntity;
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;
public class CredentialDAO implements DataAccessObject<CredentialEntity, UUID> {
private final DatabaseManager db;
public CredentialDAO(Pool pool) {
this.db = DatabaseManager.getInstance(pool);
}
@Override
public Future<List<CredentialEntity>> getAll() {
return getAll(new QueryParams(Map.of(), new QueryFilters()));
}
@Override
public Future<CredentialEntity> getById(UUID id) {
Promise<CredentialEntity> promise = Promise.promise();
String query = QueryBuilder
.select(CredentialEntity.class)
.where(Map.of("credential_id", id.toString()))
.build();
db.executeOne(query, CredentialEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
public Future<List<CredentialEntity>> getAll(QueryParams params) {
Promise<List<CredentialEntity>> promise = Promise.promise();
String query = QueryBuilder
.select(CredentialEntity.class)
.where(params.getFilters())
.orderBy(params.getQueryFilters().getSort(), params.getQueryFilters().getOrder())
.limit(params.getQueryFilters().getLimit())
.offset(params.getQueryFilters().getOffset())
.build();
db.execute(query, CredentialEntity.class,
list -> promise.complete(list.isEmpty() ? List.of() : list),
promise::fail
);
return promise.future();
}
/**
* Útil para el login: busca la credencial por servicio y usuario
*/
public Future<CredentialEntity> getByServiceAndUsername(int serviceId, String username) {
Promise<CredentialEntity> promise = Promise.promise();
String query = QueryBuilder
.select(CredentialEntity.class)
.where(Map.of("service_id", String.valueOf(serviceId), "username", username))
.build();
db.executeOne(query, CredentialEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
public Future<List<CredentialEntity>> getByUserId(UUID userId) {
Promise<List<CredentialEntity>> promise = Promise.promise();
String query = QueryBuilder
.select(CredentialEntity.class)
.where(Map.of("user_id", userId.toString()))
.build();
db.execute(query, CredentialEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
@Override
public Future<CredentialEntity> insert(CredentialEntity credential) {
Promise<CredentialEntity> promise = Promise.promise();
// Si no tiene ID, se lo generamos antes de insertar
if (credential.getCredentialId() == null) {
credential.setCredentialId(UUID.randomUUID());
}
String query = QueryBuilder.insert(credential).build();
db.executeOne(query, CredentialEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
@Override
public Future<CredentialEntity> upsert(CredentialEntity credential, String... conflictKeys) {
Promise<CredentialEntity> promise = Promise.promise();
String query = QueryBuilder.upsert(credential, conflictKeys).build();
db.executeOne(query, CredentialEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
@Override
public Future<CredentialEntity> update(CredentialEntity credential) {
Promise<CredentialEntity> promise = Promise.promise();
String query = QueryBuilder.update(credential).build();
db.executeOne(query, CredentialEntity.class,
_ -> promise.complete(credential),
promise::fail
);
return promise.future();
}
@Override
public Future<Boolean> delete(UUID id) {
Promise<Boolean> promise = Promise.promise();
CredentialEntity cred = new CredentialEntity();
cred.setCredentialId(id);
String query = QueryBuilder.delete(cred).build();
db.executeOne(query, CredentialEntity.class,
result -> promise.complete(result != null),
promise::fail
);
return promise.future();
}
@Override
public Future<Boolean> exists(UUID id) {
Promise<Boolean> promise = Promise.promise();
String query = QueryBuilder
.select(CredentialEntity.class)
.where(Map.of("credential_id", id.toString()))
.build();
db.executeOne(query, CredentialEntity.class,
result -> promise.complete(result != null),
promise::fail
);
return promise.future();
}
}

View File

@@ -1,4 +1,8 @@
package net.miarma.api.backlib.core.dao; package net.miarma.api.microservices.core.dao;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import io.vertx.core.Future; import io.vertx.core.Future;
import io.vertx.core.Promise; import io.vertx.core.Promise;
@@ -8,12 +12,9 @@ import net.miarma.api.backlib.db.DatabaseManager;
import net.miarma.api.backlib.db.QueryBuilder; import net.miarma.api.backlib.db.QueryBuilder;
import net.miarma.api.backlib.http.QueryFilters; import net.miarma.api.backlib.http.QueryFilters;
import net.miarma.api.backlib.http.QueryParams; import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.backlib.core.entities.FileEntity; import net.miarma.api.microservices.core.entities.FileEntity;
import java.util.List; public class FileDAO implements DataAccessObject<FileEntity, UUID> {
import java.util.Map;
public class FileDAO implements DataAccessObject<FileEntity, Integer> {
private final DatabaseManager db; private final DatabaseManager db;
@@ -27,7 +28,7 @@ public class FileDAO implements DataAccessObject<FileEntity, Integer> {
} }
@Override @Override
public Future<FileEntity> getById(Integer id) { public Future<FileEntity> getById(UUID id) {
Promise<FileEntity> promise = Promise.promise(); Promise<FileEntity> promise = Promise.promise();
String query = QueryBuilder String query = QueryBuilder
.select(FileEntity.class) .select(FileEntity.class)
@@ -60,7 +61,7 @@ public class FileDAO implements DataAccessObject<FileEntity, Integer> {
return promise.future(); return promise.future();
} }
public Future<List<FileEntity>> getUserFiles(Integer userId) { public Future<List<FileEntity>> getUserFiles(UUID userId) {
Promise<List<FileEntity>> promise = Promise.promise(); Promise<List<FileEntity>> promise = Promise.promise();
String query = QueryBuilder String query = QueryBuilder
.select(FileEntity.class) .select(FileEntity.class)
@@ -115,7 +116,7 @@ public class FileDAO implements DataAccessObject<FileEntity, Integer> {
} }
@Override @Override
public Future<Boolean> exists(Integer id) { public Future<Boolean> exists(UUID id) {
Promise<Boolean> promise = Promise.promise(); Promise<Boolean> promise = Promise.promise();
String query = QueryBuilder String query = QueryBuilder
.select(FileEntity.class) .select(FileEntity.class)
@@ -131,10 +132,10 @@ public class FileDAO implements DataAccessObject<FileEntity, Integer> {
} }
@Override @Override
public Future<Boolean> delete(Integer id) { public Future<Boolean> delete(UUID id) {
Promise<Boolean> promise = Promise.promise(); Promise<Boolean> promise = Promise.promise();
FileEntity file = new FileEntity(); FileEntity file = new FileEntity();
file.setFile_id(id); file.setFileId(id);
String query = QueryBuilder.delete(file).build(); String query = QueryBuilder.delete(file).build();

View File

@@ -1,19 +1,20 @@
package net.miarma.api.backlib.core.dao; package net.miarma.api.microservices.core.dao;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import io.vertx.core.Future; import io.vertx.core.Future;
import io.vertx.core.Promise; import io.vertx.core.Promise;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.core.entities.UserEntity; import net.miarma.api.microservices.core.entities.UserEntity;
import net.miarma.api.backlib.db.DataAccessObject; import net.miarma.api.backlib.db.DataAccessObject;
import net.miarma.api.backlib.db.DatabaseManager; import net.miarma.api.backlib.db.DatabaseManager;
import net.miarma.api.backlib.db.QueryBuilder; import net.miarma.api.backlib.db.QueryBuilder;
import net.miarma.api.backlib.http.QueryFilters; import net.miarma.api.backlib.http.QueryFilters;
import net.miarma.api.backlib.http.QueryParams; import net.miarma.api.backlib.http.QueryParams;
public class UserDAO implements DataAccessObject<UserEntity, Integer> { public class UserDAO implements DataAccessObject<UserEntity, UUID> {
private final DatabaseManager db; private final DatabaseManager db;
@@ -27,7 +28,7 @@ public class UserDAO implements DataAccessObject<UserEntity, Integer> {
} }
@Override @Override
public Future<UserEntity> getById(Integer id) { public Future<UserEntity> getById(UUID id) {
Promise<UserEntity> promise = Promise.promise(); Promise<UserEntity> promise = Promise.promise();
String query = QueryBuilder String query = QueryBuilder
.select(UserEntity.class) .select(UserEntity.class)
@@ -60,36 +61,6 @@ public class UserDAO implements DataAccessObject<UserEntity, Integer> {
return promise.future(); return promise.future();
} }
public Future<UserEntity> getByEmail(String email) {
Promise<UserEntity> promise = Promise.promise();
String query = QueryBuilder
.select(UserEntity.class)
.where(Map.of("email", email))
.build();
db.executeOne(query, UserEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
public Future<UserEntity> getByUserName(String userName) {
Promise<UserEntity> promise = Promise.promise();
String query = QueryBuilder
.select(UserEntity.class)
.where(Map.of("user_name", userName))
.build();
db.executeOne(query, UserEntity.class,
promise::complete,
promise::fail
);
return promise.future();
}
@Override @Override
public Future<UserEntity> insert(UserEntity user) { public Future<UserEntity> insert(UserEntity user) {
Promise<UserEntity> promise = Promise.promise(); Promise<UserEntity> promise = Promise.promise();
@@ -130,10 +101,10 @@ public class UserDAO implements DataAccessObject<UserEntity, Integer> {
} }
@Override @Override
public Future<Boolean> delete(Integer id) { public Future<Boolean> delete(UUID id) {
Promise<Boolean> promise = Promise.promise(); Promise<Boolean> promise = Promise.promise();
UserEntity user = new UserEntity(); UserEntity user = new UserEntity();
user.setUser_id(id); user.setUserId(id);
String query = QueryBuilder.delete(user).build(); String query = QueryBuilder.delete(user).build();
@@ -146,7 +117,7 @@ public class UserDAO implements DataAccessObject<UserEntity, Integer> {
} }
@Override @Override
public Future<Boolean> exists(Integer id) { public Future<Boolean> exists(UUID id) {
Promise<Boolean> promise = Promise.promise(); Promise<Boolean> promise = Promise.promise();
String query = QueryBuilder String query = QueryBuilder
.select(UserEntity.class) .select(UserEntity.class)

View File

@@ -0,0 +1,110 @@
package net.miarma.api.microservices.core.entities;
import com.google.gson.annotations.SerializedName;
import net.miarma.api.backlib.annotations.APIDontReturn;
import net.miarma.api.backlib.annotations.Table;
import java.util.UUID;
import java.time.LocalDateTime;
@Table("credentials")
public class CredentialEntity {
@SerializedName("credential_id")
private UUID credentialId;
@SerializedName("user_id")
private UUID userId;
@SerializedName("service_id")
private int serviceId;
private String username;
private String email;
@APIDontReturn
private String password;
private int status;
@SerializedName("created_at")
private LocalDateTime createdAt;
@SerializedName("updated_at")
private LocalDateTime updatedAt;
public CredentialEntity() {}
public UUID getCredentialId() {
return credentialId;
}
public void setCredentialId(UUID credentialId) {
this.credentialId = credentialId;
}
public UUID getUserId() {
return userId;
}
public void setUserId(UUID userId) {
this.userId = userId;
}
public int getServiceId() {
return serviceId;
}
public void setServiceId(int serviceId) {
this.serviceId = serviceId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
}

View File

@@ -0,0 +1,99 @@
package net.miarma.api.microservices.core.entities;
import java.time.LocalDateTime;
import java.util.UUID;
import com.google.gson.annotations.SerializedName;
import io.vertx.sqlclient.Row;
import net.miarma.api.backlib.annotations.Table;
import net.miarma.api.backlib.db.AbstractEntity;
import net.miarma.api.microservices.core.enums.CoreFileContext;
@Table("files")
public class FileEntity extends AbstractEntity {
@SerializedName("file_id")
private UUID fileId;
@SerializedName("file_name")
private String fileName;
@SerializedName("file_path")
private String filePath;
@SerializedName("mime_type")
private String mimeType;
@SerializedName("uploaded_by")
private UUID uploadedBy;
private CoreFileContext context;
@SerializedName("uploaded_at")
private LocalDateTime uploadedAt;
public FileEntity() {
super();
}
public FileEntity(Row row) {
super(row);
}
public UUID getFileId() {
return fileId;
}
public void setFileId(UUID fileId) {
this.fileId = fileId;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getMimeType() {
return mimeType;
}
public void setMimeType(String mimeType) {
this.mimeType = mimeType;
}
public UUID getUploadedBy() {
return uploadedBy;
}
public void setUploadedBy(UUID uploadedBy) {
this.uploadedBy = uploadedBy;
}
public CoreFileContext getContext() {
return context;
}
public void setContext(CoreFileContext context) {
this.context = context;
}
public LocalDateTime getUploadedAt() {
return uploadedAt;
}
public void setUploadedAt(LocalDateTime uploadedAt) {
this.uploadedAt = uploadedAt;
}
}

View File

@@ -0,0 +1,53 @@
package net.miarma.api.microservices.core.entities;
import java.time.LocalDateTime;
import java.util.UUID;
import io.vertx.sqlclient.Row;
import net.miarma.api.backlib.annotations.Table;
import net.miarma.api.backlib.db.AbstractEntity;
import net.miarma.api.microservices.core.enums.CoreUserGlobalRole;
import net.miarma.api.microservices.core.enums.CoreUserGlobalStatus;
@Table("users")
public class UserEntity extends AbstractEntity {
private UUID userId;
private String userName;
private String email;
private String displayName;
private String avatar;
private CoreUserGlobalStatus globalStatus;
private CoreUserGlobalRole globalRole;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public UserEntity() { }
public UserEntity(Row row) { super(row); }
public UUID getUserId() { return userId; }
public void setUserId(UUID userId) { this.userId = userId; }
public String getUserName() { return userName; }
public void setUserName(String userName) { this.userName = userName; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public String getDisplayName() { return displayName; }
public void setDisplayName(String displayName) { this.displayName = displayName; }
public String getAvatar() { return avatar; }
public void setAvatar(String avatar) { this.avatar = avatar; }
public CoreUserGlobalStatus getGlobalStatus() { return globalStatus; }
public void setGlobalStatus(CoreUserGlobalStatus globalStatus) { this.globalStatus = globalStatus; }
public CoreUserGlobalRole getGlobalRole() { return globalRole; }
public void setGlobalRole(CoreUserGlobalRole role) { this.globalRole = role; }
public LocalDateTime getCreatedAt() { return createdAt; }
public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }
public LocalDateTime getUpdatedAt() { return updatedAt; }
public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; }
}

View File

@@ -0,0 +1,37 @@
package net.miarma.api.microservices.core.enums;
import net.miarma.api.backlib.interfaces.IValuableEnum;
public enum CoreFileContext implements IValuableEnum {
CORE(0),
HUERTOS(1),
MMC(2),
CINE(3);
private final int value;
CoreFileContext(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public String toCtxString() {
return switch(this) {
case CORE -> "core";
case HUERTOS -> "huertos";
case MMC -> "miarmacraft";
case CINE -> "cine";
};
}
public static CoreFileContext fromInt(int i) {
for (CoreFileContext context : values()) {
if (context.value == i) return context;
}
throw new IllegalArgumentException("Invalid CoreFileContext value: " + i);
}
}

View File

@@ -0,0 +1,26 @@
package net.miarma.api.microservices.core.enums;
import net.miarma.api.backlib.interfaces.IUserRole;
public enum CoreUserGlobalRole implements IUserRole {
USER(0),
ADMIN(1);
private final int value;
CoreUserGlobalRole(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static CoreUserGlobalRole fromInt(int i) {
for (CoreUserGlobalRole role : values()) {
if (role.value == i) return role;
}
throw new IllegalArgumentException("Invalid CoreUserGlobalRole value: " + i);
}
}

View File

@@ -0,0 +1,26 @@
package net.miarma.api.microservices.core.enums;
import net.miarma.api.backlib.interfaces.IValuableEnum;
public enum CoreUserGlobalStatus implements IValuableEnum {
INACTIVE(0),
ACTIVE(1);
private final int value;
CoreUserGlobalStatus(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static CoreUserGlobalStatus fromInt(int i) {
for (CoreUserGlobalStatus status : values()) {
if (status.value == i) return status;
}
throw new IllegalArgumentException("Invalid CoreUserGlobalStatus value: " + i);
}
}

View File

@@ -1,25 +1,33 @@
package net.miarma.api.backlib.core.handlers; package net.miarma.api.microservices.core.handlers;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.UUID;
import org.slf4j.Logger;
import com.google.gson.Gson;
import io.vertx.core.buffer.Buffer; import io.vertx.core.buffer.Buffer;
import io.vertx.core.json.JsonObject; import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.FileUpload; import io.vertx.ext.web.FileUpload;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.gson.GsonProvider;
import net.miarma.api.backlib.Constants.CoreFileContext;
import net.miarma.api.backlib.http.ApiStatus; import net.miarma.api.backlib.http.ApiStatus;
import net.miarma.api.backlib.http.QueryParams; import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.backlib.core.entities.FileEntity; import net.miarma.api.backlib.log.LoggerProvider;
import net.miarma.api.backlib.core.services.FileService;
import net.miarma.api.backlib.util.JsonUtil; import net.miarma.api.backlib.util.JsonUtil;
import net.miarma.api.microservices.core.entities.FileEntity;
import java.io.IOException; import net.miarma.api.microservices.core.enums.CoreFileContext;
import java.nio.file.Files; import net.miarma.api.microservices.core.services.FileService;
import java.nio.file.Paths;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class FileDataHandler { public class FileDataHandler {
private final Logger LOGGER = LoggerProvider.getLogger();
private final Gson GSON = GsonProvider.get();
private final FileService fileService; private final FileService fileService;
public FileDataHandler(Pool pool) { public FileDataHandler(Pool pool) {
@@ -35,7 +43,7 @@ public class FileDataHandler {
} }
public void getById(RoutingContext ctx) { public void getById(RoutingContext ctx) {
Integer fileId = Integer.parseInt(ctx.pathParam("file_id")); UUID fileId = UUID.fromString(ctx.pathParam("file_id"));
fileService.getById(fileId) fileService.getById(fileId)
.onSuccess(file -> JsonUtil.sendJson(ctx, ApiStatus.OK, file)) .onSuccess(file -> JsonUtil.sendJson(ctx, ApiStatus.OK, file))
@@ -46,7 +54,7 @@ public class FileDataHandler {
try { try {
String fileName = ctx.request().getFormAttribute("file_name"); String fileName = ctx.request().getFormAttribute("file_name");
String mimeType = ctx.request().getFormAttribute("mime_type"); String mimeType = ctx.request().getFormAttribute("mime_type");
int uploadedBy = Integer.parseInt(ctx.request().getFormAttribute("uploaded_by")); UUID uploadedBy = UUID.fromString(ctx.request().getFormAttribute("uploaded_by"));
int contextValue = Integer.parseInt(ctx.request().getFormAttribute("context")); int contextValue = Integer.parseInt(ctx.request().getFormAttribute("context"));
FileUpload upload = ctx.fileUploads().stream() FileUpload upload = ctx.fileUploads().stream()
@@ -58,23 +66,23 @@ public class FileDataHandler {
byte[] fileBinary = buffer.getBytes(); byte[] fileBinary = buffer.getBytes();
FileEntity file = new FileEntity(); FileEntity file = new FileEntity();
file.setFile_name(fileName); file.setFileName(fileName);
file.setMime_type(mimeType); file.setMimeType(mimeType);
file.setUploaded_by(uploadedBy); file.setUploadedBy(uploadedBy);
file.setContext(CoreFileContext.fromInt(contextValue)); file.setContext(CoreFileContext.fromInt(contextValue));
fileService.create(file, fileBinary) fileService.create(file, fileBinary)
.onSuccess(result -> JsonUtil.sendJson(ctx, ApiStatus.CREATED, result)) .onSuccess(result -> JsonUtil.sendJson(ctx, ApiStatus.CREATED, result))
.onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage())); .onFailure(err -> JsonUtil.sendJson(ctx, ApiStatus.fromException(err), null, err.getMessage()));
} catch (Exception e) { } catch (Exception e) {
Constants.LOGGER.error(e.getMessage(), e); LOGGER.error(e.getMessage(), e);
JsonUtil.sendJson(ctx, ApiStatus.INTERNAL_SERVER_ERROR, null, e.getMessage()); JsonUtil.sendJson(ctx, ApiStatus.INTERNAL_SERVER_ERROR, null, e.getMessage());
} }
} }
public void update(RoutingContext ctx) { public void update(RoutingContext ctx) {
FileEntity file = Constants.GSON.fromJson(ctx.body().asString(), FileEntity.class); FileEntity file = GSON.fromJson(ctx.body().asString(), FileEntity.class);
fileService.update(file) fileService.update(file)
.onSuccess(result -> JsonUtil.sendJson(ctx, ApiStatus.OK, result)) .onSuccess(result -> JsonUtil.sendJson(ctx, ApiStatus.OK, result))
@@ -82,14 +90,14 @@ public class FileDataHandler {
} }
public void delete(RoutingContext ctx) { public void delete(RoutingContext ctx) {
Integer fileId = Integer.parseInt(ctx.pathParam("file_id")); UUID fileId = UUID.fromString(ctx.pathParam("file_id"));
JsonObject body = ctx.body().asJsonObject(); JsonObject body = ctx.body().asJsonObject();
String filePath = body.getString("file_path"); String filePath = body.getString("file_path");
try { try {
Files.deleteIfExists(Paths.get(filePath)); Files.deleteIfExists(Paths.get(filePath));
} catch (IOException e) { } catch (IOException e) {
Constants.LOGGER.error(e.getMessage(), e); LOGGER.error(e.getMessage(), e);
JsonUtil.sendJson(ctx, ApiStatus.INTERNAL_SERVER_ERROR, null, e.getMessage()); JsonUtil.sendJson(ctx, ApiStatus.INTERNAL_SERVER_ERROR, null, e.getMessage());
return; return;
} }

View File

@@ -1,9 +1,11 @@
package net.miarma.api.backlib.core.handlers; package net.miarma.api.microservices.core.handlers;
import java.util.UUID;
import io.vertx.core.Vertx; import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject; import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.http.ApiStatus; import net.miarma.api.backlib.http.ApiStatus;
import net.miarma.api.backlib.security.JWTManager; import net.miarma.api.backlib.security.JWTManager;
import net.miarma.api.backlib.util.JsonUtil; import net.miarma.api.backlib.util.JsonUtil;
@@ -11,6 +13,8 @@ import net.miarma.api.backlib.util.JsonUtil;
public class FileLogicHandler { public class FileLogicHandler {
private final Vertx vertx; private final Vertx vertx;
private final String CORE_EVENT_BUS = ConfigManager.getInstance()
.getStringProperty("eventbus.core.address");
public FileLogicHandler(Vertx vertx) { public FileLogicHandler(Vertx vertx) {
this.vertx = vertx; this.vertx = vertx;
@@ -25,14 +29,14 @@ public class FileLogicHandler {
} }
String token = authHeader.substring(7); String token = authHeader.substring(7);
int userId = JWTManager.getInstance().getUserId(token); UUID userId = JWTManager.getInstance().extractUserId(token);
if (userId <= 0) { if (userId == null) {
JsonUtil.sendJson(ctx, ApiStatus.UNAUTHORIZED, null, "Invalid token"); JsonUtil.sendJson(ctx, ApiStatus.UNAUTHORIZED, null, "Invalid or expired token");
return false; return false;
} }
request.put("userId", userId); request.put("userId", userId.toString());
return true; return true;
} }
@@ -40,7 +44,7 @@ public class FileLogicHandler {
JsonObject request = new JsonObject().put("action", "getUserFiles"); JsonObject request = new JsonObject().put("action", "getUserFiles");
if (!validateAuth(ctx, request)) return; if (!validateAuth(ctx, request)) return;
vertx.eventBus().request(Constants.CORE_EVENT_BUS, request, ar -> { vertx.eventBus().request(CORE_EVENT_BUS, request, ar -> {
if (ar.succeeded()) { if (ar.succeeded()) {
JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body()); JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body());
} else { } else {
@@ -50,13 +54,15 @@ public class FileLogicHandler {
} }
public void downloadFile(RoutingContext ctx) { public void downloadFile(RoutingContext ctx) {
UUID fileId = UUID.fromString(ctx.pathParam("file_id"));
JsonObject request = new JsonObject() JsonObject request = new JsonObject()
.put("action", "downloadFile") .put("action", "downloadFile")
.put("fileId", Integer.parseInt(ctx.pathParam("file_id"))); .put("fileId", fileId.toString());
if (!validateAuth(ctx, request)) return; if (!validateAuth(ctx, request)) return;
vertx.eventBus().request(Constants.CORE_EVENT_BUS, request, ar -> { vertx.eventBus().request(CORE_EVENT_BUS, request, ar -> {
if (ar.succeeded()) { if (ar.succeeded()) {
JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body()); JsonUtil.sendJson(ctx, ApiStatus.OK, ar.result().body());
} else { } else {

View File

@@ -1,4 +1,4 @@
package net.miarma.api.backlib.core.handlers; package net.miarma.api.microservices.core.handlers;
import io.vertx.core.Vertx; import io.vertx.core.Vertx;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;

View File

@@ -1,17 +1,21 @@
package net.miarma.api.backlib.core.handlers; package net.miarma.api.microservices.core.handlers;
import com.google.gson.Gson;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.gson.GsonProvider;
import net.miarma.api.backlib.http.ApiStatus; import net.miarma.api.backlib.http.ApiStatus;
import net.miarma.api.backlib.http.QueryParams; import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.backlib.util.JsonUtil; import net.miarma.api.backlib.util.JsonUtil;
import net.miarma.api.backlib.core.entities.UserEntity; import net.miarma.api.microservices.core.entities.UserEntity;
import net.miarma.api.backlib.core.services.UserService; import net.miarma.api.microservices.core.services.UserService;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class UserDataHandler { public class UserDataHandler {
private final Gson GSON = GsonProvider.get();
private final UserService userService; private final UserService userService;
public UserDataHandler(Pool pool) { public UserDataHandler(Pool pool) {
@@ -39,7 +43,7 @@ public class UserDataHandler {
} }
public void create(RoutingContext ctx) { public void create(RoutingContext ctx) {
UserEntity user = Constants.GSON.fromJson(ctx.body().asString(), UserEntity.class); UserEntity user = GSON.fromJson(ctx.body().asString(), UserEntity.class);
userService.register(user) userService.register(user)
.onSuccess(result -> JsonUtil.sendJson(ctx, ApiStatus.CREATED, result)).onFailure(err -> { .onSuccess(result -> JsonUtil.sendJson(ctx, ApiStatus.CREATED, result)).onFailure(err -> {
@@ -49,7 +53,7 @@ public class UserDataHandler {
} }
public void update(RoutingContext ctx) { public void update(RoutingContext ctx) {
UserEntity user = Constants.GSON.fromJson(ctx.body().asString(), UserEntity.class); UserEntity user = GSON.fromJson(ctx.body().asString(), UserEntity.class);
userService.update(user) userService.update(user)
.onSuccess(result -> JsonUtil.sendJson(ctx, ApiStatus.NO_CONTENT, result)).onFailure(err -> { .onSuccess(result -> JsonUtil.sendJson(ctx, ApiStatus.NO_CONTENT, result)).onFailure(err -> {

View File

@@ -1,4 +1,4 @@
package net.miarma.api.backlib.core.handlers; package net.miarma.api.microservices.core.handlers;
import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.DecodedJWT;
@@ -10,7 +10,7 @@ import net.miarma.api.backlib.http.ApiStatus;
import net.miarma.api.backlib.security.JWTManager; import net.miarma.api.backlib.security.JWTManager;
import net.miarma.api.backlib.util.EventBusUtil; import net.miarma.api.backlib.util.EventBusUtil;
import net.miarma.api.backlib.util.JsonUtil; import net.miarma.api.backlib.util.JsonUtil;
import net.miarma.api.backlib.core.entities.UserEntity; import net.miarma.api.microservices.core.entities.UserEntity;
public class UserLogicHandler { public class UserLogicHandler {

View File

@@ -5,9 +5,9 @@ import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.Constants.CoreUserRole; import net.miarma.api.backlib.Constants.CoreUserRole;
import net.miarma.api.backlib.core.handlers.FileDataHandler; import net.miarma.api.microservices.core.handlers.FileDataHandler;
import net.miarma.api.backlib.core.handlers.UserDataHandler; import net.miarma.api.microservices.core.handlers.UserDataHandler;
import net.miarma.api.backlib.core.services.UserService; import net.miarma.api.microservices.core.services.UserService;
import net.miarma.api.microservices.core.routing.middlewares.CoreAuthGuard; import net.miarma.api.microservices.core.routing.middlewares.CoreAuthGuard;
public class CoreDataRouter { public class CoreDataRouter {

View File

@@ -5,10 +5,10 @@ import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.Constants.CoreUserRole; import net.miarma.api.backlib.Constants.CoreUserRole;
import net.miarma.api.backlib.core.handlers.FileLogicHandler; import net.miarma.api.microservices.core.handlers.FileLogicHandler;
import net.miarma.api.backlib.core.handlers.ScreenshotHandler; import net.miarma.api.microservices.core.handlers.ScreenshotHandler;
import net.miarma.api.backlib.core.handlers.UserLogicHandler; import net.miarma.api.microservices.core.handlers.UserLogicHandler;
import net.miarma.api.backlib.core.services.UserService; import net.miarma.api.microservices.core.services.UserService;
import net.miarma.api.microservices.core.routing.middlewares.CoreAuthGuard; import net.miarma.api.microservices.core.routing.middlewares.CoreAuthGuard;
public class CoreLogicRouter { public class CoreLogicRouter {

View File

@@ -5,8 +5,8 @@ import java.util.function.Consumer;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;
import net.miarma.api.backlib.Constants.CoreUserRole; import net.miarma.api.backlib.Constants.CoreUserRole;
import net.miarma.api.backlib.middlewares.AbstractAuthGuard; import net.miarma.api.backlib.middlewares.AbstractAuthGuard;
import net.miarma.api.backlib.core.entities.UserEntity; import net.miarma.api.microservices.core.entities.UserEntity;
import net.miarma.api.backlib.core.services.UserService; import net.miarma.api.microservices.core.services.UserService;
public class CoreAuthGuard extends AbstractAuthGuard<UserEntity, CoreUserRole> { public class CoreAuthGuard extends AbstractAuthGuard<UserEntity, CoreUserRole> {
private final UserService userService; private final UserService userService;

View File

@@ -0,0 +1,91 @@
package net.miarma.api.microservices.core.services;
import java.util.UUID;
import io.vertx.core.Future;
import io.vertx.core.json.JsonObject;
import io.vertx.sqlclient.Pool;
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.security.JWTManager;
import net.miarma.api.backlib.security.PasswordHasher;
import net.miarma.api.microservices.core.dao.CredentialDAO;
import net.miarma.api.microservices.core.dao.UserDAO;
import net.miarma.api.microservices.core.entities.CredentialEntity;
import net.miarma.api.microservices.core.entities.UserEntity;
import net.miarma.api.microservices.core.enums.CoreUserGlobalRole;
import net.miarma.api.microservices.core.enums.CoreUserGlobalStatus;
public class AuthService {
private final UserDAO userDAO;
private final CredentialDAO credentialDAO;
private final int serviceId;
public AuthService(Pool pool, int serviceId) {
this.userDAO = new UserDAO(pool);
this.credentialDAO = new CredentialDAO(pool);
this.serviceId = serviceId;
}
/**
* Login: Comprueba credenciales y devuelve el token + datos del usuario
*/
public Future<JsonObject> login(String login, String plainPassword, boolean keepLoggedIn) {
return credentialDAO.getByServiceAndUsername(this.serviceId, login).compose(cred -> {
if (cred == null) {
return Future.failedFuture(new BadRequestException("Invalid credentials"));
}
if (!PasswordHasher.verify(plainPassword, cred.getPassword())) {
return Future.failedFuture(new BadRequestException("Invalid credentials"));
}
return userDAO.getById(cred.getUserId()).compose(user -> {
if (user == null) {
return Future.failedFuture(new NotFoundException("User not found"));
}
if (user.getGlobalStatus() != CoreUserGlobalStatus.ACTIVE) {
return Future.failedFuture(new ForbiddenException("User is inactive"));
}
String token = JWTManager.getInstance().generateToken(
cred.getUsername(),
user.getUserId(),
user.getGlobalRole(),
this.serviceId,
keepLoggedIn
);
JsonObject response = new JsonObject()
.put("token", token)
.put("user", JsonObject.mapFrom(user));
return Future.succeededFuture(response);
});
});
}
/**
* Register: Crea el perfil global y la credencial de servicio
*/
public Future<UserEntity> register(UserEntity profile, String username, String email, String password) {
profile.setUserId(UUID.randomUUID());
profile.setGlobalRole(CoreUserGlobalRole.USER);
profile.setGlobalStatus(CoreUserGlobalStatus.ACTIVE);
return userDAO.insert(profile).compose(savedUser -> {
CredentialEntity cred = new CredentialEntity();
cred.setCredentialId(UUID.randomUUID());
cred.setUserId(savedUser.getUserId());
cred.setServiceId(this.serviceId);
cred.setUsername(username);
cred.setEmail(email);
cred.setPassword(PasswordHasher.hash(password));
cred.setStatus(1);
return credentialDAO.insert(cred).map(savedUser);
});
}
}

View File

@@ -1,27 +1,35 @@
package net.miarma.api.backlib.core.services; package net.miarma.api.microservices.core.services;
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.OSType;
import net.miarma.api.backlib.exceptions.NotFoundException;
import net.miarma.api.backlib.exceptions.ValidationException;
import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.backlib.core.dao.FileDAO;
import net.miarma.api.backlib.core.entities.FileEntity;
import net.miarma.api.backlib.core.validators.FileValidator;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.List; import java.util.List;
import java.util.UUID;
import org.slf4j.Logger;
import com.google.gson.Gson;
import io.vertx.core.Future;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.config.OSType;
import net.miarma.api.backlib.exceptions.NotFoundException;
import net.miarma.api.backlib.exceptions.ValidationException;
import net.miarma.api.backlib.gson.GsonProvider;
import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.backlib.log.LoggerProvider;
import net.miarma.api.microservices.core.dao.FileDAO;
import net.miarma.api.microservices.core.entities.FileEntity;
import net.miarma.api.microservices.core.validators.FileValidator;
public class FileService { public class FileService {
private final FileDAO fileDAO; private final FileDAO fileDAO;
private final FileValidator fileValidator; private final FileValidator fileValidator;
private final Gson GSON = GsonProvider.get();
private final Logger LOGGER = LoggerProvider.getLogger();
public FileService(Pool pool) { public FileService(Pool pool) {
this.fileDAO = new FileDAO(pool); this.fileDAO = new FileDAO(pool);
@@ -32,7 +40,7 @@ public class FileService {
return fileDAO.getAll(params); return fileDAO.getAll(params);
} }
public Future<FileEntity> getById(Integer id) { public Future<FileEntity> getById(UUID id) {
return fileDAO.getById(id).compose(file -> { return fileDAO.getById(id).compose(file -> {
if (file == null) { if (file == null) {
return Future.failedFuture(new NotFoundException("File not found with id: " + id)); return Future.failedFuture(new NotFoundException("File not found with id: " + id));
@@ -41,28 +49,28 @@ public class FileService {
}); });
} }
public Future<List<FileEntity>> getUserFiles(Integer userId) { public Future<List<FileEntity>> getUserFiles(UUID userId) {
return fileDAO.getUserFiles(userId); return fileDAO.getUserFiles(userId);
} }
public Future<FileEntity> create(FileEntity file, byte[] fileBinary) { public Future<FileEntity> create(FileEntity file, byte[] fileBinary) {
return fileValidator.validate(file, fileBinary.length).compose(validation -> { return fileValidator.validateAsync(file, fileBinary.length).compose(validation -> {
if (!validation.isValid()) { if (!validation.isValid()) {
return Future.failedFuture(new ValidationException(Constants.GSON.toJson(validation.getErrors()))); return Future.failedFuture(new ValidationException(GSON.toJson(validation.getErrors())));
} }
String dir = ConfigManager.getInstance() String dir = ConfigManager.getInstance()
.getFilesDir(file.getContext().toCtxString()); .getFilesDir(file.getContext().toCtxString());
String pathString = dir + file.getFile_name(); String pathString = dir + file.getFileName();
Path filePath = Paths.get(dir + file.getFile_name()); Path filePath = Paths.get(dir + file.getFileName());
file.setFile_path(ConfigManager.getOS() == OSType.WINDOWS ? file.setFilePath(ConfigManager.getOS() == OSType.WINDOWS ?
pathString.replace("\\", "\\\\") : pathString); pathString.replace("\\", "\\\\") : pathString);
try { try {
Files.write(filePath, fileBinary); Files.write(filePath, fileBinary);
} catch (IOException e) { } catch (IOException e) {
Constants.LOGGER.error("Error writing file to disk: ", e); LOGGER.error("Error writing file to disk: ", e);
return Future.failedFuture(e); return Future.failedFuture(e);
} }
@@ -70,14 +78,14 @@ public class FileService {
}); });
} }
public Future<FileEntity> downloadFile(Integer fileId) { public Future<FileEntity> downloadFile(UUID fileId) {
return getById(fileId); return getById(fileId);
} }
public Future<FileEntity> update(FileEntity file) { public Future<FileEntity> update(FileEntity file) {
return fileValidator.validate(file).compose(validation -> { return fileValidator.validateAsync(file).compose(validation -> {
if (!validation.isValid()) { if (!validation.isValid()) {
return Future.failedFuture(new ValidationException(Constants.GSON.toJson(validation.getErrors()))); return Future.failedFuture(new ValidationException(GSON.toJson(validation.getErrors())));
} }
return fileDAO.update(file); return fileDAO.update(file);
@@ -85,27 +93,27 @@ public class FileService {
} }
public Future<FileEntity> upsert(FileEntity file) { public Future<FileEntity> upsert(FileEntity file) {
return fileValidator.validate(file).compose(validation -> { return fileValidator.validateAsync(file).compose(validation -> {
if (!validation.isValid()) { if (!validation.isValid()) {
return Future.failedFuture(new ValidationException(Constants.GSON.toJson(validation.getErrors()))); return Future.failedFuture(new ValidationException(GSON.toJson(validation.getErrors())));
} }
return fileDAO.upsert(file, "file_id"); return fileDAO.upsert(file, "file_id");
}); });
} }
public Future<Boolean> delete(Integer fileId) { public Future<Boolean> delete(UUID fileId) {
return getById(fileId).compose(file -> { return getById(fileId).compose(file -> {
String dir = ConfigManager.getInstance() String dir = ConfigManager.getInstance()
.getFilesDir(file.getContext().toCtxString()); .getFilesDir(file.getContext().toCtxString());
String filePath = dir + file.getFile_name(); String filePath = dir + file.getFileName();
Path path = Paths.get(filePath); Path path = Paths.get(filePath);
try { try {
Files.deleteIfExists(path); Files.deleteIfExists(path);
} catch (IOException e) { } catch (IOException e) {
Constants.LOGGER.error("Error deleting file from disk: ", e); LOGGER.error("Error deleting file from disk: ", e);
return Future.failedFuture(e); return Future.failedFuture(e);
} }
@@ -118,7 +126,7 @@ public class FileService {
}); });
} }
public Future<Boolean> exists(Integer fileId) { public Future<Boolean> exists(UUID fileId) {
return fileDAO.exists(fileId); return fileDAO.exists(fileId);
} }
} }

View File

@@ -0,0 +1,55 @@
package net.miarma.api.microservices.core.services;
import java.util.List;
import java.util.UUID;
import io.vertx.core.Future;
import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.exceptions.NotFoundException;
import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.microservices.core.dao.UserDAO;
import net.miarma.api.microservices.core.entities.UserEntity;
import net.miarma.api.microservices.core.enums.CoreUserGlobalRole;
import net.miarma.api.microservices.core.enums.CoreUserGlobalStatus;
public class UserService {
private final UserDAO userDAO;
public UserService(Pool pool) {
this.userDAO = new UserDAO(pool);
}
public Future<List<UserEntity>> getAll(QueryParams params) {
return userDAO.getAll(params);
}
public Future<UserEntity> getById(UUID id) {
return userDAO.getById(id).compose(user -> {
if (user == null) return Future.failedFuture(new NotFoundException("User not found"));
return Future.succeededFuture(user);
});
}
public Future<UserEntity> updateProfile(UserEntity user) {
return userDAO.update(user);
}
public Future<UserEntity> changeRole(UUID userId, CoreUserGlobalRole newRole) {
return getById(userId).compose(user -> {
user.setGlobalRole(newRole);
return userDAO.update(user);
});
}
public Future<UserEntity> changeStatus(UUID userId, CoreUserGlobalStatus newStatus) {
return getById(userId).compose(user -> {
user.setGlobalStatus(newStatus);
return userDAO.update(user);
});
}
public Future<Boolean> deleteUser(UUID id) {
return userDAO.delete(id);
}
}

View File

@@ -0,0 +1,63 @@
package net.miarma.api.microservices.core.validators;
import io.vertx.core.Future;
import net.miarma.api.backlib.validation.ValidationResult;
import net.miarma.api.microservices.core.entities.FileEntity;
public class FileValidator {
private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
public Future<ValidationResult> validateAsync(FileEntity file, long size) {
ValidationResult result = validate(file);
if (size <= 0) {
result.addError("size", "File size must be greater than 0 bytes");
}
if (size > MAX_FILE_SIZE) {
result.addError("size", "File size exceeds the 10 MB limit");
}
return Future.succeededFuture(result);
}
public Future<ValidationResult> validateAsync(FileEntity file) {
ValidationResult result = validate(file);
return Future.succeededFuture(result);
}
private ValidationResult validate(FileEntity file) {
ValidationResult result = new ValidationResult();
if (file == null) {
return result.addError("file", "File object cannot be null");
}
if (file.getFileName() == null || file.getFileName().isBlank()) {
result.addError("file_name", "File name is required");
} else if (file.getFileName().length() > 255) {
result.addError("file_name", "File name is too long (max 255 characters)");
}
if (file.getFilePath() == null || file.getFilePath().isBlank()) {
result.addError("file_path", "File path is required");
} else if (file.getFilePath().length() > 255) {
result.addError("file_path", "File path is too long (max 255 characters)");
}
if (file.getMimeType() == null || file.getMimeType().isBlank()) {
result.addError("mime_type", "MIME type is required");
}
if (file.getContext() == null) {
result.addError("context", "File context is required");
}
if (file.getUploadedBy() == null) {
result.addError("uploaded_by", "Uploader User ID is required");
}
return result;
}
}

View File

@@ -0,0 +1,45 @@
package net.miarma.api.microservices.core.validators;
import io.vertx.core.Future;
import net.miarma.api.backlib.validation.ValidationResult;
import net.miarma.api.microservices.core.entities.CredentialEntity;
import net.miarma.api.microservices.core.entities.UserEntity;
public class UserValidator {
public Future<ValidationResult> validateAsync(UserEntity user, CredentialEntity creds) {
ValidationResult result = new ValidationResult();
if (user == null) {
return Future.succeededFuture(result.addError("user", "User profile cannot be null"));
}
if (user.getDisplayName() == null || user.getDisplayName().isBlank()) {
result.addError("display_name", "Display name is required");
}
if (creds == null) {
return Future.succeededFuture(result.addError("credentials", "Credentials are required"));
}
if (creds.getUsername() == null || creds.getUsername().isBlank()) {
result.addError("username", "Username is required");
}
if (creds.getEmail() != null && !creds.getEmail().isBlank()) {
if (!creds.getEmail().matches("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$")) {
result.addError("email", "Invalid email format");
}
} else {
result.addError("email", "Email is required");
}
if (creds.getPassword() == null || creds.getPassword().isBlank()) {
result.addError("password", "Password is required");
} else if (creds.getPassword().length() < 6) {
result.addError("password", "Password must be at least 6 characters long");
}
return Future.succeededFuture(result);
}
}

View File

@@ -9,13 +9,13 @@ import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router; import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.Constants.CoreUserGlobalStatus; import net.miarma.api.backlib.Constants.CoreUserGlobalStatus;
import net.miarma.api.backlib.Constants.CoreUserRole; import net.miarma.api.backlib.Constants.CoreUserRole;
import net.miarma.api.backlib.core.entities.UserEntity; import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.core.services.FileService; import net.miarma.api.microservices.core.entities.UserEntity;
import net.miarma.api.backlib.core.services.UserService; import net.miarma.api.microservices.core.services.FileService;
import net.miarma.api.microservices.core.services.UserService;
import net.miarma.api.backlib.db.DatabaseProvider; import net.miarma.api.backlib.db.DatabaseProvider;
import net.miarma.api.backlib.util.EventBusUtil; import net.miarma.api.backlib.util.EventBusUtil;
import net.miarma.api.backlib.util.RouterUtil; import net.miarma.api.backlib.util.RouterUtil;

View File

@@ -5,7 +5,7 @@ import io.vertx.core.Promise;
import io.vertx.ext.web.Router; import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager; import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.db.DatabaseProvider; import net.miarma.api.backlib.db.DatabaseProvider;
import net.miarma.api.backlib.util.RouterUtil; import net.miarma.api.backlib.util.RouterUtil;
import net.miarma.api.microservices.core.routing.CoreLogicRouter; import net.miarma.api.microservices.core.routing.CoreLogicRouter;

View File

@@ -4,9 +4,9 @@ import io.vertx.core.AbstractVerticle;
import io.vertx.core.DeploymentOptions; import io.vertx.core.DeploymentOptions;
import io.vertx.core.Promise; import io.vertx.core.Promise;
import io.vertx.core.ThreadingModel; import io.vertx.core.ThreadingModel;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.LogAccumulator; import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.log.LogAccumulator;
import net.miarma.api.backlib.util.DeploymentUtil; import net.miarma.api.backlib.util.DeploymentUtil;
public class CoreMainVerticle extends AbstractVerticle { public class CoreMainVerticle extends AbstractVerticle {

View File

@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>net.miarma.api</groupId> <groupId>net.miarma.api</groupId>
<artifactId>huertos</artifactId> <artifactId>huertos</artifactId>
<version>1.2.1</version> <version>2.0.0</version>
<properties> <properties>
<maven.compiler.source>23</maven.compiler.source> <maven.compiler.source>23</maven.compiler.source>
@@ -20,7 +20,7 @@
<dependency> <dependency>
<groupId>net.miarma.api</groupId> <groupId>net.miarma.api</groupId>
<artifactId>backlib</artifactId> <artifactId>backlib</artifactId>
<version>1.2.1</version> <version>2.0.0</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@@ -0,0 +1,27 @@
package net.miarma.api.microservices.huertos.enums;
import net.miarma.api.backlib.interfaces.IValuableEnum;
public enum HuertosAnnouncementPriority implements IValuableEnum {
LOW(0),
MEDIUM(1),
HIGH(2);
private final int value;
HuertosAnnouncementPriority(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosAnnouncementPriority fromInt(int i) {
for (HuertosAnnouncementPriority priority : values()) {
if (priority.value == i) return priority;
}
throw new IllegalArgumentException("Invalid HuertosAnnouncementPriority value: " + i);
}
}

View File

@@ -0,0 +1,26 @@
package net.miarma.api.microservices.huertos.enums;
import net.miarma.api.backlib.interfaces.IValuableEnum;
public enum HuertosPaymentFrequency implements IValuableEnum {
BIYEARLY(0),
YEARLY(1);
private final int value;
HuertosPaymentFrequency(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosPaymentFrequency fromInt(int i) {
for (HuertosPaymentFrequency frequency : values()) {
if (frequency.value == i) return frequency;
}
throw new IllegalArgumentException("Invalid HuertoPaymentFrequency value: " + i);
}
}

View File

@@ -0,0 +1,26 @@
package net.miarma.api.microservices.huertos.enums;
import net.miarma.api.backlib.interfaces.IValuableEnum;
public enum HuertosPaymentType implements IValuableEnum {
BANK(0),
CASH(1);
private final int value;
HuertosPaymentType(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosPaymentType fromInt(int i) {
for (HuertosPaymentType type : values()) {
if (type.value == i) return type;
}
throw new IllegalArgumentException("Invalid HuertoPaymentType value: " + i);
}
}

View File

@@ -0,0 +1,27 @@
package net.miarma.api.microservices.huertos.enums;
import net.miarma.api.backlib.interfaces.IValuableEnum;
public enum HuertosRequestStatus implements IValuableEnum {
PENDING(0),
APPROVED(1),
REJECTED(2);
private final int value;
HuertosRequestStatus(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosRequestStatus fromInt(int i) {
for (HuertosRequestStatus status : values()) {
if (status.value == i) return status;
}
throw new IllegalArgumentException("Invalid HuertoRequestStatus value: " + i);
}
}

View File

@@ -0,0 +1,30 @@
package net.miarma.api.microservices.huertos.enums;
import net.miarma.api.backlib.interfaces.IValuableEnum;
public enum HuertosRequestType implements IValuableEnum {
REGISTER(0),
UNREGISTER(1),
ADD_COLLABORATOR(2),
REMOVE_COLLABORATOR(3),
ADD_GREENHOUSE(4),
REMOVE_GREENHOUSE(5);
private final int value;
HuertosRequestType(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosRequestType fromInt(int i) {
for (HuertosRequestType type : values()) {
if (type.value == i) return type;
}
throw new IllegalArgumentException("Invalid HuertoRequestType value: " + i);
}
}

View File

@@ -0,0 +1,27 @@
package net.miarma.api.microservices.huertos.enums;
import net.miarma.api.backlib.interfaces.IUserRole;
public enum HuertosUserRole implements IUserRole {
USER(0),
ADMIN(1),
DEV(2);
private final int value;
HuertosUserRole(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosUserRole fromInt(int i) {
for (HuertosUserRole role : values()) {
if (role.value == i) return role;
}
throw new IllegalArgumentException("Invalid HuertosUserRole value: " + i);
}
}

View File

@@ -0,0 +1,30 @@
package net.miarma.api.microservices.huertos.enums;
import net.miarma.api.backlib.interfaces.IValuableEnum;
public enum HuertosUserType implements IValuableEnum {
WAIT_LIST(0),
MEMBER(1),
WITH_GREENHOUSE(2),
COLLABORATOR(3),
DEVELOPER(5),
SUBSIDY(4);
private final int value;
HuertosUserType(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static HuertosUserType fromInt(int i) {
for (HuertosUserType type : values()) {
if (type.value == i) return type;
}
throw new IllegalArgumentException("Invalid HuertosUserType value: " + i);
}
}

View File

@@ -10,8 +10,8 @@ import io.vertx.core.WorkerExecutor;
import io.vertx.core.json.Json; import io.vertx.core.json.Json;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.http.ApiStatus; import net.miarma.api.backlib.http.ApiStatus;
import net.miarma.api.backlib.security.JWTManager; import net.miarma.api.backlib.security.JWTManager;
import net.miarma.api.microservices.huertos.entities.MemberEntity; import net.miarma.api.microservices.huertos.entities.MemberEntity;

View File

@@ -14,7 +14,7 @@ import jakarta.mail.Session;
import jakarta.mail.Store; import jakarta.mail.Store;
import jakarta.mail.internet.MimeMessage; import jakarta.mail.internet.MimeMessage;
import jakarta.mail.internet.MimeUtility; import jakarta.mail.internet.MimeUtility;
import net.miarma.api.backlib.ConfigManager; import net.miarma.api.backlib.config.ConfigManager;
public class ImapReader { public class ImapReader {

View File

@@ -23,7 +23,7 @@ import jakarta.mail.Session;
import jakarta.mail.Store; import jakarta.mail.Store;
import jakarta.mail.internet.InternetAddress; import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage; import jakarta.mail.internet.MimeMessage;
import net.miarma.api.backlib.ConfigManager; import net.miarma.api.backlib.config.ConfigManager;
public class MailManager { public class MailManager {
private final Vertx vertx; private final Vertx vertx;
@@ -31,6 +31,9 @@ public class MailManager {
private final int smtpPort; private final int smtpPort;
private final Map<String, MailClient> clientCache = new ConcurrentHashMap<>(); private final Map<String, MailClient> clientCache = new ConcurrentHashMap<>();
public static final List<String> HUERTOS_ALLOWED_MAIL_FOLDERS =
List.of("INBOX", "Drafts", "Sent", "Spam", "Trash");
public MailManager(Vertx vertx) { public MailManager(Vertx vertx) {
this.vertx = vertx; this.vertx = vertx;
this.smtpHost = ConfigManager.getInstance().getStringProperty("smtp.server"); this.smtpHost = ConfigManager.getInstance().getStringProperty("smtp.server");

View File

@@ -9,10 +9,10 @@ import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router; import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.Constants.HuertosUserStatus; import net.miarma.api.backlib.Constants.HuertosUserStatus;
import net.miarma.api.backlib.Constants.HuertosUserType; import net.miarma.api.backlib.Constants.HuertosUserType;
import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.db.DatabaseProvider; import net.miarma.api.backlib.db.DatabaseProvider;
import net.miarma.api.backlib.util.EventBusUtil; import net.miarma.api.backlib.util.EventBusUtil;
import net.miarma.api.backlib.util.NameCensorer; import net.miarma.api.backlib.util.NameCensorer;

View File

@@ -5,7 +5,7 @@ import io.vertx.core.Promise;
import io.vertx.ext.web.Router; import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager; import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.db.DatabaseProvider; import net.miarma.api.backlib.db.DatabaseProvider;
import net.miarma.api.backlib.util.RouterUtil; import net.miarma.api.backlib.util.RouterUtil;
import net.miarma.api.microservices.huertos.routing.HuertosLogicRouter; import net.miarma.api.microservices.huertos.routing.HuertosLogicRouter;

View File

@@ -2,9 +2,9 @@ package net.miarma.api.microservices.huertos.verticles;
import io.vertx.core.AbstractVerticle; import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise; import io.vertx.core.Promise;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.LogAccumulator; import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.log.LogAccumulator;
import net.miarma.api.backlib.util.DeploymentUtil; import net.miarma.api.backlib.util.DeploymentUtil;
public class HuertosMainVerticle extends AbstractVerticle { public class HuertosMainVerticle extends AbstractVerticle {

View File

@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>net.miarma.api</groupId> <groupId>net.miarma.api</groupId>
<artifactId>huertosdecine</artifactId> <artifactId>huertosdecine</artifactId>
<version>1.2.1</version> <version>2.0.0</version>
<properties> <properties>
<maven.compiler.source>23</maven.compiler.source> <maven.compiler.source>23</maven.compiler.source>
@@ -20,7 +20,7 @@
<dependency> <dependency>
<groupId>net.miarma.api</groupId> <groupId>net.miarma.api</groupId>
<artifactId>backlib</artifactId> <artifactId>backlib</artifactId>
<version>1.2.1</version> <version>2.0.0</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@@ -0,0 +1,26 @@
package net.miarma.api.microservices.huertosdecine.enums;
import net.miarma.api.backlib.interfaces.IUserRole;
public enum CineUserRole implements IUserRole {
USER(0),
ADMIN(1);
private final int value;
CineUserRole(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static CineUserRole fromInt(int i) {
for (CineUserRole role : values()) {
if (role.value == i) return role;
}
throw new IllegalArgumentException("Invalid CineUserRole value: " + i);
}
}

View File

@@ -2,8 +2,8 @@ package net.miarma.api.microservices.huertosdecine.handlers;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.http.ApiStatus; import net.miarma.api.backlib.http.ApiStatus;
import net.miarma.api.backlib.http.QueryParams; import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.microservices.huertosdecine.entities.MovieEntity; import net.miarma.api.microservices.huertosdecine.entities.MovieEntity;

View File

@@ -9,8 +9,8 @@ import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router; import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.db.DatabaseProvider; import net.miarma.api.backlib.db.DatabaseProvider;
import net.miarma.api.backlib.util.EventBusUtil; import net.miarma.api.backlib.util.EventBusUtil;
import net.miarma.api.backlib.util.RouterUtil; import net.miarma.api.backlib.util.RouterUtil;

View File

@@ -5,7 +5,7 @@ import io.vertx.core.Promise;
import io.vertx.ext.web.Router; import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager; import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.db.DatabaseProvider; import net.miarma.api.backlib.db.DatabaseProvider;
import net.miarma.api.backlib.util.RouterUtil; import net.miarma.api.backlib.util.RouterUtil;
import net.miarma.api.microservices.huertosdecine.routing.CineLogicRouter; import net.miarma.api.microservices.huertosdecine.routing.CineLogicRouter;

View File

@@ -2,9 +2,9 @@ package net.miarma.api.microservices.huertosdecine.verticles;
import io.vertx.core.AbstractVerticle; import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise; import io.vertx.core.Promise;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.LogAccumulator; import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.log.LogAccumulator;
import net.miarma.api.backlib.util.DeploymentUtil; import net.miarma.api.backlib.util.DeploymentUtil;
public class CineMainVerticle extends AbstractVerticle { public class CineMainVerticle extends AbstractVerticle {

View File

@@ -1,8 +1,8 @@
<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"> <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> <modelVersion>4.0.0</modelVersion>
<groupId>net.miarma.api</groupId> <groupId>net.miarma.api</groupId>
<artifactId>miarmacraft</artifactId> <artifactId>minecraft</artifactId>
<version>1.2.1</version> <version>2.0.0</version>
<properties> <properties>
<maven.compiler.source>23</maven.compiler.source> <maven.compiler.source>23</maven.compiler.source>
@@ -20,7 +20,7 @@
<dependency> <dependency>
<groupId>net.miarma.api</groupId> <groupId>net.miarma.api</groupId>
<artifactId>backlib</artifactId> <artifactId>backlib</artifactId>
<version>1.2.1</version> <version>2.0.0</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

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

View File

@@ -1,4 +1,4 @@
package net.miarma.api.microservices.miarmacraft.dao; package net.miarma.api.microservices.minecraft.dao;
import io.vertx.core.Future; import io.vertx.core.Future;
import io.vertx.core.Promise; import io.vertx.core.Promise;
@@ -8,7 +8,7 @@ import net.miarma.api.backlib.db.DatabaseManager;
import net.miarma.api.backlib.db.QueryBuilder; import net.miarma.api.backlib.db.QueryBuilder;
import net.miarma.api.backlib.http.QueryFilters; import net.miarma.api.backlib.http.QueryFilters;
import net.miarma.api.backlib.http.QueryParams; import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.microservices.miarmacraft.entities.ModEntity; import net.miarma.api.microservices.minecraft.entities.ModEntity;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;

View File

@@ -1,4 +1,4 @@
package net.miarma.api.microservices.miarmacraft.dao; package net.miarma.api.microservices.minecraft.dao;
import io.vertx.core.Future; import io.vertx.core.Future;
import io.vertx.core.Promise; import io.vertx.core.Promise;
@@ -8,7 +8,7 @@ import net.miarma.api.backlib.db.DatabaseManager;
import net.miarma.api.backlib.db.QueryBuilder; import net.miarma.api.backlib.db.QueryBuilder;
import net.miarma.api.backlib.http.QueryFilters; import net.miarma.api.backlib.http.QueryFilters;
import net.miarma.api.backlib.http.QueryParams; import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.microservices.miarmacraft.entities.PlayerEntity; import net.miarma.api.microservices.minecraft.entities.PlayerEntity;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;

View File

@@ -1,4 +1,4 @@
package net.miarma.api.microservices.miarmacraft.dao; package net.miarma.api.microservices.minecraft.dao;
import io.vertx.core.Future; import io.vertx.core.Future;
import io.vertx.core.Promise; import io.vertx.core.Promise;
@@ -8,7 +8,7 @@ import net.miarma.api.backlib.db.DatabaseManager;
import net.miarma.api.backlib.db.QueryBuilder; import net.miarma.api.backlib.db.QueryBuilder;
import net.miarma.api.backlib.http.QueryFilters; import net.miarma.api.backlib.http.QueryFilters;
import net.miarma.api.backlib.http.QueryParams; import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.microservices.miarmacraft.entities.UserMetadataEntity; import net.miarma.api.microservices.minecraft.entities.UserMetadataEntity;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;

View File

@@ -1,4 +1,4 @@
package net.miarma.api.microservices.miarmacraft.entities; package net.miarma.api.microservices.minecraft.entities;
import io.vertx.sqlclient.Row; import io.vertx.sqlclient.Row;
import net.miarma.api.backlib.Constants.MMCModStatus; import net.miarma.api.backlib.Constants.MMCModStatus;

View File

@@ -1,4 +1,4 @@
package net.miarma.api.microservices.miarmacraft.entities; package net.miarma.api.microservices.minecraft.entities;
import java.time.LocalDateTime; import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package net.miarma.api.microservices.miarmacraft.entities; package net.miarma.api.microservices.minecraft.entities;
import io.vertx.sqlclient.Row; import io.vertx.sqlclient.Row;
import net.miarma.api.backlib.Constants.MMCUserRole; import net.miarma.api.backlib.Constants.MMCUserRole;

View File

@@ -0,0 +1,26 @@
package net.miarma.api.microservices.minecraft.enums;
import net.miarma.api.backlib.interfaces.IValuableEnum;
public enum MinecraftModStatus implements IValuableEnum {
ACTIVE(0),
INACTIVE(1);
private final int value;
MinecraftModStatus(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static MinecraftModStatus fromInt(int i) {
for (MinecraftModStatus status : values()) {
if (status.value == i) return status;
}
throw new IllegalArgumentException("Invalid MinecraftModStatus value: " + i);
}
}

View File

@@ -0,0 +1,27 @@
package net.miarma.api.microservices.minecraft.enums;
import net.miarma.api.backlib.interfaces.IUserRole;
import net.miarma.api.backlib.interfaces.IValuableEnum;
public enum MinecraftUserRole implements IUserRole, IValuableEnum {
PLAYER(0),
ADMIN(1);
private final int value;
MinecraftUserRole(int value) {
this.value = value;
}
@Override
public int getValue() {
return value;
}
public static MinecraftUserRole fromInt(int i) {
for (MinecraftUserRole role : values()) {
if (role.value == i) return role;
}
throw new IllegalArgumentException("Invalid MinecraftUserRole value: " + i);
}
}

View File

@@ -1,13 +1,13 @@
package net.miarma.api.microservices.miarmacraft.handlers; package net.miarma.api.microservices.minecraft.handlers;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.http.ApiStatus; 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 net.miarma.api.backlib.util.JsonUtil;
import net.miarma.api.microservices.minecraft.entities.ModEntity;
import net.miarma.api.microservices.minecraft.services.ModService;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;

View File

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

View File

@@ -1,12 +1,12 @@
package net.miarma.api.microservices.miarmacraft.handlers; package net.miarma.api.microservices.minecraft.handlers;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.http.ApiStatus; 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; import net.miarma.api.backlib.util.JsonUtil;
import net.miarma.api.microservices.minecraft.entities.PlayerEntity;
import net.miarma.api.microservices.minecraft.services.PlayerService;
public class PlayerDataHandler { public class PlayerDataHandler {
private final PlayerService playerService; private final PlayerService playerService;

View File

@@ -1,4 +1,4 @@
package net.miarma.api.microservices.miarmacraft.handlers; package net.miarma.api.microservices.minecraft.handlers;
import io.vertx.core.Vertx; import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject; import io.vertx.core.json.JsonObject;

View File

@@ -1,14 +1,14 @@
package net.miarma.api.microservices.miarmacraft.routing; package net.miarma.api.microservices.minecraft.routing;
import io.vertx.core.Vertx; import io.vertx.core.Vertx;
import io.vertx.ext.web.Router; import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.Constants.MMCUserRole; import net.miarma.api.backlib.Constants.MMCUserRole;
import net.miarma.api.microservices.miarmacraft.handlers.ModDataHandler; import net.miarma.api.microservices.minecraft.handlers.ModDataHandler;
import net.miarma.api.microservices.miarmacraft.handlers.PlayerDataHandler; import net.miarma.api.microservices.minecraft.handlers.PlayerDataHandler;
import net.miarma.api.microservices.miarmacraft.routing.middlewares.MMCAuthGuard; import net.miarma.api.microservices.minecraft.routing.middlewares.MMCAuthGuard;
import net.miarma.api.microservices.miarmacraft.services.PlayerService; import net.miarma.api.microservices.minecraft.services.PlayerService;
public class MMCDataRouter { public class MMCDataRouter {
public static void mount(Router router, Vertx vertx, Pool pool) { public static void mount(Router router, Vertx vertx, Pool pool) {

View File

@@ -1,4 +1,4 @@
package net.miarma.api.microservices.miarmacraft.routing; package net.miarma.api.microservices.minecraft.routing;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;

View File

@@ -1,12 +1,12 @@
package net.miarma.api.microservices.miarmacraft.routing; package net.miarma.api.microservices.minecraft.routing;
import io.vertx.core.Vertx; import io.vertx.core.Vertx;
import io.vertx.ext.web.Router; import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.microservices.miarmacraft.handlers.PlayerLogicHandler; import net.miarma.api.microservices.minecraft.handlers.PlayerLogicHandler;
import net.miarma.api.microservices.miarmacraft.routing.middlewares.MMCAuthGuard; import net.miarma.api.microservices.minecraft.routing.middlewares.MMCAuthGuard;
import net.miarma.api.microservices.miarmacraft.services.PlayerService; import net.miarma.api.microservices.minecraft.services.PlayerService;
public class MMCLogicRouter { public class MMCLogicRouter {
public static void mount(Router router, Vertx vertx, Pool pool) { public static void mount(Router router, Vertx vertx, Pool pool) {

View File

@@ -1,12 +1,12 @@
package net.miarma.api.microservices.miarmacraft.routing.middlewares; package net.miarma.api.microservices.minecraft.routing.middlewares;
import java.util.function.Consumer; import java.util.function.Consumer;
import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.RoutingContext;
import net.miarma.api.backlib.Constants.MMCUserRole; import net.miarma.api.backlib.Constants.MMCUserRole;
import net.miarma.api.backlib.middlewares.AbstractAuthGuard; import net.miarma.api.backlib.middlewares.AbstractAuthGuard;
import net.miarma.api.microservices.miarmacraft.entities.PlayerEntity; import net.miarma.api.microservices.minecraft.entities.PlayerEntity;
import net.miarma.api.microservices.miarmacraft.services.PlayerService; import net.miarma.api.microservices.minecraft.services.PlayerService;
public class MMCAuthGuard extends AbstractAuthGuard<PlayerEntity, MMCUserRole> { public class MMCAuthGuard extends AbstractAuthGuard<PlayerEntity, MMCUserRole> {
private final PlayerService playerService; private final PlayerService playerService;

View File

@@ -1,16 +1,16 @@
package net.miarma.api.microservices.miarmacraft.services; package net.miarma.api.microservices.minecraft.services;
import com.eduardomcb.discord.webhook.WebhookClient; import com.eduardomcb.discord.webhook.WebhookClient;
import com.eduardomcb.discord.webhook.WebhookManager; import com.eduardomcb.discord.webhook.WebhookManager;
import com.eduardomcb.discord.webhook.models.Message; import com.eduardomcb.discord.webhook.models.Message;
import io.vertx.core.Future; import io.vertx.core.Future;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.exceptions.NotFoundException; import net.miarma.api.backlib.exceptions.NotFoundException;
import net.miarma.api.backlib.http.QueryParams; import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.microservices.miarmacraft.dao.ModDAO; import net.miarma.api.microservices.minecraft.dao.ModDAO;
import net.miarma.api.microservices.miarmacraft.entities.ModEntity; import net.miarma.api.microservices.minecraft.entities.ModEntity;
import java.util.List; import java.util.List;

View File

@@ -1,4 +1,4 @@
package net.miarma.api.microservices.miarmacraft.services; package net.miarma.api.microservices.minecraft.services;
import io.vertx.core.Future; import io.vertx.core.Future;
import io.vertx.core.json.JsonObject; import io.vertx.core.json.JsonObject;
@@ -13,13 +13,13 @@ import net.miarma.api.backlib.exceptions.NotFoundException;
import net.miarma.api.backlib.http.QueryParams; import net.miarma.api.backlib.http.QueryParams;
import net.miarma.api.backlib.security.JWTManager; import net.miarma.api.backlib.security.JWTManager;
import net.miarma.api.backlib.security.PasswordHasher; import net.miarma.api.backlib.security.PasswordHasher;
import net.miarma.api.microservices.minecraft.dao.PlayerDAO;
import net.miarma.api.microservices.minecraft.dao.UserMetadataDAO;
import net.miarma.api.microservices.minecraft.entities.PlayerEntity;
import net.miarma.api.microservices.minecraft.entities.UserMetadataEntity;
import net.miarma.api.backlib.core.dao.UserDAO; import net.miarma.api.backlib.core.dao.UserDAO;
import net.miarma.api.backlib.core.entities.UserEntity; import net.miarma.api.backlib.core.entities.UserEntity;
import net.miarma.api.backlib.core.services.UserService; 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; import java.util.List;

View File

@@ -1,4 +1,4 @@
package net.miarma.api.microservices.miarmacraft.verticles; package net.miarma.api.microservices.minecraft.verticles;
import io.vertx.core.AbstractVerticle; import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise; import io.vertx.core.Promise;
@@ -6,15 +6,15 @@ import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router; import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.Constants.MMCUserRole; import net.miarma.api.backlib.Constants.MMCUserRole;
import net.miarma.api.backlib.Constants.MMCUserStatus; import net.miarma.api.backlib.Constants.MMCUserStatus;
import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.db.DatabaseProvider; import net.miarma.api.backlib.db.DatabaseProvider;
import net.miarma.api.backlib.util.EventBusUtil; import net.miarma.api.backlib.util.EventBusUtil;
import net.miarma.api.backlib.util.RouterUtil; import net.miarma.api.backlib.util.RouterUtil;
import net.miarma.api.microservices.miarmacraft.routing.MMCDataRouter; import net.miarma.api.microservices.minecraft.routing.MMCDataRouter;
import net.miarma.api.microservices.miarmacraft.services.PlayerService; import net.miarma.api.microservices.minecraft.services.PlayerService;
public class MMCDataVerticle extends AbstractVerticle { public class MMCDataVerticle extends AbstractVerticle {
private ConfigManager configManager; private ConfigManager configManager;

View File

@@ -1,14 +1,14 @@
package net.miarma.api.microservices.miarmacraft.verticles; package net.miarma.api.microservices.minecraft.verticles;
import io.vertx.core.AbstractVerticle; import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise; import io.vertx.core.Promise;
import io.vertx.ext.web.Router; import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.Pool;
import net.miarma.api.backlib.ConfigManager; import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.db.DatabaseProvider; import net.miarma.api.backlib.db.DatabaseProvider;
import net.miarma.api.backlib.util.RouterUtil; import net.miarma.api.backlib.util.RouterUtil;
import net.miarma.api.microservices.miarmacraft.routing.MMCLogicRouter; import net.miarma.api.microservices.minecraft.routing.MMCLogicRouter;
public class MMCLogicVerticle extends AbstractVerticle { public class MMCLogicVerticle extends AbstractVerticle {
private ConfigManager configManager; private ConfigManager configManager;

View File

@@ -1,10 +1,10 @@
package net.miarma.api.microservices.miarmacraft.verticles; package net.miarma.api.microservices.minecraft.verticles;
import io.vertx.core.AbstractVerticle; import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise; import io.vertx.core.Promise;
import net.miarma.api.backlib.ConfigManager;
import net.miarma.api.backlib.Constants; import net.miarma.api.backlib.Constants;
import net.miarma.api.backlib.LogAccumulator; import net.miarma.api.backlib.config.ConfigManager;
import net.miarma.api.backlib.log.LogAccumulator;
import net.miarma.api.backlib.util.DeploymentUtil; import net.miarma.api.backlib.util.DeploymentUtil;
public class MMCMainVerticle extends AbstractVerticle { public class MMCMainVerticle extends AbstractVerticle {

Some files were not shown because too many files have changed in this diff Show More