Make fields in user-related classes immutable and simplify logger usage

This commit is contained in:
2026-04-10 20:33:04 +02:00
parent eb7a9d0992
commit 570bc18c66
14 changed files with 56 additions and 61 deletions
Generated
+1
View File
@@ -0,0 +1 @@
FlightScoreBackend
+8
View File
@@ -1,5 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="db-forest-configuration">
<data version="2">.
----------------------------------------
1:0:e0f49905-9df6-459a-a57c-731edb2c1607
2:0:74720f71-b717-4c46-a783-e93fc40a8785
3:0:c2ae7de6-543e-4eed-8b31-a13cb00693a8
.</data>
</component>
<component name="db-tree-configuration">
<option name="data" value="----------------------------------------&#10;1:0:e0f49905-9df6-459a-a57c-731edb2c1607&#10;2:0:74720f71-b717-4c46-a783-e93fc40a8785&#10;3:0:c2ae7de6-543e-4eed-8b31-a13cb00693a8&#10;" />
</component>
+1 -1
View File
@@ -5,7 +5,7 @@
<file type="web" url="file://$PROJECT_DIR$" />
</component>
<component name="KubernetesApiProvider"><![CDATA[{}]]></component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_25" default="true" project-jdk-name="openjdk-25" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_26" default="true" project-jdk-name="26" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
Generated
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="" vcs="Git" />
</component>
</project>
@@ -27,9 +27,9 @@ public class Backend {
private final ProviderManager providerManager;
private PermissionProvider permissionProvider;
private RoleProvider roleProvider;
private UserProvider userProvider;
private final PermissionProvider permissionProvider;
private final RoleProvider roleProvider;
private final UserProvider userProvider;
public Backend() {
@@ -19,6 +19,7 @@ public class LoginActionResult extends ActionResult{
this.accessToken = null;
this.refreshToken = null;
}
public LoginActionResult(User user, String accessToken, String refreshToken) {
super(true, "Login successful");
this.user = user;
@@ -7,7 +7,6 @@ import dev.coph.simplerequest.body.JsonBody;
import dev.coph.simplerequest.handler.RequestHandler;
import dev.coph.simplerequest.handler.RequestMethod;
import dev.coph.simplerequest.util.ResponseUtil;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.jetty.http.HttpCookie;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Response;
@@ -15,9 +14,7 @@ import org.eclipse.jetty.util.Callback;
import org.json.JSONObject;
import java.io.IOException;
import java.util.Map;
@Slf4j
public class LoginRequestHandler {
private final Logger logger = Logger.of("RH - Login");
private final Backend backend;
@@ -11,14 +11,14 @@ import java.util.Locale;
@Accessors(fluent = true)
public class User {
private ULID id;
private String firstName;
private String lastName;
private String email;
private String phoneNumber;
private Locale country;
private final ULID id;
private final String firstName;
private final String lastName;
private final String email;
private final String phoneNumber;
private final Locale country;
private Role role;
private boolean blocked;
private final boolean blocked;
public User(ULID id, String firstname, String lastname, String email, String phoneNumber, Locale country, boolean blocked) {
this.id = id;
@@ -11,7 +11,6 @@ import dev.coph.flightscore.backend.utils.TokenGenerator;
import dev.coph.simpleauthentication.cryptography.CCrypt;
import dev.coph.simpleauthentication.jwt.JWT;
import dev.coph.simpleauthentication.jwt.JwtException;
import dev.coph.simpleauthentication.jwt.algorithm.EdDSAAlgorithm;
import dev.coph.simpleauthentication.jwt.algorithm.HS256Algorithm;
import dev.coph.simpleauthentication.jwt.algorithm.JwtSignAlgorithm;
import dev.coph.simplecache.Cache;
@@ -23,24 +22,19 @@ import dev.coph.simplesql.database.attributes.CreateMethod;
import dev.coph.simplesql.database.attributes.DataType;
import dev.coph.simplesql.query.Query;
import dev.coph.simpleutilities.ulid.ULID;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONArray;
import java.io.File;
import java.sql.Timestamp;
import java.time.Duration;
import java.time.Instant;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
@Slf4j
public class UserProvider implements Provider {
private Logger logger = Logger.of("UserProvider");
private final Backend backend;
private final Logger logger = Logger.of("UserProvider");
private JwtSignAlgorithm jwtSignAlgorithm;
private long JWT_EXPIRATION_TIME;
@@ -253,6 +247,30 @@ public class UserProvider implements Provider {
return new LoginActionResult(user, accessToken, refreshToken);
}
private String createAccessToken(User user, long expiresAt) {
try {
JWT.Builder builder = new JWT.Builder()
.algorithm(jwtSignAlgorithm)
.audience("flightscore-api")
.issuer("flightscore-api")
.subject(user.id().toString())
.expiresAt(expiresAt / 1000)
.issuedAt(System.currentTimeMillis() / 1000);
if (user.role() != null) {
JSONArray permissions = new JSONArray();
user.role().permissions().forEach(permission -> permissions.put(permission.name()));
builder.claim("permission", permissions.toString());
builder.claim("role", user.role().id().toString());
}
return builder.sign();
} catch (JwtException e) {
logger.error("Error creating JWT", e);
}
return null;
}
public LoginActionResult refreshToken(String refreshToken) {
if (refreshToken == null || refreshToken.isEmpty()) {
return new LoginActionResult(false, "Invalid refresh token");
@@ -368,28 +386,4 @@ public class UserProvider implements Provider {
return exists.get();
}
private String createAccessToken(User user, long expiresAt) {
try {
JWT.Builder builder = new JWT.Builder()
.algorithm(jwtSignAlgorithm)
.audience("flightscore-api")
.issuer("flightscore-api")
.subject(user.id().toString())
.expiresAt(expiresAt / 1000)
.issuedAt(System.currentTimeMillis() / 1000);
if (user.role() != null) {
JSONArray permissions = new JSONArray();
user.role().permissions().forEach(permission -> permissions.put(permission.name()));
builder.claim("permission", permissions.toString());
builder.claim("role", user.role().id().toString());
}
return builder.sign();
} catch (JwtException e) {
logger.error("Error creating JWT", e);
}
return null;
}
}
@@ -7,12 +7,11 @@ import lombok.experimental.Accessors;
@Getter
@Accessors(fluent = true)
public class Permission {
private final ULID id;
private final String name;
public Permission(ULID id, String name) {
this.id = id;
this.name = name;
}
private ULID id;
private String name;
}
@@ -38,7 +38,6 @@ public class PermissionProvider implements Provider {
.column("id", DataType.BINARY, 26, true)
.column("name", DataType.VARCHAR, 255)
.primaryKey(List.of("id"));
;
query.query(tableCreate);
}
@@ -11,15 +11,14 @@ import java.util.HashSet;
@Accessors(fluent = true)
public class Role {
private final ULID id;
private final String name;
private final boolean defaultRole;
private final HashSet<Permission> permissions = new HashSet<>();
public Role(ULID id, String name, boolean defaultRole) {
this.id = id;
this.name = name;
this.defaultRole = defaultRole;
}
private ULID id;
private String name;
private boolean defaultRole;
private HashSet<Permission> permissions = new HashSet<>();
}
@@ -11,7 +11,6 @@ import dev.coph.simplesql.query.Query;
import dev.coph.simpleutilities.ulid.ULID;
import lombok.Getter;
import lombok.experimental.Accessors;
import org.checkerframework.checker.units.qual.C;
import java.util.HashMap;
import java.util.List;
@@ -19,12 +18,11 @@ import java.util.List;
@Accessors(fluent = true)
public class RoleProvider implements Provider {
private final Logger logger = Logger.of("RoleProvider");
private HashMap<ULID, Role> roles = new HashMap<>();
private final Backend backend;
private final HashMap<ULID, Role> roles = new HashMap<>();
@Getter
private Role defaultRole;
private final Backend backend;
public RoleProvider(Backend backend) {
this.backend = backend;
}
@@ -1,7 +1,6 @@
package dev.coph.flightscore.backend.utils;
import dev.coph.simplelogger.GenericLogger;
import dev.coph.simplelogger.Logger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;