fix(docker): ensure prisma generate runs on build and add explicit admin model types

This commit is contained in:
mstfyldz
2026-08-23 02:00:31 +03:00
parent 99951328ed
commit 5d57a6ef0b
5 changed files with 11 additions and 4 deletions
+4
View File
@@ -8,6 +8,7 @@ WORKDIR /app
# Install dependencies # Install dependencies
COPY package.json package-lock.json* ./ COPY package.json package-lock.json* ./
COPY prisma ./prisma/
RUN npm ci --legacy-peer-deps RUN npm ci --legacy-peer-deps
@@ -17,6 +18,9 @@ WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules COPY --from=deps /app/node_modules ./node_modules
COPY . . COPY . .
# Generate Prisma Client
RUN npx prisma generate
# Environment variables must be present at build time for Next.js # Environment variables must be present at build time for Next.js
ENV NEXT_TELEMETRY_DISABLED=1 ENV NEXT_TELEMETRY_DISABLED=1
+2 -1
View File
@@ -4,6 +4,7 @@ import { redirect } from 'next/navigation';
import { Trash2, CheckCircle } from 'lucide-react'; import { Trash2, CheckCircle } from 'lucide-react';
import { deleteContact, markContactAsRead } from '../actions'; import { deleteContact, markContactAsRead } from '../actions';
import { revalidatePath } from 'next/cache'; import { revalidatePath } from 'next/cache';
import type { ContactMessage } from '@prisma/client';
export default async function ContactAdminPage() { export default async function ContactAdminPage() {
const session = await getSession(); const session = await getSession();
@@ -31,7 +32,7 @@ export default async function ContactAdminPage() {
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{messages.map(msg => ( {messages.map((msg: ContactMessage) => (
<tr key={msg.id} className="border-b border-slate-200 dark:border-slate-800 hover:bg-slate-50 dark:hover:bg-slate-800/50"> <tr key={msg.id} className="border-b border-slate-200 dark:border-slate-800 hover:bg-slate-50 dark:hover:bg-slate-800/50">
<td className="p-4 text-sm">{msg.createdAt.toLocaleDateString('tr-TR')}</td> <td className="p-4 text-sm">{msg.createdAt.toLocaleDateString('tr-TR')}</td>
<td className="p-4 text-sm font-medium">{msg.name}</td> <td className="p-4 text-sm font-medium">{msg.name}</td>
+2 -1
View File
@@ -4,6 +4,7 @@ import { redirect } from 'next/navigation';
import { Trash2, Plus } from 'lucide-react'; import { Trash2, Plus } from 'lucide-react';
import { addGalleryItem, deleteGalleryItem } from '../actions'; import { addGalleryItem, deleteGalleryItem } from '../actions';
import { revalidatePath } from 'next/cache'; import { revalidatePath } from 'next/cache';
import type { Gallery } from '@prisma/client';
export default async function GalleryAdminPage() { export default async function GalleryAdminPage() {
const session = await getSession(); const session = await getSession();
@@ -61,7 +62,7 @@ export default async function GalleryAdminPage() {
<h2 className="text-xl font-bold mb-6">Mevcut Resimler ({galleryItems.length})</h2> <h2 className="text-xl font-bold mb-6">Mevcut Resimler ({galleryItems.length})</h2>
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4"> <div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
{galleryItems.map(item => ( {galleryItems.map((item: Gallery) => (
<div key={item.id} className="group relative rounded-xl overflow-hidden border border-slate-200 dark:border-slate-700 bg-slate-50 dark:bg-slate-800"> <div key={item.id} className="group relative rounded-xl overflow-hidden border border-slate-200 dark:border-slate-700 bg-slate-50 dark:bg-slate-800">
<div className="aspect-video w-full overflow-hidden bg-slate-200 dark:bg-slate-700"> <div className="aspect-video w-full overflow-hidden bg-slate-200 dark:bg-slate-700">
{/* eslint-disable-next-line @next/next/no-img-element */} {/* eslint-disable-next-line @next/next/no-img-element */}
+2 -1
View File
@@ -4,6 +4,7 @@ import { redirect } from 'next/navigation';
import { Trash2, Plus, Briefcase } from 'lucide-react'; import { Trash2, Plus, Briefcase } from 'lucide-react';
import { addServiceItem, deleteServiceItem } from '../actions'; import { addServiceItem, deleteServiceItem } from '../actions';
import { revalidatePath } from 'next/cache'; import { revalidatePath } from 'next/cache';
import type { Service } from '@prisma/client';
export default async function ServicesAdminPage() { export default async function ServicesAdminPage() {
const session = await getSession(); const session = await getSession();
@@ -61,7 +62,7 @@ export default async function ServicesAdminPage() {
<h2 className="text-xl font-bold mb-6">Mevcut Hizmetler ({services.length})</h2> <h2 className="text-xl font-bold mb-6">Mevcut Hizmetler ({services.length})</h2>
<div className="space-y-4"> <div className="space-y-4">
{services.map(item => ( {services.map((item: Service) => (
<div key={item.id} className="group relative flex items-start space-x-4 p-4 rounded-xl border border-slate-200 dark:border-slate-700 bg-slate-50 dark:bg-slate-800"> <div key={item.id} className="group relative flex items-start space-x-4 p-4 rounded-xl border border-slate-200 dark:border-slate-700 bg-slate-50 dark:bg-slate-800">
<div className="flex-shrink-0 p-3 bg-white dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-700"> <div className="flex-shrink-0 p-3 bg-white dark:bg-slate-900 rounded-lg border border-slate-200 dark:border-slate-700">
{item.iconUrl ? ( {item.iconUrl ? (
+1 -1
View File
@@ -4,7 +4,7 @@
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
"build": "next build", "build": "prisma generate && next build",
"start": "next start", "start": "next start",
"lint": "eslint" "lint": "eslint"
}, },