From 7db7b5c400b1ed1aea983ef0ffcceb4c1064ddf9 Mon Sep 17 00:00:00 2001
From: Robert Dyer <rdyer@unl.edu>
Date: Sat, 9 Mar 2024 11:29:20 -0600
Subject: [PATCH] Provide "api/category-groups-get" API endpoint (#2446)

---
 packages/api/methods.test.ts                  | 33 ++++++++++++++++++-
 packages/api/methods.ts                       |  4 +++
 packages/loot-core/src/server/api.ts          |  5 +++
 packages/loot-core/src/server/main.ts         |  4 +++
 .../loot-core/src/types/api-handlers.d.ts     |  2 ++
 upcoming-release-notes/2446.md                |  6 ++++
 6 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 upcoming-release-notes/2446.md

diff --git a/packages/api/methods.test.ts b/packages/api/methods.test.ts
index e68214d83..ff8830010 100644
--- a/packages/api/methods.test.ts
+++ b/packages/api/methods.test.ts
@@ -58,11 +58,42 @@ describe('API CRUD operations', () => {
     await api.loadBudget(budgetName);
   });
 
-  // apis: createCategoryGroup, updateCategoryGroup, deleteCategoryGroup
+  // apis: getCategoryGroups, createCategoryGroup, updateCategoryGroup, deleteCategoryGroup
   test('CategoryGroups: successfully update category groups', async () => {
     const month = '2023-10';
     global.currentMonth = month;
 
+    // get existing category groups
+    const groups = await api.getCategoryGroups();
+    expect(groups).toEqual(
+      expect.arrayContaining([
+        expect.objectContaining({
+          hidden: 0,
+          id: 'fc3825fd-b982-4b72-b768-5b30844cf832',
+          is_income: 0,
+          name: 'Usual Expenses',
+          sort_order: 16384,
+          tombstone: 0,
+        }),
+        expect.objectContaining({
+          hidden: 0,
+          id: 'a137772f-cf2f-4089-9432-822d2ddc1466',
+          is_income: 0,
+          name: 'Investments and Savings',
+          sort_order: 32768,
+          tombstone: 0,
+        }),
+        expect.objectContaining({
+          hidden: 0,
+          id: '2E1F5BDB-209B-43F9-AF2C-3CE28E380C00',
+          is_income: 1,
+          name: 'Income',
+          sort_order: 32768,
+          tombstone: 0,
+        }),
+      ]),
+    );
+
     // create our test category group
     const mainGroupId = await api.createCategoryGroup({
       name: 'test-group',
diff --git a/packages/api/methods.ts b/packages/api/methods.ts
index 03acaf0f4..cf8a6aa46 100644
--- a/packages/api/methods.ts
+++ b/packages/api/methods.ts
@@ -121,6 +121,10 @@ export function deleteAccount(id) {
   return send('api/account-delete', { id });
 }
 
+export function getCategoryGroups() {
+  return send('api/category-groups-get');
+}
+
 export function createCategoryGroup(group) {
   return send('api/category-group-create', { group });
 }
diff --git a/packages/loot-core/src/server/api.ts b/packages/loot-core/src/server/api.ts
index 2956ce61a..13c731235 100644
--- a/packages/loot-core/src/server/api.ts
+++ b/packages/loot-core/src/server/api.ts
@@ -514,6 +514,11 @@ handlers['api/categories-get'] = async function ({
     : result.list.map(categoryModel.toExternal);
 };
 
+handlers['api/category-groups-get'] = async function () {
+  checkFileOpen();
+  return handlers['get-category-groups']();
+};
+
 handlers['api/category-group-create'] = withMutation(async function ({
   group,
 }) {
diff --git a/packages/loot-core/src/server/main.ts b/packages/loot-core/src/server/main.ts
index 64cd29938..b5e3c0d49 100644
--- a/packages/loot-core/src/server/main.ts
+++ b/packages/loot-core/src/server/main.ts
@@ -361,6 +361,10 @@ handlers['category-delete'] = mutator(async function ({ id, transferId }) {
   });
 });
 
+handlers['get-category-groups'] = async function () {
+  return await db.getCategoriesGrouped();
+};
+
 handlers['category-group-create'] = mutator(async function ({
   name,
   isIncome,
diff --git a/packages/loot-core/src/types/api-handlers.d.ts b/packages/loot-core/src/types/api-handlers.d.ts
index 7ad399073..1f314fde6 100644
--- a/packages/loot-core/src/types/api-handlers.d.ts
+++ b/packages/loot-core/src/types/api-handlers.d.ts
@@ -109,6 +109,8 @@ export interface ApiHandlers {
     grouped;
   }) => Promise<Array<CategoryGroupEntity> | Array<CategoryEntity>>;
 
+  'api/category-groups-get': () => Promise<CategoryGroupEntity[]>;
+
   'api/category-group-create': (arg: { group }) => Promise<string>;
 
   'api/category-group-update': (arg: { id; fields }) => Promise<unknown>;
diff --git a/upcoming-release-notes/2446.md b/upcoming-release-notes/2446.md
new file mode 100644
index 000000000..d37841b1c
--- /dev/null
+++ b/upcoming-release-notes/2446.md
@@ -0,0 +1,6 @@
+---
+category: Enhancements
+authors: [psybers]
+---
+
+Provide "api/category-groups-get" API endpoint
\ No newline at end of file
-- 
GitLab