diff --git a/.gitignore b/.gitignore
index 9154f4c..0a816db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,4 @@
hs_err_pid*
replay_pid*
+core/.rsa/
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index d8d0c90..e61b4ce 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -14,5 +14,6 @@
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index eba6e1f..c092167 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -8,5 +8,5 @@
-
+
\ No newline at end of file
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index afa8c73..0000000
--- a/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,13 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=25
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=25
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
-org.eclipse.jdt.core.compiler.release=enabled
-org.eclipse.jdt.core.compiler.source=25
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f..0000000
--- a/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/backlib/.settings/org.eclipse.jdt.apt.core.prefs b/backlib/.settings/org.eclipse.jdt.apt.core.prefs
deleted file mode 100644
index d4313d4..0000000
--- a/backlib/.settings/org.eclipse.jdt.apt.core.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.apt.aptEnabled=false
diff --git a/backlib/.settings/org.eclipse.jdt.core.prefs b/backlib/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 1b6e1ef..0000000
--- a/backlib/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,9 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
-org.eclipse.jdt.core.compiler.processAnnotations=disabled
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/backlib/.settings/org.eclipse.m2e.core.prefs b/backlib/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f..0000000
--- a/backlib/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/backlib/pom.xml b/backlib/pom.xml
index 40541b5..0e6f095 100644
--- a/backlib/pom.xml
+++ b/backlib/pom.xml
@@ -9,11 +9,74 @@
backlib
+
+ 25
+ 25
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.mariadb.jdbc
+ mariadb-java-client
+ runtime
+
jakarta.validation
jakarta.validation-api
3.1.1
+
+ org.hibernate.validator
+ hibernate-validator
+ 8.0.0.Final
+
+
+ org.projectlombok
+ lombok
+ 1.18.42
+ compile
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+
+
+ io.jsonwebtoken
+ jjwt-api
+ 0.11.5
+
+
+ io.jsonwebtoken
+ jjwt-impl
+ 0.11.5
+ runtime
+
+
+ io.jsonwebtoken
+ jjwt-jackson
+ 0.11.5
+ runtime
+
+
+
+ net.miarma
+ backlib
+ 1.0.0
+
\ No newline at end of file
diff --git a/backlib/src/main/java/net/miarma/backlib/config/SecurityCommonConfig.java b/backlib/src/main/java/net/miarma/backlib/config/SecurityCommonConfig.java
new file mode 100644
index 0000000..18906b7
--- /dev/null
+++ b/backlib/src/main/java/net/miarma/backlib/config/SecurityCommonConfig.java
@@ -0,0 +1,23 @@
+package net.miarma.backlib.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+@Configuration
+public class SecurityCommonConfig {
+ @Bean
+ public AuthenticationManager authManager(HttpSecurity http) throws Exception {
+ return http.getSharedObject(AuthenticationManagerBuilder.class)
+ .build();
+ }
+
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+ return new BCryptPasswordEncoder(12);
+ }
+}
diff --git a/backlib/src/main/java/net/miarma/backlib/dto/ChangeAvatarRequest.java b/backlib/src/main/java/net/miarma/backlib/dto/ChangeAvatarRequest.java
new file mode 100644
index 0000000..b1d1f61
--- /dev/null
+++ b/backlib/src/main/java/net/miarma/backlib/dto/ChangeAvatarRequest.java
@@ -0,0 +1,3 @@
+package net.miarma.backlib.dto;
+
+public record ChangeAvatarRequest(String avatar) {}
diff --git a/backlib/src/main/java/net/miarma/backlib/dto/ChangePasswordRequest.java b/backlib/src/main/java/net/miarma/backlib/dto/ChangePasswordRequest.java
index 41c0e32..8b30986 100644
--- a/backlib/src/main/java/net/miarma/backlib/dto/ChangePasswordRequest.java
+++ b/backlib/src/main/java/net/miarma/backlib/dto/ChangePasswordRequest.java
@@ -4,42 +4,7 @@ import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
-public class ChangePasswordRequest {
-
- @NotBlank
- private String oldPassword;
-
- @NotBlank
- private String newPassword;
-
- @NotNull
- @Min(0)
- private Byte serviceId;
-
- public String getOldPassword() {
- return oldPassword;
- }
-
- public void setOldPassword(String oldPassword) {
- this.oldPassword = oldPassword;
- }
-
- public String getNewPassword() {
- return newPassword;
- }
-
- public void setNewPassword(String newPassword) {
- this.newPassword = newPassword;
- }
-
- public Byte getServiceId() {
- return serviceId;
- }
-
- public void setServiceId(Byte serviceId) {
- this.serviceId = serviceId;
- }
-
-
-}
+public record ChangePasswordRequest(@NotBlank String oldPassword,
+ @NotBlank String newPassword,
+ @NotBlank Byte serviceId) {}
diff --git a/backlib/src/main/java/net/miarma/backlib/dto/ChangeRoleRequest.java b/backlib/src/main/java/net/miarma/backlib/dto/ChangeRoleRequest.java
new file mode 100644
index 0000000..52115da
--- /dev/null
+++ b/backlib/src/main/java/net/miarma/backlib/dto/ChangeRoleRequest.java
@@ -0,0 +1,4 @@
+package net.miarma.backlib.dto;
+
+public record ChangeRoleRequest(Byte role) {
+}
diff --git a/backlib/src/main/java/net/miarma/backlib/dto/ChangeStatusRequest.java b/backlib/src/main/java/net/miarma/backlib/dto/ChangeStatusRequest.java
new file mode 100644
index 0000000..bc667cd
--- /dev/null
+++ b/backlib/src/main/java/net/miarma/backlib/dto/ChangeStatusRequest.java
@@ -0,0 +1,3 @@
+package net.miarma.backlib.dto;
+
+public record ChangeStatusRequest(Byte status) {}
diff --git a/backlib/src/main/java/net/miarma/backlib/dto/LoginRequest.java b/backlib/src/main/java/net/miarma/backlib/dto/LoginRequest.java
index 8ed9cda..190cd59 100644
--- a/backlib/src/main/java/net/miarma/backlib/dto/LoginRequest.java
+++ b/backlib/src/main/java/net/miarma/backlib/dto/LoginRequest.java
@@ -2,36 +2,6 @@ package net.miarma.backlib.dto;
import jakarta.validation.constraints.NotBlank;
-public class LoginRequest {
- @NotBlank
- private String username;
-
- @NotBlank
- private String password;
-
- private Byte serviceId;
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public Byte getServiceId() {
- return serviceId;
- }
-
- public void setServiceId(Byte serviceId) {
- this.serviceId = serviceId;
- }
-}
+public record LoginRequest(@NotBlank String username,
+ @NotBlank String password,
+ Byte serviceId) {}
diff --git a/backlib/src/main/java/net/miarma/backlib/dto/LoginResponse.java b/backlib/src/main/java/net/miarma/backlib/dto/LoginResponse.java
index d4b22df..6bfa5f6 100644
--- a/backlib/src/main/java/net/miarma/backlib/dto/LoginResponse.java
+++ b/backlib/src/main/java/net/miarma/backlib/dto/LoginResponse.java
@@ -1,37 +1,5 @@
package net.miarma.backlib.dto;
-public class LoginResponse {
- private String token;
- private UserDto user;
- private CredentialDto account;
-
- public LoginResponse(String token, UserDto user, CredentialDto account) {
- this.token = token;
- this.user = user;
- this.account = account;
- }
-
- public String getToken() {
- return token;
- }
-
- public void setToken(String token) {
- this.token = token;
- }
-
- public UserDto getUser() {
- return user;
- }
-
- public void setUser(UserDto user) {
- this.user = user;
- }
-
- public CredentialDto getAccount() {
- return account;
- }
-
- public void setAccount(CredentialDto account) {
- this.account = account;
- }
-}
\ No newline at end of file
+public record LoginResponse(String token,
+ UserDto user,
+ CredentialDto account) {}
\ No newline at end of file
diff --git a/backlib/src/main/java/net/miarma/backlib/dto/RegisterRequest.java b/backlib/src/main/java/net/miarma/backlib/dto/RegisterRequest.java
index 032e0c0..7166825 100644
--- a/backlib/src/main/java/net/miarma/backlib/dto/RegisterRequest.java
+++ b/backlib/src/main/java/net/miarma/backlib/dto/RegisterRequest.java
@@ -1,41 +1,9 @@
package net.miarma.backlib.dto;
-public class RegisterRequest {
- private String username;
- private String email;
- private String password;
- private String displayName;
- private Byte 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 String getDisplayName() {
- return displayName;
- }
- public void setDisplayName(String displayName) {
- this.displayName = displayName;
- }
- public Byte getServiceId() {
- return serviceId;
- }
- public void setServiceId(Byte serviceId) {
- this.serviceId = serviceId;
- }
-
-
-}
\ No newline at end of file
+import jakarta.validation.constraints.NotBlank;
+
+public record RegisterRequest(@NotBlank String username,
+ String email,
+ @NotBlank String password,
+ @NotBlank String displayName,
+ Byte serviceId) {}
\ No newline at end of file
diff --git a/backlib/src/main/java/net/miarma/backlib/dto/UserExistsResponse.java b/backlib/src/main/java/net/miarma/backlib/dto/UserExistsResponse.java
new file mode 100644
index 0000000..f767ee4
--- /dev/null
+++ b/backlib/src/main/java/net/miarma/backlib/dto/UserExistsResponse.java
@@ -0,0 +1,4 @@
+package net.miarma.backlib.dto;
+
+public record UserExistsResponse(boolean exists) {
+}
diff --git a/backlib/src/main/java/net/miarma/backlib/security/JwtService.java b/backlib/src/main/java/net/miarma/backlib/security/JwtService.java
new file mode 100644
index 0000000..26f6bbd
--- /dev/null
+++ b/backlib/src/main/java/net/miarma/backlib/security/JwtService.java
@@ -0,0 +1,105 @@
+package net.miarma.backlib.security;
+
+import io.jsonwebtoken.*;
+import jakarta.annotation.PostConstruct;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+import java.util.Date;
+import java.util.UUID;
+
+@Service
+public class JwtService {
+
+ @Value("${jwt.private-key-path}")
+ private String privateKeyPath;
+
+ @Value("${jwt.public-key-path}")
+ private String publicKeyPath;
+
+ @Value("${jwt.expiration-ms}")
+ private long expiration;
+
+ private PrivateKey privateKey;
+ private PublicKey publicKey;
+
+ @PostConstruct
+ public void init() throws Exception {
+ System.out.println("user.name = " + System.getProperty("user.name"));
+ System.out.println("user.home = " + System.getProperty("user.home"));
+ System.out.println("privateKeyPath = " + privateKeyPath);
+
+ this.privateKey = loadPrivateKey(privateKeyPath);
+ this.publicKey = loadPublicKey(publicKeyPath);
+ }
+
+ private PrivateKey loadPrivateKey(String path) throws Exception {
+ String pem = Files.readString(Path.of(path));
+ pem = pem.replace("-----BEGIN PRIVATE KEY-----", "")
+ .replace("-----END PRIVATE KEY-----", "")
+ .replaceAll("\\s", "");
+
+ byte[] decoded = Base64.getDecoder().decode(pem);
+ PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded);
+ KeyFactory kf = KeyFactory.getInstance("RSA");
+ return kf.generatePrivate(spec);
+ }
+
+ private PublicKey loadPublicKey(String path) throws Exception {
+ String pem = Files.readString(Path.of(path));
+ pem = pem.replace("-----BEGIN PUBLIC KEY-----", "")
+ .replace("-----END PUBLIC KEY-----", "")
+ .replaceAll("\\s", "");
+
+ byte[] decoded = Base64.getDecoder().decode(pem);
+ X509EncodedKeySpec spec = new X509EncodedKeySpec(decoded);
+ KeyFactory kf = KeyFactory.getInstance("RSA");
+ return kf.generatePublic(spec);
+ }
+
+ public String generateToken(UUID userId, Byte serviceId) {
+ Date now = new Date();
+ Date exp = new Date(now.getTime() + expiration);
+
+ return Jwts.builder()
+ .setSubject(userId.toString())
+ .claim("service", serviceId)
+ .setIssuedAt(now)
+ .setExpiration(exp)
+ .signWith(privateKey, SignatureAlgorithm.RS256)
+ .compact();
+ }
+
+ public boolean validateToken(String token) {
+ try {
+ Jwts.parserBuilder().setSigningKey(publicKey).build().parseClaimsJws(token);
+ return true;
+ } catch (JwtException | IllegalArgumentException e) {
+ return false;
+ }
+ }
+
+ public UUID getUserId(String token) {
+ Claims claims = Jwts.parserBuilder().setSigningKey(publicKey).build().parseClaimsJws(token).getBody();
+ return UUID.fromString(claims.getSubject());
+ }
+
+ public Byte getServiceId(String token) {
+ Claims claims = Jwts.parserBuilder().setSigningKey(publicKey).build().parseClaimsJws(token).getBody();
+ return ((Number) claims.get("service")).byteValue();
+ }
+
+ public Date getExpiration(String token) {
+ Claims claims = Jwts.parserBuilder().setSigningKey(publicKey).build().parseClaimsJws(token).getBody();
+ return claims.getExpiration();
+ }
+}
+
diff --git a/backlib/target/classes/META-INF/MANIFEST.MF b/backlib/target/classes/META-INF/MANIFEST.MF
deleted file mode 100644
index a5622f8..0000000
--- a/backlib/target/classes/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,4 +0,0 @@
-Manifest-Version: 1.0
-Build-Jdk-Spec: 21
-Created-By: Maven Integration for Eclipse
-
diff --git a/backlib/target/classes/META-INF/maven/net.miarma/backlib/pom.properties b/backlib/target/classes/META-INF/maven/net.miarma/backlib/pom.properties
deleted file mode 100644
index 2cecf85..0000000
--- a/backlib/target/classes/META-INF/maven/net.miarma/backlib/pom.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-#Generated by Maven Integration for Eclipse
-#Sun Jan 18 04:49:28 CET 2026
-artifactId=backlib
-groupId=net.miarma
-m2e.projectLocation=/home/jomaa/git/miarma-backend/backlib
-m2e.projectName=backlib
-version=1.0.0
diff --git a/backlib/target/classes/META-INF/maven/net.miarma/backlib/pom.xml b/backlib/target/classes/META-INF/maven/net.miarma/backlib/pom.xml
deleted file mode 100644
index 40541b5..0000000
--- a/backlib/target/classes/META-INF/maven/net.miarma/backlib/pom.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
- 4.0.0
-
- net.miarma
- backend
- 1.0.0
-
- backlib
-
-
-
- jakarta.validation
- jakarta.validation-api
- 3.1.1
-
-
-
\ No newline at end of file
diff --git a/cine/.settings/org.eclipse.jdt.core.prefs b/cine/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 2f5cc74..0000000
--- a/cine/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/cine/.settings/org.eclipse.m2e.core.prefs b/cine/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f..0000000
--- a/cine/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/cine/.settings/org.springframework.ide.eclipse.prefs b/cine/.settings/org.springframework.ide.eclipse.prefs
deleted file mode 100644
index a12794d..0000000
--- a/cine/.settings/org.springframework.ide.eclipse.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-boot.validation.initialized=true
-eclipse.preferences.version=1
diff --git a/core/.settings/org.eclipse.jdt.apt.core.prefs b/core/.settings/org.eclipse.jdt.apt.core.prefs
deleted file mode 100644
index dfa4f3a..0000000
--- a/core/.settings/org.eclipse.jdt.apt.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.apt.aptEnabled=true
-org.eclipse.jdt.apt.genSrcDir=target/generated-sources/annotations
-org.eclipse.jdt.apt.genTestSrcDir=target/generated-test-sources/test-annotations
diff --git a/core/.settings/org.eclipse.jdt.core.prefs b/core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 85a7c3d..0000000
--- a/core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,15 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=25
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=25
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
-org.eclipse.jdt.core.compiler.processAnnotations=enabled
-org.eclipse.jdt.core.compiler.release=enabled
-org.eclipse.jdt.core.compiler.source=25
diff --git a/core/.settings/org.eclipse.m2e.core.prefs b/core/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f..0000000
--- a/core/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/core/.settings/org.springframework.ide.eclipse.prefs b/core/.settings/org.springframework.ide.eclipse.prefs
deleted file mode 100644
index a12794d..0000000
--- a/core/.settings/org.springframework.ide.eclipse.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-boot.validation.initialized=true
-eclipse.preferences.version=1
diff --git a/core/pom.xml b/core/pom.xml
index d87f464..7c7a7f4 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -9,6 +9,11 @@
core
+
+ 25
+ 25
+
+
@@ -44,6 +49,10 @@
1.18.42
compile
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
diff --git a/core/src/main/java/net/miarma/backend/core/config/SecurityConfig.java b/core/src/main/java/net/miarma/backend/core/config/SecurityConfig.java
index 55ea65c..2dcb1f3 100644
--- a/core/src/main/java/net/miarma/backend/core/config/SecurityConfig.java
+++ b/core/src/main/java/net/miarma/backend/core/config/SecurityConfig.java
@@ -1,5 +1,6 @@
package net.miarma.backend.core.config;
+import net.miarma.backend.core.security.JwtFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
@@ -37,15 +38,4 @@ public class SecurityConfig {
return http.build();
}
-
- @Bean
- public AuthenticationManager authManager(HttpSecurity http) throws Exception {
- return http.getSharedObject(AuthenticationManagerBuilder.class)
- .build();
- }
-
- @Bean
- public PasswordEncoder passwordEncoder() {
- return new BCryptPasswordEncoder(12);
- }
}
diff --git a/core/src/main/java/net/miarma/backend/core/controller/AuthController.java b/core/src/main/java/net/miarma/backend/core/controller/AuthController.java
index 8ffa78f..8965fc1 100644
--- a/core/src/main/java/net/miarma/backend/core/controller/AuthController.java
+++ b/core/src/main/java/net/miarma/backend/core/controller/AuthController.java
@@ -15,7 +15,7 @@ import jakarta.validation.Valid;
import net.miarma.backend.core.model.Credential;
import net.miarma.backend.core.service.AuthService;
import net.miarma.backend.core.service.CredentialService;
-import net.miarma.backend.core.service.JwtService;
+import net.miarma.backlib.security.JwtService;
import net.miarma.backlib.dto.ChangePasswordRequest;
import net.miarma.backlib.dto.LoginRequest;
import net.miarma.backlib.dto.LoginResponse;
diff --git a/core/src/main/java/net/miarma/backend/core/controller/CredentialController.java b/core/src/main/java/net/miarma/backend/core/controller/CredentialController.java
index f9ae7a3..d7565b0 100644
--- a/core/src/main/java/net/miarma/backend/core/controller/CredentialController.java
+++ b/core/src/main/java/net/miarma/backend/core/controller/CredentialController.java
@@ -3,6 +3,8 @@ package net.miarma.backend.core.controller;
import java.util.List;
import java.util.UUID;
+import net.miarma.backlib.dto.ChangeRoleRequest;
+import net.miarma.backlib.dto.ChangeStatusRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
@@ -39,26 +41,54 @@ public class CredentialController {
return ResponseEntity.ok(credentialService.getByUserId(userId));
}
- @GetMapping("/{credentialId}")
+ @GetMapping("/{credential_id}")
@PreAuthorize("hasRole('ADMIN') or @credentialService.isOwner(#credentialId, authentication.principal.userId)")
- public ResponseEntity getById(@PathVariable("credentialId") UUID credentialId) {
+ public ResponseEntity getById(@PathVariable("credential_id") UUID credentialId) {
return ResponseEntity.ok(credentialService.getById(credentialId));
}
- @PutMapping("/{credentialId}")
+ @PutMapping("/{credential_id}")
@PreAuthorize("hasRole('ADMIN') or @credentialService.isOwner(#credentialId, authentication.principal.userId)")
public ResponseEntity update(
- @PathVariable("credentialId") UUID credentialId,
+ @PathVariable("credential_id") UUID credentialId,
@RequestBody CredentialDto dto
) {
dto.setCredentialId(credentialId);
return ResponseEntity.ok(credentialService.update(credentialId, dto));
}
- @DeleteMapping("/{credentialId}")
+ @DeleteMapping("/{credential_id}")
@PreAuthorize("hasRole('ADMIN') or @credentialService.isOwner(#credentialId, authentication.principal.userId)")
- public ResponseEntity delete(@PathVariable("credentialId") UUID credentialId) {
+ public ResponseEntity delete(@PathVariable("credential_id") UUID credentialId) {
credentialService.delete(credentialId);
return ResponseEntity.noContent().build();
}
+
+ @GetMapping("/{credential_id}/status")
+ public ResponseEntity getStatus(@PathVariable("credential_id") UUID credentialId) {
+ return ResponseEntity.ok(credentialService.getStatus(credentialId));
+ }
+
+ @PutMapping("/{credential_id}/status")
+ public ResponseEntity updateStatus(
+ @PathVariable("credential_id") UUID credentialId,
+ @RequestBody ChangeStatusRequest req
+ ) {
+ credentialService.updateStatus(credentialId, req.status());
+ return ResponseEntity.noContent().build();
+ }
+
+ @GetMapping("/{credential_id}/role")
+ public ResponseEntity getRole(@PathVariable("credential_id") UUID credentialId) {
+ return ResponseEntity.ok(credentialService.getRole(credentialId));
+ }
+
+ @PutMapping("/{credential_id}/role")
+ public ResponseEntity updateRole(
+ @PathVariable("credential_id") UUID credentialId,
+ @RequestBody ChangeRoleRequest req
+ ) {
+ credentialService.updateRole(credentialId, req.role());
+ return ResponseEntity.noContent().build();
+ }
}
diff --git a/core/src/main/java/net/miarma/backend/core/controller/FileController.java b/core/src/main/java/net/miarma/backend/core/controller/FileController.java
index 7f30177..5378d46 100644
--- a/core/src/main/java/net/miarma/backend/core/controller/FileController.java
+++ b/core/src/main/java/net/miarma/backend/core/controller/FileController.java
@@ -55,7 +55,7 @@ public class FileController {
@RequestParam String fileName,
@RequestParam String mimeType,
@RequestParam UUID uploadedBy,
- @RequestParam Short context,
+ @RequestParam Byte context,
@RequestPart("file") MultipartFile file
) throws IOException {
File entity = new File();
diff --git a/core/src/main/java/net/miarma/backend/core/controller/ScreenshotController.java b/core/src/main/java/net/miarma/backend/core/controller/ScreenshotController.java
new file mode 100644
index 0000000..17d3b13
--- /dev/null
+++ b/core/src/main/java/net/miarma/backend/core/controller/ScreenshotController.java
@@ -0,0 +1,24 @@
+package net.miarma.backend.core.controller;
+
+import net.miarma.backend.core.service.ScreenshotService;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping("/screenshot")
+public class ScreenshotController {
+ private final ScreenshotService screenshotService;
+
+ public ScreenshotController(ScreenshotService screenshotService) {
+ this.screenshotService = screenshotService;
+ }
+
+ @GetMapping("/screenshot")
+ public Mono> getScreenshot(@RequestParam String url) {
+ return screenshotService.getScreenshot(url);
+ }
+}
diff --git a/core/src/main/java/net/miarma/backend/core/controller/UserController.java b/core/src/main/java/net/miarma/backend/core/controller/UserController.java
index 4204d23..0eb79c8 100644
--- a/core/src/main/java/net/miarma/backend/core/controller/UserController.java
+++ b/core/src/main/java/net/miarma/backend/core/controller/UserController.java
@@ -3,6 +3,10 @@ package net.miarma.backend.core.controller;
import java.util.List;
import java.util.UUID;
+import net.miarma.backlib.dto.ChangeRoleRequest;
+import net.miarma.backlib.dto.ChangeAvatarRequest;
+import net.miarma.backlib.dto.ChangeStatusRequest;
+import net.miarma.backlib.dto.UserExistsResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -16,7 +20,7 @@ import org.springframework.web.bind.annotation.RestController;
import net.miarma.backend.core.mapper.UserMapper;
import net.miarma.backend.core.model.User;
-import net.miarma.backend.core.service.JwtService;
+import net.miarma.backlib.security.JwtService;
import net.miarma.backend.core.service.UserService;
import net.miarma.backlib.dto.UserDto;
@@ -59,6 +63,45 @@ public class UserController {
public ResponseEntity getAvatar(@PathVariable("user_id") UUID userId) {
return ResponseEntity.ok(userService.getById(userId).getAvatar());
}
+
+ @PutMapping("/{user_id}/avatar")
+ public ResponseEntity updateAvatar(@PathVariable("user_id") UUID userId, @RequestBody ChangeAvatarRequest avatar) {
+ return ResponseEntity.ok(userService.updateAvatar(userId, avatar));
+ }
+
+ @GetMapping("/{user_id}/status")
+ public ResponseEntity getStatus(@PathVariable("user_id") UUID userId) {
+ return ResponseEntity.ok(userService.getStatus(userId));
+ }
+
+ @PutMapping("/{user_id}/status")
+ public ResponseEntity updateStatus(
+ @PathVariable("user_id") UUID userId,
+ @RequestBody ChangeStatusRequest req
+ ) {
+ userService.updateStatus(userId, req.status());
+ return ResponseEntity.noContent().build();
+ }
+
+ @GetMapping("/{user_id}/role")
+ public ResponseEntity getRole(@PathVariable("user_id") UUID userId) {
+ return ResponseEntity.ok(userService.getRole(userId));
+ }
+
+ @PutMapping("/{user_id}/role")
+ public ResponseEntity updateRole(
+ @PathVariable("user_id") UUID userid,
+ @RequestBody ChangeRoleRequest req
+ ) {
+ userService.updateRole(userid, req.role());
+ return ResponseEntity.noContent().build();
+ }
+
+ @GetMapping("/{user_id}/exists")
+ public ResponseEntity exists(@PathVariable("user_id") UUID userId) {
+ boolean exists = userService.exists(userId);
+ return ResponseEntity.ok(new UserExistsResponse(exists));
+ }
@GetMapping("/me")
public ResponseEntity getMe(@RequestHeader("Authorization") String authHeader) {
diff --git a/core/src/main/java/net/miarma/backend/core/model/Credential.java b/core/src/main/java/net/miarma/backend/core/model/Credential.java
index bb779bf..fa251f8 100644
--- a/core/src/main/java/net/miarma/backend/core/model/Credential.java
+++ b/core/src/main/java/net/miarma/backend/core/model/Credential.java
@@ -50,6 +50,7 @@ public class Credential {
private String email;
private String password;
private Byte status;
+ private Byte role;
@CreationTimestamp
private Instant createdAt;
@@ -142,6 +143,10 @@ public class Credential {
this.status = status;
}
+ public Byte getRole() { return role; }
+
+ public void setRole(Byte role) { this.role = role; }
+
public Instant getCreatedAt() {
return createdAt;
}
diff --git a/core/src/main/java/net/miarma/backend/core/model/File.java b/core/src/main/java/net/miarma/backend/core/model/File.java
index 349845a..27ea0f4 100644
--- a/core/src/main/java/net/miarma/backend/core/model/File.java
+++ b/core/src/main/java/net/miarma/backend/core/model/File.java
@@ -43,7 +43,7 @@ public class File {
private Instant uploadedAt;
@Column(name = "context", nullable = false)
- private Short context;
+ private Byte context;
@PrePersist
@PreUpdate
@@ -112,11 +112,11 @@ public class File {
return uploadedAt;
}
- public Short getContext() {
+ public Byte getContext() {
return context;
}
- public void setContext(Short context) {
+ public void setContext(Byte context) {
this.context = context;
}
}
diff --git a/core/src/main/java/net/miarma/backend/core/repository/FileRepository.java b/core/src/main/java/net/miarma/backend/core/repository/FileRepository.java
index 4a8d4f6..c984a31 100644
--- a/core/src/main/java/net/miarma/backend/core/repository/FileRepository.java
+++ b/core/src/main/java/net/miarma/backend/core/repository/FileRepository.java
@@ -10,7 +10,7 @@ import net.miarma.backend.core.model.File;
public interface FileRepository extends JpaRepository {
List findByUploadedBy(UUID uploadedBy);
- List findByContext(short context);
+ List findByContext(Byte context);
- List findByUploadedByAndContext(UUID uploadedBy, short context);
+ List findByUploadedByAndContext(UUID uploadedBy, Byte context);
}
\ No newline at end of file
diff --git a/core/src/main/java/net/miarma/backend/core/config/JwtFilter.java b/core/src/main/java/net/miarma/backend/core/security/JwtFilter.java
similarity index 97%
rename from core/src/main/java/net/miarma/backend/core/config/JwtFilter.java
rename to core/src/main/java/net/miarma/backend/core/security/JwtFilter.java
index 80efc68..9e70933 100644
--- a/core/src/main/java/net/miarma/backend/core/config/JwtFilter.java
+++ b/core/src/main/java/net/miarma/backend/core/security/JwtFilter.java
@@ -1,4 +1,4 @@
-package net.miarma.backend.core.config;
+package net.miarma.backend.core.security;
import java.io.IOException;
import java.util.List;
@@ -16,7 +16,7 @@ import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import net.miarma.backend.core.model.User;
-import net.miarma.backend.core.service.JwtService;
+import net.miarma.backlib.security.JwtService;
import net.miarma.backend.core.service.UserService;
@Component
diff --git a/core/src/main/java/net/miarma/backend/core/service/AuthService.java b/core/src/main/java/net/miarma/backend/core/service/AuthService.java
index c565b37..0202a70 100644
--- a/core/src/main/java/net/miarma/backend/core/service/AuthService.java
+++ b/core/src/main/java/net/miarma/backend/core/service/AuthService.java
@@ -20,11 +20,11 @@ public class AuthService {
private final CredentialService credentialService;
private final UserService userService;
- private final JwtService jwtService;
+ private final net.miarma.backlib.security.JwtService jwtService;
private final PasswordEncoder passwordEncoder;
public AuthService(CredentialService credentialService, UserService userService,
- JwtService jwtService, PasswordEncoder passwordEncoder) {
+ net.miarma.backlib.security.JwtService jwtService, PasswordEncoder passwordEncoder) {
this.credentialService = credentialService;
this.userService = userService;
this.jwtService = jwtService;
@@ -57,7 +57,7 @@ public class AuthService {
user = credentialService.getByEmail(request.getEmail());
} catch (RuntimeException e) {
UserDto dto = new UserDto();
- dto.setUserId(UUID.randomUUID());
+ dto.userId(UUID.randomUUID());
dto.setDisplayName(request.getDisplayName());
user = userService.create(dto);
}
diff --git a/core/src/main/java/net/miarma/backend/core/service/CredentialService.java b/core/src/main/java/net/miarma/backend/core/service/CredentialService.java
index ceba83a..ede5ab9 100644
--- a/core/src/main/java/net/miarma/backend/core/service/CredentialService.java
+++ b/core/src/main/java/net/miarma/backend/core/service/CredentialService.java
@@ -127,11 +127,11 @@ public class CredentialService {
Credential cred = credentialRepository.findById(idBytes)
.orElseThrow(() -> new RuntimeException("Credential not found"));
- if (!passwordEncoder.matches(request.getOldPassword(), cred.getPassword())) {
+ if (!passwordEncoder.matches(request.oldPassword(), cred.getPassword())) {
throw new IllegalArgumentException("Old password is incorrect");
}
- cred.setPassword(passwordEncoder.encode(request.getNewPassword()));
+ cred.setPassword(passwordEncoder.encode(request.newPassword()));
return credentialRepository.save(cred);
}
@@ -142,4 +142,30 @@ public class CredentialService {
credentialRepository.deleteById(idBytes);
}
+ public Byte getStatus(UUID credentialId) {
+ Credential credential = credentialRepository.findById(UuidUtil.uuidToBin(credentialId))
+ .orElseThrow(() -> new RuntimeException("User not found"));;
+ return credential.getStatus();
+ }
+
+ public void updateStatus(UUID credentialId, Byte status) {
+ Credential credential = credentialRepository.findById(UuidUtil.uuidToBin(credentialId))
+ .orElseThrow(() -> new RuntimeException("User not found"));;
+ credential.setStatus(status);
+ credentialRepository.save(credential);
+ }
+
+ public Byte getRole(UUID credentialId) {
+ Credential credential = credentialRepository.findById(UuidUtil.uuidToBin(credentialId))
+ .orElseThrow(() -> new RuntimeException("User not found"));;
+ return credential.getRole();
+ }
+
+ public void updateRole(UUID credentialId, Byte role) {
+ Credential credential = credentialRepository.findById(UuidUtil.uuidToBin(credentialId))
+ .orElseThrow(() -> new RuntimeException("User not found"));;
+ credential.setRole(role);
+ credentialRepository.save(credential);
+ }
+
}
diff --git a/core/src/main/java/net/miarma/backend/core/service/FileService.java b/core/src/main/java/net/miarma/backend/core/service/FileService.java
index dea77d9..3a5ee29 100644
--- a/core/src/main/java/net/miarma/backend/core/service/FileService.java
+++ b/core/src/main/java/net/miarma/backend/core/service/FileService.java
@@ -39,7 +39,7 @@ public class FileService {
return fileRepository.findByUploadedBy(userId);
}
if (params.containsKey("context")) {
- short context = Short.parseShort(params.get("context"));
+ Byte context = Byte.parseByte(params.get("context"));
return fileRepository.findByContext(context);
}
return fileRepository.findAll();
diff --git a/core/src/main/java/net/miarma/backend/core/service/JwtService.java b/core/src/main/java/net/miarma/backend/core/service/JwtService.java
deleted file mode 100644
index 291274c..0000000
--- a/core/src/main/java/net/miarma/backend/core/service/JwtService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package net.miarma.backend.core.service;
-
-import io.jsonwebtoken.*;
-import io.jsonwebtoken.security.Keys;
-import org.springframework.stereotype.Service;
-
-import java.security.Key;
-import java.util.Date;
-import java.util.UUID;
-
-@Service
-public class JwtService {
-
- private final String secret = "miarma-esto-es-un-secreto-super-largo-para-jwt-1234567890";
- private final Key key = Keys.hmacShaKeyFor(secret.getBytes());
-
- private final long expiration = 3600_000;
-
- public String generateToken(UUID userId, Byte serviceId) {
- Date now = new Date();
- Date exp = new Date(now.getTime() + expiration);
-
- return Jwts.builder()
- .setSubject(userId.toString())
- .claim("service", serviceId)
- .setIssuedAt(now)
- .setExpiration(exp)
- .signWith(key, SignatureAlgorithm.HS256)
- .compact();
- }
-
- public boolean validateToken(String token) {
- try {
- Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
- return true;
- } catch (JwtException | IllegalArgumentException e) {
- return false;
- }
- }
-
- public UUID getUserId(String token) {
- Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
- return UUID.fromString(claims.getSubject());
- }
-
- public Byte getServiceId(String token) {
- Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
- return ((Number) claims.get("service")).byteValue();
- }
-
- public Date getExpiration(String token) {
- Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
- return claims.getExpiration();
- }
-}
-
diff --git a/core/src/main/java/net/miarma/backend/core/service/ScreenshotService.java b/core/src/main/java/net/miarma/backend/core/service/ScreenshotService.java
new file mode 100644
index 0000000..d660f76
--- /dev/null
+++ b/core/src/main/java/net/miarma/backend/core/service/ScreenshotService.java
@@ -0,0 +1,34 @@
+package net.miarma.backend.core.service;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
+
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
+@Service
+public class ScreenshotService {
+
+ private final WebClient webClient;
+ private final String URI = "http://screenshoter:7000";
+
+ public ScreenshotService(WebClient.Builder webClientBuilder) {
+ this.webClient = webClientBuilder.baseUrl(URI).build();
+ }
+
+ public Mono> getScreenshot(String url) {
+ String encodedUrl = URLEncoder.encode(url, StandardCharsets.UTF_8);
+
+ return webClient.get()
+ .uri("/screenshot?url=" + encodedUrl)
+ .retrieve()
+ .toEntity(byte[].class)
+ .map(response -> ResponseEntity
+ .status(response.getStatusCode())
+ .header("Content-Type", "image/png")
+ .body(response.getBody())
+ );
+ }
+}
diff --git a/core/src/main/java/net/miarma/backend/core/service/UserService.java b/core/src/main/java/net/miarma/backend/core/service/UserService.java
index 4b3dd7a..c5607fe 100644
--- a/core/src/main/java/net/miarma/backend/core/service/UserService.java
+++ b/core/src/main/java/net/miarma/backend/core/service/UserService.java
@@ -3,6 +3,8 @@ package net.miarma.backend.core.service;
import java.util.List;
import java.util.UUID;
+import net.miarma.backend.core.mapper.UserMapper;
+import net.miarma.backlib.dto.ChangeAvatarRequest;
import org.springframework.stereotype.Service;
import jakarta.transaction.Transactional;
@@ -75,4 +77,43 @@ public class UserService {
throw new RuntimeException("User not found");
userRepository.deleteById(idBytes);
}
+
+ public UserDto updateAvatar(UUID userId, ChangeAvatarRequest req) {
+ User user = userRepository.findById(UuidUtil.uuidToBin(userId))
+ .orElseThrow(() -> new RuntimeException("User not found"));
+ user.setAvatar(req.avatar());
+ userRepository.save(user);
+ return UserMapper.toDto(user);
+ }
+
+ public Byte getStatus(UUID userId) {
+ User user = userRepository.findById(UuidUtil.uuidToBin(userId))
+ .orElseThrow(() -> new RuntimeException("User not found"));;
+ return user.getGlobalStatus();
+ }
+
+ public void updateStatus(UUID userId, Byte status) {
+ User user = userRepository.findById(UuidUtil.uuidToBin(userId))
+ .orElseThrow(() -> new RuntimeException("User not found"));;
+ user.setGlobalStatus(status);
+ userRepository.save(user);
+ }
+
+ public Byte getRole(UUID userId) {
+ User user = userRepository.findById(UuidUtil.uuidToBin(userId))
+ .orElseThrow(() -> new RuntimeException("User not found"));;
+ return user.getGlobalRole();
+ }
+
+ public void updateRole(UUID userId, Byte role) {
+ User user = userRepository.findById(UuidUtil.uuidToBin(userId))
+ .orElseThrow(() -> new RuntimeException("User not found"));;
+ user.setGlobalRole(role);
+ userRepository.save(user);
+ }
+
+ public boolean exists(UUID userId) {
+ return userRepository.existsById(UuidUtil.uuidToBin(userId));
+ }
+
}
diff --git a/core/src/main/resources/application.yml b/core/src/main/resources/application.yml
index b358a82..2498ba3 100644
--- a/core/src/main/resources/application.yml
+++ b/core/src/main/resources/application.yml
@@ -16,7 +16,7 @@ spring:
jpa:
open-in-view: false
hibernate:
- ddl-auto: update
+ ddl-auto: validate
properties:
hibernate:
format_sql: true
@@ -35,6 +35,11 @@ logging:
org.hibernate.orm.jdbc.bind: TRACE
org.springframework.security: INFO
+jwt:
+ private-key-path: /home/jomaa/.config/miarma-backend/private.pem
+ public-key-path: /home/jomaa/.config/miarma-backend/public.pem
+ expiration-ms: 3600000
+
management:
endpoints:
web:
diff --git a/huertos/.settings/org.eclipse.jdt.core.prefs b/huertos/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 2f5cc74..0000000
--- a/huertos/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/huertos/.settings/org.eclipse.m2e.core.prefs b/huertos/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f..0000000
--- a/huertos/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/huertos/.settings/org.springframework.ide.eclipse.prefs b/huertos/.settings/org.springframework.ide.eclipse.prefs
deleted file mode 100644
index a12794d..0000000
--- a/huertos/.settings/org.springframework.ide.eclipse.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-boot.validation.initialized=true
-eclipse.preferences.version=1
diff --git a/huertos/pom.xml b/huertos/pom.xml
index ae05f10..72f964d 100644
--- a/huertos/pom.xml
+++ b/huertos/pom.xml
@@ -9,6 +9,11 @@
huertos
+
+ 25
+ 25
+
+
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/config/SecurityConfig.java b/huertos/src/main/java/net/miarma/backend/huertos/config/SecurityConfig.java
new file mode 100644
index 0000000..7a058ec
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/config/SecurityConfig.java
@@ -0,0 +1,42 @@
+package net.miarma.backend.huertos.config;
+
+import net.miarma.backend.huertos.security.HuertosJwtFilter;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+
+@Configuration
+@EnableWebSecurity
+@EnableMethodSecurity(prePostEnabled = true)
+public class SecurityConfig {
+
+ private final HuertosJwtFilter jwtFilter;
+
+ public SecurityConfig(HuertosJwtFilter jwtFilter) {
+ this.jwtFilter = jwtFilter;
+ }
+
+ @Bean
+ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+ http
+ .csrf(csrf -> csrf.disable())
+ .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
+ .authorizeHttpRequests(auth -> auth
+ // PUBLICAS
+ .requestMatchers("/login").permitAll()
+ .requestMatchers("/announces/**").permitAll()
+ .requestMatchers("/huertos/members/waitlist").permitAll()
+ .requestMatchers("/huertos/members/latest-number").permitAll()
+ // PRIVADAS
+ .requestMatchers("/**").authenticated()
+ );
+ http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
+ return http.build();
+ }
+}
+
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/AnnouncementDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/AnnouncementDto.java
new file mode 100644
index 0000000..3c8e3fe
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/dto/AnnouncementDto.java
@@ -0,0 +1,84 @@
+package net.miarma.backend.huertos.dto;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public class AnnouncementDto {
+ public static class Request {
+ private String body;
+ private Byte priority;
+ private UUID publishedBy;
+
+ public String getBody() {
+ return body;
+ }
+
+ public void setBody(String body) {
+ this.body = body;
+ }
+
+ public Byte getPriority() {
+ return priority;
+ }
+
+ public void setPriority(Byte priority) {
+ this.priority = priority;
+ }
+
+ public UUID getPublishedBy() {
+ return publishedBy;
+ }
+
+ public void setPublishedBy(UUID publishedBy) {
+ this.publishedBy = publishedBy;
+ }
+ }
+
+ public static class Response {
+ private UUID announceId;
+ private String body;
+ private Byte priority;
+ private UUID publishedBy;
+ private Instant createdAt;
+
+ public UUID getAnnounceId() {
+ return announceId;
+ }
+
+ public void setAnnounceId(UUID announceId) {
+ this.announceId = announceId;
+ }
+
+ public String getBody() {
+ return body;
+ }
+
+ public void setBody(String body) {
+ this.body = body;
+ }
+
+ public Byte getPriority() {
+ return priority;
+ }
+
+ public void setPriority(Byte priority) {
+ this.priority = priority;
+ }
+
+ public UUID getPublishedBy() {
+ return publishedBy;
+ }
+
+ public void setPublishedBy(UUID publishedBy) {
+ this.publishedBy = publishedBy;
+ }
+
+ public Instant getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Instant createdAt) {
+ this.createdAt = createdAt;
+ }
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/BalanceDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/BalanceDto.java
new file mode 100644
index 0000000..f13803f
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/dto/BalanceDto.java
@@ -0,0 +1,43 @@
+package net.miarma.backend.huertos.dto;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+
+public class BalanceDto {
+ private Byte id;
+ private BigDecimal initialBank;
+ private BigDecimal initialCash;
+ private Instant createdAt;
+
+ public Byte getId() {
+ return id;
+ }
+
+ public void setId(Byte id) {
+ this.id = id;
+ }
+
+ public BigDecimal getInitialBank() {
+ return initialBank;
+ }
+
+ public void setInitialBank(BigDecimal initialBank) {
+ this.initialBank = initialBank;
+ }
+
+ public BigDecimal getInitialCash() {
+ return initialCash;
+ }
+
+ public void setInitialCash(BigDecimal initialCash) {
+ this.initialCash = initialCash;
+ }
+
+ public Instant getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Instant createdAt) {
+ this.createdAt = createdAt;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/BalanceWithTotalsDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/BalanceWithTotalsDto.java
deleted file mode 100644
index 0ceeec0..0000000
--- a/huertos/src/main/java/net/miarma/backend/huertos/dto/BalanceWithTotalsDto.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package net.miarma.backend.huertos.dto;
-
-public class BalanceWithTotalsDto {
-
-}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/ExpenseDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/ExpenseDto.java
new file mode 100644
index 0000000..541b27a
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/dto/ExpenseDto.java
@@ -0,0 +1,122 @@
+package net.miarma.backend.huertos.dto;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.util.UUID;
+
+public class ExpenseDto {
+ public static class Request {
+ private String concept;
+ private BigDecimal amount;
+ private String supplier;
+ private String invoice;
+ private Byte type;
+
+ public String getConcept() {
+ return concept;
+ }
+
+ public void setConcept(String concept) {
+ this.concept = concept;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ public String getSupplier() {
+ return supplier;
+ }
+
+ public void setSupplier(String supplier) {
+ this.supplier = supplier;
+ }
+
+ public String getInvoice() {
+ return invoice;
+ }
+
+ public void setInvoice(String invoice) {
+ this.invoice = invoice;
+ }
+
+ public Byte getType() {
+ return type;
+ }
+
+ public void setType(Byte type) {
+ this.type = type;
+ }
+ }
+
+ public static class Response {
+ private UUID expenseId;
+ private String concept;
+ private BigDecimal amount;
+ private String supplier;
+ private String invoice;
+
+ public UUID getExpenseId() {
+ return expenseId;
+ }
+
+ public void setExpenseId(UUID expenseId) {
+ this.expenseId = expenseId;
+ }
+
+ public String getConcept() {
+ return concept;
+ }
+
+ public void setConcept(String concept) {
+ this.concept = concept;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ public String getSupplier() {
+ return supplier;
+ }
+
+ public void setSupplier(String supplier) {
+ this.supplier = supplier;
+ }
+
+ public String getInvoice() {
+ return invoice;
+ }
+
+ public void setInvoice(String invoice) {
+ this.invoice = invoice;
+ }
+
+ public Byte getType() {
+ return type;
+ }
+
+ public void setType(Byte type) {
+ this.type = type;
+ }
+
+ public Instant getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Instant createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ private Byte type;
+ private Instant createdAt;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/HuertosUserMetadataDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/HuertosUserMetadataDto.java
new file mode 100644
index 0000000..ff63b21
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/dto/HuertosUserMetadataDto.java
@@ -0,0 +1,106 @@
+package net.miarma.backend.huertos.dto;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public class HuertosUserMetadataDto {
+ private UUID userId;
+ private Integer memberNumber;
+ private Integer plotNumber;
+ private String dni;
+ private String phone;
+ private Byte type;
+ private Byte role;
+ private String notes;
+ private Instant createdAt;
+ private Instant assignedAt;
+ private Instant deactivatedAt;
+
+ public UUID getUserId() {
+ return userId;
+ }
+
+ public void setUserId(UUID userId) {
+ this.userId = userId;
+ }
+
+ public Integer getMemberNumber() {
+ return memberNumber;
+ }
+
+ public void setMemberNumber(Integer memberNumber) {
+ this.memberNumber = memberNumber;
+ }
+
+ public Integer getPlotNumber() {
+ return plotNumber;
+ }
+
+ public void setPlotNumber(Integer plotNumber) {
+ this.plotNumber = plotNumber;
+ }
+
+ public String getDni() {
+ return dni;
+ }
+
+ public void setDni(String dni) {
+ this.dni = dni;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public Byte getType() {
+ return type;
+ }
+
+ public void setType(Byte type) {
+ this.type = type;
+ }
+
+ public Byte getRole() {
+ return role;
+ }
+
+ public void setRole(Byte role) {
+ this.role = role;
+ }
+
+ public String getNotes() {
+ return notes;
+ }
+
+ public void setNotes(String notes) {
+ this.notes = notes;
+ }
+
+ public Instant getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Instant createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public Instant getAssignedAt() {
+ return assignedAt;
+ }
+
+ public void setAssignedAt(Instant assignedAt) {
+ this.assignedAt = assignedAt;
+ }
+
+ public Instant getDeactivatedAt() {
+ return deactivatedAt;
+ }
+
+ public void setDeactivatedAt(Instant deactivatedAt) {
+ this.deactivatedAt = deactivatedAt;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/IncomeDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/IncomeDto.java
new file mode 100644
index 0000000..f30b4f4
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/dto/IncomeDto.java
@@ -0,0 +1,121 @@
+package net.miarma.backend.huertos.dto;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.util.UUID;
+
+public class IncomeDto {
+ public static class Request {
+ private UUID userId;
+ private String concept;
+ private BigDecimal amount;
+ private Byte type;
+ private Byte frequency;
+
+ public UUID getUserId() {
+ return userId;
+ }
+
+ public void setUserId(UUID userId) {
+ this.userId = userId;
+ }
+
+ public String getConcept() {
+ return concept;
+ }
+
+ public void setConcept(String concept) {
+ this.concept = concept;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ public Byte getType() {
+ return type;
+ }
+
+ public void setType(Byte type) {
+ this.type = type;
+ }
+
+ public Byte getFrequency() {
+ return frequency;
+ }
+
+ public void setFrequency(Byte frequency) {
+ this.frequency = frequency;
+ }
+ }
+
+ public static class Response {
+ private UUID incomeId;
+ private UUID userId;
+ private String concept;
+ private BigDecimal amount;
+ private Byte type;
+ private Byte frequency;
+ private Instant createdAt;
+
+ public UUID getIncomeId() {
+ return incomeId;
+ }
+
+ public void setIncomeId(UUID incomeId) {
+ this.incomeId = incomeId;
+ }
+
+ public UUID getUserId() {
+ return userId;
+ }
+
+ public void setUserId(UUID userId) {
+ this.userId = userId;
+ }
+
+ public String getConcept() {
+ return concept;
+ }
+
+ public void setConcept(String concept) {
+ this.concept = concept;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ public Byte getType() {
+ return type;
+ }
+
+ public void setType(Byte type) {
+ this.type = type;
+ }
+
+ public Byte getFrequency() {
+ return frequency;
+ }
+
+ public void setFrequency(Byte frequency) {
+ this.frequency = frequency;
+ }
+
+ public Instant getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Instant createdAt) {
+ this.createdAt = createdAt;
+ }
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/PreUserDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/PreUserDto.java
new file mode 100644
index 0000000..f9d1452
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/dto/PreUserDto.java
@@ -0,0 +1,274 @@
+package net.miarma.backend.huertos.dto;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public class PreUserDto {
+ public static class Request {
+ private UUID requestId;
+ private String userName;
+ private String displayName;
+ private String dni;
+ private String phone;
+ private String email;
+ private String password;
+ private String address;
+ private String zipCode;
+ private String city;
+ private Integer memberNumber;
+ private Integer plotNumber;
+ private Byte type;
+
+ public UUID getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(UUID requestId) {
+ this.requestId = requestId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String getDni() {
+ return dni;
+ }
+
+ public void setDni(String dni) {
+ this.dni = dni;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ 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 String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getZipCode() {
+ return zipCode;
+ }
+
+ public void setZipCode(String zipCode) {
+ this.zipCode = zipCode;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public Integer getMemberNumber() {
+ return memberNumber;
+ }
+
+ public void setMemberNumber(Integer memberNumber) {
+ this.memberNumber = memberNumber;
+ }
+
+ public Integer getPlotNumber() {
+ return plotNumber;
+ }
+
+ public void setPlotNumber(Integer plotNumber) {
+ this.plotNumber = plotNumber;
+ }
+
+ public Byte getType() {
+ return type;
+ }
+
+ public void setType(Byte type) {
+ this.type = type;
+ }
+
+ public Byte getRole() {
+ return role;
+ }
+
+ public void setRole(Byte role) {
+ this.role = role;
+ }
+
+ private Byte role;
+ }
+
+ public static class Response {
+ private UUID preUserId;
+ private UUID requestId;
+ private String userName;
+ private String displayName;
+ private String dni;
+ private String phone;
+ private String email;
+ private String address;
+ private String zipCode;
+ private String city;
+ private Integer memberNumber;
+ private Integer plotNumber;
+ private Byte type;
+ private Byte role;
+ private Instant createdAt;
+
+ public UUID getPreUserId() {
+ return preUserId;
+ }
+
+ public void setPreUserId(UUID preUserId) {
+ this.preUserId = preUserId;
+ }
+
+ public UUID getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(UUID requestId) {
+ this.requestId = requestId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String getDni() {
+ return dni;
+ }
+
+ public void setDni(String dni) {
+ this.dni = dni;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getZipCode() {
+ return zipCode;
+ }
+
+ public void setZipCode(String zipCode) {
+ this.zipCode = zipCode;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public Integer getMemberNumber() {
+ return memberNumber;
+ }
+
+ public void setMemberNumber(Integer memberNumber) {
+ this.memberNumber = memberNumber;
+ }
+
+ public Integer getPlotNumber() {
+ return plotNumber;
+ }
+
+ public void setPlotNumber(Integer plotNumber) {
+ this.plotNumber = plotNumber;
+ }
+
+ public Byte getType() {
+ return type;
+ }
+
+ public void setType(Byte type) {
+ this.type = type;
+ }
+
+ public Byte getRole() {
+ return role;
+ }
+
+ public void setRole(Byte role) {
+ this.role = role;
+ }
+
+ public Instant getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Instant createdAt) {
+ this.createdAt = createdAt;
+ }
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/RequestDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/RequestDto.java
new file mode 100644
index 0000000..d6dc42d
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/dto/RequestDto.java
@@ -0,0 +1,104 @@
+package net.miarma.backend.huertos.dto;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public class RequestDto {
+ public static class Request {
+ private Byte type;
+ private Byte status;
+ private UUID requestedBy;
+
+ public Byte getType() {
+ return type;
+ }
+
+ public void setType(Byte type) {
+ this.type = type;
+ }
+
+ public Byte getStatus() {
+ return status;
+ }
+
+ public void setStatus(Byte status) {
+ this.status = status;
+ }
+
+ public UUID getRequestedBy() {
+ return requestedBy;
+ }
+
+ public void setRequestedBy(UUID requestedBy) {
+ this.requestedBy = requestedBy;
+ }
+
+ public UUID getTargetUserId() {
+ return targetUserId;
+ }
+
+ public void setTargetUserId(UUID targetUserId) {
+ this.targetUserId = targetUserId;
+ }
+
+ private UUID targetUserId;
+ }
+
+ public static class Response {
+ private UUID requestId;
+ private Byte type;
+ private Byte status;
+
+ public UUID getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(UUID requestId) {
+ this.requestId = requestId;
+ }
+
+ public Byte getType() {
+ return type;
+ }
+
+ public void setType(Byte type) {
+ this.type = type;
+ }
+
+ public Byte getStatus() {
+ return status;
+ }
+
+ public void setStatus(Byte status) {
+ this.status = status;
+ }
+
+ public UUID getRequestedBy() {
+ return requestedBy;
+ }
+
+ public void setRequestedBy(UUID requestedBy) {
+ this.requestedBy = requestedBy;
+ }
+
+ public UUID getTargetUserId() {
+ return targetUserId;
+ }
+
+ public void setTargetUserId(UUID targetUserId) {
+ this.targetUserId = targetUserId;
+ }
+
+ public Instant getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Instant createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ private UUID requestedBy;
+ private UUID targetUserId;
+ private Instant createdAt;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VBalanceWithTotalsDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VBalanceWithTotalsDto.java
new file mode 100644
index 0000000..ed71815
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VBalanceWithTotalsDto.java
@@ -0,0 +1,78 @@
+package net.miarma.backend.huertos.dto.view;
+
+import java.time.Instant;
+
+public class VBalanceWithTotalsDto {
+ private Long id;
+ private Double initialBank;
+ private Double initialCash;
+ private Double totalBankExpenses;
+ private Double totalCashExpenses;
+ private Double totalBankIncomes;
+ private Double totalCashIncomes;
+ private Instant createdAt;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Double getInitialBank() {
+ return initialBank;
+ }
+
+ public void setInitialBank(Double initialBank) {
+ this.initialBank = initialBank;
+ }
+
+ public Double getInitialCash() {
+ return initialCash;
+ }
+
+ public void setInitialCash(Double initialCash) {
+ this.initialCash = initialCash;
+ }
+
+ public Double getTotalBankExpenses() {
+ return totalBankExpenses;
+ }
+
+ public void setTotalBankExpenses(Double totalBankExpenses) {
+ this.totalBankExpenses = totalBankExpenses;
+ }
+
+ public Double getTotalCashExpenses() {
+ return totalCashExpenses;
+ }
+
+ public void setTotalCashExpenses(Double totalCashExpenses) {
+ this.totalCashExpenses = totalCashExpenses;
+ }
+
+ public Double getTotalBankIncomes() {
+ return totalBankIncomes;
+ }
+
+ public void setTotalBankIncomes(Double totalBankIncomes) {
+ this.totalBankIncomes = totalBankIncomes;
+ }
+
+ public Double getTotalCashIncomes() {
+ return totalCashIncomes;
+ }
+
+ public void setTotalCashIncomes(Double totalCashIncomes) {
+ this.totalCashIncomes = totalCashIncomes;
+ }
+
+ public Instant getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Instant createdAt) {
+ this.createdAt = createdAt;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VHuertosMemberDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VHuertosMemberDto.java
new file mode 100644
index 0000000..fc6f3eb
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VHuertosMemberDto.java
@@ -0,0 +1,151 @@
+package net.miarma.backend.huertos.dto.view;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public class VHuertosMemberDto {
+ private UUID userId;
+ private String displayName;
+ private String avatar;
+ private Integer memberNumber;
+ private Integer plotNumber;
+ private String dni;
+ private String phone;
+ private Byte type;
+ private Byte role;
+ private Byte credentialStatus;
+ private String notes;
+ private Instant createdAt;
+ private Instant assignedAt;
+ private Instant deactivatedAt;
+ private Byte serviceId;
+ private String serviceName;
+
+ public UUID getUserId() {
+ return userId;
+ }
+
+ public void setUserId(UUID userId) {
+ this.userId = userId;
+ }
+
+ 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 Integer getMemberNumber() {
+ return memberNumber;
+ }
+
+ public void setMemberNumber(Integer memberNumber) {
+ this.memberNumber = memberNumber;
+ }
+
+ public Integer getPlotNumber() {
+ return plotNumber;
+ }
+
+ public void setPlotNumber(Integer plotNumber) {
+ this.plotNumber = plotNumber;
+ }
+
+ public String getDni() {
+ return dni;
+ }
+
+ public void setDni(String dni) {
+ this.dni = dni;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public Byte getType() {
+ return type;
+ }
+
+ public void setType(Byte type) {
+ this.type = type;
+ }
+
+ public Byte getRole() {
+ return role;
+ }
+
+ public void setRole(Byte role) {
+ this.role = role;
+ }
+
+ public Byte getCredentialStatus() {
+ return credentialStatus;
+ }
+
+ public void setCredentialStatus(Byte credentialStatus) {
+ this.credentialStatus = credentialStatus;
+ }
+
+ public String getNotes() {
+ return notes;
+ }
+
+ public void setNotes(String notes) {
+ this.notes = notes;
+ }
+
+ public Instant getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Instant createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public Instant getAssignedAt() {
+ return assignedAt;
+ }
+
+ public void setAssignedAt(Instant assignedAt) {
+ this.assignedAt = assignedAt;
+ }
+
+ public Instant getDeactivatedAt() {
+ return deactivatedAt;
+ }
+
+ public void setDeactivatedAt(Instant deactivatedAt) {
+ this.deactivatedAt = deactivatedAt;
+ }
+
+ public Byte getServiceId() {
+ return serviceId;
+ }
+
+ public void setServiceId(Byte serviceId) {
+ this.serviceId = serviceId;
+ }
+
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VIncomesWithFullNamesDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VIncomesWithFullNamesDto.java
new file mode 100644
index 0000000..54d94d7
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VIncomesWithFullNamesDto.java
@@ -0,0 +1,79 @@
+package net.miarma.backend.huertos.dto.view;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public class VIncomesWithFullNamesDto {
+ private UUID incomeId;
+ private UUID userId;
+ private String displayName;
+ private String concept;
+ private Double amount;
+ private Byte type;
+ private Byte frequency;
+ private Instant createdAt;
+
+ public UUID getIncomeId() {
+ return incomeId;
+ }
+
+ public void setIncomeId(UUID incomeId) {
+ this.incomeId = incomeId;
+ }
+
+ public UUID getUserId() {
+ return userId;
+ }
+
+ public void setUserId(UUID userId) {
+ this.userId = userId;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String getConcept() {
+ return concept;
+ }
+
+ public void setConcept(String concept) {
+ this.concept = concept;
+ }
+
+ public Double getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Double amount) {
+ this.amount = amount;
+ }
+
+ public Byte getType() {
+ return type;
+ }
+
+ public void setType(Byte type) {
+ this.type = type;
+ }
+
+ public Byte getFrequency() {
+ return frequency;
+ }
+
+ public void setFrequency(Byte frequency) {
+ this.frequency = frequency;
+ }
+
+ public Instant getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Instant createdAt) {
+ this.createdAt = createdAt;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VRequestsWithPreUsersDto.java b/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VRequestsWithPreUsersDto.java
new file mode 100644
index 0000000..57b3b64
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/dto/view/VRequestsWithPreUsersDto.java
@@ -0,0 +1,198 @@
+package net.miarma.backend.huertos.dto.view;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public class VRequestsWithPreUsersDto {
+ private UUID requestId;
+ private Byte requestType;
+ private Byte requestStatus;
+ private UUID requestedBy;
+ private String requestedByName;
+ private UUID targetUserId;
+ private Instant requestCreatedAt;
+
+ // PreUser fields
+ private UUID preUserId;
+ private String preUserName;
+ private String preDisplayName;
+ private String preDni;
+ private String prePhone;
+ private String preEmail;
+ private String preAddress;
+ private String preZipCode;
+ private String preCity;
+ private Integer preMemberNumber;
+ private Integer prePlotNumber;
+ private Byte preType;
+ private Byte preRole;
+ private Instant preCreatedAt;
+
+ public UUID getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(UUID requestId) {
+ this.requestId = requestId;
+ }
+
+ public Byte getRequestType() {
+ return requestType;
+ }
+
+ public void setRequestType(Byte requestType) {
+ this.requestType = requestType;
+ }
+
+ public Byte getRequestStatus() {
+ return requestStatus;
+ }
+
+ public void setRequestStatus(Byte requestStatus) {
+ this.requestStatus = requestStatus;
+ }
+
+ public UUID getRequestedBy() {
+ return requestedBy;
+ }
+
+ public void setRequestedBy(UUID requestedBy) {
+ this.requestedBy = requestedBy;
+ }
+
+ public String getRequestedByName() {
+ return requestedByName;
+ }
+
+ public void setRequestedByName(String requestedByName) {
+ this.requestedByName = requestedByName;
+ }
+
+ public UUID getTargetUserId() {
+ return targetUserId;
+ }
+
+ public void setTargetUserId(UUID targetUserId) {
+ this.targetUserId = targetUserId;
+ }
+
+ public Instant getRequestCreatedAt() {
+ return requestCreatedAt;
+ }
+
+ public void setRequestCreatedAt(Instant requestCreatedAt) {
+ this.requestCreatedAt = requestCreatedAt;
+ }
+
+ public UUID getPreUserId() {
+ return preUserId;
+ }
+
+ public void setPreUserId(UUID preUserId) {
+ this.preUserId = preUserId;
+ }
+
+ public String getPreUserName() {
+ return preUserName;
+ }
+
+ public void setPreUserName(String preUserName) {
+ this.preUserName = preUserName;
+ }
+
+ public String getPreDisplayName() {
+ return preDisplayName;
+ }
+
+ public void setPreDisplayName(String preDisplayName) {
+ this.preDisplayName = preDisplayName;
+ }
+
+ public String getPreDni() {
+ return preDni;
+ }
+
+ public void setPreDni(String preDni) {
+ this.preDni = preDni;
+ }
+
+ public String getPrePhone() {
+ return prePhone;
+ }
+
+ public void setPrePhone(String prePhone) {
+ this.prePhone = prePhone;
+ }
+
+ public String getPreEmail() {
+ return preEmail;
+ }
+
+ public void setPreEmail(String preEmail) {
+ this.preEmail = preEmail;
+ }
+
+ public String getPreAddress() {
+ return preAddress;
+ }
+
+ public void setPreAddress(String preAddress) {
+ this.preAddress = preAddress;
+ }
+
+ public String getPreZipCode() {
+ return preZipCode;
+ }
+
+ public void setPreZipCode(String preZipCode) {
+ this.preZipCode = preZipCode;
+ }
+
+ public String getPreCity() {
+ return preCity;
+ }
+
+ public void setPreCity(String preCity) {
+ this.preCity = preCity;
+ }
+
+ public Integer getPreMemberNumber() {
+ return preMemberNumber;
+ }
+
+ public void setPreMemberNumber(Integer preMemberNumber) {
+ this.preMemberNumber = preMemberNumber;
+ }
+
+ public Integer getPrePlotNumber() {
+ return prePlotNumber;
+ }
+
+ public void setPrePlotNumber(Integer prePlotNumber) {
+ this.prePlotNumber = prePlotNumber;
+ }
+
+ public Byte getPreType() {
+ return preType;
+ }
+
+ public void setPreType(Byte preType) {
+ this.preType = preType;
+ }
+
+ public Byte getPreRole() {
+ return preRole;
+ }
+
+ public void setPreRole(Byte preRole) {
+ this.preRole = preRole;
+ }
+
+ public Instant getPreCreatedAt() {
+ return preCreatedAt;
+ }
+
+ public void setPreCreatedAt(Instant preCreatedAt) {
+ this.preCreatedAt = preCreatedAt;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/mapper/AnnouncementMapper.java b/huertos/src/main/java/net/miarma/backend/huertos/mapper/AnnouncementMapper.java
new file mode 100644
index 0000000..5502518
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/mapper/AnnouncementMapper.java
@@ -0,0 +1,30 @@
+package net.miarma.backend.huertos.mapper;
+
+import net.miarma.backend.huertos.dto.AnnouncementDto;
+import net.miarma.backend.huertos.model.Announcement;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public class AnnouncementMapper {
+
+ public static AnnouncementDto.Response toDto(Announcement entity) {
+ AnnouncementDto.Response dto = new AnnouncementDto.Response();
+ dto.setAnnounceId(entity.getAnnounceId());
+ dto.setBody(entity.getBody());
+ dto.setPriority(entity.getPriority());
+ dto.setPublishedBy(entity.getPublishedBy());
+ dto.setCreatedAt(entity.getCreatedAt());
+ return dto;
+ }
+
+ public static Announcement toEntity(AnnouncementDto.Request dto) {
+ Announcement entity = new Announcement();
+ entity.setAnnounceId(UUID.randomUUID());
+ entity.setBody(dto.getBody());
+ entity.setPriority(dto.getPriority());
+ entity.setPublishedBy(dto.getPublishedBy());
+ entity.setCreatedAt(Instant.now());
+ return entity;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/mapper/BalanceMapper.java b/huertos/src/main/java/net/miarma/backend/huertos/mapper/BalanceMapper.java
new file mode 100644
index 0000000..238768c
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/mapper/BalanceMapper.java
@@ -0,0 +1,29 @@
+package net.miarma.backend.huertos.mapper;
+
+import net.miarma.backend.huertos.dto.BalanceDto;
+import net.miarma.backend.huertos.model.Balance;
+
+public class BalanceMapper {
+
+ public static BalanceDto toDto(Balance balance) {
+ if (balance == null) return null;
+
+ BalanceDto dto = new BalanceDto();
+ dto.setId(balance.getId());
+ dto.setInitialBank(balance.getInitialBank());
+ dto.setInitialCash(balance.getInitialCash());
+ dto.setCreatedAt(balance.getCreatedAt());
+ return dto;
+ }
+
+ public static Balance toEntity(BalanceDto dto) {
+ if (dto == null) return null;
+
+ Balance balance = new Balance();
+ balance.setId(dto.getId());
+ balance.setInitialBank(dto.getInitialBank());
+ balance.setInitialCash(dto.getInitialCash());
+ balance.setCreatedAt(dto.getCreatedAt());
+ return balance;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/mapper/ExpenseMapper.java b/huertos/src/main/java/net/miarma/backend/huertos/mapper/ExpenseMapper.java
new file mode 100644
index 0000000..f750d5a
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/mapper/ExpenseMapper.java
@@ -0,0 +1,33 @@
+package net.miarma.backend.huertos.mapper;
+
+import net.miarma.backend.huertos.dto.ExpenseDto;
+import net.miarma.backend.huertos.model.Expense;
+
+public class ExpenseMapper {
+
+ public static ExpenseDto.Response toResponse(Expense entity) {
+ if (entity == null) return null;
+
+ ExpenseDto.Response dto = new ExpenseDto.Response();
+ dto.setExpenseId(entity.getExpenseId());
+ dto.setConcept(entity.getConcept());
+ dto.setAmount(entity.getAmount());
+ dto.setSupplier(entity.getSupplier());
+ dto.setInvoice(entity.getInvoice());
+ dto.setType(entity.getType());
+ dto.setCreatedAt(entity.getCreatedAt());
+ return dto;
+ }
+
+ public static Expense toEntity(ExpenseDto.Request dto) {
+ if (dto == null) return null;
+
+ Expense entity = new Expense();
+ entity.setConcept(dto.getConcept());
+ entity.setAmount(dto.getAmount());
+ entity.setSupplier(dto.getSupplier());
+ entity.setInvoice(dto.getInvoice());
+ entity.setType(dto.getType());
+ return entity;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/mapper/HuertosUserMetadataMapper.java b/huertos/src/main/java/net/miarma/backend/huertos/mapper/HuertosUserMetadataMapper.java
new file mode 100644
index 0000000..1812126
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/mapper/HuertosUserMetadataMapper.java
@@ -0,0 +1,39 @@
+package net.miarma.backend.huertos.mapper;
+
+import net.miarma.backend.huertos.dto.HuertosUserMetadataDto;
+import net.miarma.backend.huertos.model.HuertosUserMetadata;
+
+public class HuertosUserMetadataMapper {
+
+ public static HuertosUserMetadataDto toDto(HuertosUserMetadata entity) {
+ HuertosUserMetadataDto dto = new HuertosUserMetadataDto();
+ dto.setUserId(entity.getUserId());
+ dto.setMemberNumber(entity.getMemberNumber());
+ dto.setPlotNumber(entity.getPlotNumber());
+ dto.setDni(entity.getDni());
+ dto.setPhone(entity.getPhone());
+ dto.setType(entity.getType());
+ dto.setRole(entity.getRole());
+ dto.setNotes(entity.getNotes());
+ dto.setCreatedAt(entity.getCreatedAt());
+ dto.setAssignedAt(entity.getAssignedAt());
+ dto.setDeactivatedAt(entity.getDeactivatedAt());
+ return dto;
+ }
+
+ public static HuertosUserMetadata fromDto(HuertosUserMetadataDto dto) {
+ HuertosUserMetadata entity = new HuertosUserMetadata();
+ entity.setUserId(dto.getUserId());
+ entity.setMemberNumber(dto.getMemberNumber());
+ entity.setPlotNumber(dto.getPlotNumber());
+ entity.setDni(dto.getDni());
+ entity.setPhone(dto.getPhone());
+ entity.setType(dto.getType());
+ entity.setRole(dto.getRole());
+ entity.setNotes(dto.getNotes());
+ entity.setCreatedAt(dto.getCreatedAt());
+ entity.setAssignedAt(dto.getAssignedAt());
+ entity.setDeactivatedAt(dto.getDeactivatedAt());
+ return entity;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/mapper/IncomeMapper.java b/huertos/src/main/java/net/miarma/backend/huertos/mapper/IncomeMapper.java
new file mode 100644
index 0000000..6a52b41
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/mapper/IncomeMapper.java
@@ -0,0 +1,33 @@
+package net.miarma.backend.huertos.mapper;
+
+import net.miarma.backend.huertos.dto.IncomeDto;
+import net.miarma.backend.huertos.model.Income;
+
+public class IncomeMapper {
+
+ public static IncomeDto.Response toResponse(Income entity) {
+ if (entity == null) return null;
+
+ IncomeDto.Response dto = new IncomeDto.Response();
+ dto.setIncomeId(entity.getIncomeId());
+ dto.setUserId(entity.getUserId());
+ dto.setConcept(entity.getConcept());
+ dto.setAmount(entity.getAmount());
+ dto.setType(entity.getType());
+ dto.setFrequency(entity.getFrequency());
+ dto.setCreatedAt(entity.getCreatedAt());
+ return dto;
+ }
+
+ public static Income toEntity(IncomeDto.Request dto) {
+ if (dto == null) return null;
+
+ Income entity = new Income();
+ entity.setUserId(dto.getUserId());
+ entity.setConcept(dto.getConcept());
+ entity.setAmount(dto.getAmount());
+ entity.setType(dto.getType());
+ entity.setFrequency(dto.getFrequency());
+ return entity;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/mapper/PreUserMapper.java b/huertos/src/main/java/net/miarma/backend/huertos/mapper/PreUserMapper.java
new file mode 100644
index 0000000..6dda212
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/mapper/PreUserMapper.java
@@ -0,0 +1,50 @@
+package net.miarma.backend.huertos.mapper;
+
+import net.miarma.backend.huertos.dto.PreUserDto;
+import net.miarma.backend.huertos.model.PreUser;
+
+public class PreUserMapper {
+
+ public static PreUserDto.Response toResponse(PreUser entity) {
+ if (entity == null) return null;
+
+ PreUserDto.Response dto = new PreUserDto.Response();
+ dto.setPreUserId(entity.getPreUserId());
+ dto.setRequestId(entity.getRequestId());
+ dto.setUserName(entity.getUserName());
+ dto.setDisplayName(entity.getDisplayName());
+ dto.setDni(entity.getDni());
+ dto.setPhone(entity.getPhone());
+ dto.setEmail(entity.getEmail());
+ dto.setAddress(entity.getAddress());
+ dto.setZipCode(entity.getZipCode());
+ dto.setCity(entity.getCity());
+ dto.setMemberNumber(entity.getMemberNumber());
+ dto.setPlotNumber(entity.getPlotNumber());
+ dto.setType(entity.getType());
+ dto.setRole(entity.getRole());
+ dto.setCreatedAt(entity.getCreatedAt());
+ return dto;
+ }
+
+ public static PreUser toEntity(PreUserDto.Request dto) {
+ if (dto == null) return null;
+
+ PreUser entity = new PreUser();
+ entity.setRequestId(dto.getRequestId());
+ entity.setUserName(dto.getUserName());
+ entity.setDisplayName(dto.getDisplayName());
+ entity.setDni(dto.getDni());
+ entity.setPhone(dto.getPhone());
+ entity.setEmail(dto.getEmail());
+ entity.setPassword(dto.getPassword());
+ entity.setAddress(dto.getAddress());
+ entity.setZipCode(dto.getZipCode());
+ entity.setCity(dto.getCity());
+ entity.setMemberNumber(dto.getMemberNumber());
+ entity.setPlotNumber(dto.getPlotNumber());
+ entity.setType(dto.getType());
+ entity.setRole(dto.getRole());
+ return entity;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/mapper/RequestMapper.java b/huertos/src/main/java/net/miarma/backend/huertos/mapper/RequestMapper.java
new file mode 100644
index 0000000..1779048
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/mapper/RequestMapper.java
@@ -0,0 +1,31 @@
+package net.miarma.backend.huertos.mapper;
+
+import net.miarma.backend.huertos.dto.RequestDto;
+import net.miarma.backend.huertos.model.Request;
+
+public class RequestMapper {
+
+ public static RequestDto.Response toResponse(Request entity) {
+ if (entity == null) return null;
+
+ RequestDto.Response dto = new RequestDto.Response();
+ dto.setRequestId(entity.getRequestId());
+ dto.setType(entity.getType());
+ dto.setStatus(entity.getStatus());
+ dto.setRequestedBy(entity.getRequestedBy());
+ dto.setTargetUserId(entity.getTargetUserId());
+ dto.setCreatedAt(entity.getCreatedAt());
+ return dto;
+ }
+
+ public static Request toEntity(RequestDto.Request dto) {
+ if (dto == null) return null;
+
+ Request entity = new Request();
+ entity.setType(dto.getType());
+ entity.setStatus(dto.getStatus());
+ entity.setRequestedBy(dto.getRequestedBy());
+ entity.setTargetUserId(dto.getTargetUserId());
+ return entity;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VBalanceWithTotalsMapper.java b/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VBalanceWithTotalsMapper.java
new file mode 100644
index 0000000..3d07229
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VBalanceWithTotalsMapper.java
@@ -0,0 +1,20 @@
+package net.miarma.backend.huertos.mapper.view;
+
+import net.miarma.backend.huertos.dto.view.VBalanceWithTotalsDto;
+import net.miarma.backend.huertos.model.view.VBalanceWithTotals;
+
+public class VBalanceWithTotalsMapper {
+
+ public static VBalanceWithTotalsDto toDto(VBalanceWithTotals entity) {
+ VBalanceWithTotalsDto dto = new VBalanceWithTotalsDto();
+ dto.setId(entity.getId());
+ dto.setInitialBank(entity.getInitialBank());
+ dto.setInitialCash(entity.getInitialCash());
+ dto.setTotalBankExpenses(entity.getTotalBankExpenses());
+ dto.setTotalCashExpenses(entity.getTotalCashExpenses());
+ dto.setTotalBankIncomes(entity.getTotalBankIncomes());
+ dto.setTotalCashIncomes(entity.getTotalCashIncomes());
+ dto.setCreatedAt(entity.getCreatedAt());
+ return dto;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VHuertosMemberMapper.java b/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VHuertosMemberMapper.java
new file mode 100644
index 0000000..d85ed7f
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VHuertosMemberMapper.java
@@ -0,0 +1,28 @@
+package net.miarma.backend.huertos.mapper.view;
+
+import net.miarma.backend.huertos.dto.view.VHuertosMemberDto;
+import net.miarma.backend.huertos.model.view.VHuertosMember;
+
+public class VHuertosMemberMapper {
+
+ public static VHuertosMemberDto toDto(VHuertosMember entity) {
+ VHuertosMemberDto dto = new VHuertosMemberDto();
+ dto.setUserId(entity.getUserId());
+ dto.setDisplayName(entity.getDisplayName());
+ dto.setAvatar(entity.getAvatar());
+ dto.setMemberNumber(entity.getMemberNumber());
+ dto.setPlotNumber(entity.getPlotNumber());
+ dto.setDni(entity.getDni());
+ dto.setPhone(entity.getPhone());
+ dto.setType(entity.getType());
+ dto.setRole(entity.getRole());
+ dto.setCredentialStatus(entity.getCredentialStatus());
+ dto.setNotes(entity.getNotes());
+ dto.setCreatedAt(entity.getCreatedAt());
+ dto.setAssignedAt(entity.getAssignedAt());
+ dto.setDeactivatedAt(entity.getDeactivatedAt());
+ dto.setServiceId(entity.getServiceId());
+ dto.setServiceName(entity.getServiceName());
+ return dto;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VIncomesWithFullNamesMapper.java b/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VIncomesWithFullNamesMapper.java
new file mode 100644
index 0000000..b71bbf3
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VIncomesWithFullNamesMapper.java
@@ -0,0 +1,20 @@
+package net.miarma.backend.huertos.mapper.view;
+
+import net.miarma.backend.huertos.dto.view.VIncomesWithFullNamesDto;
+import net.miarma.backend.huertos.model.view.VIncomesWithFullNames;
+
+public class VIncomesWithFullNamesMapper {
+
+ public static VIncomesWithFullNamesDto toDto(VIncomesWithFullNames entity) {
+ VIncomesWithFullNamesDto dto = new VIncomesWithFullNamesDto();
+ dto.setIncomeId(entity.getIncomeId());
+ dto.setUserId(entity.getUserId());
+ dto.setDisplayName(entity.getDisplayName());
+ dto.setConcept(entity.getConcept());
+ dto.setAmount(entity.getAmount());
+ dto.setType(entity.getType());
+ dto.setFrequency(entity.getFrequency());
+ dto.setCreatedAt(entity.getCreatedAt());
+ return dto;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VRequestsWithPreUsersMapper.java b/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VRequestsWithPreUsersMapper.java
new file mode 100644
index 0000000..8ac6bbe
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/mapper/view/VRequestsWithPreUsersMapper.java
@@ -0,0 +1,35 @@
+package net.miarma.backend.huertos.mapper.view;
+
+import net.miarma.backend.huertos.dto.view.VRequestsWithPreUsersDto;
+import net.miarma.backend.huertos.model.view.VRequestsWithPreUsers;
+
+public class VRequestsWithPreUsersMapper {
+
+ public static VRequestsWithPreUsersDto toDto(VRequestsWithPreUsers entity) {
+ VRequestsWithPreUsersDto dto = new VRequestsWithPreUsersDto();
+ dto.setRequestId(entity.getRequestId());
+ dto.setRequestType(entity.getRequestType());
+ dto.setRequestStatus(entity.getRequestStatus());
+ dto.setRequestedBy(entity.getRequestedBy());
+ dto.setRequestedByName(entity.getRequestedByName());
+ dto.setTargetUserId(entity.getTargetUserId());
+ dto.setRequestCreatedAt(entity.getRequestCreatedAt());
+
+ dto.setPreUserId(entity.getPreUserId());
+ dto.setPreUserName(entity.getPreUserName());
+ dto.setPreDisplayName(entity.getPreDisplayName());
+ dto.setPreDni(entity.getPreDni());
+ dto.setPrePhone(entity.getPrePhone());
+ dto.setPreEmail(entity.getPreEmail());
+ dto.setPreAddress(entity.getPreAddress());
+ dto.setPreZipCode(entity.getPreZipCode());
+ dto.setPreCity(entity.getPreCity());
+ dto.setPreMemberNumber(entity.getPreMemberNumber());
+ dto.setPrePlotNumber(entity.getPrePlotNumber());
+ dto.setPreType(entity.getPreType());
+ dto.setPreRole(entity.getPreRole());
+ dto.setPreCreatedAt(entity.getPreCreatedAt());
+
+ return dto;
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VHuertosMemberRepository.java b/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VHuertosMemberRepository.java
index 9ac9a58..b7f59a2 100644
--- a/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VHuertosMemberRepository.java
+++ b/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VHuertosMemberRepository.java
@@ -4,7 +4,9 @@ import net.miarma.backend.huertos.model.view.VHuertosMember;
import org.springframework.data.repository.Repository;
import java.util.List;
+import java.util.Optional;
public interface VHuertosMemberRepository extends Repository {
- List findAll();
+ List findAll();
+ Optional findById(byte[] userId);
}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VIncomesWithFullNamesRepository.java b/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VIncomesWithFullNamesRepository.java
index a14d80d..e5d1e51 100644
--- a/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VIncomesWithFullNamesRepository.java
+++ b/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VIncomesWithFullNamesRepository.java
@@ -4,7 +4,9 @@ import net.miarma.backend.huertos.model.view.VIncomesWithFullNames;
import org.springframework.data.repository.Repository;
import java.util.List;
+import java.util.Optional;
public interface VIncomesWithFullNamesRepository extends Repository {
- List findAll();
+ List findAll();
+ Optional findById(byte[] incomeId);
}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VRequestsWithPreUsersRepository.java b/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VRequestsWithPreUsersRepository.java
index dd3b97a..8af8a7a 100644
--- a/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VRequestsWithPreUsersRepository.java
+++ b/huertos/src/main/java/net/miarma/backend/huertos/repository/view/VRequestsWithPreUsersRepository.java
@@ -4,7 +4,9 @@ import net.miarma.backend.huertos.model.view.VRequestsWithPreUsers;
import org.springframework.data.repository.Repository;
import java.util.List;
+import java.util.Optional;
public interface VRequestsWithPreUsersRepository extends Repository {
- List findAll();
+ List findAll();
+ Optional findById(byte[] requestId);
}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/security/HuertosJwtFilter.java b/huertos/src/main/java/net/miarma/backend/huertos/security/HuertosJwtFilter.java
new file mode 100644
index 0000000..8ee0556
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/security/HuertosJwtFilter.java
@@ -0,0 +1,61 @@
+package net.miarma.backend.huertos.security;
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import net.miarma.backend.huertos.model.view.VHuertosMember;
+import net.miarma.backend.huertos.service.view.VHuertosMemberService;
+import net.miarma.backlib.security.JwtService;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import java.io.IOException;
+import java.util.UUID;
+
+@Component
+public class HuertosJwtFilter extends OncePerRequestFilter {
+
+ private final JwtService jwtService;
+ private final VHuertosMemberService huertosUserService;
+
+ public HuertosJwtFilter(JwtService jwtService, VHuertosMemberService huertosUserService) {
+ this.jwtService = jwtService;
+ this.huertosUserService = huertosUserService;
+ }
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request,
+ HttpServletResponse response,
+ FilterChain filterChain) throws ServletException, IOException {
+
+ String authHeader = request.getHeader("Authorization");
+ if (authHeader != null && authHeader.startsWith("Bearer ")) {
+ String token = authHeader.substring(7);
+
+ if (jwtService.validateToken(token)) {
+ UUID userId = jwtService.getUserId(token);
+
+ VHuertosMember huertosUser = huertosUserService.getById(userId);
+
+ if (huertosUser != null) {
+ var principal = new HuertosPrincipal(
+ userId,
+ huertosUser.getRole(),
+ huertosUser.getType()
+ );
+
+ var auth = new UsernamePasswordAuthenticationToken(
+ principal, null, principal.getAuthorities()
+ );
+
+ SecurityContextHolder.getContext().setAuthentication(auth);
+ }
+ }
+ }
+
+ filterChain.doFilter(request, response);
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/security/HuertosPrincipal.java b/huertos/src/main/java/net/miarma/backend/huertos/security/HuertosPrincipal.java
new file mode 100644
index 0000000..d4c4e2f
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/security/HuertosPrincipal.java
@@ -0,0 +1,62 @@
+package net.miarma.backend.huertos.security;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.UUID;
+
+public class HuertosPrincipal implements UserDetails {
+
+ private final UUID userId;
+ private final Byte role;
+ private final Byte type;
+
+ public HuertosPrincipal(UUID userId, Byte role, Byte type) {
+ this.userId = userId;
+ this.role = role;
+ this.type = type;
+ }
+
+ public UUID getUserId() { return userId; }
+ public Byte getHuertosRole() { return role; }
+ public Byte getHuertosType() { return type; }
+
+ @Override
+ public Collection extends GrantedAuthority> getAuthorities() {
+ List auth = new ArrayList<>();
+
+ String roleName = switch(role) {
+ case 0 -> "USER";
+ case 1 -> "ADMIN";
+ case 2 -> "DEV";
+ default -> "USER";
+ };
+
+ String typeName = switch(type) {
+ case 0 -> "WAIT_LIST";
+ case 1 -> "MEMBER";
+ case 2 -> "WITH_GREENHOUSE";
+ case 3 -> "COLLABORATOR";
+ case 4 -> "SUBSIDY";
+ case 5 -> "DEVELOPER";
+ default -> "WAIT_LIST";
+ };
+
+ auth.add(new SimpleGrantedAuthority("ROLE_HUERTOS_ROLE_" + roleName));
+ auth.add(new SimpleGrantedAuthority("ROLE_HUERTOS_TYPE_" + typeName));
+
+ return auth;
+ }
+
+ @Override public String getPassword() { return ""; }
+ @Override public String getUsername() { return userId.toString(); }
+ @Override public boolean isAccountNonExpired() { return true; }
+ @Override public boolean isAccountNonLocked() { return true; }
+ @Override public boolean isCredentialsNonExpired() { return true; }
+ @Override public boolean isEnabled() { return true; }
+}
+
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/AnnouncementService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/AnnouncementService.java
new file mode 100644
index 0000000..5ace933
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/AnnouncementService.java
@@ -0,0 +1,59 @@
+package net.miarma.backend.huertos.service;
+
+import jakarta.transaction.Transactional;
+import net.miarma.backend.huertos.model.Announcement;
+import net.miarma.backend.huertos.repository.AnnouncementRepository;
+import net.miarma.backlib.util.UuidUtil;
+import org.springframework.stereotype.Service;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.UUID;
+
+@Service
+@Transactional
+public class AnnouncementService {
+
+ private final AnnouncementRepository announcementRepository;
+
+ public AnnouncementService(AnnouncementRepository announcementRepository) {
+ this.announcementRepository = announcementRepository;
+ }
+
+ public List getAll() {
+ return announcementRepository.findAll();
+ }
+
+ public Announcement getById(UUID announceId) {
+ byte[] idBytes = UuidUtil.uuidToBin(announceId);
+ return announcementRepository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("Announcement not found"));
+ }
+
+ public Announcement create(Announcement announcement) {
+ if (announcement.getAnnounceId() == null) {
+ announcement.setAnnounceId(UUID.randomUUID());
+ }
+ announcement.setCreatedAt(Instant.now());
+ return announcementRepository.save(announcement);
+ }
+
+ public Announcement update(UUID announceId, Announcement dto) {
+ byte[] idBytes = UuidUtil.uuidToBin(announceId);
+ Announcement announcement = announcementRepository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("Announcement not found"));
+
+ if (dto.getBody() != null) announcement.setBody(dto.getBody());
+ if (dto.getPriority() != null) announcement.setPriority(dto.getPriority());
+ if (dto.getPublishedBy() != null) announcement.setPublishedBy(dto.getPublishedBy());
+
+ return announcementRepository.save(announcement);
+ }
+
+ public void delete(UUID announceId) {
+ byte[] idBytes = UuidUtil.uuidToBin(announceId);
+ if (!announcementRepository.existsById(idBytes))
+ throw new RuntimeException("Announcement not found");
+ announcementRepository.deleteById(idBytes);
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/BalanceService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/BalanceService.java
new file mode 100644
index 0000000..7e9a1d7
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/BalanceService.java
@@ -0,0 +1,52 @@
+package net.miarma.backend.huertos.service;
+
+import java.time.Instant;
+import java.util.Optional;
+
+import org.springframework.stereotype.Service;
+
+import jakarta.transaction.Transactional;
+import net.miarma.backend.huertos.model.Balance;
+import net.miarma.backend.huertos.repository.BalanceRepository;
+
+@Service
+@Transactional
+public class BalanceService {
+
+ private final BalanceRepository repo;
+
+ public BalanceService(BalanceRepository repo) {
+ this.repo = repo;
+ }
+
+ public Balance get() {
+ return repo.findById((byte) 1)
+ .orElseThrow(() -> new RuntimeException("Balance not found"));
+ }
+
+ public Balance create(Balance balance) {
+ if (repo.existsById((byte) 1)) {
+ throw new RuntimeException("Balance already exists");
+ }
+ balance.setId((byte) 1);
+ balance.setCreatedAt(Instant.now());
+ return repo.save(balance);
+ }
+
+ public Balance update(Balance dto) {
+ Balance balance = repo.findById((byte) 1)
+ .orElseThrow(() -> new RuntimeException("Balance not found"));
+
+ if (dto.getInitialBank() != null) balance.setInitialBank(dto.getInitialBank());
+ if (dto.getInitialCash() != null) balance.setInitialCash(dto.getInitialCash());
+
+ return repo.save(balance);
+ }
+
+ public void delete() {
+ if (!repo.existsById((byte) 1)) {
+ throw new RuntimeException("Balance not found");
+ }
+ repo.deleteById((byte) 1);
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/ExpenseService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/ExpenseService.java
new file mode 100644
index 0000000..28acb7f
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/ExpenseService.java
@@ -0,0 +1,74 @@
+package net.miarma.backend.huertos.service;
+
+import jakarta.transaction.Transactional;
+import net.miarma.backend.huertos.model.Expense;
+import net.miarma.backend.huertos.repository.ExpenseRepository;
+import net.miarma.backlib.util.UuidUtil;
+import org.springframework.stereotype.Service;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.UUID;
+
+@Service
+@Transactional
+public class ExpenseService {
+
+ private final ExpenseRepository expenseRepository;
+
+ public ExpenseService(ExpenseRepository expenseRepository) {
+ this.expenseRepository = expenseRepository;
+ }
+
+ public List getAll() {
+ return expenseRepository.findAll();
+ }
+
+ public Expense getById(UUID expenseId) {
+ byte[] idBytes = UuidUtil.uuidToBin(expenseId);
+ return expenseRepository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("Expense not found"));
+ }
+
+ public Expense create(Expense expense) {
+ if (expense.getConcept() == null || expense.getConcept().isBlank()) {
+ throw new RuntimeException("Concept is required");
+ }
+ if (expense.getAmount() == null) {
+ throw new RuntimeException("Amount is required");
+ }
+ if (expense.getSupplier() == null || expense.getSupplier().isBlank()) {
+ throw new RuntimeException("Supplier is required");
+ }
+ if (expense.getInvoice() == null || expense.getInvoice().isBlank()) {
+ throw new RuntimeException("Invoice is required");
+ }
+
+ expense.setExpenseId(UUID.randomUUID());
+ expense.setCreatedAt(Instant.now());
+
+ return expenseRepository.save(expense);
+ }
+
+ public Expense update(UUID expenseId, Expense dto) {
+ byte[] idBytes = UuidUtil.uuidToBin(expenseId);
+ Expense expense = expenseRepository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("Expense not found"));
+
+ if (dto.getConcept() != null) expense.setConcept(dto.getConcept());
+ if (dto.getAmount() != null) expense.setAmount(dto.getAmount());
+ if (dto.getSupplier() != null) expense.setSupplier(dto.getSupplier());
+ if (dto.getInvoice() != null) expense.setInvoice(dto.getInvoice());
+ if (dto.getType() != null) expense.setType(dto.getType());
+
+ return expenseRepository.save(expense);
+ }
+
+ public void delete(UUID expenseId) {
+ byte[] idBytes = UuidUtil.uuidToBin(expenseId);
+ if (!expenseRepository.existsById(idBytes)) {
+ throw new RuntimeException("Expense not found");
+ }
+ expenseRepository.deleteById(idBytes);
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/HuertosUserMetadataService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/HuertosUserMetadataService.java
new file mode 100644
index 0000000..ad32e7f
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/HuertosUserMetadataService.java
@@ -0,0 +1,82 @@
+package net.miarma.backend.huertos.service;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.stereotype.Service;
+
+import jakarta.transaction.Transactional;
+import net.miarma.backend.huertos.model.HuertosUserMetadata;
+import net.miarma.backend.huertos.repository.HuertosUserMetadataRepository;
+import net.miarma.backlib.util.UuidUtil;
+
+@Service
+@Transactional
+public class HuertosUserMetadataService {
+
+ private final HuertosUserMetadataRepository repository;
+
+ public HuertosUserMetadataService(HuertosUserMetadataRepository repository) {
+ this.repository = repository;
+ }
+
+ public List getAll() {
+ return repository.findAll();
+ }
+
+ public HuertosUserMetadata getById(UUID userId) {
+ byte[] idBytes = UuidUtil.uuidToBin(userId);
+ return repository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("User metadata not found"));
+ }
+
+ public HuertosUserMetadata create(HuertosUserMetadata meta) {
+ if (meta.getUserId() == null) {
+ throw new RuntimeException("userId is required");
+ }
+ if (repository.existsById(UuidUtil.uuidToBin(meta.getUserId()))) {
+ throw new RuntimeException("Metadata already exists for this user");
+ }
+
+ if (meta.getMemberNumber() == null) throw new RuntimeException("memberNumber required");
+ if (meta.getPlotNumber() == null) throw new RuntimeException("plotNumber required");
+ if (meta.getDni() == null || meta.getDni().isBlank()) throw new RuntimeException("dni required");
+ if (meta.getPhone() == null || meta.getPhone().isBlank()) throw new RuntimeException("phone required");
+ if (meta.getType() == null) meta.setType((byte) 0);
+ if (meta.getRole() == null) meta.setRole((byte) 0);
+
+ meta.setCreatedAt(Instant.now());
+ meta.setAssignedAt(null);
+ meta.setDeactivatedAt(null);
+
+ return repository.save(meta);
+ }
+
+ public HuertosUserMetadata update(UUID userId, HuertosUserMetadata dto) {
+ byte[] idBytes = UuidUtil.uuidToBin(userId);
+
+ HuertosUserMetadata meta = repository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("User metadata not found"));
+
+ if (dto.getMemberNumber() != null) meta.setMemberNumber(dto.getMemberNumber());
+ if (dto.getPlotNumber() != null) meta.setPlotNumber(dto.getPlotNumber());
+ if (dto.getDni() != null) meta.setDni(dto.getDni());
+ if (dto.getPhone() != null) meta.setPhone(dto.getPhone());
+ if (dto.getType() != null) meta.setType(dto.getType());
+ if (dto.getRole() != null) meta.setRole(dto.getRole());
+ if (dto.getNotes() != null) meta.setNotes(dto.getNotes());
+ if (dto.getAssignedAt() != null) meta.setAssignedAt(dto.getAssignedAt());
+ if (dto.getDeactivatedAt() != null) meta.setDeactivatedAt(dto.getDeactivatedAt());
+
+ return repository.save(meta);
+ }
+
+ public void delete(UUID userId) {
+ byte[] idBytes = UuidUtil.uuidToBin(userId);
+ if (!repository.existsById(idBytes)) {
+ throw new RuntimeException("User metadata not found");
+ }
+ repository.deleteById(idBytes);
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/IncomeService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/IncomeService.java
new file mode 100644
index 0000000..a75e7f5
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/IncomeService.java
@@ -0,0 +1,86 @@
+package net.miarma.backend.huertos.service;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.stereotype.Service;
+
+import jakarta.transaction.Transactional;
+import net.miarma.backend.huertos.model.Income;
+import net.miarma.backend.huertos.repository.IncomeRepository;
+import net.miarma.backlib.util.UuidUtil;
+
+@Service
+@Transactional
+public class IncomeService {
+
+ private final IncomeRepository repository;
+
+ public IncomeService(IncomeRepository repository) {
+ this.repository = repository;
+ }
+
+ public List getAll() {
+ return repository.findAll();
+ }
+
+ public Income getById(UUID incomeId) {
+ byte[] idBytes = UuidUtil.uuidToBin(incomeId);
+ return repository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("Income not found"));
+ }
+
+ public List getByUserId(UUID userId) {
+ byte[] idBytes = UuidUtil.uuidToBin(userId);
+ return repository.findAll().stream()
+ .filter(i -> i.getUserId().equals(userId))
+ .toList();
+ }
+
+ public Income create(Income income) {
+ if (income.getUserId() == null) {
+ throw new RuntimeException("userId is required");
+ }
+ if (income.getConcept() == null || income.getConcept().isBlank()) {
+ throw new RuntimeException("concept is required");
+ }
+ if (income.getAmount() == null || income.getAmount().signum() <= 0) {
+ throw new RuntimeException("amount must be positive");
+ }
+
+ income.setIncomeId(UUID.randomUUID());
+ income.setCreatedAt(Instant.now());
+
+ return repository.save(income);
+ }
+
+ public Income update(UUID incomeId, Income dto) {
+ byte[] idBytes = UuidUtil.uuidToBin(incomeId);
+
+ Income income = repository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("Income not found"));
+
+ if (dto.getConcept() != null) income.setConcept(dto.getConcept());
+ if (dto.getAmount() != null) {
+ if (dto.getAmount().signum() <= 0) {
+ throw new RuntimeException("amount must be positive");
+ }
+ income.setAmount(dto.getAmount());
+ }
+ if (dto.getType() != null) income.setType(dto.getType());
+ if (dto.getFrequency() != null) income.setFrequency(dto.getFrequency());
+
+ return repository.save(income);
+ }
+
+ public void delete(UUID incomeId) {
+ byte[] idBytes = UuidUtil.uuidToBin(incomeId);
+
+ if (!repository.existsById(idBytes)) {
+ throw new RuntimeException("Income not found");
+ }
+
+ repository.deleteById(idBytes);
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/PreUserService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/PreUserService.java
new file mode 100644
index 0000000..661ea60
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/PreUserService.java
@@ -0,0 +1,100 @@
+package net.miarma.backend.huertos.service;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.stereotype.Service;
+
+import jakarta.transaction.Transactional;
+import net.miarma.backend.huertos.model.PreUser;
+import net.miarma.backend.huertos.repository.PreUserRepository;
+import net.miarma.backlib.util.UuidUtil;
+
+@Service
+@Transactional
+public class PreUserService {
+
+ private final PreUserRepository repository;
+
+ public PreUserService(PreUserRepository repository) {
+ this.repository = repository;
+ }
+
+ public List getAll() {
+ return repository.findAll();
+ }
+
+ public PreUser getById(UUID preUserId) {
+ byte[] idBytes = UuidUtil.uuidToBin(preUserId);
+ return repository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("PreUser not found"));
+ }
+
+ public List getByRequestId(UUID requestId) {
+ byte[] idBytes = UuidUtil.uuidToBin(requestId);
+
+ return repository.findAll().stream()
+ .filter(p -> p.getRequestId() != null && p.getRequestId().equals(requestId))
+ .toList();
+ }
+
+ public PreUser create(PreUser preUser) {
+ if (preUser.getRequestId() == null) {
+ throw new RuntimeException("requestId is required");
+ }
+ if (preUser.getUserName() == null || preUser.getUserName().isBlank()) {
+ throw new RuntimeException("userName is required");
+ }
+ if (preUser.getDisplayName() == null || preUser.getDisplayName().isBlank()) {
+ throw new RuntimeException("displayName is required");
+ }
+ if (preUser.getDni() == null || preUser.getDni().isBlank()) {
+ throw new RuntimeException("dni is required");
+ }
+ if (preUser.getPhone() == null || preUser.getPhone().isBlank()) {
+ throw new RuntimeException("phone is required");
+ }
+ if (preUser.getEmail() == null || preUser.getEmail().isBlank()) {
+ throw new RuntimeException("email is required");
+ }
+
+ preUser.setPreUserId(UUID.randomUUID());
+ preUser.setCreatedAt(Instant.now());
+
+ return repository.save(preUser);
+ }
+
+ public PreUser update(UUID preUserId, PreUser dto) {
+ byte[] idBytes = UuidUtil.uuidToBin(preUserId);
+
+ PreUser preUser = repository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("PreUser not found"));
+
+ if (dto.getUserName() != null) preUser.setUserName(dto.getUserName());
+ if (dto.getDisplayName() != null) preUser.setDisplayName(dto.getDisplayName());
+ if (dto.getDni() != null) preUser.setDni(dto.getDni());
+ if (dto.getPhone() != null) preUser.setPhone(dto.getPhone());
+ if (dto.getEmail() != null) preUser.setEmail(dto.getEmail());
+ if (dto.getPassword() != null) preUser.setPassword(dto.getPassword());
+ if (dto.getAddress() != null) preUser.setAddress(dto.getAddress());
+ if (dto.getZipCode() != null) preUser.setZipCode(dto.getZipCode());
+ if (dto.getCity() != null) preUser.setCity(dto.getCity());
+ if (dto.getMemberNumber() != null) preUser.setMemberNumber(dto.getMemberNumber());
+ if (dto.getPlotNumber() != null) preUser.setPlotNumber(dto.getPlotNumber());
+ if (dto.getType() != null) preUser.setType(dto.getType());
+ if (dto.getRole() != null) preUser.setRole(dto.getRole());
+
+ return repository.save(preUser);
+ }
+
+ public void delete(UUID preUserId) {
+ byte[] idBytes = UuidUtil.uuidToBin(preUserId);
+
+ if (!repository.existsById(idBytes)) {
+ throw new RuntimeException("PreUser not found");
+ }
+
+ repository.deleteById(idBytes);
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/RequestService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/RequestService.java
new file mode 100644
index 0000000..f0cb60a
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/RequestService.java
@@ -0,0 +1,86 @@
+package net.miarma.backend.huertos.service;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.stereotype.Service;
+
+import jakarta.transaction.Transactional;
+import net.miarma.backend.huertos.model.Request;
+import net.miarma.backend.huertos.repository.RequestRepository;
+import net.miarma.backlib.util.UuidUtil;
+
+@Service
+@Transactional
+public class RequestService {
+
+ private final RequestRepository repository;
+
+ public RequestService(RequestRepository repository) {
+ this.repository = repository;
+ }
+
+ public List getAll() {
+ return repository.findAll();
+ }
+
+ public Request getById(UUID requestId) {
+ byte[] idBytes = UuidUtil.uuidToBin(requestId);
+ return repository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("Request not found"));
+ }
+
+ public List getByRequestedBy(UUID requestedBy) {
+ return repository.findAll().stream()
+ .filter(r -> r.getRequestedBy() != null && r.getRequestedBy().equals(requestedBy))
+ .toList();
+ }
+
+ public List getByTargetUserId(UUID targetUserId) {
+ return repository.findAll().stream()
+ .filter(r -> r.getTargetUserId() != null && r.getTargetUserId().equals(targetUserId))
+ .toList();
+ }
+
+ public Request create(Request request) {
+ if (request.getType() == null) {
+ throw new RuntimeException("type is required");
+ }
+ if (request.getStatus() == null) {
+ throw new RuntimeException("status is required");
+ }
+ if (request.getRequestedBy() == null) {
+ throw new RuntimeException("requestedBy is required");
+ }
+
+ request.setRequestId(UUID.randomUUID());
+ request.setCreatedAt(Instant.now());
+
+ return repository.save(request);
+ }
+
+ public Request update(UUID requestId, Request dto) {
+ byte[] idBytes = UuidUtil.uuidToBin(requestId);
+
+ Request request = repository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("Request not found"));
+
+ if (dto.getType() != null) request.setType(dto.getType());
+ if (dto.getStatus() != null) request.setStatus(dto.getStatus());
+ if (dto.getRequestedBy() != null) request.setRequestedBy(dto.getRequestedBy());
+ if (dto.getTargetUserId() != null) request.setTargetUserId(dto.getTargetUserId());
+
+ return repository.save(request);
+ }
+
+ public void delete(UUID requestId) {
+ byte[] idBytes = UuidUtil.uuidToBin(requestId);
+
+ if (!repository.existsById(idBytes)) {
+ throw new RuntimeException("Request not found");
+ }
+
+ repository.deleteById(idBytes);
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/view/VBalanceWithTotalsService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/view/VBalanceWithTotalsService.java
new file mode 100644
index 0000000..68aabd3
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/view/VBalanceWithTotalsService.java
@@ -0,0 +1,24 @@
+package net.miarma.backend.huertos.service.view;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
+import jakarta.transaction.Transactional;
+import net.miarma.backend.huertos.model.view.VBalanceWithTotals;
+import net.miarma.backend.huertos.repository.view.VBalanceWithTotalsRepository;
+
+@Service
+@Transactional
+public class VBalanceWithTotalsService {
+
+ private final VBalanceWithTotalsRepository repository;
+
+ public VBalanceWithTotalsService(VBalanceWithTotalsRepository repository) {
+ this.repository = repository;
+ }
+
+ public List getAll() {
+ return repository.findAll();
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/view/VHuertosMemberService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/view/VHuertosMemberService.java
new file mode 100644
index 0000000..3c0df88
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/view/VHuertosMemberService.java
@@ -0,0 +1,32 @@
+package net.miarma.backend.huertos.service.view;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.stereotype.Service;
+
+import jakarta.transaction.Transactional;
+import net.miarma.backend.huertos.model.view.VHuertosMember;
+import net.miarma.backend.huertos.repository.view.VHuertosMemberRepository;
+import net.miarma.backlib.util.UuidUtil;
+
+@Service
+@Transactional
+public class VHuertosMemberService {
+
+ private final VHuertosMemberRepository repository;
+
+ public VHuertosMemberService(VHuertosMemberRepository repository) {
+ this.repository = repository;
+ }
+
+ public List getAll() {
+ return repository.findAll();
+ }
+
+ public VHuertosMember getById(UUID userId) {
+ byte[] idBytes = UuidUtil.uuidToBin(userId);
+ return repository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("Member not found"));
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/view/VIncomesWithFullNamesService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/view/VIncomesWithFullNamesService.java
new file mode 100644
index 0000000..9ed2f28
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/view/VIncomesWithFullNamesService.java
@@ -0,0 +1,39 @@
+package net.miarma.backend.huertos.service.view;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.stereotype.Service;
+
+import jakarta.transaction.Transactional;
+import net.miarma.backend.huertos.model.view.VIncomesWithFullNames;
+import net.miarma.backend.huertos.repository.view.VIncomesWithFullNamesRepository;
+import net.miarma.backlib.util.UuidUtil;
+
+@Service
+@Transactional
+public class VIncomesWithFullNamesService {
+
+ private final VIncomesWithFullNamesRepository repository;
+
+ public VIncomesWithFullNamesService(VIncomesWithFullNamesRepository repository) {
+ this.repository = repository;
+ }
+
+ public List getAll() {
+ return repository.findAll();
+ }
+
+ public VIncomesWithFullNames getById(UUID incomeId) {
+ byte[] idBytes = UuidUtil.uuidToBin(incomeId);
+ return repository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("Income not found"));
+ }
+
+ public List getByUserId(UUID userId) {
+ byte[] idBytes = UuidUtil.uuidToBin(userId);
+ return repository.findAll().stream()
+ .filter(i -> i.getUserId().equals(userId))
+ .toList();
+ }
+}
diff --git a/huertos/src/main/java/net/miarma/backend/huertos/service/view/VRequestsWithPreUsersService.java b/huertos/src/main/java/net/miarma/backend/huertos/service/view/VRequestsWithPreUsersService.java
new file mode 100644
index 0000000..6e3fe01
--- /dev/null
+++ b/huertos/src/main/java/net/miarma/backend/huertos/service/view/VRequestsWithPreUsersService.java
@@ -0,0 +1,38 @@
+package net.miarma.backend.huertos.service.view;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.stereotype.Service;
+
+import jakarta.transaction.Transactional;
+import net.miarma.backend.huertos.model.view.VRequestsWithPreUsers;
+import net.miarma.backend.huertos.repository.view.VRequestsWithPreUsersRepository;
+import net.miarma.backlib.util.UuidUtil;
+
+@Service
+@Transactional
+public class VRequestsWithPreUsersService {
+
+ private final VRequestsWithPreUsersRepository repository;
+
+ public VRequestsWithPreUsersService(VRequestsWithPreUsersRepository repository) {
+ this.repository = repository;
+ }
+
+ public List getAll() {
+ return repository.findAll();
+ }
+
+ public VRequestsWithPreUsers getById(UUID requestId) {
+ byte[] idBytes = UuidUtil.uuidToBin(requestId);
+ return repository.findById(idBytes)
+ .orElseThrow(() -> new RuntimeException("Request not found"));
+ }
+
+ public List getByRequestType(Byte type) {
+ return repository.findAll().stream()
+ .filter(r -> r.getRequestType().equals(type))
+ .toList();
+ }
+}
diff --git a/minecraft/.settings/org.eclipse.jdt.core.prefs b/minecraft/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 2f5cc74..0000000
--- a/minecraft/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/minecraft/.settings/org.eclipse.m2e.core.prefs b/minecraft/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f..0000000
--- a/minecraft/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/minecraft/.settings/org.springframework.ide.eclipse.prefs b/minecraft/.settings/org.springframework.ide.eclipse.prefs
deleted file mode 100644
index a12794d..0000000
--- a/minecraft/.settings/org.springframework.ide.eclipse.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-boot.validation.initialized=true
-eclipse.preferences.version=1
diff --git a/minecraft/pom.xml b/minecraft/pom.xml
index a72edf0..56cd265 100644
--- a/minecraft/pom.xml
+++ b/minecraft/pom.xml
@@ -9,6 +9,11 @@
minecraft
+
+ 25
+ 25
+
+
diff --git a/mpaste/.settings/org.eclipse.jdt.core.prefs b/mpaste/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 2f5cc74..0000000
--- a/mpaste/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/mpaste/.settings/org.eclipse.m2e.core.prefs b/mpaste/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f..0000000
--- a/mpaste/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/mpaste/.settings/org.springframework.ide.eclipse.prefs b/mpaste/.settings/org.springframework.ide.eclipse.prefs
deleted file mode 100644
index a12794d..0000000
--- a/mpaste/.settings/org.springframework.ide.eclipse.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-boot.validation.initialized=true
-eclipse.preferences.version=1
diff --git a/mpaste/pom.xml b/mpaste/pom.xml
index 4a8b476..c4fe027 100644
--- a/mpaste/pom.xml
+++ b/mpaste/pom.xml
@@ -9,6 +9,11 @@
mpaste
+
+ 25
+ 25
+
+
diff --git a/pom.xml b/pom.xml
index cc81d34..5acf6c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,6 +21,8 @@
25
4.0.1
+ 25
+ 25