Uses JWT, fixes some endpoints, adds base services

This commit is contained in:
Guillaume Tâche
2025-04-24 20:38:09 +02:00
parent 8a05f63687
commit a8e7a62b0c
113 changed files with 1625 additions and 380 deletions

View File

@@ -1,5 +1,6 @@
package ch.gtache.elderscrollslegends.service.account;
import ch.gtache.elderscrollslegends.service.BaseService;
import ch.gtache.elderscrollslegends.service.SteamService;
import ch.gtache.elderscrollslegends.service.Token;
import ch.gtache.elderscrollslegends.service.account.auth.AuthData;
@@ -15,24 +16,25 @@ import java.util.List;
import static java.util.Objects.requireNonNull;
@ApplicationScoped
public class AccountService {
public class AccountService extends BaseService {
private static final Logger logger = Logger.getLogger(AccountService.class);
private final JWTService jwtService;
private final SteamService steamService;
private final DataSource dataSource;
@Inject
AccountService(final SteamService steamService, final DataSource dataSource) {
AccountService(final DataSource dataSource, final JWTService jwtService, final SteamService steamService) {
super(dataSource);
this.jwtService = requireNonNull(jwtService);
this.steamService = requireNonNull(steamService);
this.dataSource = requireNonNull(dataSource);
}
public AuthData authenticate(final String steamID) {
AuthData authenticate(final String steamID) {
if (!exists(steamID)) {
final var longId = Long.parseLong(steamID);
final var name = steamService.getName(steamID);
try (final var connection = dataSource.getConnection();
try (final var connection = dataSource().getConnection();
final var statement = connection.prepareStatement("INSERT INTO player (steam_id, name) VALUES (?, ?)")) {
statement.setLong(1, longId);
statement.setString(2, name);
@@ -43,14 +45,14 @@ public class AccountService {
}
}
updateNameIfNeeded(steamID);
final var token = getOrCreateToken(steamID);
final var token = jwtService.createToken(steamID);
return getAuthData(steamID, token);
}
private void updateNameIfNeeded(final String steamID) {
final var longId = Long.parseLong(steamID);
final var name = steamService.getName(steamID);
try (final var connection = dataSource.getConnection();
try (final var connection = dataSource().getConnection();
final var statement = connection.prepareStatement("UPDATE player SET name=? WHERE steam_id=?")) {
statement.setString(1, name);
statement.setLong(2, longId);
@@ -60,47 +62,19 @@ public class AccountService {
}
}
private Token getOrCreateToken(final String steamID) {
final var longId = Long.parseLong(steamID);
try (final var connection = dataSource.getConnection();
final var statement = connection.prepareStatement("SELECT token, expiration FROM token WHERE player_id=(SELECT id FROM player WHERE steam_id=?)")) {
statement.setLong(1, longId);
try (final var rs = statement.executeQuery()) {
if (rs.next()) {
final var token = rs.getString(1);
final var expiration = rs.getTimestamp(2).toInstant();
if (expiration.isAfter(java.time.Instant.now())) {
return new Token(token, expiration);
}
}
}
} catch (final SQLException e) {
logger.error("Error checking for player " + steamID, e);
}
try (final var connection = dataSource.getConnection();
final var statement = connection.prepareStatement("INSERT INTO token (player_id) VALUES ((SELECT id FROM player WHERE steam_id=?)) RETURNING token, expiration")) {
statement.setLong(1, longId);
try (final var rs = statement.executeQuery()) {
return rs.next() ? new Token(rs.getString(1), rs.getTimestamp(2).toInstant()) : null;
}
} catch (final SQLException e) {
logger.error("Error inserting player " + steamID, e);
}
return null;
}
private AuthData getAuthData(final String steamID, final Token token) {
if (token != null) {
final var longId = Long.parseLong(steamID);
try (final var connection = dataSource.getConnection();
final var statement = connection.prepareStatement("SELECT 1 FROM player WHERE steam_id=?")) {
try (final var connection = dataSource().getConnection();
final var statement = connection.prepareStatement("SELECT name FROM player WHERE steam_id=?")) {
statement.setLong(1, longId);
try (final var rs = statement.executeQuery()) {
if (rs.next()) {
final var uuid = token.token();
final var name = rs.getString(1);
final var timeToRefresh = Duration.between(java.time.Instant.now(), token.expirationTimestamp()).getSeconds();
return new AuthData(uuid, "", "", "", "", steamID, steamID, steamID,
"", steamID, "CH", false, false, (int) timeToRefresh,
return new AuthData(uuid, "", "steam", "", uuid, steamID, steamID, steamID,
"", name, "US", false, false, (int) timeToRefresh,
5, 5, false, "", "",
0, List.of(), false);
}
@@ -112,9 +86,9 @@ public class AccountService {
return null;
}
public boolean exists(final String steamID) {
boolean exists(final String steamID) {
final var longId = Long.parseLong(steamID);
try (final var connection = dataSource.getConnection();
try (final var connection = dataSource().getConnection();
final var statement = connection.prepareStatement("SELECT 1 FROM player WHERE steam_id=?")) {
statement.setLong(1, longId);
try (final var rs = statement.executeQuery()) {
@@ -126,19 +100,11 @@ public class AccountService {
return false;
}
public Token refresh(final String steamID) {
if (exists(steamID)) {
final var longId = Long.parseLong(steamID);
try (final var connection = dataSource.getConnection();
final var statement = connection.prepareStatement("DELETE FROM token WHERE player_id=(SELECT id FROM player WHERE steam_id=?)")) {
statement.setLong(1, longId);
statement.executeUpdate();
} catch (final SQLException e) {
logger.error("Error checking for player " + steamID, e);
}
return getOrCreateToken(steamID);
} else {
return null;
}
Token refreshToken(final String steamID) {
return jwtService.createToken(steamID);
}
public String getSteamIDFromToken(final String token) {
return jwtService.getSteamID(token);
}
}