big update base struktur tahap 1

This commit is contained in:
Wian Drs
2026-07-27 16:24:09 +07:00
parent 2b3592c4c2
commit 1dd02baa72
169 changed files with 24405 additions and 977 deletions
@@ -22,8 +22,9 @@ class AuditLogController extends ApiController
$request->validated()
);
return $this->success(
AuditLogResource::collection($data),
return $this->successPaginated(
$data,
AuditLogResource::class,
'Data audit log berhasil diambil'
);
}
@@ -37,4 +38,4 @@ class AuditLogController extends ApiController
'Detail audit log berhasil diambil'
);
}
}
}
+102 -8
View File
@@ -2,37 +2,131 @@
namespace App\Http\Controllers;
use App\Http\Requests\Auth\RegisterRequest;
use App\Http\Requests\Auth\ResendVerificationCodeRequest;
use App\Http\Requests\Auth\VerifyRegistrationRequest;
use App\Models\User;
use App\Services\Auth\AuthService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller
{
public function __construct(
protected AuthService $authService
) {}
public function register(RegisterRequest $request)
{
$result = $this->authService->register(
$request->validated()
);
return response()->json([
'success' => true,
'message' => 'Register berhasil, silakan verifikasi kode.',
'data' => [
'user' => $result['user'],
'verification' => $result['verification'],
],
], 201);
}
public function verifyRegistration(
VerifyRegistrationRequest $request
) {
$user = $this->authService->verifyRegistration(
$request->validated()
);
return response()->json([
'success' => true,
'message' => 'Verifikasi berhasil, user sudah aktif.',
'data' => $user,
]);
}
public function resendVerificationCode(
ResendVerificationCodeRequest $request
) {
$verification = $this->authService->resendVerificationCode(
$request->validated()
);
return response()->json([
'success' => true,
'message' => 'Kode verifikasi baru berhasil dibuat.',
'data' => [
'verification' => $verification,
],
]);
}
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required'
'login' => 'required|string',
'password' => 'required|string',
]);
$user = User::where('email', $request->email)->first();
$user = User::where('email', $request->login)
->orWhere('username', $request->login)
->first();
if (!$user || !Hash::check($request->password, $user->password)) {
return response()->json([
'success' => false,
'message' => 'Email atau password salah'
'message' => 'Username/email atau password salah.'
], 401);
}
if ($user->status !== 'active') {
return response()->json([
'success' => false,
'message' => 'Akun belum aktif. Silakan verifikasi terlebih dahulu.'
], 403);
}
$token = $user->createToken('services-core')->plainTextToken;
return response()->json([
'success' => true,
'token' => $token,
'user' => $user
'token' => $token,
'user' => $user,
]);
}
// public function login(Request $request)
// {
// $request->validate([
// 'email' => 'required|email',
// 'password' => 'required'
// ]);
// $user = User::where('email', $request->email)->first();
// if (!$user || !Hash::check($request->password, $user->password)) {
// return response()->json([
// 'success' => false,
// 'message' => 'Email atau password salah'
// ], 401);
// }
// if ($user->status !== 'active') {
// return response()->json([
// 'success' => false,
// 'message' => 'Akun belum aktif. Silakan verifikasi terlebih dahulu.'
// ], 403);
// }
// $token = $user->createToken('services-core')->plainTextToken;
// return response()->json([
// 'success' => true,
// 'token' => $token,
// 'user' => $user
// ]);
// }
}
@@ -0,0 +1,63 @@
<?php
namespace App\Http\Controllers\File;
use App\Http\Controllers\ApiController;
use App\Http\Requests\File\IndexStoredFileRequest;
use App\Http\Requests\File\StoreFileRequest;
use App\Http\Resources\File\StoredFileResource;
use App\Models\StoredFile;
use App\Services\File\StoredFileService;
use Illuminate\Http\Request;
class StoredFileController extends ApiController
{
public function __construct(protected StoredFileService $service) {}
public function index(IndexStoredFileRequest $request)
{
return $this->successPaginated(
$this->service->list(
$request->validated(),
$request->user(),
$request->attributes->get('tenant_id')
),
StoredFileResource::class,
'Daftar file berhasil diambil'
);
}
public function store(StoreFileRequest $request)
{
$file = $this->service->store(
$request->file('file'),
$request->user(),
$request->attributes->get('tenant_id'),
$request->validated('category', 'general')
);
return $this->created(new StoredFileResource($file), 'File berhasil diunggah');
}
public function show(Request $request, StoredFile $storedFile)
{
$this->service->authorizeAccess($storedFile, $request->user());
return $this->success(new StoredFileResource($storedFile), 'Detail file berhasil diambil');
}
public function temporaryUrl(Request $request, StoredFile $storedFile)
{
return $this->success(
$this->service->temporaryUrl($storedFile, $request->user()),
'URL sementara berhasil dibuat'
);
}
public function destroy(Request $request, StoredFile $storedFile)
{
$this->service->delete($storedFile, $request->user());
return $this->deleted('File berhasil dihapus');
}
}
@@ -4,11 +4,11 @@ namespace App\Http\Controllers\Material;
use App\Http\Controllers\ApiController;
use App\Http\Requests\Material\AssignMaterialRequest;
use App\Http\Requests\Material\TransferMaterialRequest;
use App\Http\Requests\Material\IndexMaterialRequest;
use App\Http\Requests\Material\ReturnMaterialRequest;
use App\Http\Requests\Material\TransferMaterialRequest;
use App\Http\Resources\Material\MaterialResource;
use App\Services\Material\MaterialService;
use Illuminate\Http\Request;
class MaterialController extends ApiController
{
@@ -19,20 +19,9 @@ class MaterialController extends ApiController
$this->service = $service;
}
public function index(Request $request)
public function index(IndexMaterialRequest $request)
{
$filters = $request->only([
'search',
'technician_id',
'warehouse_id',
'type',
'page',
'per_page',
'sort_by',
'sort_order',
]);
$data = $this->service->list($filters);
$data = $this->service->list($request->validated());
return $this->successPaginated(
$data,
@@ -76,7 +65,7 @@ class MaterialController extends ApiController
$data = $this->service->listByUser($user_id);
return $this->success(
\App\Http\Resources\Material\MaterialResource::collection($data),
MaterialResource::collection($data),
'List material user berhasil diambil'
);
}
@@ -90,4 +79,4 @@ class MaterialController extends ApiController
'History material berhasil diambil'
);
}
}
}
@@ -0,0 +1,146 @@
<?php
namespace App\Http\Controllers\Menu;
use App\Http\Controllers\ApiController;
use App\Models\MenuList;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
class MenuController extends ApiController
{
public function myMenus()
{
$user = auth()->user();
$tenantId = request()->attributes->get('tenant_id');
if (! $user) {
return $this->error('Unauthenticated', 401);
}
if ($user->isMasterAdmin()) {
$menus = MenuList::query()
->where('is_active', true)
->orderBy('sort_order')
->orderBy('id')
->get()
->map(function (MenuList $menu) {
return [
'id' => $menu->id,
'parent_id' => $menu->parent_id,
'name' => $menu->name,
'slug' => $menu->slug,
'url' => $menu->url,
'icon' => $menu->icon,
'component' => $menu->component,
'sort_order' => $menu->sort_order,
'permissions' => [
'can_view' => true,
'can_create' => true,
'can_update' => true,
'can_delete' => true,
'can_approve' => true,
'can_export' => true,
],
];
});
} else {
$menuRows = DB::table('menu_lists as m')
->join('menu_group_menus as mgm', 'mgm.menu_id', '=', 'm.id')
->join('user_menu_groups as umg', 'umg.menu_group_id', '=', 'mgm.menu_group_id')
->join('menu_groups as mg', 'mg.id', '=', 'umg.menu_group_id')
->where('umg.user_id', $user->id)
->where('umg.tenant_id', $tenantId)
->where('mg.is_active', true)
->where('m.is_active', true)
->where('mgm.can_view', true)
->groupBy(
'm.id',
'm.parent_id',
'm.name',
'm.slug',
'm.url',
'm.icon',
'm.component',
'm.sort_order'
)
->select(
'm.id',
'm.parent_id',
'm.name',
'm.slug',
'm.url',
'm.icon',
'm.component',
'm.sort_order',
DB::raw('MAX(CASE WHEN mgm.can_view THEN 1 ELSE 0 END) as can_view'),
DB::raw('MAX(CASE WHEN mgm.can_create THEN 1 ELSE 0 END) as can_create'),
DB::raw('MAX(CASE WHEN mgm.can_update THEN 1 ELSE 0 END) as can_update'),
DB::raw('MAX(CASE WHEN mgm.can_delete THEN 1 ELSE 0 END) as can_delete'),
DB::raw('MAX(CASE WHEN mgm.can_approve THEN 1 ELSE 0 END) as can_approve'),
DB::raw('MAX(CASE WHEN mgm.can_export THEN 1 ELSE 0 END) as can_export')
)
->orderBy('m.sort_order')
->orderBy('m.id')
->get();
$menus = $menuRows->map(function ($row) {
return [
'id' => (int) $row->id,
'parent_id' => $row->parent_id ? (int) $row->parent_id : null,
'name' => $row->name,
'slug' => $row->slug,
'url' => $row->url,
'icon' => $row->icon,
'component' => $row->component,
'sort_order' => (int) $row->sort_order,
'permissions' => [
'can_view' => (bool) $row->can_view,
'can_create' => (bool) $row->can_create,
'can_update' => (bool) $row->can_update,
'can_delete' => (bool) $row->can_delete,
'can_approve' => (bool) $row->can_approve,
'can_export' => (bool) $row->can_export,
],
];
});
}
$tree = $this->buildMenuTree($menus);
return $this->success(
[
'is_master' => (bool) $user->is_master,
'access_level' => $user->access_level->value,
'tenant_id' => $tenantId,
'menus' => $tree,
],
'Menu berhasil diambil'
);
}
private function buildMenuTree(Collection $menus, ?int $parentId = null): array
{
return $menus
->filter(fn ($menu) => $menu['parent_id'] === $parentId)
->sortBy('sort_order')
->values()
->map(function ($menu) use ($menus) {
$children = $this->buildMenuTree($menus, $menu['id']);
return [
'id' => $menu['id'],
'parent_id' => $menu['parent_id'],
'name' => $menu['name'],
'slug' => $menu['slug'],
'url' => $menu['url'],
'icon' => $menu['icon'],
'component' => $menu['component'],
'sort_order' => $menu['sort_order'],
'permissions' => $menu['permissions'],
'children' => $children,
];
})
->all();
}
}
@@ -0,0 +1,206 @@
<?php
namespace App\Http\Controllers\Menu;
use App\Http\Controllers\ApiController;
use App\Http\Requests\MenuGroup\IndexMenuGroupRequest;
use App\Http\Requests\MenuGroup\StoreMenuGroupRequest;
use App\Http\Requests\MenuGroup\SyncMenuGroupMenusRequest;
use App\Http\Requests\MenuGroup\SyncUserMenuGroupsRequest;
use App\Http\Requests\MenuGroup\UpdateMenuGroupRequest;
use App\Http\Resources\MenuGroup\MenuGroupResource;
use App\Models\MenuGroup;
use App\Models\User;
use App\Services\Access\AccessService;
use App\Services\Menu\MenuGroupService;
class MenuGroupController extends ApiController
{
public function __construct(
protected MenuGroupService $service,
protected AccessService $access
) {}
public function index(IndexMenuGroupRequest $request)
{
$data = $this->service->list(
$request->validated(),
$request->user(),
$request->attributes->get('tenant_id')
);
return $this->successPaginated(
$data,
MenuGroupResource::class,
'Data Menu Group berhasil diambil'
);
}
public function store(StoreMenuGroupRequest $request)
{
$data = $this->service->create(
$request->validated(),
$request->user(),
$request->attributes->get('tenant_id')
);
return $this->created(
new MenuGroupResource($data),
'Menu Group berhasil dibuat'
);
}
public function show(MenuGroup $menu_group)
{
$this->authorizeGroup($menu_group, false);
return $this->success(
new MenuGroupResource($menu_group->load('tenant')),
'Detail Menu Group berhasil diambil'
);
}
public function update(
UpdateMenuGroupRequest $request,
MenuGroup $menu_group
) {
$this->authorizeGroup($menu_group, true);
$data = $this->service->update(
$menu_group,
$request->validated(),
$request->user(),
$request->attributes->get('tenant_id')
);
return $this->updated(
new MenuGroupResource($data),
'Menu Group berhasil diupdate'
);
}
public function destroy(MenuGroup $menu_group)
{
$this->authorizeGroup($menu_group, true);
$this->service->delete($menu_group);
return $this->deleted(
'Menu Group berhasil dihapus'
);
}
public function menus(MenuGroup $menu_group)
{
$this->authorizeGroup($menu_group, false);
$data = $this->service->listMenus($menu_group);
return $this->success(
[
'menu_group_id' => $menu_group->id,
'menu_group' => new MenuGroupResource($menu_group),
'menus' => $data,
],
'Mapping menu group berhasil diambil'
);
}
public function availableMenus(MenuGroup $menu_group)
{
$this->authorizeGroup($menu_group, false);
$user = auth()->user();
if (! $user) {
return $this->error('Unauthenticated', 401);
}
$data = $this->service->listAvailableMenusForGroup(
$menu_group,
$user
);
return $this->success(
[
'menu_group_id' => $menu_group->id,
'menu_group' => new MenuGroupResource($menu_group),
'menus' => $data,
],
'Daftar menu tersedia berdasarkan akses user berhasil diambil'
);
}
public function syncMenus(
SyncMenuGroupMenusRequest $request,
MenuGroup $menu_group
) {
$this->authorizeGroup($menu_group, true);
$user = auth()->user();
if (! $user) {
return $this->error('Unauthenticated', 401);
}
$this->service->syncMenus(
$menu_group,
$request->validated('menus'),
$user
);
return $this->success(
[
'menu_group_id' => $menu_group->id,
'menu_group' => new MenuGroupResource($menu_group->fresh('tenant')),
'menus' => $this->service->listMenus($menu_group),
],
'Mapping menu group berhasil disimpan'
);
}
public function userAssignments(User $user)
{
$tenantId = request()->attributes->get('tenant_id');
abort_unless($this->access->canManageUser(auth()->user(), $user, $tenantId), 403);
return $this->success(
[
'user_id' => $user->id,
'assignments' => $this->service->listUserAssignments($user, $tenantId),
],
'Assignment user menu group berhasil diambil'
);
}
public function syncUserAssignments(
SyncUserMenuGroupsRequest $request,
User $user
) {
$tenantId = $request->attributes->get('tenant_id');
abort_unless($this->access->canManageUser($request->user(), $user, $tenantId), 403);
$this->service->syncUserAssignments(
$user,
$request->validated('assignments'),
$tenantId
);
return $this->success(
[
'user_id' => $user->id,
'assignments' => $this->service->listUserAssignments($user, $tenantId),
],
'Assignment user menu group berhasil disimpan'
);
}
private function authorizeGroup(MenuGroup $menuGroup, bool $write): void
{
$user = auth()->user();
$tenantId = request()->attributes->get('tenant_id');
if ($user->isMasterAdmin()) {
return;
}
$allowed = (int) $menuGroup->tenant_id === (int) $tenantId;
abort_unless($allowed, 403);
}
}
@@ -0,0 +1,75 @@
<?php
namespace App\Http\Controllers\Menu;
use App\Http\Controllers\ApiController;
use App\Http\Requests\MenuList\IndexMenuListRequest;
use App\Http\Requests\MenuList\StoreMenuListRequest;
use App\Http\Requests\MenuList\UpdateMenuListRequest;
use App\Http\Resources\MenuList\MenuListResource;
use App\Models\MenuList;
use App\Services\Menu\MenuListService;
class MenuListController extends ApiController
{
public function __construct(
protected MenuListService $service
) {}
public function index(IndexMenuListRequest $request)
{
$data = $this->service->list(
$request->validated()
);
return $this->successPaginated(
$data,
MenuListResource::class,
'Data Menu List berhasil diambil'
);
}
public function store(StoreMenuListRequest $request)
{
$data = $this->service->create(
$request->validated()
);
return $this->created(
new MenuListResource($data),
'Menu List berhasil dibuat'
);
}
public function show(MenuList $menu_list)
{
return $this->success(
new MenuListResource($menu_list),
'Detail Menu List berhasil diambil'
);
}
public function update(
UpdateMenuListRequest $request,
MenuList $menu_list
) {
$data = $this->service->update(
$menu_list,
$request->validated()
);
return $this->updated(
new MenuListResource($data),
'Menu List berhasil diupdate'
);
}
public function destroy(MenuList $menu_list)
{
$this->service->delete($menu_list);
return $this->deleted(
'Menu List berhasil dihapus'
);
}
}
@@ -0,0 +1,72 @@
<?php
namespace App\Http\Controllers\Nas;
use App\Http\Controllers\ApiController;
use App\Http\Requests\Nas\IndexNasResourceRequest;
use App\Http\Requests\Nas\StoreNasResourceRequest;
use App\Http\Requests\Nas\UpdateNasResourceRequest;
use App\Http\Resources\Nas\NasResource;
use App\Services\Nas\NasResourceService;
use Illuminate\Http\Request;
class NasResourceController extends ApiController
{
public function __construct(protected NasResourceService $service) {}
public function index(IndexNasResourceRequest $request)
{
$data = $this->service->list($this->resource($request), $request->validated(), $request->user(), $this->tenantId($request));
return $this->successPaginated($data, NasResource::class, 'Data NAS berhasil diambil');
}
public function store(StoreNasResourceRequest $request)
{
$data = $this->service->create($this->resource($request), $request->validated(), $request->user(), $this->tenantId($request));
return $this->created(new NasResource($data), 'Data NAS berhasil dibuat');
}
public function show(Request $request, int $id)
{
$data = $this->service->find($this->resource($request), $id);
$this->authorizeTenant($request, $data->tenant_id);
return $this->success(new NasResource($data), 'Detail NAS berhasil diambil');
}
public function update(UpdateNasResourceRequest $request, int $id)
{
$resource = $this->resource($request);
$model = $this->service->find($resource, $id);
$this->authorizeTenant($request, $model->tenant_id);
$data = $this->service->update($resource, $model, $request->validated(), $request->user());
return $this->updated(new NasResource($data), 'Data NAS berhasil diupdate');
}
public function destroy(Request $request, int $id)
{
$model = $this->service->find($this->resource($request), $id);
$this->authorizeTenant($request, $model->tenant_id);
$this->service->delete($model);
return $this->deleted('Data NAS berhasil dihapus');
}
private function resource(Request $request): string
{
return $request->route()->defaults['nas_resource'];
}
private function tenantId(Request $request): ?int
{
return $request->attributes->get('tenant_id');
}
private function authorizeTenant(Request $request, int $tenantId): void
{
abort_unless($request->user()->isMasterAdmin() || $tenantId === $this->tenantId($request), 403);
}
}
@@ -0,0 +1,38 @@
<?php
namespace App\Http\Controllers\Profile;
use App\Http\Controllers\ApiController;
use App\Http\Requests\Profile\UpdateProfileRequest;
use App\Http\Resources\User\UserResource;
use App\Services\User\UserService;
use Illuminate\Http\Request;
class ProfileController extends ApiController
{
public function __construct(
protected UserService $service
) {}
public function show(Request $request)
{
return $this->success(
new UserResource($this->service->show($request->user())),
'Profile berhasil diambil'
);
}
public function update(UpdateProfileRequest $request)
{
$user = $this->service->update(
$request->user(),
$request->safe()->except(['current_password', 'password_confirmation']),
$request->user()
);
return $this->updated(
new UserResource($user),
'Profile berhasil diperbarui'
);
}
}
@@ -0,0 +1,93 @@
<?php
namespace App\Http\Controllers\Tenant;
use App\Http\Controllers\ApiController;
use App\Http\Requests\Tenant\IndexTenantRequest;
use App\Http\Requests\Tenant\StoreTenantRequest;
use App\Http\Requests\Tenant\UpdateTenantRequest;
use App\Http\Resources\Tenant\TenantResource;
use App\Models\Tenant;
use App\Services\Tenant\TenantService;
use Illuminate\Http\Request;
class TenantController extends ApiController
{
public function __construct(
protected TenantService $service
) {}
public function index(IndexTenantRequest $request)
{
$data = $this->service->list(
$request->validated(),
$request->user()
);
return $this->successPaginated(
$data,
TenantResource::class,
'Data Tenant berhasil diambil'
);
}
public function store(StoreTenantRequest $request)
{
$data = $this->service->create(
$request->validated()
);
return $this->created(
new TenantResource($data),
'Tenant berhasil dibuat'
);
}
public function show(Request $request, Tenant $tenant)
{
$this->authorizeTenantAccess($request, $tenant);
return $this->success(
new TenantResource($tenant),
'Detail Tenant berhasil diambil'
);
}
public function update(
UpdateTenantRequest $request,
Tenant $tenant
) {
$data = $this->service->update(
$tenant,
$request->validated()
);
return $this->updated(
new TenantResource($data),
'Tenant berhasil diupdate'
);
}
public function destroy(Tenant $tenant)
{
$this->service->delete($tenant);
return $this->deleted(
'Tenant berhasil dihapus'
);
}
private function authorizeTenantAccess(Request $request, Tenant $tenant): void
{
$user = $request->user();
if ($user->isMasterAdmin()) {
return;
}
abort_unless(
$user->userTenants()->where('tenant_id', $tenant->id)->exists(),
403
);
}
}
@@ -3,12 +3,12 @@
namespace App\Http\Controllers\Ticket;
use App\Http\Controllers\ApiController;
use App\Http\Requests\Ticket\IndexTicketRequest;
use App\Http\Requests\Ticket\StoreTicketRequest;
use App\Http\Requests\Ticket\UpdateTicketRequest;
use App\Http\Resources\Ticket\TicketResource;
use App\Models\Ticket;
use App\Services\Ticket\TicketService;
use Illuminate\Http\Request;
class TicketController extends ApiController
{
@@ -16,13 +16,42 @@ class TicketController extends ApiController
protected TicketService $service
) {}
public function index(Request $request)
public function index(IndexTicketRequest $request)
{
$tickets = Ticket::latest()->paginate(
$request->get('per_page', 10)
);
$filters = $request->validated();
$tickets = Ticket::query()
->when(
! empty($filters['search']),
fn ($query) => $query->where(function ($searchQuery) use ($filters) {
$searchQuery->where('ticket_no', 'ILIKE', "%{$filters['search']}%")
->orWhere('title', 'ILIKE', "%{$filters['search']}%")
->orWhere('description', 'ILIKE', "%{$filters['search']}%");
})
)
->when(
! empty($filters['status']),
fn ($query) => $query->where('status', $filters['status'])
)
->when(
! empty($filters['priority']),
fn ($query) => $query->where('priority', $filters['priority'])
)
->when(
! empty($filters['ticket_type_id']),
fn ($query) => $query->where('ticket_type_id', $filters['ticket_type_id'])
)
->when(
! empty($filters['customer_id']),
fn ($query) => $query->where('customer_id', $filters['customer_id'])
)
->latest()
->paginate($filters['per_page'] ?? 10);
return $this->success($tickets);
return $this->successPaginated(
$tickets,
TicketResource::class,
'Data Ticket berhasil diambil'
);
}
public function store(StoreTicketRequest $request)
@@ -67,4 +96,4 @@ class TicketController extends ApiController
'Ticket berhasil dibatalkan'
);
}
}
}
@@ -3,12 +3,13 @@
namespace App\Http\Controllers\Ticket;
use App\Http\Controllers\ApiController;
use App\Models\TicketIncidentType;
use Illuminate\Http\JsonResponse;
use App\Services\Ticket\TicketIncidentTypeService;
use App\Http\Resources\TicketIncidentType\TicketIncidentTypeResource;
use App\Http\Requests\TicketIncidentType\IndexTicketIncidentTypeRequest;
use App\Http\Requests\TicketIncidentType\StoreTicketIncidentTypeRequest;
use App\Http\Requests\TicketIncidentType\UpdateTicketIncidentTypeRequest;
use App\Http\Resources\TicketIncidentType\TicketIncidentTypeResource;
use App\Models\TicketIncidentType;
use App\Services\Ticket\TicketIncidentTypeService;
use Illuminate\Http\JsonResponse;
class TicketIncidentTypeController extends ApiController
{
@@ -16,12 +17,12 @@ class TicketIncidentTypeController extends ApiController
private TicketIncidentTypeService $service
) {}
public function index(): JsonResponse
public function index(IndexTicketIncidentTypeRequest $request): JsonResponse
{
return $this->success(
TicketIncidentTypeResource::collection(
$this->service->getAll()
)
return $this->successPaginated(
$this->service->list($request->validated()),
TicketIncidentTypeResource::class,
'Data Incident Type berhasil diambil'
);
}
@@ -74,4 +75,4 @@ class TicketIncidentTypeController extends ApiController
'Incident Type berhasil dihapus'
);
}
}
}
@@ -3,12 +3,12 @@
namespace App\Http\Controllers\Ticket;
use App\Http\Controllers\ApiController;
use App\Http\Requests\TicketType\IndexTicketTypeRequest;
use App\Http\Requests\TicketType\StoreTicketTypeRequest;
use App\Http\Requests\TicketType\UpdateTicketTypeRequest;
use App\Http\Resources\TicketType\TicketTypeResource;
use App\Models\TicketType;
use App\Services\Ticket\TicketTypeService;
use Illuminate\Http\Request;
class TicketTypeController extends ApiController
{
@@ -16,14 +16,15 @@ class TicketTypeController extends ApiController
protected TicketTypeService $service
) {}
public function index(Request $request)
public function index(IndexTicketTypeRequest $request)
{
$data = $this->service->list(
$request->all()
$request->validated()
);
return $this->success(
TicketTypeResource::collection($data),
return $this->successPaginated(
$data,
TicketTypeResource::class,
'Data Ticket Type berhasil diambil'
);
}
@@ -71,4 +72,4 @@ class TicketTypeController extends ApiController
'Ticket Type berhasil dihapus'
);
}
}
}
@@ -0,0 +1,95 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\ApiController;
use App\Http\Requests\User\IndexUserRequest;
use App\Http\Requests\User\StoreUserRequest;
use App\Http\Requests\User\UpdateUserRequest;
use App\Http\Resources\User\UserResource;
use App\Models\User;
use App\Services\Access\AccessService;
use App\Services\User\UserService;
use Illuminate\Http\Request;
class UserController extends ApiController
{
public function __construct(
protected UserService $service,
protected AccessService $access
) {}
public function index(IndexUserRequest $request)
{
$data = $this->service->list(
$request->validated(),
$request->user(),
$request->attributes->get('tenant_id')
);
return $this->successPaginated(
$data,
UserResource::class,
'Data User berhasil diambil'
);
}
public function store(StoreUserRequest $request)
{
$data = $this->service->create(
$request->validated(),
$request->user()
);
return $this->created(
new UserResource($data),
'User berhasil dibuat'
);
}
public function show(Request $request, User $user)
{
abort_unless(
$this->access->canManageUser($request->user(), $user, $request->attributes->get('tenant_id')),
403
);
$data = $this->service->show($user);
return $this->success(
new UserResource($data),
'Detail User berhasil diambil'
);
}
public function update(UpdateUserRequest $request, User $user)
{
abort_unless(
$this->access->canManageUser($request->user(), $user, $request->attributes->get('tenant_id')),
403
);
$data = $this->service->update(
$user,
$request->validated(),
$request->user()
);
return $this->updated(
new UserResource($data),
'User berhasil diupdate'
);
}
public function destroy(Request $request, User $user)
{
abort_unless(
$this->access->canManageUser($request->user(), $user, $request->attributes->get('tenant_id')),
403
);
$this->service->delete($user);
return $this->deleted('User berhasil dihapus');
}
}
@@ -0,0 +1,106 @@
<?php
namespace App\Http\Controllers\Wilayah;
use App\Http\Controllers\ApiController;
use App\Http\Requests\Wilayah\AlamatLengkapRequest;
use App\Http\Requests\Wilayah\IndexWilayahRequest;
use App\Http\Requests\Wilayah\LookupWilayahRequest;
use App\Http\Requests\Wilayah\StoreWilayahRequest;
use App\Http\Requests\Wilayah\UpdateWilayahRequest;
use App\Http\Resources\Wilayah\WilayahResource;
use App\Models\WilayahKabupaten;
use App\Models\WilayahKecamatan;
use App\Models\WilayahProvinsi;
use App\Services\Wilayah\WilayahService;
class WilayahController extends ApiController
{
public function __construct(protected WilayahService $service) {}
public function index(IndexWilayahRequest $request, string $tingkat)
{
return $this->successPaginated(
$this->service->list($tingkat, $request->validated()),
WilayahResource::class,
"Daftar {$tingkat} berhasil diambil"
);
}
public function store(StoreWilayahRequest $request, string $tingkat)
{
return $this->created(
new WilayahResource($this->service->create($tingkat, $request->validated())),
ucfirst($tingkat).' berhasil dibuat'
);
}
public function show(int $wilayah, string $tingkat)
{
return $this->success(
new WilayahResource($this->service->find($tingkat, $wilayah)),
'Detail wilayah berhasil diambil'
);
}
public function update(UpdateWilayahRequest $request, int $wilayah, string $tingkat)
{
return $this->updated(
new WilayahResource($this->service->update($tingkat, $wilayah, $request->validated())),
ucfirst($tingkat).' berhasil diperbarui'
);
}
public function destroy(int $wilayah, string $tingkat)
{
$this->service->delete($tingkat, $wilayah);
return $this->deleted(ucfirst($tingkat).' berhasil dihapus');
}
public function alamatLengkap(AlamatLengkapRequest $request)
{
return $this->success(
$this->service->alamatLengkap($request->validated()),
'Alamat wilayah lengkap berhasil diambil'
);
}
public function provinsiOptions(LookupWilayahRequest $request)
{
return $this->success(
$this->service->options('provinsi', $request->validated()),
'Pilihan provinsi berhasil diambil'
);
}
public function kabupatenOptions(
LookupWilayahRequest $request,
WilayahProvinsi $provinsi
) {
return $this->success(
$this->service->options('kabupaten', $request->validated(), $provinsi->id),
'Pilihan kabupaten berhasil diambil'
);
}
public function kecamatanOptions(
LookupWilayahRequest $request,
WilayahKabupaten $kabupaten
) {
return $this->success(
$this->service->options('kecamatan', $request->validated(), $kabupaten->id),
'Pilihan kecamatan berhasil diambil'
);
}
public function desaOptions(
LookupWilayahRequest $request,
WilayahKecamatan $kecamatan
) {
return $this->success(
$this->service->options('desa', $request->validated(), $kecamatan->id),
'Pilihan desa berhasil diambil'
);
}
}