Skip to content
Snippets Groups Projects
Unverified Commit 37457cd6 authored by DJ Mountney's avatar DJ Mountney Committed by GitHub
Browse files

Create types for the external versions of entities meant for the API (#2716)

* Create types for the external versions of entities meant for the API

- Otherwise the types used in the API were actually wrong vs the data we were sending

* Add release note
parent c16f4c71
No related branches found
No related tags found
No related merge requests found
// @ts-strict-ignore import type {
AccountEntity,
CategoryEntity,
CategoryGroupEntity,
PayeeEntity,
} from '../types/models';
import * as models from './models'; import * as models from './models';
export type APIAccountEntity = Pick<AccountEntity, 'id' | 'name'> & {
offbudget: boolean;
closed: boolean;
};
export const accountModel = { export const accountModel = {
...models.accountModel, ...models.accountModel,
toExternal(account) { toExternal(account: AccountEntity): APIAccountEntity {
return { return {
id: account.id, id: account.id,
name: account.name, name: account.name,
...@@ -13,8 +24,8 @@ export const accountModel = { ...@@ -13,8 +24,8 @@ export const accountModel = {
}; };
}, },
fromExternal(account) { fromExternal(account: APIAccountEntity) {
const result = { ...account }; const result = { ...account } as unknown as AccountEntity;
if ('offbudget' in account) { if ('offbudget' in account) {
result.offbudget = account.offbudget ? 1 : 0; result.offbudget = account.offbudget ? 1 : 0;
} }
...@@ -25,10 +36,17 @@ export const accountModel = { ...@@ -25,10 +36,17 @@ export const accountModel = {
}, },
}; };
export type APICategoryEntity = Pick<
CategoryEntity,
'id' | 'name' | 'is_income' | 'hidden'
> & {
group_id?: string;
};
export const categoryModel = { export const categoryModel = {
...models.categoryModel, ...models.categoryModel,
toExternal(category) { toExternal(category: CategoryEntity): APICategoryEntity {
return { return {
id: category.id, id: category.id,
name: category.name, name: category.name,
...@@ -38,14 +56,10 @@ export const categoryModel = { ...@@ -38,14 +56,10 @@ export const categoryModel = {
}; };
}, },
fromExternal(category) { fromExternal(category: APICategoryEntity) {
const { group_id: _, ...result } = category; const { group_id: _, ...result }: { group_id?: string } & CategoryEntity =
if ('is_income' in category) { category;
result.is_income = category.is_income ? 1 : 0;
}
if ('hidden' in category) {
result.hidden = category.hidden ? 1 : 0;
}
if ('group_id' in category) { if ('group_id' in category) {
result.cat_group = category.group_id; result.cat_group = category.group_id;
} }
...@@ -53,27 +67,28 @@ export const categoryModel = { ...@@ -53,27 +67,28 @@ export const categoryModel = {
}, },
}; };
export type APICategoryGroupEntity = Pick<
CategoryGroupEntity,
'id' | 'name' | 'is_income' | 'hidden'
> & {
categories: APICategoryEntity[];
};
export const categoryGroupModel = { export const categoryGroupModel = {
...models.categoryGroupModel, ...models.categoryGroupModel,
toExternal(group) { toExternal(group: CategoryGroupEntity): APICategoryGroupEntity {
return { return {
id: group.id, id: group.id,
name: group.name, name: group.name,
is_income: group.is_income ? true : false, is_income: group.is_income ? true : false,
hidden: group.hidden ? true : false, hidden: group.hidden ? true : false,
categories: group.categories.map(categoryModel.toExternal), categories: group.categories?.map(categoryModel.toExternal) || [],
}; };
}, },
fromExternal(group) { fromExternal(group: APICategoryGroupEntity) {
const result = { ...group }; const result = { ...group } as unknown as CategoryGroupEntity;
if ('is_income' in group) {
result.is_income = group.is_income ? 1 : 0;
}
if ('hidden' in group) {
result.hidden = group.hidden ? 1 : 0;
}
if ('categories' in group) { if ('categories' in group) {
result.categories = group.categories.map(categoryModel.fromExternal); result.categories = group.categories.map(categoryModel.fromExternal);
} }
...@@ -81,20 +96,21 @@ export const categoryGroupModel = { ...@@ -81,20 +96,21 @@ export const categoryGroupModel = {
}, },
}; };
export type APIPayeeEntity = Pick<PayeeEntity, 'id' | 'name' | 'transfer_acct'>;
export const payeeModel = { export const payeeModel = {
...models.payeeModel, ...models.payeeModel,
toExternal(payee) { toExternal(payee: PayeeEntity) {
return { return {
id: payee.id, id: payee.id,
name: payee.name, name: payee.name,
category: payee.category,
transfer_acct: payee.transfer_acct, transfer_acct: payee.transfer_acct,
}; };
}, },
fromExternal(payee) { fromExternal(payee: APIPayeeEntity) {
// No translation is needed // No translation is needed
return payee; return payee as PayeeEntity;
}, },
}; };
import { type batchUpdateTransactions } from '../server/accounts/transactions'; import { type batchUpdateTransactions } from '../server/accounts/transactions';
import type { import type {
TransactionEntity, APICategoryEntity,
AccountEntity, APIAccountEntity,
CategoryGroupEntity, APICategoryGroupEntity,
CategoryEntity, APIPayeeEntity,
PayeeEntity, } from '../server/api-models';
} from './models';
import type { TransactionEntity } from './models';
import { type ServerHandlers } from './server-handlers'; import { type ServerHandlers } from './server-handlers';
export interface ApiHandlers { export interface ApiHandlers {
...@@ -96,7 +96,7 @@ export interface ApiHandlers { ...@@ -96,7 +96,7 @@ export interface ApiHandlers {
'api/sync': () => Promise<void>; 'api/sync': () => Promise<void>;
'api/accounts-get': () => Promise<AccountEntity[]>; 'api/accounts-get': () => Promise<APIAccountEntity[]>;
'api/account-create': (arg: { account; initialBalance? }) => Promise<string>; 'api/account-create': (arg: { account; initialBalance? }) => Promise<string>;
...@@ -114,9 +114,9 @@ export interface ApiHandlers { ...@@ -114,9 +114,9 @@ export interface ApiHandlers {
'api/categories-get': (arg: { 'api/categories-get': (arg: {
grouped; grouped;
}) => Promise<Array<CategoryGroupEntity | CategoryEntity>>; }) => Promise<Array<APICategoryGroupEntity | APICategoryEntity>>;
'api/category-groups-get': () => Promise<CategoryGroupEntity[]>; 'api/category-groups-get': () => Promise<APICategoryGroupEntity[]>;
'api/category-group-create': (arg: { group }) => Promise<string>; 'api/category-group-create': (arg: { group }) => Promise<string>;
...@@ -136,7 +136,7 @@ export interface ApiHandlers { ...@@ -136,7 +136,7 @@ export interface ApiHandlers {
transferCategoryId?; transferCategoryId?;
}) => Promise<{ error?: string }>; }) => Promise<{ error?: string }>;
'api/payees-get': () => Promise<PayeeEntity[]>; 'api/payees-get': () => Promise<APIPayeeEntity[]>;
'api/payee-create': (arg: { payee }) => Promise<string>; 'api/payee-create': (arg: { payee }) => Promise<string>;
......
---
category: Maintenance
authors: [twk3]
---
Create types for the external versions of entities meant for the API`
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment