diff --git a/.idea/db-forest-config.xml b/.idea/db-forest-config.xml
new file mode 100644
index 0000000..fd9c831
--- /dev/null
+++ b/.idea/db-forest-config.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/dev/coph/flightscore/backend/Backend.java b/src/main/java/dev/coph/flightscore/backend/Backend.java
index 4e7b0ea..1d2ef08 100644
--- a/src/main/java/dev/coph/flightscore/backend/Backend.java
+++ b/src/main/java/dev/coph/flightscore/backend/Backend.java
@@ -1,6 +1,10 @@
package dev.coph.flightscore.backend;
import dev.coph.flightscore.backend.config.Config;
+import dev.coph.flightscore.backend.provider.ProviderManager;
+import dev.coph.flightscore.backend.user.UserProvider;
+import dev.coph.flightscore.backend.user.permission.PermissionProvider;
+import dev.coph.flightscore.backend.user.role.RoleProvider;
import dev.coph.simplelogger.Logger;
import dev.coph.simplerequest.server.WebServer;
import dev.coph.simplesql.adapter.DatabaseAdapter;
@@ -18,6 +22,12 @@ public class Backend {
private final DatabaseAdapter databaseAdapter;
private final WebServer webServer;
+ private final ProviderManager providerManager;
+
+ private PermissionProvider permissionProvider;
+ private RoleProvider roleProvider;
+ private UserProvider userProvider;
+
public Backend() {
logger.info("Loading configuration...");
@@ -37,16 +47,42 @@ public class Backend {
logger.info("Preparing web server...");
this.webServer = new WebServer(configuration.server_port());
logger.success("Web server ready!");
+
+ logger.info("Preparing providers...");
+ providerManager = new ProviderManager(this);
+
+ logger.info("Creating and Registering PermissionProvider...");
+ permissionProvider = new PermissionProvider(this);
+ providerManager.registerProvider(permissionProvider);
+ logger.success("PermissionProvider created and registered!");
+
+ logger.info("Creating and Registering RoleProvider...");
+ roleProvider = new RoleProvider(this);
+ providerManager.registerProvider(roleProvider);
+ logger.success("RoleProvider created and registered!");
+
+ logger.info("Creating and Registering UserProvider...");
+ userProvider = new UserProvider(this);
+ providerManager.registerProvider(userProvider);
+ logger.success("UserProvider created and registered!");
+
+
+ logger.success("Providers ready!");
}
public void onEnable() {
+ logger.info("Starting database...");
+ databaseAdapter.connect();
+ logger.success("Database started!");
+
logger.info("Loading routes...");
logger.success("Routes loaded!");
- logger.info("Starting database...");
- databaseAdapter.connect();
- logger.success("Database started!");
+ logger.info("Creating database tables...");
+ providerManager.createAllDatabaseTables();
+ logger.success("Database tables created!");
+
logger.info("Starting web server...");
webServer.start();
diff --git a/src/main/java/dev/coph/flightscore/backend/provider/Provider.java b/src/main/java/dev/coph/flightscore/backend/provider/Provider.java
new file mode 100644
index 0000000..be5261f
--- /dev/null
+++ b/src/main/java/dev/coph/flightscore/backend/provider/Provider.java
@@ -0,0 +1,10 @@
+package dev.coph.flightscore.backend.provider;
+
+import dev.coph.simplesql.query.Query;
+
+public interface Provider {
+ int priority();
+ String key();
+ public void createDatabaseTables(Query query);
+
+}
diff --git a/src/main/java/dev/coph/flightscore/backend/provider/ProviderManager.java b/src/main/java/dev/coph/flightscore/backend/provider/ProviderManager.java
new file mode 100644
index 0000000..f28cd4e
--- /dev/null
+++ b/src/main/java/dev/coph/flightscore/backend/provider/ProviderManager.java
@@ -0,0 +1,30 @@
+package dev.coph.flightscore.backend.provider;
+
+import dev.coph.flightscore.backend.Backend;
+import dev.coph.simplesql.query.Query;
+
+import java.util.HashMap;
+
+public class ProviderManager {
+ private final Backend backend;
+ private final HashMap providers = new HashMap<>();
+
+ public ProviderManager(Backend backend) {
+ this.backend = backend;
+ }
+
+ public void createAllDatabaseTables(){
+ Query query = new Query(backend.databaseAdapter());
+ providers.values().stream().sorted((a, b) -> Integer.compare(b.priority(), a.priority())).forEach(provider -> provider.createDatabaseTables(query));
+ query.execute();
+ }
+
+ public void registerProvider(Provider provider){
+ providers.put(provider.key(), provider);
+ }
+
+ public T provider(String key){
+ return (T) providers.get(key);
+ }
+
+}
diff --git a/src/main/java/dev/coph/flightscore/backend/user/UserProvider.java b/src/main/java/dev/coph/flightscore/backend/user/UserProvider.java
index ace357f..f501e66 100644
--- a/src/main/java/dev/coph/flightscore/backend/user/UserProvider.java
+++ b/src/main/java/dev/coph/flightscore/backend/user/UserProvider.java
@@ -2,19 +2,67 @@ package dev.coph.flightscore.backend.user;
import dev.coph.flightscore.backend.Backend;
import dev.coph.flightscore.backend.action.result.LoginActionResult;
-import lombok.RequiredArgsConstructor;
+import dev.coph.flightscore.backend.provider.Provider;
+import dev.coph.simplelogger.Logger;
+import dev.coph.simplesql.database.Column;
+import dev.coph.simplesql.database.attributes.ColumnType;
+import dev.coph.simplesql.database.attributes.CreateMethod;
+import dev.coph.simplesql.database.attributes.DataType;
+import dev.coph.simplesql.query.Query;
+import org.checkerframework.checker.units.qual.C;
-@RequiredArgsConstructor
-public class UserProvider {
+import java.util.List;
+
+public class UserProvider implements Provider {
+ private Logger logger = Logger.of("UserProvider");
private final Backend backend;
+ public UserProvider(Backend backend) {
+ this.backend = backend;
+ }
+ @Override
+ public int priority() {
+ return 50;
+ }
+ @Override
+ public String key() {
+ return "user-provider";
+ }
+
+ @Override
+ public void createDatabaseTables(Query query) {
+ var tableCreate = Query.tableCreate()
+ .createMethod(CreateMethod.IF_NOT_EXISTS)
+ .table("users")
+ .column("id", DataType.BINARY, 26, true)
+ .column("fistname", DataType.VARCHAR, 255)
+ .column("lastname", DataType.VARCHAR, 255)
+ .column("email", DataType.VARCHAR, 255, true)
+ .column("phoneNumber", DataType.VARCHAR, 255)
+ .column("password", DataType.VARCHAR, 255, true)
+ .column("role", DataType.BINARY, 26)
+ .primaryKey(List.of("id"))
+ .index(List.of("email"))
+ .index(List.of("email", "password"))
+ .foreignKey(List.of("role"), "roles", List.of("id"));;
+ query.query(tableCreate);
+ tableCreate = Query.tableCreate()
+ .createMethod(CreateMethod.IF_NOT_EXISTS)
+ .table("refresh_tokens")
+ .column("user_id", DataType.BINARY, 26, true)
+ .column("token_hash", DataType.VARCHAR, 255, true)
+ .column("expires_at", DataType.TIMESTAMP, true)
+ .column(new Column("revoked", DataType.BOOLEAN, true).defaultValue(false))
+ .primaryKey(List.of("token_hash"))
+ .index(List.of("user_id"))
+ .foreignKey(List.of("user_id"), "users", List.of("id"));;
+ query.query(tableCreate);
+ }
public LoginActionResult login(String email, String password) {
return null;
}
-
-
}
diff --git a/src/main/java/dev/coph/flightscore/backend/user/permission/PermissionProvider.java b/src/main/java/dev/coph/flightscore/backend/user/permission/PermissionProvider.java
new file mode 100644
index 0000000..ada07a2
--- /dev/null
+++ b/src/main/java/dev/coph/flightscore/backend/user/permission/PermissionProvider.java
@@ -0,0 +1,40 @@
+package dev.coph.flightscore.backend.user.permission;
+
+import dev.coph.flightscore.backend.Backend;
+import dev.coph.flightscore.backend.provider.Provider;
+import dev.coph.simplesql.database.attributes.CreateMethod;
+import dev.coph.simplesql.database.attributes.DataType;
+import dev.coph.simplesql.query.Query;
+
+import java.util.List;
+
+public class PermissionProvider implements Provider {
+ private final Backend backend;
+
+ public PermissionProvider(Backend backend) {
+ this.backend = backend;
+ }
+
+ @Override
+ public int priority() {
+ return 150;
+ }
+
+ @Override
+ public String key() {
+ return "permission-provider";
+ }
+
+ @Override
+ public void createDatabaseTables(Query query) {
+ var tableCreate = Query.tableCreate()
+ .createMethod(CreateMethod.IF_NOT_EXISTS)
+ .table("permissions")
+ .column("id", DataType.BINARY, 26, true)
+ .column("name", DataType.VARCHAR, 255)
+ .primaryKey(List.of("id"));
+ ;
+ query.query(tableCreate);
+ }
+}
+
diff --git a/src/main/java/dev/coph/flightscore/backend/user/role/RoleProvider.java b/src/main/java/dev/coph/flightscore/backend/user/role/RoleProvider.java
new file mode 100644
index 0000000..23ec12a
--- /dev/null
+++ b/src/main/java/dev/coph/flightscore/backend/user/role/RoleProvider.java
@@ -0,0 +1,49 @@
+package dev.coph.flightscore.backend.user.role;
+
+import dev.coph.flightscore.backend.Backend;
+import dev.coph.flightscore.backend.provider.Provider;
+import dev.coph.simplesql.database.attributes.CreateMethod;
+import dev.coph.simplesql.database.attributes.DataType;
+import dev.coph.simplesql.query.Query;
+
+import java.util.List;
+
+public class RoleProvider implements Provider {
+ private final Backend backend;
+
+ public RoleProvider(Backend backend) {
+ this.backend = backend;
+ }
+
+
+ @Override
+ public int priority() {
+ return 100;
+ }
+
+ @Override
+ public String key() {
+ return "role-provider";
+ }
+
+ @Override
+ public void createDatabaseTables(Query query) {
+ var tableCreate = Query.tableCreate()
+ .createMethod(CreateMethod.IF_NOT_EXISTS)
+ .table("roles")
+ .column("id", DataType.BINARY, 26, true)
+ .column("name", DataType.VARCHAR, 255)
+ .primaryKey(List.of("id"));
+ query.query(tableCreate);
+ tableCreate = Query.tableCreate()
+ .createMethod(CreateMethod.IF_NOT_EXISTS)
+ .table("role_permissions")
+ .column("roleId", DataType.BINARY, 26, true)
+ .column("permissionId", DataType.BINARY, 26, true)
+ .primaryKey(List.of("roleId", "permissionId"))
+ .foreignKey(List.of("roleId"), "roles", List.of("id"))
+ .foreignKey(List.of("permissionId"), "permissions", List.of("id"));
+ query.query(tableCreate);
+ }
+}
+