This repository has been archived on 2026-04-20. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
interaktive-systeme/services/database.ts
2023-12-08 16:24:21 +01:00

127 lines
3.8 KiB
TypeScript

//created by thschleicher
import * as SQLite from "expo-sqlite";
import uuid from "react-native-uuid";
import { Query } from "expo-sqlite";
const db = SQLite.openDatabase("interactive_systeme.db");
export const initDatabase = async () => {
try {
await db.transactionAsync(async (tx: SQLite.SQLTransactionAsync) => {
await tx.executeSqlAsync(
"CREATE TABLE IF NOT EXISTS category (guid VARCHAR(36) PRIMARY KEY, name TEXT, color TEXT, type TEXT);"
);
await tx.executeSqlAsync(
"CREATE TABLE IF NOT EXISTS expense (guid VARCHAR(36) PRIMARY KEY, name TEXT, category_guid VARCHAR(36), datetime DATETIME, amount DOUBLE, FOREIGN KEY (category_guid) REFERENCES category(guid));"
);
console.log("Successfully initialized Tables!");
});
} catch (error) {
console.log("Error initializing the Tables!");
throw (error);
}
};
export const addCategory = async (name: string, color: string, type: string) => {
//needs user input validation for type and color (should be validated by this function)
const UUID = uuid.v4();
try {
await db.transactionAsync(async (tx) => {
await tx.executeSqlAsync("INSERT INTO category (guid, name, color, type) VALUES (?, ?, ?, ?);",
[UUID.toString(), name, color, type]
);
});
console.log("Category added successfully!");
} catch (error) {
console.log("Error adding category: ", error);
throw error;
}
}
export const addExpense = async (name: string, category_guid: string,datetime: string, amount: number) => {
//needs user input validation for type and color (should be validated by this function)
const expenseUUID = uuid.v4();
try {
await db.transactionAsync(async (tx) => {
await tx.executeSqlAsync("INSERT INTO expense (guid, name, category_guid, datetime, amount) VALUES (?, ?, ?, ?, ?);", [expenseUUID.toString(), name, category_guid, datetime, amount]
);
});
console.log("Expense added successfully!");
} catch (error) {
console.log("Error adding expense: ", error);
throw error;
}
};
export const deleteCategory = async (guid: string) => {
try {
await db.transactionAsync(async (tx: SQLite.SQLTransactionAsync) => {
await tx.executeSqlAsync("DELETE FROM category WHERE guid = ?;", [guid]);
});
} catch(error) {
console.log("Error deleting category: ", error);
throw error;
}
}
export const deleteExpense = async (guid: string) => {
try {
await db.transactionAsync(async (tx: SQLite.SQLTransactionAsync) => {
await tx.executeSqlAsync("DELETE FROM expense WHERE guid = ?;", [guid]);
});
} catch(error) {
console.log("Error deleting expense: ", error);
throw error;
}
}
export const executeQuery = async (query: string) => {
const sqliteQuary: Query[] = [{sql: query, args: []}];
const result = await runQuery(sqliteQuary);
if("rows" in result[0]) {
return result[0]["rows"];
}
console.error("Query could not be executed!");
};
export const deleteDatabase = () => {
closeDatabase().then(() => {
try {
db.deleteAsync()
} catch (error) {
console.log("Error deleting the Database: ", error);
throw error;
}
});
console.log("Database Deleted!")
}
const runQuery = async (query: Query[]) => {
try {
return await db.execAsync(query, true);
} catch (error) {
console.log("Error running Quary: ", error);
throw(error);
}
};
const closeDatabase = async () => {
try {
db.closeAsync();
} catch (error) {
console.log("Error, cant close database: ", error);
throw error;
}
}