ci: use local prisma client

This commit is contained in:
Vasily Zubarev
2025-05-03 10:23:13 +02:00
parent 9e6b2f89bf
commit 26991a1520
47 changed files with 66 additions and 60 deletions

1
.gitignore vendored
View File

@@ -47,6 +47,7 @@ yarn-error.log*
next-env.d.ts
# databases
prisma/client
pgdata
*.db
*.sqlite

View File

@@ -1,6 +1,6 @@
import { fileExists, fullPathForFile } from "@/lib/files"
import { generateFilePreviews } from "@/lib/previews/generate"
import { File, User } from "@prisma/client"
import { File, User } from "@/prisma/client"
import fs from "fs/promises"
const MAX_PAGES_TO_ANALYZE = 4

View File

@@ -1,4 +1,4 @@
import { Category, Field, Project } from "@prisma/client"
import { Category, Field, Project } from "@/prisma/client"
export function buildLLMPrompt(
promptTemplate: string,

View File

@@ -1,13 +1,16 @@
import { Field } from "@prisma/client"
import { Field } from "@/prisma/client"
export const fieldsToJsonSchema = (fields: Field[]) => {
const fieldsWithPrompt = fields.filter((field) => field.llm_prompt)
const schema = {
type: "object",
properties: fieldsWithPrompt.reduce((acc, field) => {
acc[field.code] = { type: field.type, description: field.llm_prompt || "" }
return acc
}, {} as Record<string, { type: string; description: string }>),
properties: fieldsWithPrompt.reduce(
(acc, field) => {
acc[field.code] = { type: field.type, description: field.llm_prompt || "" }
return acc
},
{} as Record<string, { type: string; description: string }>
),
required: fieldsWithPrompt.map((field) => field.code),
additionalProperties: false,
}

View File

@@ -4,8 +4,8 @@ import { ActionState } from "@/lib/actions"
import { getCurrentUser } from "@/lib/auth"
import { EXPORT_AND_IMPORT_FIELD_MAP } from "@/models/export_and_import"
import { createTransaction } from "@/models/transactions"
import { Transaction } from "@/prisma/client"
import { parse } from "@fast-csv/parse"
import { Transaction } from "@prisma/client"
import { revalidatePath } from "next/cache"
export async function parseCSVAction(

View File

@@ -17,7 +17,7 @@ import { createField, deleteField, updateField } from "@/models/fields"
import { createProject, deleteProject, updateProject } from "@/models/projects"
import { SettingsMap, updateSettings } from "@/models/settings"
import { updateUser } from "@/models/users"
import { Prisma, User } from "@prisma/client"
import { Prisma, User } from "@/prisma/client"
import { revalidatePath } from "next/cache"
import { redirect } from "next/navigation"

View File

@@ -3,7 +3,7 @@ import { CrudTable } from "@/components/settings/crud"
import { getCurrentUser } from "@/lib/auth"
import { randomHexColor } from "@/lib/utils"
import { getCategories } from "@/models/categories"
import { Prisma } from "@prisma/client"
import { Prisma } from "@/prisma/client"
export default async function CategoriesSettingsPage() {
const user = await getCurrentUser()

View File

@@ -2,7 +2,7 @@
import { prisma } from "@/lib/db"
import { DEFAULT_CATEGORIES, DEFAULT_CURRENCIES, DEFAULT_FIELDS, DEFAULT_SETTINGS } from "@/models/defaults"
import { User } from "@prisma/client"
import { User } from "@/prisma/client"
import { redirect } from "next/navigation"
export async function resetLLMSettings(user: User) {

View File

@@ -2,7 +2,7 @@ import { addFieldAction, deleteFieldAction, editFieldAction } from "@/app/(app)/
import { CrudTable } from "@/components/settings/crud"
import { getCurrentUser } from "@/lib/auth"
import { getFields } from "@/models/fields"
import { Prisma } from "@prisma/client"
import { Prisma } from "@/prisma/client"
export default async function FieldsSettingsPage() {
const user = await getCurrentUser()

View File

@@ -3,7 +3,7 @@ import { CrudTable } from "@/components/settings/crud"
import { getCurrentUser } from "@/lib/auth"
import { randomHexColor } from "@/lib/utils"
import { getProjects } from "@/models/projects"
import { Prisma } from "@prisma/client"
import { Prisma } from "@/prisma/client"
export default async function ProjectsSettingsPage() {
const user = await getCurrentUser()

View File

@@ -20,7 +20,7 @@ import {
updateTransactionFiles,
} from "@/models/transactions"
import { updateUser } from "@/models/users"
import { Transaction } from "@prisma/client"
import { Transaction } from "@/prisma/client"
import { randomUUID } from "crypto"
import { mkdir, writeFile } from "fs/promises"
import { revalidatePath } from "next/cache"

View File

@@ -13,7 +13,7 @@ import { DEFAULT_PROMPT_ANALYSE_NEW_FILE } from "@/models/defaults"
import { deleteFile, getFileById, updateFile } from "@/models/files"
import { createTransaction, updateTransactionFiles } from "@/models/transactions"
import { updateUser } from "@/models/users"
import { Category, Field, File, Project, Transaction } from "@prisma/client"
import { Category, Field, File, Project, Transaction } from "@/prisma/client"
import { mkdir, rename } from "fs/promises"
import { revalidatePath } from "next/cache"
import path from "path"

View File

@@ -77,5 +77,3 @@ export default async function SelfHostedWelcomePage() {
</Card>
)
}
export const dynamic = "force-dynamic"

View File

@@ -2,7 +2,7 @@ import { Badge } from "@/components/ui/badge"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { formatCurrency } from "@/lib/utils"
import { ProjectStats } from "@/models/stats"
import { Project } from "@prisma/client"
import { Project } from "@/prisma/client"
import { Plus } from "lucide-react"
import Link from "next/link"

View File

@@ -1,7 +1,7 @@
"use client"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { File } from "@prisma/client"
import { File } from "@/prisma/client"
import { Cake, FilePlus } from "lucide-react"
import Link from "next/link"

View File

@@ -15,7 +15,7 @@ import {
} from "@/components/ui/dialog"
import { Separator } from "@/components/ui/separator"
import { useTransactionFilters } from "@/hooks/use-transaction-filters"
import { Category, Field, Project } from "@prisma/client"
import { Category, Field, Project } from "@/prisma/client"
import { formatDate } from "date-fns"
import { useRouter } from "next/navigation"
import { useState } from "react"

View File

@@ -1,7 +1,7 @@
"use client"
import { formatBytes } from "@/lib/utils"
import { File } from "@prisma/client"
import { File } from "@/prisma/client"
import Image from "next/image"
import Link from "next/link"
import { useState } from "react"

View File

@@ -1,6 +1,6 @@
"use client"
import { Category } from "@prisma/client"
import { Category } from "@/prisma/client"
import { SelectProps } from "@radix-ui/react-select"
import { useMemo } from "react"
import { FormSelect } from "./simple"

View File

@@ -1,4 +1,4 @@
import { Project } from "@prisma/client"
import { Project } from "@/prisma/client"
import { SelectProps } from "@radix-ui/react-select"
import { FormSelect } from "./simple"

View File

@@ -3,7 +3,7 @@
import { parseCSVAction, saveTransactionsAction } from "@/app/(app)/import/csv/actions"
import { FormError } from "@/components/forms/error"
import { Button } from "@/components/ui/button"
import { Field } from "@prisma/client"
import { Field } from "@/prisma/client"
import { Loader2, Play, Upload } from "lucide-react"
import { useRouter } from "next/navigation"
import { startTransition, useActionState, useEffect, useState } from "react"

View File

@@ -6,7 +6,7 @@ import { FormSelectCategory } from "@/components/forms/select-category"
import { FormSelectCurrency } from "@/components/forms/select-currency"
import { FormSelectType } from "@/components/forms/select-type"
import { Button } from "@/components/ui/button"
import { Category, Currency } from "@prisma/client"
import { Category, Currency } from "@/prisma/client"
import { CircleCheckBig } from "lucide-react"
import { useActionState } from "react"

View File

@@ -6,7 +6,7 @@ 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 { Field } from "@/prisma/client"
import { CircleCheckBig, Edit } from "lucide-react"
import Link from "next/link"
import { useActionState } from "react"

View File

@@ -4,7 +4,7 @@ import { saveProfileAction } from "@/app/(app)/settings/actions"
import { FormError } from "@/components/forms/error"
import { FormInput } from "@/components/forms/simple"
import { Button } from "@/components/ui/button"
import { User } from "@prisma/client"
import { User } from "@/prisma/client"
import { CircleCheckBig } from "lucide-react"
import { useActionState } from "react"
import { SubscriptionPlan } from "./subscription-plan"

View File

@@ -1,4 +1,4 @@
import { User } from "@prisma/client"
import { User } from "@/prisma/client"
import { PricingCard } from "@/components/auth/pricing-card"
import { Button } from "@/components/ui/button"

View File

@@ -8,7 +8,7 @@ import { FormSelectProject } from "@/components/forms/select-project"
import { FormSelectType } from "@/components/forms/select-type"
import { FormInput, FormTextarea } from "@/components/forms/simple"
import { Button } from "@/components/ui/button"
import { Category, Currency, Project } from "@prisma/client"
import { Category, Currency, Project } from "@/prisma/client"
import { format } from "date-fns"
import { Import, Loader2 } from "lucide-react"
import Link from "next/link"

View File

@@ -8,7 +8,7 @@ import { FormSelectProject } from "@/components/forms/select-project"
import { FormSelectType } from "@/components/forms/select-type"
import { FormInput, FormTextarea } from "@/components/forms/simple"
import { Button } from "@/components/ui/button"
import { Category, Currency, Field, Project, Transaction } from "@prisma/client"
import { Category, Currency, Field, Project, Transaction } from "@/prisma/client"
import { format } from "date-fns"
import { Loader2 } from "lucide-react"
import { useRouter } from "next/navigation"

View File

@@ -10,7 +10,7 @@ import {
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import { Field } from "@prisma/client"
import { Field } from "@/prisma/client"
import { ColumnsIcon } from "lucide-react"
import { useRouter } from "next/navigation"
import { useState } from "react"

View File

@@ -7,7 +7,7 @@ import { Input } from "@/components/ui/input"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { isFiltered, useTransactionFilters } from "@/hooks/use-transaction-filters"
import { TransactionFilters } from "@/models/transactions"
import { Category, Field, Project } from "@prisma/client"
import { Category, Field, Project } from "@/prisma/client"
import { X } from "lucide-react"
export function TransactionSearchAndFilters({

View File

@@ -6,7 +6,7 @@ import { Checkbox } from "@/components/ui/checkbox"
import { Table, TableBody, TableCell, TableFooter, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { calcTotalPerCurrency } from "@/lib/stats"
import { cn, formatCurrency } from "@/lib/utils"
import { Category, Field, Project, Transaction } from "@prisma/client"
import { Category, Field, Project, Transaction } from "@/prisma/client"
import { formatDate } from "date-fns"
import { ArrowDownIcon, ArrowUpIcon, File } from "lucide-react"
import { useRouter, useSearchParams } from "next/navigation"

View File

@@ -5,7 +5,7 @@ import { FilePreview } from "@/components/files/preview"
import { Button } from "@/components/ui/button"
import { Card } from "@/components/ui/card"
import config from "@/lib/config"
import { File, Transaction } from "@prisma/client"
import { File, Transaction } from "@/prisma/client"
import { Loader2, Upload, X } from "lucide-react"
import { useState } from "react"

View File

@@ -10,7 +10,7 @@ import { FormSelectProject } from "@/components/forms/select-project"
import { FormSelectType } from "@/components/forms/select-type"
import { FormInput, FormTextarea } from "@/components/forms/simple"
import { Button } from "@/components/ui/button"
import { Category, Currency, Field, File, Project } from "@prisma/client"
import { Category, Currency, Field, File, Project } from "@/prisma/client"
import { format } from "date-fns"
import { Brain, Loader2 } from "lucide-react"
import { startTransition, useActionState, useMemo, useState } from "react"

View File

@@ -1,6 +1,6 @@
import config from "@/lib/config"
import { getSelfHostedUser, getUserByEmail, getUserById, SELF_HOSTED_USER } from "@/models/users"
import { User } from "@prisma/client"
import { User } from "@/prisma/client"
import { betterAuth } from "better-auth"
import { prismaAdapter } from "better-auth/adapters/prisma"
import { APIError } from "better-auth/api"

View File

@@ -1,4 +1,4 @@
import { PrismaClient } from "@prisma/client"
import { PrismaClient } from "@/prisma/client"
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined

View File

@@ -1,4 +1,4 @@
import { File, Transaction, User } from "@prisma/client"
import { File, Transaction, User } from "@/prisma/client"
import { access, constants, readdir, stat } from "fs/promises"
import path from "path"
import config from "./config"

View File

@@ -1,6 +1,6 @@
import { resizeImage } from "@/lib/previews/images"
import { pdfToImages } from "@/lib/previews/pdf"
import { User } from "@prisma/client"
import { User } from "@/prisma/client"
export async function generateFilePreviews(
user: User,

View File

@@ -1,7 +1,7 @@
"use server"
import { fileExists, getUserPreviewsDirectory } from "@/lib/files"
import { User } from "@prisma/client"
import { User } from "@/prisma/client"
import fs from "fs/promises"
import path from "path"
import sharp from "sharp"

View File

@@ -1,7 +1,7 @@
"use server"
import { fileExists, getUserPreviewsDirectory } from "@/lib/files"
import { User } from "@prisma/client"
import { User } from "@/prisma/client"
import fs from "fs/promises"
import path from "path"
import { fromPath } from "pdf2pic"

View File

@@ -1,14 +1,17 @@
import { Transaction } from "@prisma/client"
import { Transaction } from "@/prisma/client"
export function calcTotalPerCurrency(transactions: Transaction[]): Record<string, number> {
return transactions.reduce((acc, transaction) => {
if (transaction.convertedCurrencyCode) {
acc[transaction.convertedCurrencyCode.toUpperCase()] =
(acc[transaction.convertedCurrencyCode.toUpperCase()] || 0) + (transaction.convertedTotal || 0)
} else if (transaction.currencyCode) {
acc[transaction.currencyCode.toUpperCase()] =
(acc[transaction.currencyCode.toUpperCase()] || 0) + (transaction.total || 0)
}
return acc
}, {} as Record<string, number>)
return transactions.reduce(
(acc, transaction) => {
if (transaction.convertedCurrencyCode) {
acc[transaction.convertedCurrencyCode.toUpperCase()] =
(acc[transaction.convertedCurrencyCode.toUpperCase()] || 0) + (transaction.convertedTotal || 0)
} else if (transaction.currencyCode) {
acc[transaction.currencyCode.toUpperCase()] =
(acc[transaction.currencyCode.toUpperCase()] || 0) + (transaction.total || 0)
}
return acc
},
{} as Record<string, number>
)
}

View File

@@ -1,6 +1,6 @@
import { prisma } from "@/lib/db"
import { codeFromName } from "@/lib/utils"
import { Prisma } from "@prisma/client"
import { Prisma } from "@/prisma/client"
import { cache } from "react"
export type CategoryData = {

View File

@@ -1,5 +1,5 @@
import { prisma } from "@/lib/db"
import { Prisma } from "@prisma/client"
import { Prisma } from "@/prisma/client"
import { cache } from "react"
export const getCurrencies = cache(async (userId: string) => {

View File

@@ -1,6 +1,6 @@
import { prisma } from "@/lib/db"
import { codeFromName } from "@/lib/utils"
import { Prisma } from "@prisma/client"
import { Prisma } from "@/prisma/client"
import { cache } from "react"
export type FieldData = {

View File

@@ -1,6 +1,6 @@
import { prisma } from "@/lib/db"
import { codeFromName } from "@/lib/utils"
import { Prisma } from "@prisma/client"
import { Prisma } from "@/prisma/client"
import { cache } from "react"
export type ProjectData = {

View File

@@ -1,6 +1,6 @@
import { prisma } from "@/lib/db"
import { calcTotalPerCurrency } from "@/lib/stats"
import { Prisma } from "@prisma/client"
import { Prisma } from "@/prisma/client"
import { cache } from "react"
import { TransactionFilters } from "./transactions"

View File

@@ -1,5 +1,5 @@
import { prisma } from "@/lib/db"
import { Field, Prisma, Transaction } from "@prisma/client"
import { Field, Prisma, Transaction } from "@/prisma/client"
import { cache } from "react"
import { getFields } from "./fields"
import { deleteFile } from "./files"

View File

@@ -1,5 +1,5 @@
import { prisma } from "@/lib/db"
import { Prisma } from "@prisma/client"
import { Prisma } from "@/prisma/client"
import { cache } from "react"
export const SELF_HOSTED_USER = {

View File

@@ -6,7 +6,7 @@
"scripts": {
"dev": "next dev -p 7331 --turbopack",
"build": "next build",
"start": "prisma migrate deploy && next start",
"start": "prisma generate && prisma migrate deploy && next start",
"lint": "next lint"
},
"dependencies": {

View File

@@ -3,6 +3,7 @@
generator client {
provider = "prisma-client-js"
output = "client"
}
datasource db {