diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 4eaa3bf..d70515a 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -12,9 +12,13 @@ application{ } dependencies{ + implementation(project(":core")) implementation(project(":translations")) implementation(project(":user")) implementation(project(":web")) + + implementation("de.srsoftware:tools.optionals:1.0.0") + implementation("de.srsoftware:tools.util:2.0.3") } tasks.jar { diff --git a/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java b/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java index f44e6e9..92c0263 100644 --- a/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java +++ b/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java @@ -6,8 +6,10 @@ import static java.lang.System.Logger.Level.INFO; import com.sun.net.httpserver.HttpServer; import de.srsoftware.tools.ColorLogger; +import de.srsoftware.umbrella.core.ConnectionProvider; import de.srsoftware.umbrella.translations.Translations; import de.srsoftware.umbrella.user.UserModule; +import de.srsoftware.umbrella.user.sqlite.SqliteDB; import de.srsoftware.umbrella.web.WebHandler; import java.io.IOException; import java.net.InetSocketAddress; @@ -15,15 +17,18 @@ import java.util.concurrent.Executors; public class Application { private static final System.Logger LOG = System.getLogger("Umbrella"); + private static final String USER_DB = "/home/srichter/workspace/umbrella/data/umbrella.db"; public static void main(String[] args) throws IOException { ColorLogger.setRootLogLevel(DEBUG); LOG.log(INFO, "Starting Umbrella:"); - var port = 8080; - var threads = 16; + var port = 8080; + var threads = 16; + var connectionProvider = new ConnectionProvider(); + var userDb = new SqliteDB(connectionProvider.get(USER_DB)); HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); server.setExecutor(Executors.newFixedThreadPool(threads)); new WebHandler().bindPath("/").on(server); - new UserModule().bindPath("/api/user").on(server); + new UserModule(userDb).bindPath("/api/user").on(server); new Translations().bindPath("/api/translations").on(server); LOG.log(INFO,"Started web server at {0}",port); server.start(); diff --git a/build.gradle.kts b/build.gradle.kts index d868971..c59b90d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -40,7 +40,7 @@ subprojects { dependencies { testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") - implementation("de.srsoftware:tools.http:6.0.2") + implementation("de.srsoftware:tools.http:6.0.3") implementation("de.srsoftware:tools.logging:1.3.2") } diff --git a/core/build.gradle.kts b/core/build.gradle.kts new file mode 100644 index 0000000..6bfd15b --- /dev/null +++ b/core/build.gradle.kts @@ -0,0 +1,20 @@ +plugins { + id("java") +} + +group = "de.srsoftware" +version = "unspecified" + +repositories { + mavenCentral() +} + +dependencies { + testImplementation(platform("org.junit:junit-bom:5.10.0")) + testImplementation("org.junit.jupiter:junit-jupiter") + implementation("org.xerial:sqlite-jdbc:3.49.0.0") +} + +tasks.test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/core/src/main/java/de/srsoftware/umbrella/core/AddableMap.java b/core/src/main/java/de/srsoftware/umbrella/core/AddableMap.java new file mode 100644 index 0000000..71e7a3a --- /dev/null +++ b/core/src/main/java/de/srsoftware/umbrella/core/AddableMap.java @@ -0,0 +1,12 @@ +/* © SRSoftware 2025 */ +package de.srsoftware.umbrella.core; + +import java.util.HashMap; + +public class AddableMap extends HashMap { + public AddableMap plus(Object...param){ + if (param.length % 2 == 1) throw new RuntimeException("Expectirg number of parameters to be even"); + for (int i=0; i { + public Connection get(Object o) { + if (o instanceof String filename) o = new File(filename); + if (o instanceof File dbFile) try { + var conn = super.get(dbFile); + if (conn == null) put(dbFile, conn = open(dbFile)); + return conn; + } catch (SQLException sqle) { + throw new RuntimeException(sqle); + } + return null; + } + + private Connection open(File dbFile) throws SQLException { + SQLiteDataSource dataSource = new SQLiteDataSource(); + dataSource.setUrl("jdbc:sqlite:%s".formatted(dbFile)); + return dataSource.getConnection(); + } +} diff --git a/core/src/main/java/de/srsoftware/umbrella/core/Constants.java b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java new file mode 100644 index 0000000..eff8fbe --- /dev/null +++ b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java @@ -0,0 +1,60 @@ +/* © SRSoftware 2025 */ +package de.srsoftware.umbrella.core; + + +import static java.nio.charset.StandardCharsets.UTF_8; + +public class Constants { + + public static final String ADDRESS = "address"; + public static final String ATTACHMENTS = "attachments"; + public static final String BODY = "body"; + public static final String DATA = "data"; + public static final String DATE = "date"; + public static final String DEFAULT_LANGUAGE = "en"; + public static final String DEFAULT_THEME = "winter"; + public static final String DESCRIPTION = "description"; + public static final String DOMAIN = "domain"; + public static final String EMAIL = "email"; + + public static final String ERROR_FAILED_CREATE_TABLE = "Failed to create \"{0}\" table!"; + public static final String ERROR_INVALID_FIELD = "Expected {0} to be {1}!"; + public static final String ERROR_MISSING_FIELD = "Json is missing {0} field!"; + public static final String ERROR_READ_TABLE = "Failed to read {0} from {1} table"; + + public static final String EXPIRATION = "expiration"; + public static final String ID = "id"; + public static final String KEY = "key"; + public static final String LANGUAGE = "language"; + public static final String LOGIN = "login"; + public static final String MESSAGES = "messages"; + public static final String NAME = "name"; + public static final String MIME = "mime"; + public static final String NUMBER = "number"; + public static final String OPTIONAL = "optional"; + public static final String PASSWORD = "password"; + + public static final String RECEIVERS = "receivers"; + public static final String REDIRECT = "redirect"; + public static final String SENDER = "sender"; + public static final String SETTINGS = "settings"; + public static final String STATE = "state"; + public static final String STATUS_CODE = "code"; + public static final String STRING = "string"; + public static final String SUBJECT = "subject"; + + public static final String TABLE_SETTINGS = "settings"; + + public static final String TEMPLATE = "template"; + public static final String TEXT = "text"; + public static final String THEME = "theme"; + public static final String TITLE = "title"; + public static final String TOKEN = "token"; + public static final String UMBRELLA = "Umbrella"; + public static final String URL = "url"; + public static final String USER = "user"; + public static final String USER_ID = "user_id"; + public static final String USER_LIST = "user_list"; + public static final String UTF8 = UTF_8.displayName(); + public static final String VALUE = "value"; +} diff --git a/core/src/main/java/de/srsoftware/umbrella/core/Paths.java b/core/src/main/java/de/srsoftware/umbrella/core/Paths.java new file mode 100644 index 0000000..1601f86 --- /dev/null +++ b/core/src/main/java/de/srsoftware/umbrella/core/Paths.java @@ -0,0 +1,19 @@ +/* © SRSoftware 2025 */ +package de.srsoftware.umbrella.core; + +public class Paths { + private Paths(){}; + + public static final String ADD = "add"; + public static final String CSS = "css"; + public static final String JSON = "json"; + public static final String LEGACY = "legacy"; + public static final String LIST = "list"; + public static final String LOGOUT = "logout"; + public static final String SEARCH = "search"; + public static final String SERVICE = "service"; + public static final String SETTINGS = "settings"; + public static final String SUBMIT = "submit"; + public static final String TOKEN = "token"; + public static final String VIEW = "view"; +} diff --git a/core/src/main/java/de/srsoftware/umbrella/core/ResponseCode.java b/core/src/main/java/de/srsoftware/umbrella/core/ResponseCode.java new file mode 100644 index 0000000..bf1fb54 --- /dev/null +++ b/core/src/main/java/de/srsoftware/umbrella/core/ResponseCode.java @@ -0,0 +1,14 @@ +/* © SRSoftware 2025 */ +package de.srsoftware.umbrella.core; + +public class ResponseCode { + public static final int OK = 200; + public static final int REDIRECT = 302; + public static final int BAD_REQUEST = 400; + public static final int UNAUTHORIZED = 401; + public static final int FORBIDDEN = 403; + public static final int NOT_FOUND = 404; + public static final int UNPROCESSABLE = 422; + public static final int SERVER_ERROR = 500; + public static final int NOT_IMPLEMENTED = 501; +} diff --git a/core/src/main/java/de/srsoftware/umbrella/core/UmbrellaException.java b/core/src/main/java/de/srsoftware/umbrella/core/UmbrellaException.java new file mode 100644 index 0000000..f19c43b --- /dev/null +++ b/core/src/main/java/de/srsoftware/umbrella/core/UmbrellaException.java @@ -0,0 +1,27 @@ +/* © SRSoftware 2025 */ +package de.srsoftware.umbrella.core; + +import static java.text.MessageFormat.format; + + +public class UmbrellaException extends Exception{ + private final int statusCode; + + public UmbrellaException(int statusCode, String message){ + super(message); + this.statusCode = statusCode; + } + + public UmbrellaException(int statusCode, String message, Object ... fills){ + this(statusCode,format(message,fills)); + } + + public UmbrellaException causedBy(Exception e) { + initCause(e); + return this; + } + + public int statusCode(){ + return statusCode; + } +} diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 7f8d333..031ddf3 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -9,18 +9,20 @@ translations_ready = true; }); + import Footer from "./Components/Footer.svelte"; import Homepage from "./Components/Homepage.svelte"; import Login from "./Components/Login.svelte"; import Menu from "./Components/Menu.svelte"; {#if translations_ready } -{#if user.username } - - -{:else} - -{/if} + + {#if user.name } + + {:else} + + {/if} +