summaryrefslogtreecommitdiffstats
path: root/apps/projects-web/src/app/lib
diff options
context:
space:
mode:
Diffstat (limited to 'apps/projects-web/src/app/lib')
-rw-r--r--apps/projects-web/src/app/lib/services/user-service.ts21
-rw-r--r--apps/projects-web/src/app/lib/stores/categories.ts44
-rw-r--r--apps/projects-web/src/app/lib/stores/entries.ts74
-rw-r--r--apps/projects-web/src/app/lib/stores/labels.ts44
4 files changed, 183 insertions, 0 deletions
diff --git a/apps/projects-web/src/app/lib/services/user-service.ts b/apps/projects-web/src/app/lib/services/user-service.ts
new file mode 100644
index 0000000..7bffa49
--- /dev/null
+++ b/apps/projects-web/src/app/lib/services/user-service.ts
@@ -0,0 +1,21 @@
+import {delete_account, logout} from "$shared/lib/api/user";
+import {accounts_base} from "$shared/lib/configuration";
+import {clear_session_data} from "$shared/lib/session";
+import {clear_categories} from "$app/lib/stores/categories";
+import {clear_entries} from "$app/lib/stores/entries";
+import {clear_labels} from "$app/lib/stores/labels";
+
+export async function logout_user(reason: string = "") {
+ await logout();
+ clear_session_data();
+ clear_categories();
+ clear_labels();
+ clear_entries();
+ location.replace(accounts_base("#/login" + (reason ? "?" + reason : "")));
+}
+
+export async function delete_user() {
+ await delete_account();
+ clear_session_data();
+ location.replace(accounts_base("#/login?deleted"));
+}
diff --git a/apps/projects-web/src/app/lib/stores/categories.ts b/apps/projects-web/src/app/lib/stores/categories.ts
new file mode 100644
index 0000000..2a63c42
--- /dev/null
+++ b/apps/projects-web/src/app/lib/stores/categories.ts
@@ -0,0 +1,44 @@
+import {writable, get} from "svelte/store";
+import {create_time_category, delete_time_category, get_time_categories} from "$shared/lib/api/time-entry";
+import type {TimeCategoryDto} from "$shared/lib/models/TimeCategoryDto";
+import type {IInternalFetchResponse} from "$shared/lib/models/IInternalFetchResponse";
+
+const categories = writable<Array<TimeCategoryDto>>([]);
+
+export async function reload_categories() {
+ const get_categories_response = await get_time_categories();
+ if (!get_categories_response.ok) {
+ clear_categories();
+ return;
+ }
+ categories.set(get_categories_response.data ?? []);
+}
+
+export function clear_categories() {
+ categories.set([]);
+}
+
+export async function create_category_async(request: TimeCategoryDto): Promise<IInternalFetchResponse> {
+ const create_entry_response = await create_time_category(request);
+ if (create_entry_response.ok) {
+ const stored_entries = get(categories);
+ stored_entries.push(create_entry_response.data);
+ categories.set(stored_entries);
+ }
+ return create_entry_response;
+}
+
+export async function edit_category_async(entry: TimeCategoryDto) {
+ if (!entry.id) return;
+}
+
+export async function delete_category_async(entry: TimeCategoryDto) {
+ if (!entry.id) return;
+ const http_request = await delete_time_category(entry.id);
+ if (http_request.ok) {
+ const stored_entries = get(categories);
+ categories.set(stored_entries.filter(e => e.id !== entry.id));
+ }
+}
+
+export default categories;
diff --git a/apps/projects-web/src/app/lib/stores/entries.ts b/apps/projects-web/src/app/lib/stores/entries.ts
new file mode 100644
index 0000000..e933568
--- /dev/null
+++ b/apps/projects-web/src/app/lib/stores/entries.ts
@@ -0,0 +1,74 @@
+import {Temporal} from "@js-temporal/polyfill";
+import {writable, get} from "svelte/store";
+import {get_time_entries, create_time_entry, delete_time_entry, update_time_entry} from "$shared/lib/api/time-entry";
+import type {TimeEntryDto} from "$shared/lib/models/TimeEntryDto";
+import type {IInternalFetchResponse} from "$shared/lib/models/IInternalFetchResponse";
+import type {TimeEntryQuery} from "$shared/lib/models/TimeEntryQuery";
+
+const entries = writable<Array<TimeEntryDto>>([]);
+
+export function get_time_entry(id: string): TimeEntryDto {
+ return get(entries).find(c => c.id === id);
+}
+
+export async function reload_entries(query: TimeEntryQuery): Promise<void> {
+ const get_entries_response = await get_time_entries(query);
+ if (!get_entries_response.ok) {
+ clear_entries();
+ return;
+ }
+ entries.set(get_default_sorted(get_entries_response.data?.results ?? []));
+}
+
+export function clear_entries() {
+ entries.set([]);
+}
+
+function get_default_sorted(unsorted: Array<TimeEntryDto>): Array<TimeEntryDto> {
+ if (unsorted.length < 1) return unsorted;
+ const byStart = unsorted.sort((a, b) => {
+ return Temporal.Instant.compare(Temporal.Instant.from(b.start), Temporal.Instant.from(a.start));
+ });
+
+ return byStart.sort((a, b) => {
+ return Temporal.Instant.compare(Temporal.Instant.from(b.stop), Temporal.Instant.from(a.stop));
+ });
+}
+
+export async function create_entry_async(request: TimeEntryDto): Promise<IInternalFetchResponse> {
+ const create_entry_response = await create_time_entry(request);
+ if (create_entry_response.ok) {
+ const stored_entries = get(entries) ?? [];
+ stored_entries.push(create_entry_response.data);
+ entries.set(get_default_sorted(stored_entries));
+ }
+ return create_entry_response;
+}
+
+export async function edit_entry_async(request: TimeEntryDto): Promise<IInternalFetchResponse> {
+ if (!request.id) return;
+ const edit_entry_response = await update_time_entry(request);
+ if (edit_entry_response.ok) {
+ const stored_entries = get(entries) ?? [];
+ const index = stored_entries.findIndex(c => c.id === request.id);
+ if (index === -1) {
+ stored_entries.push(edit_entry_response.data);
+ } else {
+ stored_entries[index] = edit_entry_response.data;
+ }
+ entries.set(get_default_sorted(stored_entries));
+ }
+ return edit_entry_response;
+}
+
+export async function delete_entry_async(entry_id: string): Promise<void> {
+ if (!entry_id) throw new Error("No id was supplied when deleting query");
+ const delete_entry_response = await delete_time_entry(entry_id);
+ if (delete_entry_response.ok) {
+ const stored_entries = get(entries) ?? [];
+ entries.set(get_default_sorted(stored_entries.filter((e) => e.id !== entry_id) ?? []));
+ }
+}
+
+
+export default entries;
diff --git a/apps/projects-web/src/app/lib/stores/labels.ts b/apps/projects-web/src/app/lib/stores/labels.ts
new file mode 100644
index 0000000..d5ffaa9
--- /dev/null
+++ b/apps/projects-web/src/app/lib/stores/labels.ts
@@ -0,0 +1,44 @@
+import {writable, get} from "svelte/store";
+import {create_time_label, delete_time_label, get_time_labels} from "$shared/lib/api/time-entry";
+import type {IInternalFetchResponse} from "$shared/lib/models/IInternalFetchResponse";
+import type {TimeLabelDto} from "$shared/lib/models/TimeLabelDto";
+
+const labels = writable<Array<TimeLabelDto>>([]);
+
+export async function reload_labels() {
+ const get_labels_response = await get_time_labels();
+ if (!get_labels_response.ok) {
+ clear_labels();
+ return;
+ }
+ labels.set(get_labels_response.data ?? []);
+}
+
+export function clear_labels() {
+ labels.set([]);
+}
+
+export async function create_label_async(request: TimeLabelDto): Promise<IInternalFetchResponse> {
+ const create_label_response = await create_time_label(request);
+ if (create_label_response.ok) {
+ const stored_entries = get(labels) ?? [];
+ stored_entries.push(create_label_response.data);
+ labels.set(stored_entries);
+ }
+ return create_label_response;
+}
+
+export async function edit_label_async(entry: TimeLabelDto) {
+ if (!entry.id) throw new Error("Label id is required");
+}
+
+export async function delete_label_async(entry: TimeLabelDto) {
+ if (!entry.id) return;
+ const http_request = await delete_time_label(entry.id);
+ if (http_request.ok) {
+ const stored_entries = get(labels) ?? [];
+ labels.set(stored_entries.filter(e => e.id !== entry.id));
+ }
+}
+
+export default labels;