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