diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a6862ec --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +*.sqlite + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/README.md b/README.md index ee26ae1..ea728e0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,14 @@ # klist -todos for your browser and terminal \ No newline at end of file +todos for your browser and terminal + +## disclaimer + +work in progress, very far from production ready. use with caution and mind the [LICENSE](license) file + +also, if you're getting mad at me because i used kotlin, i can assure you i will probably will be mad at myself +as well soon enough. there are languages way better for this. + +## description + +This project aims to provide a CLI as well as a BFF to organize your day-to-day life, even with friends and colleagues. diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..cb6db10 --- /dev/null +++ b/pom.xml @@ -0,0 +1,107 @@ + + + 4.0.0 + + dev.thebread + klist + 1.0-SNAPSHOT + + + UTF-8 + official + 9 + + + + + mavenCentral + https://repo1.maven.org/maven2/ + + + + + src/main/kotlin + src/test/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + 2.1.20 + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + maven-surefire-plugin + 3.5.3 + + + maven-failsafe-plugin + 3.5.3 + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + MainKt + + + + + + + + org.jetbrains.kotlin + kotlin-test-junit5 + 2.1.20 + test + + + org.junit.jupiter + junit-jupiter + 5.10.0 + test + + + org.jetbrains.kotlin + kotlin-stdlib + 2.1.20 + + + + + org.xerial + sqlite-jdbc + 3.49.1.0 + + + + org.jetbrains.kotlinx + kotlinx-cli-jvm + 0.3.6 + + + + \ No newline at end of file diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt new file mode 100644 index 0000000..b45c76d --- /dev/null +++ b/src/main/kotlin/Main.kt @@ -0,0 +1,63 @@ +package dev.thebread + +import java.sql.DriverManager +import java.sql.Connection +import java.io.File +import java.sql.PreparedStatement + +class KlistApp { + + enum class PreparedStatementCase { + GET_USERS, GET_LIST_FOR_USER, GET_LISTS, GET_STAGES_FOR_LIST, + ADD_LIST, ADD_USER, ADD_LIST_FOR_USER, ADD_STAGE_FOR_LIST, ADD_TASK_TO_LIST, + MOVE_TASK_TO_STAGE, + REMOVE_TASK, REMOVE_USER, REMOVE_LIST_FOR_USER, + REG_LOCAL_FOR_USER, REG_DISCORD_FOR_USER, REG_GOOGLE_FOR_USER, + CLEANUP, + } + + private var conn: Connection + private var stmts: Map + + constructor(path: String?) { + conn = DriverManager.getConnection(if (!path.isNullOrBlank()) path else "jdbc:sqlite::memory:") + dbSetup(conn) + stmts = dbPrepare(conn) + } + + private fun dbSetup(conn: Connection) { + val initSql = File("init.sql").readText() + conn.createStatement().executeUpdate(initSql) + } + + private fun dbPrepare(conn: Connection): Map { + return PreparedStatementCase.entries.associateWith { case -> + conn.prepareStatement( + File( + "prepare/${ + case.toString().lowercase() + }.sql" + ).readText() + ) + } + } + + private fun assureUser() {} + private fun assureListForUser() {} + private fun assureStageForList() {} + + fun createTask() {} + fun moveTask() {} + fun deleteTask() {} + + fun createStage() {} + fun moveStage() {} + fun deleteStage() {} + + fun deleteUser() {} +} + +fun main() { + val app = KlistApp(null); + println("Works yay") +} \ No newline at end of file diff --git a/src/main/resources/init.sql b/src/main/resources/init.sql new file mode 100644 index 0000000..01497cf --- /dev/null +++ b/src/main/resources/init.sql @@ -0,0 +1,39 @@ +create table if not exists users ( + id integer primary key, + name text not null, + local_id integer, -- if the thing is running locally + discord_id integer, -- if logging in via web via discord + google_id integer -- if logging in via web via google +); + +create table if not exists user_lists ( + id integer primary key, + user_id integer not null, + list_id integer not null +); + +create table if not exists lists ( + id integer primary key, + name text not null, + desc text +); + +create table if not exists task_stages ( + id integer primary key, + name text not null, + desc text, + list_id integer not null, + foreign key (list_id) references lists(id) +); + +-- this currently enables moving tasks _between lists_ (calculated of course) +create table if not exists tasks ( + id integer primary key, + name text not null, + desc text, + stage integer not null, + due date, + due_stage integer, -- more like target stage + foreign key (stage) references task_stages(id), + foreign key (due_stage) references task_stages(id) +) \ No newline at end of file diff --git a/src/main/resources/prepare/add_list.sql b/src/main/resources/prepare/add_list.sql new file mode 100644 index 0000000..cf36816 --- /dev/null +++ b/src/main/resources/prepare/add_list.sql @@ -0,0 +1 @@ +insert into lists values (?1, ?2); \ No newline at end of file diff --git a/src/main/resources/prepare/add_list_for_user.sql b/src/main/resources/prepare/add_list_for_user.sql new file mode 100644 index 0000000..104e885 --- /dev/null +++ b/src/main/resources/prepare/add_list_for_user.sql @@ -0,0 +1 @@ +insert or ignore into user_lists values (?1, ?2); \ No newline at end of file diff --git a/src/main/resources/prepare/add_stage_for_list.sql b/src/main/resources/prepare/add_stage_for_list.sql new file mode 100644 index 0000000..d7c2abe --- /dev/null +++ b/src/main/resources/prepare/add_stage_for_list.sql @@ -0,0 +1 @@ +insert into task_stages values (?1, ?2, ?3); \ No newline at end of file diff --git a/src/main/resources/prepare/add_task_to_list.sql b/src/main/resources/prepare/add_task_to_list.sql new file mode 100644 index 0000000..8499f31 --- /dev/null +++ b/src/main/resources/prepare/add_task_to_list.sql @@ -0,0 +1 @@ +insert into tasks values (?1, ?2, ?3); \ No newline at end of file diff --git a/src/main/resources/prepare/add_user.sql b/src/main/resources/prepare/add_user.sql new file mode 100644 index 0000000..fbe5b9a --- /dev/null +++ b/src/main/resources/prepare/add_user.sql @@ -0,0 +1 @@ +insert into users values (?1); \ No newline at end of file diff --git a/src/main/resources/prepare/cleanup.sql b/src/main/resources/prepare/cleanup.sql new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/prepare/get_list_for_user.sql b/src/main/resources/prepare/get_list_for_user.sql new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/prepare/get_lists.sql b/src/main/resources/prepare/get_lists.sql new file mode 100644 index 0000000..be32882 --- /dev/null +++ b/src/main/resources/prepare/get_lists.sql @@ -0,0 +1 @@ +select * from lists; \ No newline at end of file diff --git a/src/main/resources/prepare/get_stages_for_list.sql b/src/main/resources/prepare/get_stages_for_list.sql new file mode 100644 index 0000000..a66e123 --- /dev/null +++ b/src/main/resources/prepare/get_stages_for_list.sql @@ -0,0 +1 @@ +select * from task_stages where list_id = ?1; \ No newline at end of file diff --git a/src/main/resources/prepare/get_users.sql b/src/main/resources/prepare/get_users.sql new file mode 100644 index 0000000..3df145e --- /dev/null +++ b/src/main/resources/prepare/get_users.sql @@ -0,0 +1 @@ +select * from users; \ No newline at end of file diff --git a/src/main/resources/prepare/reg_discord_for_user.sql b/src/main/resources/prepare/reg_discord_for_user.sql new file mode 100644 index 0000000..358f8ed --- /dev/null +++ b/src/main/resources/prepare/reg_discord_for_user.sql @@ -0,0 +1,3 @@ +update users +set discord_id = ?1 +where id = ?2; \ No newline at end of file diff --git a/src/main/resources/prepare/reg_google_for_user.sql b/src/main/resources/prepare/reg_google_for_user.sql new file mode 100644 index 0000000..d7fe669 --- /dev/null +++ b/src/main/resources/prepare/reg_google_for_user.sql @@ -0,0 +1,3 @@ +update users +set google_id = ?1 +where id = ?2; \ No newline at end of file diff --git a/src/main/resources/prepare/reg_local_for_user.sql b/src/main/resources/prepare/reg_local_for_user.sql new file mode 100644 index 0000000..a5ceb40 --- /dev/null +++ b/src/main/resources/prepare/reg_local_for_user.sql @@ -0,0 +1,3 @@ +update users +set local_id = ?1 +where id = ?2; \ No newline at end of file diff --git a/src/main/resources/prepare/remove_list_for_user.sql b/src/main/resources/prepare/remove_list_for_user.sql new file mode 100644 index 0000000..eea2a02 --- /dev/null +++ b/src/main/resources/prepare/remove_list_for_user.sql @@ -0,0 +1 @@ +delete from user_lists where user_id = ?1 and list_id = ?2; \ No newline at end of file diff --git a/src/main/resources/prepare/remove_task.sql b/src/main/resources/prepare/remove_task.sql new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/prepare/remove_user.sql b/src/main/resources/prepare/remove_user.sql new file mode 100644 index 0000000..e69de29 diff --git a/src/test/kotlin/DatabaseTests.kt b/src/test/kotlin/DatabaseTests.kt new file mode 100644 index 0000000..a09c472 --- /dev/null +++ b/src/test/kotlin/DatabaseTests.kt @@ -0,0 +1,12 @@ +import org.junit.jupiter.api.*; + +import dev.thebread.KlistApp; + +import org.junit.jupiter.api.Test; +import java.sql.Connection; + +class DatabaseTests { + + private val app : KlistApp = KlistApp(null); + +} \ No newline at end of file