Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
d2caefc
remove: prisma output custom path
colombefioren Aug 23, 2025
0cc1484
chore: move lib folder in server root
colombefioren Aug 23, 2025
7af6226
chore(prisma): remove custom generator output and drop icon_emoji att…
colombefioren Aug 23, 2025
b0aff8a
feat(client): add income models
colombefioren Aug 23, 2025
08dcacc
feat(server): implement income controller with full CRUD operations
colombefioren Aug 23, 2025
3567d5e
feat(server): implement income category controller
colombefioren Aug 23, 2025
8acfe4d
feat(server): asyncHandler utility
colombefioren Aug 23, 2025
3928203
refactor: separate controller and service logic for cleaner architecture
colombefioren Aug 23, 2025
ad7d22d
refactor: unify income and income-category controllers
colombefioren Aug 23, 2025
867f846
feat: income routes
colombefioren Aug 23, 2025
87d9b4c
feat: GET /custom-categories endpoint to fetch categories created by …
colombefioren Aug 23, 2025
c094fd0
fix: correct income controller exports
colombefioren Aug 23, 2025
34ce5bb
chore: add temporary middleware to mock user (id: 4) for testing
colombefioren Aug 23, 2025
01853ee
fix(server): handle missing date field in income creation
colombefioren Aug 23, 2025
b263485
fix(server): resolve invalid date type error
colombefioren Aug 23, 2025
962ea93
chore(api): make income.date optional and require category_id in Open…
colombefioren Aug 23, 2025
ea517fa
feat(client): implement income service
colombefioren Aug 23, 2025
825f96d
feat(client): custom react hooks for income data
colombefioren Aug 23, 2025
66b5777
feat: react-router-dom and setup initial routes for home and incomes
colombefioren Aug 24, 2025
59b4a60
feat(client): income component and incomes page with full functionality
colombefioren Aug 24, 2025
77a953d
refactor: rename endpoints to /custom-categories in API spec and serv…
colombefioren Aug 24, 2025
f057393
feat: setup theme colors and font
colombefioren Aug 24, 2025
49274c9
Merge branch 'style/theme' of https://github.com/Mathieu-bot/expense-…
colombefioren Aug 24, 2025
7a1756d
remove: icon_emoji column from income_category
colombefioren Aug 24, 2025
c394cfa
fix: comprehensive error handling and validation for income categories
colombefioren Aug 24, 2025
61fda3b
chore: regenerate openapi service after spec update
colombefioren Aug 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion client/index.html
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
<!doctype html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<link
rel="stylesheet"
href="https://api.fontshare.com/v2/css?f[]=clash-grotesk@1,2&display=swap"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React + TS</title>
</head>
Expand Down
54 changes: 54 additions & 0 deletions client/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 6 additions & 5 deletions client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
"axios": "^1.7.7",
"react": "^19.1.1",
"react-dom": "^19.1.1",
"react-router-dom": "^7.8.2",
"tailwindcss": "^4.1.11"
},
"devDependencies": {
Expand All @@ -33,19 +34,19 @@
"@types/react": "^19.1.9",
"@types/react-dom": "^19.1.7",
"@vitejs/plugin-react": "^4.7.0",
"@vitest/browser": "^3.2.4",
"@vitest/coverage-v8": "^3.2.4",
"eslint": "^9.32.0",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.20",
"eslint-plugin-storybook": "^9.1.2",
"globals": "^16.3.0",
"openapi-typescript-codegen": "^0.29.0",
"playwright": "^1.54.2",
"storybook": "^9.1.2",
"typescript": "~5.8.3",
"typescript-eslint": "^8.39.0",
"vite": "^7.1.0",
"vitest": "^3.2.4",
"@vitest/browser": "^3.2.4",
"playwright": "^1.54.2",
"@vitest/coverage-v8": "^3.2.4",
"openapi-typescript-codegen": "^0.29.0"
"vitest": "^3.2.4"
}
}
54 changes: 19 additions & 35 deletions client/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,39 +1,23 @@
import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'
import { SpeedInsights } from '@vercel/speed-insights/react'
import { Analytics } from '@vercel/analytics/react'

function App() {
const [count, setCount] = useState(0)
import { Routes, Route, Navigate } from "react-router-dom";
import { ToastProvider } from "./ui";
import { IncomesPage } from "./pages/IncomesPage";

const App = () => {
return (
<>
<SpeedInsights />
<Analytics />
<div>
<a href="https://vite.dev" target="_blank">
<img src={viteLogo} className="logo" alt="Vite logo" />
</a>
<a href="https://react.dev" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
</div>
<h1>Vite + React</h1>
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>
count is {count}
</button>
<p>
Edit <code>src/App.tsx</code> and save to test HMR
</p>
<ToastProvider
max={4}
dense={false}
pauseOnHover={true}
anchorOrigin={{ vertical: "top", horizontal: "right" }}
>
<div className="App min-h-screen bg-gray-50">
<Routes>
<Route path="/" element={<Navigate to="/incomes" replace />} />
<Route path="/incomes" element={<IncomesPage />} />
</Routes>
</div>
<p className="read-the-docs">
Click on the Vite and React logos to learn more
</p>
</>
)
}
</ToastProvider>
);
};

export default App
export default App;
2 changes: 1 addition & 1 deletion client/src/api/core/ApiError.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ export class ApiError extends Error {
this.body = response.body;
this.request = request;
}
}
}
2 changes: 1 addition & 1 deletion client/src/api/core/ApiRequestOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ export type ApiRequestOptions = {
readonly mediaType?: string;
readonly responseHeader?: string;
readonly errors?: Record<number, string>;
};
};
2 changes: 1 addition & 1 deletion client/src/api/core/ApiResult.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ export type ApiResult = {
readonly status: number;
readonly statusText: string;
readonly body: any;
};
};
2 changes: 1 addition & 1 deletion client/src/api/core/CancelablePromise.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,4 @@ export class CancelablePromise<T> implements Promise<T> {
public get isCancelled(): boolean {
return this.#isCancelled;
}
}
}
2 changes: 1 addition & 1 deletion client/src/api/core/OpenAPI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@ export const OpenAPI: OpenAPIConfig = {
PASSWORD: undefined,
HEADERS: undefined,
ENCODE_PATH: undefined,
};
};
2 changes: 1 addition & 1 deletion client/src/api/core/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -320,4 +320,4 @@ export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions, ax
reject(error);
}
});
};
};
Loading