diff --git a/core/src/main/java/de/srsoftware/umbrella/core/ModuleRegistry.java b/core/src/main/java/de/srsoftware/umbrella/core/ModuleRegistry.java index 020af4f..a77046f 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/ModuleRegistry.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/ModuleRegistry.java @@ -30,7 +30,7 @@ public class ModuleRegistry { case BookmarkService bs: singleton.bookmarkService = bs; break; case CompanyService cs: singleton.companyService = cs; break; case DocumentService ds: singleton.documentService = ds; break; - case FileService fs singleton.fileService = fs; breaK; + case FileService fs: singleton.fileService = fs; break; case ItemService is: singleton.itemService = is; break; case MarkdownService ms: singleton.markdownService = ms; break; case NoteService ns: singleton.noteService = ns; break; diff --git a/files/src/main/java/de/srsoftware/umbrella/files/Constants.java b/files/src/main/java/de/srsoftware/umbrella/files/Constants.java index 0ef7a74..223cc5d 100644 --- a/files/src/main/java/de/srsoftware/umbrella/files/Constants.java +++ b/files/src/main/java/de/srsoftware/umbrella/files/Constants.java @@ -2,4 +2,7 @@ package de.srsoftware.umbrella.files; public class Constants { public static final String CONFIG_DATABASE = "umbrella.modules.files.database"; + public static final String CONFIG_FILESTORE = "umbrella.modules.files.base_dir"; + public static final String FILE = "file"; + public static final String TABLE_FILE_SHARES = "file_shares"; } diff --git a/files/src/main/java/de/srsoftware/umbrella/files/FileModule.java b/files/src/main/java/de/srsoftware/umbrella/files/FileModule.java index b18019c..bc32e1f 100644 --- a/files/src/main/java/de/srsoftware/umbrella/files/FileModule.java +++ b/files/src/main/java/de/srsoftware/umbrella/files/FileModule.java @@ -1,24 +1,78 @@ package de.srsoftware.umbrella.files; +import com.sun.net.httpserver.HttpExchange; import de.srsoftware.configuration.Configuration; +import de.srsoftware.tools.Path; +import de.srsoftware.tools.SessionToken; import de.srsoftware.umbrella.core.BaseHandler; import de.srsoftware.umbrella.core.ModuleRegistry; import de.srsoftware.umbrella.core.api.FileService; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; +import de.srsoftware.umbrella.core.model.Token; +import de.srsoftware.umbrella.core.model.UmbrellaUser; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Optional; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; +import static de.srsoftware.umbrella.core.Constants.*; +import static de.srsoftware.umbrella.core.ModuleRegistry.userService; +import static de.srsoftware.umbrella.core.Paths.LIST; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException; +import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.unprocessable; import static de.srsoftware.umbrella.files.Constants.CONFIG_DATABASE; +import static de.srsoftware.umbrella.files.Constants.CONFIG_FILESTORE; public class FileModule extends BaseHandler implements FileService { - FileDb fileDb; + private final File baseDir; + private final FileDb fileDb; public FileModule(Configuration config) throws UmbrellaException { super(); var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); + var filestore = config.get(CONFIG_FILESTORE).orElseThrow(() -> missingFieldException(CONFIG_FILESTORE)); + baseDir = new File(filestore.toString()); + if (!baseDir.exists()) try { + Files.createDirectories(baseDir.toPath()); + } catch (IOException e) { + throw unprocessable("Failed to create {0}",baseDir); + } + if (!baseDir.isDirectory()) throw unprocessable("{0} is not a directory!"); fileDb = new SqliteDb(connect(dbFile)); ModuleRegistry.add(this); } + @Override + public boolean doGet(Path path, HttpExchange ex) throws IOException { + addCors(ex); + try { + Optional token = SessionToken.from(ex).map(Token::of); + var user = userService().loadUser(token); + if (user.isEmpty()) return unauthorized(ex); + var head = path.pop(); + return switch (head){ + case COMPANY -> getCompanyFiles(path, ex, user.get()); + case PROJECT -> getProjectFiles(path, ex, user.get()); + case USER -> getUserFiles(path, ex, user.get()); + case null, default -> super.doGet(path,ex); + }; + } catch (UmbrellaException e) { + return send(ex,e); + } + } + + private boolean getCompanyFiles(Path path, HttpExchange ex, UmbrellaUser user) { + return false; + } + + private boolean getProjectFiles(Path path, HttpExchange ex, UmbrellaUser user) { + return false; + } + + private boolean getUserFiles(Path path, HttpExchange ex, UmbrellaUser user) { + return false; + } } diff --git a/files/src/main/java/de/srsoftware/umbrella/files/SqliteDb.java b/files/src/main/java/de/srsoftware/umbrella/files/SqliteDb.java index 2bf750f..72e83df 100644 --- a/files/src/main/java/de/srsoftware/umbrella/files/SqliteDb.java +++ b/files/src/main/java/de/srsoftware/umbrella/files/SqliteDb.java @@ -1,11 +1,39 @@ package de.srsoftware.umbrella.files; +import de.srsoftware.umbrella.core.BaseDb; + import java.sql.Connection; +import java.sql.SQLException; + +import static de.srsoftware.umbrella.core.Constants.USER_ID; +import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.databaseException; +import static de.srsoftware.umbrella.files.Constants.FILE; +import static de.srsoftware.umbrella.files.Constants.TABLE_FILE_SHARES; +import static java.text.MessageFormat.format; -public class SqliteDb implements FileDb { - private final Connection db; +public class SqliteDb extends BaseDb implements FileDb { public SqliteDb(Connection conn) { - this.db = conn; + super(conn); + } + + @Override + protected int createTables() { + int currentVersion = createSettingsTable(); + switch (currentVersion){ + case 0: + createShareTable(); + } + + return setCurrentVersion(1); + } + + private void createShareTable() { + var sql = "CREATE TABLE IF NOT EXISTS {0} ({1} VARCHAR(2048) NOT NULL, {2} INT NOT NULL, PRIMARY KEY({1}, {2}))"; + try { + db.prepareStatement(format(sql, TABLE_FILE_SHARES,FILE,USER_ID)).execute(); + } catch (SQLException e){ + throw databaseException(e.getMessage()).causedBy(e); + } } } diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 46aaba1..7d7695b 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -85,7 +85,7 @@ - + diff --git a/frontend/src/routes/files/Index.svelte b/frontend/src/routes/files/Index.svelte index e93b0b8..be2d910 100644 --- a/frontend/src/routes/files/Index.svelte +++ b/frontend/src/routes/files/Index.svelte @@ -1,5 +1,58 @@ -

{t('files')}

\ No newline at end of file +

{t('files')} – {router.path}

+ +{#if children?.dirs} +
    +{#each Object.entries(children.dirs) as [k,v]} +
  • + {k} +
  • +{/each} +
+{/if} diff --git a/legacy/src/main/java/de/srsoftware/umbrella/legacy/CompanyLegacy.java b/legacy/src/main/java/de/srsoftware/umbrella/legacy/CompanyLegacy.java index f649efd..095743a 100644 --- a/legacy/src/main/java/de/srsoftware/umbrella/legacy/CompanyLegacy.java +++ b/legacy/src/main/java/de/srsoftware/umbrella/legacy/CompanyLegacy.java @@ -25,7 +25,6 @@ public class CompanyLegacy extends BaseHandler { public CompanyLegacy(Configuration config) { super(); - ModuleRegistry.add(this); } @Override