has('search')) { $search = $request->get('search'); $query->where(function ($q) use ($search) { $q->where('key', 'like', "%{$search}%") ->orWhereRaw("JSON_SEARCH(translations, 'one', ?, NULL, '$[*]') IS NOT NULL", ["%{$search}%"]); }); } // Sorting $sortField = $request->get('sort', 'id'); $sortOrder = $request->get('order', 'desc'); $query->orderBy($sortField, $sortOrder); // Pagination $page = $request->get('page', 1); $pageSize = $request->get('pageSize', 20); $totalCount = $query->count(); $items = $query->skip(($page - 1) * $pageSize)->take($pageSize)->get(); // Format data for DataGrid $data = $items->map(function ($item) { $formatted = [ 'id' => $item->id, 'key' => $item->key, 'hash' => $item->hash, 'created_at' => $item->created_at?->toDateTimeString(), 'updated_at' => $item->updated_at?->toDateTimeString(), ]; // Add translation fields for each active language $languages = Language::where('is_active', true)->get(); $translations = $item->translations ?? []; foreach ($languages as $language) { $formatted[$language->code] = $translations[$language->code] ?? ''; } return $formatted; }); return response()->json([ 'data' => $data, 'totalCount' => $totalCount, ]); } /** * Store a newly created resource in storage. */ public function store(Request $request): JsonResponse { $validator = Validator::make($request->all(), [ 'key' => 'required|string|max:500', ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'errors' => $validator->errors(), ], 422); } $hash = md5($request->key); // Check if translation already exists $exists = SiteTranslation::where('hash', $hash)->first(); if ($exists) { return response()->json([ 'success' => false, 'message' => 'Bu key zaten mevcut.', ], 409); } $languages = Language::where('is_active', true)->get(); $translations = []; foreach ($languages as $language) { if ($request->has($language->code)) { $translations[$language->code] = $request->get($language->code, ''); } } $translation = SiteTranslation::create([ 'hash' => $hash, 'key' => $request->key, 'translations' => $translations, ]); Cache::forget("site_translation_{$hash}"); return response()->json([ 'success' => true, 'data' => $translation->load('translations'), 'message' => 'Çeviri başarıyla oluşturuldu.', ], 201); } /** * Update the specified resource in storage. */ public function update(Request $request, $id): JsonResponse { $translation = SiteTranslation::findOrFail($id); $validator = Validator::make($request->all(), [ 'key' => 'sometimes|required|string|max:500', ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'errors' => $validator->errors(), ], 422); } $languages = Language::where('is_active', true)->get(); $translations = $translation->translations ?? []; // Update translations foreach ($languages as $language) { if ($request->has($language->code)) { $translations[$language->code] = $request->get($language->code, ''); } } // Update key if provided if ($request->has('key') && $request->key !== $translation->key) { $translation->key = $request->key; $translation->hash = md5($request->key); } $translation->translations = $translations; $translation->save(); Cache::forget("site_translation_{$translation->hash}"); return response()->json([ 'success' => true, 'data' => $translation->fresh(), 'message' => 'Çeviri başarıyla güncellendi.', ]); } /** * Batch update multiple resources. */ public function batchUpdate(Request $request): JsonResponse { $validator = Validator::make($request->all(), [ 'changes' => 'required|array', ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'errors' => $validator->fails(), ], 422); } $changes = $request->get('changes', []); $updated = []; $errors = []; foreach ($changes as $change) { try { // ID can be in 'key' field (integer) or directly in 'key' field $id = is_numeric($change['key'] ?? null) ? (int)$change['key'] : ($change['key']['id'] ?? null); if (!$id) { $errors[] = 'ID bulunamadı.'; continue; } $translation = SiteTranslation::find($id); if (!$translation) { $errors[] = "ID {$id} için kayıt bulunamadı."; continue; } $data = $change['data'] ?? []; $languages = Language::where('is_active', true)->get(); $translations = $translation->translations ?? []; // Update translations foreach ($languages as $language) { if (isset($data[$language->code])) { $translations[$language->code] = $data[$language->code]; } } // Update key if provided if (isset($data['key']) && $data['key'] !== $translation->key) { $translation->key = $data['key']; $translation->hash = md5($data['key']); } $translation->translations = $translations; $translation->save(); Cache::forget("site_translation_{$translation->hash}"); $updated[] = $translation->id; } catch (\Exception $e) { $id = is_numeric($change['key'] ?? null) ? (int)$change['key'] : ($change['key']['id'] ?? 'unknown'); $errors[] = "ID {$id} için hata: " . $e->getMessage(); } } return response()->json([ 'success' => count($errors) === 0, 'updated' => $updated, 'errors' => $errors, 'message' => count($updated) . ' kayıt güncellendi.', ]); } /** * Remove the specified resource from storage. */ public function destroy($id): JsonResponse { $translation = SiteTranslation::findOrFail($id); $hash = $translation->hash; $translation->delete(); Cache::forget("site_translation_{$hash}"); return response()->json([ 'success' => true, 'message' => 'Çeviri başarıyla silindi.', ]); } /** * Batch delete multiple resources. */ public function batchDestroy(Request $request): JsonResponse { $validator = Validator::make($request->all(), [ 'ids' => 'required|array', 'ids.*' => 'required|integer|exists:site_translations,id', ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'errors' => $validator->errors(), ], 422); } $ids = $request->get('ids', []); $translations = SiteTranslation::whereIn('id', $ids)->get(); foreach ($translations as $translation) { Cache::forget("site_translation_{$translation->hash}"); } SiteTranslation::whereIn('id', $ids)->delete(); return response()->json([ 'success' => true, 'message' => count($ids) . ' kayıt başarıyla silindi.', ]); } }