lms/app/Services/SettingsService.php
2025-12-15 12:26:23 +01:00

511 lines
18 KiB
PHP

<?php
namespace App\Services;
use App\Models\Footer;
use App\Models\FooterItem;
use App\Models\Navbar;
use App\Models\NavbarItem;
use App\Models\Page;
use App\Models\Setting;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
class SettingsService extends MediaService
{
public function getSetting(array $params)
{
return DB::transaction(function () use ($params) {
$settings = Setting::when(array_key_exists('type', $params), function ($query) use ($params) {
return $query->where('type', $params['type']);
})
->when(array_key_exists('sub_type', $params), function ($query) use ($params) {
return $query->where('sub_type', $params['sub_type']);
})
->first();
return $settings;
}, 5);
}
public function getSettings(array $params)
{
return DB::transaction(function () use ($params) {
$settings = Setting::when(array_key_exists('type', $params), function ($query) use ($params) {
return $query->where('type', $params['type']);
})
->when(array_key_exists('sub_type', $params), function ($query) use ($params) {
return $query->where('sub_type', $params['sub_type']);
})
->get();
return $settings;
}, 5);
}
public function systemUpdate(array $data, string $id)
{
return DB::transaction(function () use ($data, $id) {
$setting = Setting::find($id);
if (array_key_exists('new_logo_dark', $data) && $data['new_logo_dark']) {
$data['logo_dark'] = $this->addNewDeletePrev($setting, $data['new_logo_dark'], "logo_dark");
}
if (array_key_exists('new_logo_light', $data) && $data['new_logo_light']) {
$data['logo_light'] = $this->addNewDeletePrev($setting, $data['new_logo_light'], "logo_light");
}
if (array_key_exists('new_favicon', $data) && $data['new_favicon']) {
$data['favicon'] = $this->addNewDeletePrev($setting, $data['new_favicon'], "favicon");
}
if (array_key_exists('new_banner', $data) && $data['new_banner']) {
$data['banner'] = $this->addNewDeletePrev($setting, $data['new_banner'], "banner");
}
// Remove multiple fields at once
$filteredData = Arr::except($data, [
'new_logo',
'new_favicon',
'new_banner'
]);
$setting->update(['fields' => $filteredData]);
return $setting;
}, 5);
}
public function paymentUpdate(array $data, string $id)
{
return DB::transaction(function () use ($data, $id) {
return Setting::find($id)->update(['fields' => $data]);
}, 5);
}
public function smtpUpdate(array $data, string $id)
{
return DB::transaction(function () use ($data, $id) {
testSmtpConnection($data);
return Setting::find($id)->update(['fields' => $data]);
}, 5);
}
public function storageUpdate(array $data, string $id)
{
return DB::transaction(function () use ($data, $id) {
return Setting::find($id)->update(['fields' => $data]);
}, 5);
}
public function authUpdate(array $data, string $id)
{
return DB::transaction(function () use ($data, $id) {
return Setting::find($id)->update(['fields' => $data]);
}, 5);
}
public function zoomConfigUpdate(array $data, string $id)
{
return DB::transaction(function () use ($data, $id) {
return Setting::find($id)->update(['fields' => $data]);
}, 5);
}
public function homePagesSelect(array $data, string $id)
{
return DB::transaction(function () use ($data, $id) {
return Setting::find($id)->update(['fields' => $data]);
}, 5);
}
public function customPagesCreate(array $data)
{
return DB::transaction(function () use ($data) {
return Page::create($data);
}, 5);
}
public function customPagesUpdate(array $data, string $id)
{
return DB::transaction(function () use ($data, $id) {
return Page::find($id)->update($data);
}, 5);
}
public function customPagesDestroy(string $id)
{
return DB::transaction(function () use ($id) {
return Page::find($id)->delete();
}, 5);
}
public function getNavbar(string $slug)
{
return DB::transaction(function () use ($slug) {
return Navbar::where('slug', $slug)
->where('active', true)
->with('navbarItems')
->first();
}, 5);
}
public function getFooter(string $slug)
{
return DB::transaction(function () use ($slug) {
return Footer::where('slug', $slug)
->where('active', true)
->with('footerItems')
->first();
}, 5);
}
/**
* Create a new navbar item.
*/
public function createNavbarItem(Navbar $navbar, array $data)
{
return DB::transaction(function () use ($navbar, $data) {
// Handle different types of navbar items
if ($data['type'] === 'dropdown') {
// For dropdown items, filter out empty items and keep as array (Laravel will auto-convert to JSON)
if (isset($data['items']) && is_array($data['items']) && !empty($data['items'])) {
// Filter out empty items
$filteredItems = array_filter($data['items'], function ($item) {
return !empty($item['title']) && !empty($item['url']);
});
$data['items'] = array_values($filteredItems);
} else {
$data['items'] = [];
}
$data['value'] = null; // Dropdowns don't use value field
} elseif ($data['type'] === 'action') {
// For action types, clear both value and items fields
$data['value'] = null;
$data['items'] = null;
} else {
// For URL types, clear items field
$data['items'] = null;
}
$navbarItem = NavbarItem::create([
'navbar_id' => $navbar->id,
...$data,
]);
return $navbarItem;
}, 5);
}
/**
* Update a navbar item.
*/
public function updateNavbarItem(NavbarItem $item, array $data)
{
return DB::transaction(function () use ($item, $data) {
// Handle different types of navbar items
if ($data['type'] === 'dropdown') {
// For dropdown items, filter out empty items and keep as array (Laravel will auto-convert to JSON)
if (isset($data['items']) && is_array($data['items']) && !empty($data['items'])) {
// Filter out empty items
$filteredItems = array_filter($data['items'], function ($item) {
return !empty($item['title']) && !empty($item['url']);
});
$data['items'] = array_values($filteredItems);
} else {
$data['items'] = [];
}
$data['value'] = null; // Dropdowns don't use value field
} elseif ($data['type'] === 'action') {
// For action types, clear both value and items fields
$data['value'] = null;
$data['items'] = null;
} else {
// For URL types, clear items field
$data['items'] = null;
}
$item->update($data);
return $item->fresh();
}, 5);
}
/**
* Delete a navbar item.
*/
public function deleteNavbarItem(NavbarItem $item)
{
return DB::transaction(function () use ($item) {
return $item->delete();
}, 5);
}
/**
* Reorder navbar items.
*/
public function reorderNavbarItems(array $sortedData)
{
foreach ($sortedData as $value) {
NavbarItem::where('id', $value['id'])->update([
'sort' => $value['sort']
]);
}
}
/**
* Move a navbar item up or down.
*/
public function moveNavbarItem(NavbarItem $item, string $direction)
{
return DB::transaction(function () use ($item, $direction) {
$currentSort = $item->sort;
$navbar = $item->navbar;
if ($direction === 'up') {
// Find the item with the next lower sort value
$targetItem = NavbarItem::where('navbar_id', $navbar->id)
->where('sort', '<', $currentSort)
->orderBy('sort', 'desc')
->first();
} else { // down
// Find the item with the next higher sort value
$targetItem = NavbarItem::where('navbar_id', $navbar->id)
->where('sort', '>', $currentSort)
->orderBy('sort', 'asc')
->first();
}
if ($targetItem) {
// Swap the sort values
$targetSort = $targetItem->sort;
$targetItem->update(['sort' => $currentSort]);
$item->update(['sort' => $targetSort]);
}
return true;
}, 5);
}
/**
* Get navbar with items, optionally filtered by type.
*/
public function getNavbarWithItems(string $slug, ?string $type = null)
{
return DB::transaction(function () use ($slug, $type) {
$query = Navbar::where('slug', $slug)
->where('active', true)
->with(['navbarItems' => function ($query) use ($type) {
$query->where('active', true)
->when($type, function ($q) use ($type) {
return $q->where('type', $type);
})
->orderBy('sort', 'asc');
}]);
return $query->first();
}, 5);
}
/**
* Toggle navbar item active status.
*/
public function toggleNavbarItemStatus(NavbarItem $item)
{
return DB::transaction(function () use ($item) {
$item->update(['active' => !$item->active]);
return $item->fresh();
}, 5);
}
/**
* Duplicate a navbar item.
*/
public function duplicateNavbarItem(NavbarItem $item)
{
return DB::transaction(function () use ($item) {
$maxSort = NavbarItem::where('navbar_id', $item->navbar_id)->max('sort');
return NavbarItem::create([
'navbar_id' => $item->navbar_id,
'type' => $item->type,
'slug' => $item->slug . '_copy',
'title' => $item->title . ' (Copy)',
'value' => $item->value,
'items' => $item->items,
'sort' => $maxSort + 1,
'active' => true,
]);
}, 5);
}
/**
* Create a new footer item.
*/
public function createFooterItem(Footer $footer, array $data)
{
return DB::transaction(function () use ($footer, $data) {
// Handle different types of footer items
if ($data['type'] === 'list') {
// For list items, filter out empty items and keep as array (Laravel will auto-convert to JSON)
if (isset($data['items']) && is_array($data['items']) && !empty($data['items'])) {
// Filter out empty items
$filteredItems = array_filter($data['items'], function ($item) {
return !empty($item['title']) && (!isset($item['url']) || !empty($item['url']));
});
$data['items'] = array_values($filteredItems);
} else {
$data['items'] = [];
}
} elseif ($data['type'] === 'social_media') {
// For social media items, ensure icon and url are provided
if (isset($data['items']) && is_array($data['items']) && !empty($data['items'])) {
$filteredItems = array_filter($data['items'], function ($item) {
return !empty($item['title']) && !empty($item['url']) && !empty($item['icon']);
});
$data['items'] = array_values($filteredItems);
} else {
$data['items'] = [];
}
} elseif ($data['type'] === 'payment_methods') {
// For payment methods, ensure image is provided
if (isset($data['items']) && is_array($data['items']) && !empty($data['items'])) {
$filteredItems = array_filter($data['items'], function ($item) {
return !empty($item['image']);
});
$data['items'] = array_values($filteredItems);
} else {
$data['items'] = [];
}
} elseif ($data['type'] === 'copyright') {
// For copyright type, clear items field
$data['items'] = [];
} else {
// For other types, keep items as is or empty array
if (!isset($data['items']) || !is_array($data['items'])) {
$data['items'] = [];
}
}
$footerItem = FooterItem::create([
'footer_id' => $footer->id,
...$data,
]);
return $footerItem;
}, 5);
}
/**
* Update an existing footer item.
*/
public function updateFooterItem(FooterItem $item, array $data)
{
return DB::transaction(function () use ($item, $data) {
// Handle different types of footer items
if ($data['type'] === 'list') {
// For list items, filter out empty items and keep as array (Laravel will auto-convert to JSON)
if (isset($data['items']) && is_array($data['items']) && !empty($data['items'])) {
// Filter out empty items
$filteredItems = array_filter($data['items'], function ($item) {
return !empty($item['title']) && (!isset($item['url']) || !empty($item['url']));
});
$data['items'] = array_values($filteredItems);
} else {
$data['items'] = [];
}
} elseif ($data['type'] === 'social_media') {
// For social media items, ensure icon and url are provided
if (isset($data['items']) && is_array($data['items']) && !empty($data['items'])) {
$filteredItems = array_filter($data['items'], function ($item) {
return !empty($item['title']) && !empty($item['url']) && !empty($item['icon']);
});
$data['items'] = array_values($filteredItems);
} else {
$data['items'] = [];
}
} elseif ($data['type'] === 'payment_methods') {
// For payment methods, ensure image is provided
if (isset($data['items']) && is_array($data['items']) && !empty($data['items'])) {
$filteredItems = array_filter($data['items'], function ($item) {
return !empty($item['image']);
});
$data['items'] = array_values($filteredItems);
} else {
$data['items'] = [];
}
} elseif ($data['type'] === 'copyright') {
// For copyright type, clear items field
$data['items'] = [];
} else {
// For other types, keep items as is or empty array
if (!isset($data['items']) || !is_array($data['items'])) {
$data['items'] = [];
}
}
$item->update($data);
return $item->fresh();
}, 5);
}
/**
* Delete a footer item.
*/
public function deleteFooterItem(FooterItem $item)
{
return DB::transaction(function () use ($item) {
return $item->delete();
}, 5);
}
/**
* Reorder footer items.
*/
public function reorderFooterItems(array $sortedData)
{
return DB::transaction(function () use ($sortedData) {
foreach ($sortedData as $itemData) {
FooterItem::where('id', $itemData['id'])->update([
'sort' => $itemData['sort']
]);
}
}, 5);
}
/**
* Get footer with items, optionally filtered by type.
*/
public function getFooterWithItems(string $slug, ?string $type = null)
{
return DB::transaction(function () use ($slug, $type) {
$query = Footer::where('slug', $slug)
->where('active', true)
->with(['footerItems' => function ($query) use ($type) {
$query->where('active', true)
->when($type, function ($q) use ($type) {
return $q->where('type', $type);
})
->orderBy('sort', 'asc');
}]);
return $query->first();
}, 5);
}
/**
* Toggle footer item active status.
*/
public function toggleFooterItemStatus(FooterItem $item)
{
return DB::transaction(function () use ($item) {
$item->update(['active' => !$item->active]);
return $item->fresh();
}, 5);
}
}