diff --git a/.env.example b/.env.example index 2715a2a..06a2c95 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,6 @@ PORT=7331 -UPLOAD_PATH="./uploads" -DATABASE_URL="file:./db.sqlite" +UPLOAD_PATH="./data/uploads" +DATABASE_URL="file:../data/db.sqlite" PROMPT_ANALYSE_NEW_FILE="You are an accountant and invoice analysis assistant. Extract the following information from the given invoice: diff --git a/.gitignore b/.gitignore index e7972ce..49b002d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -# uploads -/uploads/* +# data directory +/data/* # dependencies /node_modules diff --git a/app/export/transactions/route.ts b/app/export/transactions/route.ts index 47f7c00..79e8e8b 100644 --- a/app/export/transactions/route.ts +++ b/app/export/transactions/route.ts @@ -1,7 +1,7 @@ -import { ExportFields, ExportFilters, exportImportFieldsMapping } from "@/data/export_and_import" -import { getFields } from "@/data/fields" -import { getFilesByTransactionId } from "@/data/files" -import { getTransactions } from "@/data/transactions" +import { ExportFields, ExportFilters, exportImportFieldsMapping } from "@/models/export_and_import" +import { getFields } from "@/models/fields" +import { getFilesByTransactionId } from "@/models/files" +import { getTransactions } from "@/models/transactions" import { format } from "@fast-csv/format" import { formatDate } from "date-fns" import fs from "fs" diff --git a/app/files/actions.ts b/app/files/actions.ts index 679f7df..a7d580e 100644 --- a/app/files/actions.ts +++ b/app/files/actions.ts @@ -1,7 +1,7 @@ "use server" -import { createFile } from "@/data/files" import { FILE_UNSORTED_UPLOAD_PATH, getUnsortedFileUploadPath } from "@/lib/files" +import { createFile } from "@/models/files" import { existsSync } from "fs" import { mkdir, writeFile } from "fs/promises" import { revalidatePath } from "next/cache" diff --git a/app/files/download/[fileId]/route.ts b/app/files/download/[fileId]/route.ts index 88d3167..f4859cc 100644 --- a/app/files/download/[fileId]/route.ts +++ b/app/files/download/[fileId]/route.ts @@ -1,4 +1,4 @@ -import { getFileById } from "@/data/files" +import { getFileById } from "@/models/files" import fs from "fs/promises" import { NextResponse } from "next/server" @@ -16,12 +16,11 @@ export async function GET(request: Request, { params }: { params: Promise<{ file if (!file) { return new NextResponse("File not found", { status: 404 }) } - // Check if file exists try { await fs.access(file.path) } catch { - return new NextResponse("File not found on disk", { status: 404 }) + return new NextResponse(`File not found on disk: ${file.path}`, { status: 404 }) } // Read file diff --git a/app/files/preview/[fileId]/route.ts b/app/files/preview/[fileId]/route.ts index 3939159..e3057ae 100644 --- a/app/files/preview/[fileId]/route.ts +++ b/app/files/preview/[fileId]/route.ts @@ -1,6 +1,6 @@ -import { getFileById } from "@/data/files" import { resizeImage } from "@/lib/images" import { pdfToImages } from "@/lib/pdf" +import { getFileById } from "@/models/files" import fs from "fs/promises" import { NextResponse } from "next/server" import path from "path" @@ -27,7 +27,7 @@ export async function GET(request: Request, { params }: { params: Promise<{ file try { await fs.access(file.path) } catch { - return new NextResponse("File not found on disk", { status: 404 }) + return new NextResponse(`File not found on disk: ${file.path}`, { status: 404 }) } let previewPath = file.path diff --git a/app/import/csv/actions.tsx b/app/import/csv/actions.tsx index 72f42ba..bc59f3b 100644 --- a/app/import/csv/actions.tsx +++ b/app/import/csv/actions.tsx @@ -1,7 +1,7 @@ "use server" -import { exportImportFieldsMapping } from "@/data/export_and_import" -import { createTransaction } from "@/data/transactions" +import { exportImportFieldsMapping } from "@/models/export_and_import" +import { createTransaction } from "@/models/transactions" import { parse } from "@fast-csv/parse" import { revalidatePath } from "next/cache" diff --git a/app/import/csv/page.tsx b/app/import/csv/page.tsx index a6de58a..b4c99a4 100644 --- a/app/import/csv/page.tsx +++ b/app/import/csv/page.tsx @@ -1,5 +1,5 @@ import { ImportCSVTable } from "@/components/import/csv" -import { getFields } from "@/data/fields" +import { getFields } from "@/models/fields" export default async function CSVImportPage() { const fields = await getFields() diff --git a/app/layout.tsx b/app/layout.tsx index 75ceccf..d9706b4 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -3,8 +3,8 @@ import MobileMenu from "@/components/sidebar/mobile-menu" import { AppSidebar } from "@/components/sidebar/sidebar" import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar" import { Toaster } from "@/components/ui/sonner" -import { getUnsortedFilesCount } from "@/data/files" -import { getSettings } from "@/data/settings" +import { getUnsortedFilesCount } from "@/models/files" +import { getSettings } from "@/models/settings" import type { Metadata, Viewport } from "next" import { NotificationProvider } from "./context" import "./globals.css" diff --git a/app/page.tsx b/app/page.tsx index 2193684..c93d68d 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -3,9 +3,9 @@ import { StatsWidget } from "@/components/dashboard/stats-widget" import DashboardUnsortedWidget from "@/components/dashboard/unsorted-widget" import { WelcomeWidget } from "@/components/dashboard/welcome-widget" import { Separator } from "@/components/ui/separator" -import { getUnsortedFiles } from "@/data/files" -import { getSettings } from "@/data/settings" -import { TransactionFilters } from "@/data/transactions" +import { getUnsortedFiles } from "@/models/files" +import { getSettings } from "@/models/settings" +import { TransactionFilters } from "@/models/transactions" export default async function Home({ searchParams }: { searchParams: Promise }) { const filters = await searchParams diff --git a/app/settings/actions.ts b/app/settings/actions.ts index 1fe1934..5892610 100644 --- a/app/settings/actions.ts +++ b/app/settings/actions.ts @@ -1,12 +1,12 @@ "use server" -import { createCategory, deleteCategory, updateCategory } from "@/data/categories" -import { createCurrency, deleteCurrency, updateCurrency } from "@/data/currencies" -import { createField, deleteField, updateField } from "@/data/fields" -import { createProject, deleteProject, updateProject } from "@/data/projects" -import { updateSettings } from "@/data/settings" import { settingsFormSchema } from "@/forms/settings" import { codeFromName } from "@/lib/utils" +import { createCategory, deleteCategory, updateCategory } from "@/models/categories" +import { createCurrency, deleteCurrency, updateCurrency } from "@/models/currencies" +import { createField, deleteField, updateField } from "@/models/fields" +import { createProject, deleteProject, updateProject } from "@/models/projects" +import { updateSettings } from "@/models/settings" import { revalidatePath } from "next/cache" import { redirect } from "next/navigation" diff --git a/app/settings/categories/page.tsx b/app/settings/categories/page.tsx index 592abfe..741eb32 100644 --- a/app/settings/categories/page.tsx +++ b/app/settings/categories/page.tsx @@ -1,7 +1,7 @@ import { addCategoryAction, deleteCategoryAction, editCategoryAction } from "@/app/settings/actions" import { CrudTable } from "@/components/settings/crud" -import { getCategories } from "@/data/categories" import { randomHexColor } from "@/lib/utils" +import { getCategories } from "@/models/categories" export default async function CategoriesSettingsPage() { const categories = await getCategories() diff --git a/app/settings/currencies/page.tsx b/app/settings/currencies/page.tsx index 47a1fdb..299c9af 100644 --- a/app/settings/currencies/page.tsx +++ b/app/settings/currencies/page.tsx @@ -1,6 +1,6 @@ import { addCurrencyAction, deleteCurrencyAction, editCurrencyAction } from "@/app/settings/actions" import { CrudTable } from "@/components/settings/crud" -import { getCurrencies } from "@/data/currencies" +import { getCurrencies } from "@/models/currencies" export default async function CurrenciesSettingsPage() { const currencies = await getCurrencies() diff --git a/app/settings/fields/page.tsx b/app/settings/fields/page.tsx index 0f90dfb..baae4c5 100644 --- a/app/settings/fields/page.tsx +++ b/app/settings/fields/page.tsx @@ -1,6 +1,6 @@ import { addFieldAction, deleteFieldAction, editFieldAction } from "@/app/settings/actions" import { CrudTable } from "@/components/settings/crud" -import { getFields } from "@/data/fields" +import { getFields } from "@/models/fields" export default async function FieldsSettingsPage() { const fields = await getFields() diff --git a/app/settings/llm/page.tsx b/app/settings/llm/page.tsx index 81b2d65..cb5eaac 100644 --- a/app/settings/llm/page.tsx +++ b/app/settings/llm/page.tsx @@ -1,6 +1,6 @@ import LLMSettingsForm from "@/components/settings/llm-settings-form" -import { getFields } from "@/data/fields" -import { getSettings } from "@/data/settings" +import { getFields } from "@/models/fields" +import { getSettings } from "@/models/settings" export default async function LlmSettingsPage() { const settings = await getSettings() diff --git a/app/settings/page.tsx b/app/settings/page.tsx index f9f2101..8d5d969 100644 --- a/app/settings/page.tsx +++ b/app/settings/page.tsx @@ -1,7 +1,7 @@ import GlobalSettingsForm from "@/components/settings/global-settings-form" -import { getCategories } from "@/data/categories" -import { getCurrencies } from "@/data/currencies" -import { getSettings } from "@/data/settings" +import { getCategories } from "@/models/categories" +import { getCurrencies } from "@/models/currencies" +import { getSettings } from "@/models/settings" export default async function SettingsPage() { const settings = await getSettings() diff --git a/app/settings/projects/page.tsx b/app/settings/projects/page.tsx index bf068ea..430783d 100644 --- a/app/settings/projects/page.tsx +++ b/app/settings/projects/page.tsx @@ -1,7 +1,7 @@ import { addProjectAction, deleteProjectAction, editProjectAction } from "@/app/settings/actions" import { CrudTable } from "@/components/settings/crud" -import { getProjects } from "@/data/projects" import { randomHexColor } from "@/lib/utils" +import { getProjects } from "@/models/projects" export default async function ProjectsSettingsPage() { const projects = await getProjects() diff --git a/app/transactions/[transactionId]/layout.tsx b/app/transactions/[transactionId]/layout.tsx index 265a0bd..b4de861 100644 --- a/app/transactions/[transactionId]/layout.tsx +++ b/app/transactions/[transactionId]/layout.tsx @@ -1,4 +1,4 @@ -import { getTransactionById } from "@/data/transactions" +import { getTransactionById } from "@/models/transactions" import { notFound } from "next/navigation" export default async function TransactionLayout({ diff --git a/app/transactions/[transactionId]/page.tsx b/app/transactions/[transactionId]/page.tsx index 56bf31d..fcd3323 100644 --- a/app/transactions/[transactionId]/page.tsx +++ b/app/transactions/[transactionId]/page.tsx @@ -2,13 +2,13 @@ import { FormTextarea } from "@/components/forms/simple" import TransactionEditForm from "@/components/transactions/edit" import TransactionFiles from "@/components/transactions/transaction-files" import { Card } from "@/components/ui/card" -import { getCategories } from "@/data/categories" -import { getCurrencies } from "@/data/currencies" -import { getFields } from "@/data/fields" -import { getFilesByTransactionId } from "@/data/files" -import { getProjects } from "@/data/projects" -import { getSettings } from "@/data/settings" -import { getTransactionById } from "@/data/transactions" +import { getCategories } from "@/models/categories" +import { getCurrencies } from "@/models/currencies" +import { getFields } from "@/models/fields" +import { getFilesByTransactionId } from "@/models/files" +import { getProjects } from "@/models/projects" +import { getSettings } from "@/models/settings" +import { getTransactionById } from "@/models/transactions" import { notFound } from "next/navigation" export default async function TransactionPage({ params }: { params: Promise<{ transactionId: string }> }) { diff --git a/app/transactions/actions.ts b/app/transactions/actions.ts index de0bc67..d02ac91 100644 --- a/app/transactions/actions.ts +++ b/app/transactions/actions.ts @@ -1,6 +1,8 @@ "use server" -import { createFile, deleteFile } from "@/data/files" +import { transactionFormSchema } from "@/forms/transactions" +import { FILE_UPLOAD_PATH, getTransactionFileUploadPath } from "@/lib/files" +import { createFile, deleteFile } from "@/models/files" import { bulkDeleteTransactions, createTransaction, @@ -8,9 +10,7 @@ import { getTransactionById, updateTransaction, updateTransactionFiles, -} from "@/data/transactions" -import { transactionFormSchema } from "@/forms/transactions" -import { FILE_UPLOAD_PATH, getTransactionFileUploadPath } from "@/lib/files" +} from "@/models/transactions" import { existsSync } from "fs" import { mkdir, writeFile } from "fs/promises" import { revalidatePath } from "next/cache" diff --git a/app/transactions/page.tsx b/app/transactions/page.tsx index 4ef44b7..4864822 100644 --- a/app/transactions/page.tsx +++ b/app/transactions/page.tsx @@ -4,10 +4,10 @@ import { TransactionSearchAndFilters } from "@/components/transactions/filters" import { TransactionList } from "@/components/transactions/list" import { NewTransactionDialog } from "@/components/transactions/new" import { Button } from "@/components/ui/button" -import { getCategories } from "@/data/categories" -import { getFields } from "@/data/fields" -import { getProjects } from "@/data/projects" -import { getTransactions, TransactionFilters } from "@/data/transactions" +import { getCategories } from "@/models/categories" +import { getFields } from "@/models/fields" +import { getProjects } from "@/models/projects" +import { getTransactions, TransactionFilters } from "@/models/transactions" import { Download, Plus, Upload } from "lucide-react" import { Metadata } from "next" diff --git a/app/unsorted/actions.ts b/app/unsorted/actions.ts index 3321333..3bbe048 100644 --- a/app/unsorted/actions.ts +++ b/app/unsorted/actions.ts @@ -1,9 +1,9 @@ "use server" -import { deleteFile, getFileById, updateFile } from "@/data/files" -import { createTransaction, updateTransactionFiles } from "@/data/transactions" import { transactionFormSchema } from "@/forms/transactions" import { getTransactionFileUploadPath } from "@/lib/files" +import { deleteFile, getFileById, updateFile } from "@/models/files" +import { createTransaction, updateTransactionFiles } from "@/models/transactions" import { mkdir, rename } from "fs/promises" import { revalidatePath } from "next/cache" import path from "path" diff --git a/app/unsorted/page.tsx b/app/unsorted/page.tsx index fc06c2c..6da3254 100644 --- a/app/unsorted/page.tsx +++ b/app/unsorted/page.tsx @@ -4,12 +4,12 @@ import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" import { Button } from "@/components/ui/button" import { Card } from "@/components/ui/card" import AnalyzeForm from "@/components/unsorted/analyze-form" -import { getCategories } from "@/data/categories" -import { getCurrencies } from "@/data/currencies" -import { getFields } from "@/data/fields" -import { getUnsortedFiles } from "@/data/files" -import { getProjects } from "@/data/projects" -import { getSettings } from "@/data/settings" +import { getCategories } from "@/models/categories" +import { getCurrencies } from "@/models/currencies" +import { getFields } from "@/models/fields" +import { getUnsortedFiles } from "@/models/files" +import { getProjects } from "@/models/projects" +import { getSettings } from "@/models/settings" import { FileText, PartyPopper, Settings, Upload } from "lucide-react" import { Metadata } from "next" import Link from "next/link" diff --git a/components/dashboard/drop-zone-widget.tsx b/components/dashboard/drop-zone-widget.tsx index 0c5933a..051903d 100644 --- a/components/dashboard/drop-zone-widget.tsx +++ b/components/dashboard/drop-zone-widget.tsx @@ -2,11 +2,11 @@ import { useNotification } from "@/app/context" import { uploadFilesAction } from "@/app/files/actions" +import { FormError } from "@/components/forms/error" import { FILE_ACCEPTED_MIMETYPES } from "@/lib/files" import { Camera, Loader2 } from "lucide-react" import { useRouter } from "next/navigation" import { startTransition, useState } from "react" -import { FormError } from "../forms/error" export default function DashboardDropZoneWidget() { const router = useRouter() diff --git a/components/dashboard/filters-widget.tsx b/components/dashboard/filters-widget.tsx index ac78473..b827c73 100644 --- a/components/dashboard/filters-widget.tsx +++ b/components/dashboard/filters-widget.tsx @@ -1,9 +1,9 @@ "use client" -import { TransactionFilters } from "@/data/transactions" +import { DateRangePicker } from "@/components/forms/date-range-picker" import { useTransactionFilters } from "@/hooks/use-transaction-filters" +import { TransactionFilters } from "@/models/transactions" import { format } from "date-fns" -import { DateRangePicker } from "../forms/date-range-picker" export function FiltersWidget({ defaultFilters, diff --git a/components/dashboard/projects-widget.tsx b/components/dashboard/projects-widget.tsx index abacde3..6a9e4b7 100644 --- a/components/dashboard/projects-widget.tsx +++ b/components/dashboard/projects-widget.tsx @@ -1,7 +1,7 @@ import { Badge } from "@/components/ui/badge" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" -import { ProjectStats } from "@/data/stats" import { formatCurrency } from "@/lib/utils" +import { ProjectStats } from "@/models/stats" import { Project } from "@prisma/client" import { Plus } from "lucide-react" import Link from "next/link" diff --git a/components/dashboard/stats-widget.tsx b/components/dashboard/stats-widget.tsx index 85c2d08..6f2a95d 100644 --- a/components/dashboard/stats-widget.tsx +++ b/components/dashboard/stats-widget.tsx @@ -1,11 +1,11 @@ -import { getProjects } from "@/data/projects" -import { getDashboardStats, getProjectStats } from "@/data/stats" -import { TransactionFilters } from "@/data/transactions" +import { FiltersWidget } from "@/components/dashboard/filters-widget" +import { ProjectsWidget } from "@/components/dashboard/projects-widget" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { formatCurrency } from "@/lib/utils" +import { getProjects } from "@/models/projects" +import { getDashboardStats, getProjectStats } from "@/models/stats" +import { TransactionFilters } from "@/models/transactions" import { ArrowDown, ArrowUp, BicepsFlexed } from "lucide-react" -import { Card, CardContent, CardHeader, CardTitle } from "../ui/card" -import { FiltersWidget } from "./filters-widget" -import { ProjectsWidget } from "./projects-widget" export async function StatsWidget({ filters }: { filters: TransactionFilters }) { const projects = await getProjects() diff --git a/components/dashboard/welcome-widget.tsx b/components/dashboard/welcome-widget.tsx index 00dac9c..e59f555 100644 --- a/components/dashboard/welcome-widget.tsx +++ b/components/dashboard/welcome-widget.tsx @@ -1,6 +1,6 @@ import { Button } from "@/components/ui/button" import { Card, CardDescription, CardTitle } from "@/components/ui/card" -import { getSettings, updateSettings } from "@/data/settings" +import { getSettings, updateSettings } from "@/models/settings" import { Banknote, ChartBarStacked, FolderOpenDot, Key, TextCursorInput, X } from "lucide-react" import { revalidatePath } from "next/cache" import Link from "next/link" diff --git a/components/export/transactions.tsx b/components/export/transactions.tsx index 302d505..dc51cdf 100644 --- a/components/export/transactions.tsx +++ b/components/export/transactions.tsx @@ -1,5 +1,8 @@ "use client" +import { DateRangePicker } from "@/components/forms/date-range-picker" +import { FormSelectCategory } from "@/components/forms/select-category" +import { FormSelectProject } from "@/components/forms/select-project" import { Button } from "@/components/ui/button" import { Dialog, @@ -16,9 +19,6 @@ import { Category, Field, Project } from "@prisma/client" import { formatDate } from "date-fns" import { useRouter } from "next/navigation" import { useState } from "react" -import { DateRangePicker } from "../forms/date-range-picker" -import { FormSelectCategory } from "../forms/select-category" -import { FormSelectProject } from "../forms/select-project" const deselectedFields = ["files", "text"] diff --git a/components/import/csv.tsx b/components/import/csv.tsx index 6c7eadb..677ad64 100644 --- a/components/import/csv.tsx +++ b/components/import/csv.tsx @@ -1,12 +1,12 @@ "use client" +import { parseCSVAction, saveTransactionsAction } from "@/app/import/csv/actions" +import { FormError } from "@/components/forms/error" import { Button } from "@/components/ui/button" import { Field } from "@prisma/client" import { Loader2, Play, Upload } from "lucide-react" import { useRouter } from "next/navigation" import { startTransition, useActionState, useEffect, useState } from "react" -import { parseCSVAction, saveTransactionsAction } from "../../app/import/csv/actions" -import { FormError } from "../forms/error" const MAX_PREVIEW_ROWS = 100 diff --git a/components/settings/global-settings-form.tsx b/components/settings/global-settings-form.tsx index c6a197e..e0e0885 100644 --- a/components/settings/global-settings-form.tsx +++ b/components/settings/global-settings-form.tsx @@ -1,6 +1,7 @@ "use client" import { saveSettingsAction } from "@/app/settings/actions" +import { FormError } from "@/components/forms/error" import { FormSelectCategory } from "@/components/forms/select-category" import { FormSelectCurrency } from "@/components/forms/select-currency" import { FormSelectType } from "@/components/forms/select-type" @@ -9,7 +10,6 @@ import { Button } from "@/components/ui/button" import { Category, Currency } from "@prisma/client" import { CircleCheckBig } from "lucide-react" import { useActionState } from "react" -import { FormError } from "../forms/error" export default function GlobalSettingsForm({ settings, diff --git a/components/settings/llm-settings-form.tsx b/components/settings/llm-settings-form.tsx index 337c451..f6d67ed 100644 --- a/components/settings/llm-settings-form.tsx +++ b/components/settings/llm-settings-form.tsx @@ -2,14 +2,14 @@ import { fieldsToJsonSchema } from "@/app/ai/schema" import { saveSettingsAction } from "@/app/settings/actions" +import { FormError } from "@/components/forms/error" import { FormInput, FormTextarea } from "@/components/forms/simple" import { Button } from "@/components/ui/button" +import { Card, CardTitle } from "@/components/ui/card" import { Field } from "@prisma/client" import { CircleCheckBig, Edit } from "lucide-react" import Link from "next/link" import { useActionState } from "react" -import { FormError } from "../forms/error" -import { Card, CardTitle } from "../ui/card" export default function LLMSettingsForm({ settings, fields }: { settings: Record; fields: Field[] }) { const [saveState, saveAction, pending] = useActionState(saveSettingsAction, null) diff --git a/components/sidebar/mobile-menu.tsx b/components/sidebar/mobile-menu.tsx index f7ae4d6..293ee95 100644 --- a/components/sidebar/mobile-menu.tsx +++ b/components/sidebar/mobile-menu.tsx @@ -1,8 +1,8 @@ "use client" +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" +import { useSidebar } from "@/components/ui/sidebar" import Link from "next/link" -import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar" -import { useSidebar } from "../ui/sidebar" export default function MobileMenu({ settings, diff --git a/components/sidebar/sidebar-item.tsx b/components/sidebar/sidebar-item.tsx index f46da8d..b3e9e21 100644 --- a/components/sidebar/sidebar-item.tsx +++ b/components/sidebar/sidebar-item.tsx @@ -1,9 +1,9 @@ "use client" +import { SidebarMenuItem } from "@/components/ui/sidebar" import { cn } from "@/lib/utils" import { usePathname } from "next/navigation" import { ComponentProps } from "react" -import { SidebarMenuItem } from "../ui/sidebar" export function SidebarMenuItemWithHighlight({ href, diff --git a/components/transactions/create.tsx b/components/transactions/create.tsx index 85cf05f..5b475c5 100644 --- a/components/transactions/create.tsx +++ b/components/transactions/create.tsx @@ -1,6 +1,7 @@ "use client" import { createTransactionAction } from "@/app/transactions/actions" +import { FormError } from "@/components/forms/error" import { FormSelectCategory } from "@/components/forms/select-category" import { FormSelectCurrency } from "@/components/forms/select-currency" import { FormSelectProject } from "@/components/forms/select-project" @@ -13,7 +14,6 @@ import { Import, Loader2 } from "lucide-react" import Link from "next/link" import { useRouter } from "next/navigation" import { useActionState, useEffect, useState } from "react" -import { FormError } from "../forms/error" export default function TransactionCreateForm({ categories, diff --git a/components/transactions/edit.tsx b/components/transactions/edit.tsx index d5aac9a..a45c697 100644 --- a/components/transactions/edit.tsx +++ b/components/transactions/edit.tsx @@ -1,6 +1,7 @@ "use client" import { deleteTransactionAction, saveTransactionAction } from "@/app/transactions/actions" +import { FormError } from "@/components/forms/error" import { FormSelectCategory } from "@/components/forms/select-category" import { FormSelectCurrency } from "@/components/forms/select-currency" import { FormSelectProject } from "@/components/forms/select-project" @@ -12,7 +13,6 @@ import { format } from "date-fns" import { Loader2 } from "lucide-react" import { useRouter } from "next/navigation" import { startTransition, useActionState, useEffect, useState } from "react" -import { FormError } from "../forms/error" export default function TransactionEditForm({ transaction, diff --git a/components/transactions/filters.tsx b/components/transactions/filters.tsx index bf12f1a..4d52308 100644 --- a/components/transactions/filters.tsx +++ b/components/transactions/filters.tsx @@ -4,8 +4,8 @@ import { DateRangePicker } from "@/components/forms/date-range-picker" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" -import { TransactionFilters } from "@/data/transactions" import { isFiltered, useTransactionFilters } from "@/hooks/use-transaction-filters" +import { TransactionFilters } from "@/models/transactions" import { Category, Project } from "@prisma/client" import { X } from "lucide-react" diff --git a/components/transactions/new.tsx b/components/transactions/new.tsx index 8e248a5..990488b 100644 --- a/components/transactions/new.tsx +++ b/components/transactions/new.tsx @@ -6,10 +6,10 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog" -import { getCategories } from "@/data/categories" -import { getCurrencies } from "@/data/currencies" -import { getProjects } from "@/data/projects" -import { getSettings } from "@/data/settings" +import { getCategories } from "@/models/categories" +import { getCurrencies } from "@/models/currencies" +import { getProjects } from "@/models/projects" +import { getSettings } from "@/models/settings" import TransactionCreateForm from "./create" export async function NewTransactionDialog({ children }: { children: React.ReactNode }) { diff --git a/components/unsorted/analyze-form.tsx b/components/unsorted/analyze-form.tsx index cd259ef..d571f08 100644 --- a/components/unsorted/analyze-form.tsx +++ b/components/unsorted/analyze-form.tsx @@ -4,6 +4,7 @@ import { analyzeTransaction, retrieveAllAttachmentsForAI } from "@/app/ai/analyz import { useNotification } from "@/app/context" import { deleteUnsortedFileAction, saveFileAsTransactionAction } from "@/app/unsorted/actions" import { FormConvertCurrency } from "@/components/forms/convert-currency" +import { FormError } from "@/components/forms/error" import { FormSelectCategory } from "@/components/forms/select-category" import { FormSelectCurrency } from "@/components/forms/select-currency" import { FormSelectProject } from "@/components/forms/select-project" @@ -13,7 +14,6 @@ import { Button } from "@/components/ui/button" import { Category, Currency, Field, File, Project } from "@prisma/client" import { Brain, Loader2 } from "lucide-react" import { startTransition, useActionState, useMemo, useState } from "react" -import { FormError } from "../forms/error" export default function AnalyzeForm({ file, diff --git a/hooks/use-transaction-filters.tsx b/hooks/use-transaction-filters.tsx index 997f125..079ca20 100644 --- a/hooks/use-transaction-filters.tsx +++ b/hooks/use-transaction-filters.tsx @@ -1,4 +1,4 @@ -import { TransactionFilters } from "@/data/transactions" +import { TransactionFilters } from "@/models/transactions" import { format } from "date-fns" import { useRouter, useSearchParams } from "next/navigation" import { useEffect, useState } from "react" diff --git a/data/categories.ts b/models/categories.ts similarity index 100% rename from data/categories.ts rename to models/categories.ts diff --git a/data/currencies.ts b/models/currencies.ts similarity index 100% rename from data/currencies.ts rename to models/currencies.ts diff --git a/data/export_and_import.ts b/models/export_and_import.ts similarity index 100% rename from data/export_and_import.ts rename to models/export_and_import.ts diff --git a/data/fields.ts b/models/fields.ts similarity index 100% rename from data/fields.ts rename to models/fields.ts diff --git a/data/files.ts b/models/files.ts similarity index 89% rename from data/files.ts rename to models/files.ts index 81100fc..2fd93be 100644 --- a/data/files.ts +++ b/models/files.ts @@ -63,11 +63,17 @@ export const updateFile = async (id: string, data: any) => { export const deleteFile = async (id: string) => { const file = await getFileById(id) - if (file) { - await unlink(path.resolve(file.path)) - - return await prisma.file.delete({ - where: { id }, - }) + if (!file) { + return } + + try { + await unlink(path.resolve(file.path)) + } catch (error) { + console.error("Error deleting file:", error) + } + + return await prisma.file.delete({ + where: { id }, + }) } diff --git a/data/projects.ts b/models/projects.ts similarity index 100% rename from data/projects.ts rename to models/projects.ts diff --git a/data/settings.ts b/models/settings.ts similarity index 100% rename from data/settings.ts rename to models/settings.ts diff --git a/data/stats.ts b/models/stats.ts similarity index 100% rename from data/stats.ts rename to models/stats.ts diff --git a/data/transactions.ts b/models/transactions.ts similarity index 100% rename from data/transactions.ts rename to models/transactions.ts diff --git a/package.json b/package.json index 4113990..84a684f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "taxhacker", - "version": "0.1.0", + "version": "0.2.0", "private": true, "type": "module", "scripts": {