From b94a7ae06b20d550c727d5192cea8baf3e8fb641 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Fri, 8 Aug 2025 22:04:47 +0200 Subject: project crud --- src/administration.cpp | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) (limited to 'src/administration.cpp') 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 +#include +#include +#include + #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 -- cgit v1.2.3-70-g09d2