getFilterData($filterData); $query = $this->getQuery(); if (isset($filter['search']) && strlen($filter['search']) > 0) { $query = $this->filterSearchQuery($query, $filter['search']); } return $query->orderBy($filter['orderBy'], $filter['order']) ->paginate($filter['perPage']); } catch (Exception $exception) { throw new Exception($exception->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); } } protected function getFilterData(array $filterData = []): array { $defaultArgs = [ 'perPage' => 10, 'search' => '', 'orderBy' => "{$this->table}.{$this->primaryKey}", 'order' => 'desc', ]; return array_merge($defaultArgs, $filterData); } protected function getQuery(): Builder { if ( $this->table == 'restaurants' || $this->table == 'restaurant_image_s_a_a_s_settings' || $this->table == 's_a_a_s_faqs' || $this->table == 's_a_a_s_subscriptions' || $this->table == 'support_tickets' || $this->table == 'support_ticket_categories' || $this->table == 'support_ticket_conversations' || $this->table == 'support_ticket_f_a_q_s' || $this->table == 'support_ticket_ip_infos' || $this->table == 'support_ticket_last_conversations' || $this->table == 'support_ticket_licenses' ) { return DB::table($this->table); } $restaurantId = (int) $this->getCurrentRestaurantId(); return DB::table($this->table) ->where("{$this->table}.restaurant_id", $restaurantId); } protected function filterSearchQuery(Builder|EloquentBuilder $query, string $searchedText): Builder|EloquentBuilder { return $query; } public function getCount(array $filterData = []): int { return $this->getQuery()->count(); } /** * @throws Exception */ public function create(array $data): bool|object { $data = $this->prepareForDB($data); try { return $this->getQuery()->insert($data); } catch (Exception $exception) { throw new Exception($exception->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); } } /** * @throws Exception */ public function update(int $id, array $data): ?object { $item = $this->getById($id); try { $data = $this->prepareForDB($data, $item); $updated = $this->getQuery() ->where("{$this->table}.{$this->primaryKey}", $id) ->update($data); if ($updated) { $item = $this->getById($id); } return $item; } catch (Exception $exception) { throw new Exception($exception->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); } } /** * @throws Exception */ public function getById(int $id, array $selects = ['*']): ?object { return $this->getByColumn("{$this->table}.{$this->primaryKey}", $id, $selects); } public function prepareForDB(array $data, ?object $item = null): array { if (count($this->fillableColumns) === 0) { return $data; } $preparedData = []; foreach ($this->fillableColumns as $column) { if (isset($data[$column])) { $preparedData[$column] = $data[$column] ?? null; } } return $preparedData; } /** * @throws Exception */ public function getByColumn(string $columnName, $columnValue, array $selects = ['*']): ?object { try { $item = $this->getQuery() ->where($columnName, $columnValue) ->select($selects) ->first(); if (empty($item)) { throw new Exception( $this->getExceptionMessage(static::MESSAGE_ITEM_DOES_NOT_EXIST_MESSAGE), Response::HTTP_NOT_FOUND ); } return $item; } catch (Exception $exception) { throw new Exception($exception); } } protected function getExceptionMessage(string $key): string { return $this->getExceptionMessages()[$key]; } protected function getExceptionMessages(): array { return [ static::MESSAGE_ITEM_DOES_NOT_EXIST_MESSAGE => 'Item does not exist.', static::MESSAGE_ITEM_COULD_NOT_BE_DELETED => 'Item could not be deleted.', ]; } /** * @throws Exception */ public function delete(int $id): ?object { $item = $this->getById($id); try { $deleted = $this->getQuery() ->where($this->primaryKey, $id) ->update([ 'deleted_at' => Carbon::now(), ]); } catch (Exception $exception) { throw new Exception($exception->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); } if (! $deleted) { throw new Exception( $this->getExceptionMessage(static::MESSAGE_ITEM_COULD_NOT_BE_DELETED), Response::HTTP_INTERNAL_SERVER_ERROR ); } return $item; } /** * @throws Exception */ public function getDropdown(): array { $columns = array_unique( array_merge( [$this->primaryKey], $this->getDropdownSelectableColumns() ) ); $dropdown = (new Dropdown) ->setTableName($this->table) ->setSelectedColumns($columns) ->setOrderByColumnWithOrders($this->getOrderByColumnWithOrders()) ->setSelectableTableQuery(); $dropdown->setQuery($this->getDropdownAdditionalWhere($dropdown->getQuery())); return $dropdown->getDropdowns(); } /** * @throws Exception */ protected function getDropdownSelectableColumns(): array { throw new Exception('This method must be called from child repository.'); } /** * @throws Exception */ protected function getOrderByColumnWithOrders(): array { throw new Exception('This method must be called from child repository.'); } protected function getDropdownAdditionalWhere(Builder $query): Builder { return $query; } protected function getNextAutoIncrementId(): int { $tableInfo = DB::select("SHOW CREATE TABLE {$this->table}"); $tableCreateStatement = $tableInfo[0]->{'Create Table'}; preg_match('/AUTO_INCREMENT=(\d+)/', $tableCreateStatement, $matches); return $matches[1] ?? 1; } }