summaryrefslogtreecommitdiff
path: root/src/administration.cpp
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-08-08 22:04:47 +0200
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-08-08 22:04:47 +0200
commitb94a7ae06b20d550c727d5192cea8baf3e8fb641 (patch)
tree3258eb27e2e3f266f8c220662ebb24ebe3071b79 /src/administration.cpp
parent21496e32695744d4679fc11105352c61522ce601 (diff)
project crud
Diffstat (limited to 'src/administration.cpp')
-rw-r--r--src/administration.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/administration.cpp b/src/administration.cpp
index 052f007..9362b8d 100644
--- a/src/administration.cpp
+++ b/src/administration.cpp
@@ -1,3 +1,8 @@
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <time.h>
+
#include "administration.hpp"
administration g_administration;
@@ -5,12 +10,14 @@ administration g_administration;
void administration_create()
{
list_init(&g_administration.contacts);
+ list_init(&g_administration.projects);
strncpy(g_administration.path, "[unsaved project]", sizeof(g_administration.path)); // @localize
}
void administration_destroy()
{
list_destroy(&g_administration.contacts);
+ list_destroy(&g_administration.projects);
}
bool administration_create_contact(contact data)
@@ -93,4 +100,96 @@ u32 administration_get_contacts(u32 page_index, u32 page_size, contact* buffer)
char* administration_get_file_path()
{
return g_administration.path;
+}
+
+u32 administration_get_project_count()
+{
+ return list_size(&g_administration.projects);
+}
+
+u32 administration_get_projects(u32 page_index, u32 page_size, project* buffer)
+{
+ assert(buffer);
+
+ u32 write_cursor = 0;
+
+ u32 read_start = page_index * page_size;
+
+ list_iterator_start(&g_administration.projects);
+ while (list_iterator_hasnext(&g_administration.projects)) {
+ project c = *(project *)list_iterator_next(&g_administration.projects);
+
+ if (g_administration.projects.iter_pos <= read_start) continue;
+
+ buffer[write_cursor++] = c;
+ if (write_cursor >= page_size) break;
+ }
+ list_iterator_stop(&g_administration.projects);
+
+ return write_cursor;
+}
+
+void administration_cancel_project(project data)
+{
+ data.end_date = time(NULL);
+ data.state = project_state::CANCELLED;
+ administration_update_project(data);
+}
+
+char* administration_project_get_status_string(project data)
+{
+ switch(data.state)
+ {
+ case project_state::RUNNING: return "project.state.running"; break;
+ case project_state::PAUSED: return "project.state.paused"; break;
+ case project_state::CANCELLED: return "project.state.cancelled"; break;
+ }
+}
+
+bool administration_create_project(project data)
+{
+ data.state = project_state::RUNNING;
+ data.start_date = time(NULL);
+ data.end_date = 0;
+ project* new_project = (project*)malloc(sizeof(project));
+ memcpy((void*)new_project, (void*)&data, sizeof(project));
+ list_append(&g_administration.projects, new_project);
+
+ g_administration.next_id++;
+
+ return true;
+}
+
+bool administration_update_project(project data)
+{
+ list_iterator_start(&g_administration.projects);
+ while (list_iterator_hasnext(&g_administration.projects)) {
+ project* c = (project *)list_iterator_next(&g_administration.projects);
+
+ if (strcmp(c->id, data.id) == 0) {
+ memcpy(c, &data, sizeof(data));
+ list_iterator_stop(&g_administration.projects);
+ return true;
+ }
+ }
+ list_iterator_stop(&g_administration.projects);
+
+ return false;
+}
+
+bool administration_remove_project(project data)
+{
+ list_iterator_start(&g_administration.projects);
+ while (list_iterator_hasnext(&g_administration.projects)) {
+ project* c = (project *)list_iterator_next(&g_administration.projects);
+
+ if (strcmp(c->id, data.id) == 0) {
+ list_iterator_stop(&g_administration.projects);
+ list_delete(&g_administration.projects, c);
+ return true;
+ }
+ }
+ list_iterator_stop(&g_administration.projects);
+
+ return false;
} \ No newline at end of file