Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions app/Http/Controllers/Master/ArtikelKabupatenController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

namespace App\Http\Controllers\Master;

use App\Http\Controllers\Controller;
use Illuminate\View\View;

class ArtikelKabupatenController extends Controller
{
protected $permission = 'master-data-artikel';

/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$listPermission = $this->generateListPermission();
$clearCache = request('clear_cache', false);
if ($clearCache) {
(new \App\Services\ArtikelService)->clearCache('artikel', ['filter[id]' => $clearCache]);
}

return view('master.artikel.index')->with($listPermission);
}

/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create(): View
{
return view('master.artikel.create');
}

/**
* Show the form for editing the specified resource.
*
* @param int $id
*
* @return \Illuminate\Http\Response
*/
public function edit($id): View
{
return view('master.artikel.edit', compact('id'));
}
}
51 changes: 51 additions & 0 deletions app/Http/Controllers/Master/ArtikelUploadController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

namespace App\Http\Controllers\Master;

use App\Http\Controllers\AppBaseController;
use App\Traits\UploadedFile;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class ArtikelUploadController extends AppBaseController
{
use UploadedFile;

public function __construct()
{
$this->pathFolder = 'uploads/artikel';
}

/**
* Upload gambar artikel
*/
public function uploadGambar(Request $request)
{
try {
$request->validate([
'file' => 'required|image|mimes:jpg,jpeg,png,gif|max:2048',
]);

if ($request->file('file')) {
$path = $this->uploadFile($request, 'file');
$url = Storage::url($path);

return response()->json([
'success' => true,
'url' => $url,
'path' => $path,
], 200);
}

return response()->json([
'success' => false,
'message' => 'File tidak ditemukan',
], 400);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Upload gagal: ' . $e->getMessage(),
], 500);
}
}
}
48 changes: 48 additions & 0 deletions app/Services/ArtikelService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

namespace App\Services;

use Illuminate\Support\Facades\Cache;

class ArtikelService extends BaseApiService
{
protected int $cacheTtl = 3600; // TTL dalam detik (1 jam)

public function artikel(array $filters = [])
{
$cacheKey = $this->buildCacheKey('artikel', $filters);

// Ambil dari cache dulu
return Cache::remember($cacheKey, $this->cacheTtl, function () use ($filters) {
$data = $this->apiRequest('/api/v1/artikel', $filters);
if (! $data) {
return collect([]);
}

return collect($data)->map(fn ($item) => (object) $item['attributes']);
});
}

public function artikelById(int $id)
{
$cacheKey = "artikel_$id";

return Cache::remember($cacheKey, $this->cacheTtl, function () use ($id) {
$data = $this->apiRequest('/api/v1/artikel/tampil', [
'id' => $id,
]);

if (is_array($data) && isset($data['data'])) {
return (object) $data['data'];
}

return null;
});
}

public function clearCache(string $prefix = 'artikel', array $filters = [])
{
$cacheKey = $this->buildCacheKey($prefix, $filters);
Cache::forget($cacheKey);
}
}
1 change: 1 addition & 0 deletions catatan_rilis.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ Di rilis ini, versi 2512.0.1 berisi penambahan dan perbaikan yang diminta penggu

#### Penambahan Fitur

1. [#872](https://github.com/OpenSID/OpenKab/issues/872) Penambahan modul artikel OpenSID.

#### Perbaikan BUG

Expand Down
114 changes: 114 additions & 0 deletions database/migrations/2025_12_09_101721_add_menu_artikel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<?php

use App\Models\Team;
use Illuminate\Database\Migrations\Migration;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// Update menu untuk semua team yang ada
$teams = Team::all();

foreach ($teams as $team) {
$menu = $team->menu;

// Cari menu "Pengaturan OpenSID"
foreach ($menu as $key => $menuItem) {
if ($menuItem['text'] === 'Pengaturan OpenSID') {
// Cari posisi "Kategori Artikel"
$submenu = $menuItem['submenu'];
$kategoriIndex = null;

foreach ($submenu as $index => $sub) {
if ($sub['text'] === 'Kategori Artikel') {
$kategoriIndex = $index;
break;
}
}

// Jika Kategori Artikel ditemukan, tambahkan Artikel setelahnya
if ($kategoriIndex !== null) {
$newSubmenu = [
'icon' => 'far fa-fw fa-circle',
'text' => 'Artikel',
'url' => 'master/artikel',
'permission' => 'master-data-artikel',
];

// Insert setelah Kategori Artikel
array_splice($submenu, $kategoriIndex + 1, 0, [$newSubmenu]);
$menu[$key]['submenu'] = $submenu;
}

break;
}
}

// Update menu team
$team->update(['menu' => $menu]);
}

// Tidak perlu membuat permission baru karena sudah ada 'master-data-artikel'
// Permission ini sudah digunakan untuk kategori artikel

// Sync permission ke role yang sudah ada
$roles = Role::all();
foreach ($roles as $role) {
// Pastikan role punya permission master-data-artikel
if (!$role->hasPermissionTo('master-data-artikel-read')) {
$permissions = [
'master-data-artikel-read',
'master-data-artikel-write',
'master-data-artikel-edit',
'master-data-artikel-delete',
];

foreach ($permissions as $permissionName) {
$permission = Permission::where('name', $permissionName)->first();
if ($permission && !$role->hasPermissionTo($permission)) {
$role->givePermissionTo($permission);
}
}
}
}
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// Remove menu artikel dari semua team
$teams = Team::all();

foreach ($teams as $team) {
$menu = $team->menu;

foreach ($menu as $key => $menuItem) {
if ($menuItem['text'] === 'Pengaturan OpenSID') {
$submenu = $menuItem['submenu'];

// Hapus menu Artikel
$submenu = array_filter($submenu, function($sub) {
return $sub['text'] !== 'Artikel';
});

$menu[$key]['submenu'] = array_values($submenu);
break;
}
}

$team->update(['menu' => $menu]);
}
}
};
Loading