hasMany(Release::class, 'categories_id'); } /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function parent() { return $this->belongsTo(static::class, 'parentid'); } /** * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function children() { return $this->hasMany(static::class, 'parentid'); } /** * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function userExcludedCategory() { return $this->hasMany(UserExcludedCategory::class, 'categories_id'); } /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function roleExcludedCategory() { return $this->belongsTo(RoleExcludedCategory::class, 'categories_id'); } /** * @return \Illuminate\Database\Eloquent\Collection|\Illuminate\Support\Collection|static[] */ public static function getRecentlyAdded() { $recent = Cache::get('recentlyadded'); if ($recent !== null) { return $recent; } $recent = self::query() ->where('r.adddate', '>', Carbon::now()->subWeek()) ->selectRaw('CONCAT(cp.title, " > ", categories.title) as title') ->selectRaw('COUNT(r.id) as count') ->join('categories as cp', 'cp.id', '=', 'categories.parentid') ->join('releases as r', 'r.categories_id', '=', 'categories.id') ->groupBy('title') ->orderBy('count', 'desc') ->get(); $expiresAt = Carbon::now()->addSeconds(config('nntmux.cache_expiry_long')); Cache::put('recentlyadded', $recent, $expiresAt); return $recent; } /** * Parse category search constraints. * * @param array $cat * * @return string $catsrch */ public static function getCategorySearch(array $cat = []): string { $categories = []; // If multiple categories were sent in a single array position, slice and add them if (strpos($cat[0], ',') !== false) { $tmpcats = explode(',', $cat[0]); // Reset the category to the first comma separated value in the string $cat[0] = $tmpcats[0]; // Add the remaining categories in the string to the original array foreach (\array_slice($tmpcats, 1) as $tmpcat) { $cat[] = $tmpcat; } } foreach ($cat as $category) { if ($category !== -1 && self::isParent($category)) { foreach (self::getChildren($category) as $child) { $categories[] = $child['id']; } } elseif ($category > 0) { $categories[] = $category; } } $catCount = \count($categories); switch ($catCount) { //No category constraint case 0: $catsrch = ' AND 1=1 '; break; // One category constraint case 1: $catsrch = $categories[0] !== -1 ? ' AND r.categories_id = '.$categories[0] : ''; break; // Multiple category constraints default: $catsrch = ' AND r.categories_id IN ('.implode(', ', $categories).') '; break; } return $catsrch; } /** * Returns a concatenated list of other categories. * * @return string */ public static function getCategoryOthersGroup(): string { return implode( ',', self::OTHERS_GROUP ); } /** * @param $category * * @return mixed */ public static function getCategoryValue($category) { return \constant('self::'.$category); } /** * Check if category is parent. * * @param $cid * * @return bool */ public static function isParent($cid): bool { $ret = self::query()->where(['id' => $cid, 'parentid' => null])->first(); return $ret !== null; } /** * @return \Illuminate\Database\Eloquent\Collection|static[] */ public static function getFlat() { return self::query()->get(); } /** * Get children of a parent category. * * * @param $categoryId * @return mixed */ public static function getChildren($categoryId) { $expiresAt = Carbon::now()->addSeconds(config('nntmux.cache_expiry_long')); $children = Cache::get(md5($categoryId)); if ($children !== null) { return $children; } $children = self::find($categoryId)->children; Cache::put(md5($categoryId), $children, $expiresAt); return $children; } /** * Get names of enabled parent categories. * * @return \Illuminate\Database\Eloquent\Collection|static[] */ public static function getEnabledParentNames() { return self::query() ->where(['parentid' => null, 'status' => 1]) ->get(['title']); } /** * Returns category ID's for site disabled categories. * * * @return \Illuminate\Database\Eloquent\Collection|static[] */ public static function getDisabledIDs() { return self::query() ->where('status', '=', 2) ->orWhere(['status' => 2, 'parentid' => null]) ->get(['id']); } /** * Get multiple categories. * * @param array $ids * * @return array|bool */ public static function getByIds($ids) { if (\count($ids) > 0) { $catIds = Cache::get('categoryids'); if ($catIds !== null) { return $catIds; } $catIds = self::query()->whereIn('id', $ids)->get(); $expiresAt = Carbon::now()->addSeconds(config('nntmux.cache_expiry_long')); Cache::put('categoryids', $catIds, $expiresAt); return $catIds; } return false; } /** * Return the parent and category name from the supplied categoryID. * * * @param $ID * @return string */ public static function getNameByID($ID): string { $cat = self::query()->where('id', $ID)->first(); return $cat !== null ? $cat->parent->title.' -> '.$cat->title : ''; } /** * @param $title * @param $parent * @return bool|mixed */ public static function getIdByName($title, $parent) { $cat = self::query()->where('title', $title)->with('parent.'.$parent)->first(['id']); return $cat !== null ? $cat->id : false; } /** * Update a category. * * * @param $id * @param $status * @param $desc->update * @param $disablepreview * @param $minsize * @param $maxsize * @return int */ public static function updateCategory($id, $status, $desc, $disablepreview, $minsize, $maxsize): int { return self::query()->where('id', $id)->update( [ 'disablepreview' => $disablepreview, 'status' => $status, 'minsizetoformrelease' => $minsize, 'maxsizetoformrelease' => $maxsize, 'description' => $desc, ] ); } /** * @param array $excludedCats * * @param array $roleExcludedCats * * @return array */ public static function getForMenu(array $excludedCats = [], array $roleExcludedCats = []): array { $ret = []; $sql = self::query()->where('status', '=', self::STATUS_ACTIVE); if (\count($excludedCats) > 0 && \count($roleExcludedCats) === 0) { $sql->whereNotIn('id', $excludedCats); } elseif (\count($excludedCats) > 0 && \count($roleExcludedCats) > 0) { $sql->whereNotIn('id', [$excludedCats, $roleExcludedCats]); } elseif (\count($excludedCats) === 0 && \count($roleExcludedCats) > 0) { $sql->whereNotIn('id', $roleExcludedCats); } $arrsql = Cache::get(md5(implode(',', $excludedCats).implode(',', $roleExcludedCats))); if ($arrsql !== null) { $arr = $arrsql; } else { $arr = $sql->get()->toArray(); $expiresAt = Carbon::now()->addSeconds(config('nntmux.cache_expiry_long')); Cache::put(md5(implode(',', $excludedCats).implode(',', $roleExcludedCats)), $arr, $expiresAt); } foreach ($arr as $key => $val) { if ($val['id'] === self::OTHER_ROOT) { $item = $arr[$key]; unset($arr[$key]); $arr[] = $item; break; } } foreach ($arr as $a) { if (empty($a['parentid'])) { $ret[] = $a; } } foreach ($ret as $key => $parent) { $subcatlist = []; $subcatnames = []; foreach ($arr as $a) { if ($a['parentid'] === $parent['id']) { $subcatlist[] = $a; $subcatnames[] = $a['title']; } } if (\count($subcatlist) > 0) { array_multisort($subcatnames, SORT_ASC, $subcatlist); $ret[$key]['subcatlist'] = $subcatlist; } else { unset($ret[$key]); } } return $ret; } /** * Return a list of categories for use in a dropdown. * * @param bool $blnIncludeNoneSelected * * @return array */ public static function getForSelect($blnIncludeNoneSelected = true): array { $categories = self::getCategories(); $temp_array = []; if ($blnIncludeNoneSelected) { $temp_array[-1] = '--Please Select--'; } foreach ($categories as $category) { $temp_array[$category['id']] = $category['title']; } return $temp_array; } /** * @param bool $activeOnly * @param array $excludedCats * @return array */ public static function getCategories($activeOnly = false, array $excludedCats = []) { $sql = self::query() ->select(['categories.id', 'cp.id as parentid', 'categories.status']) ->selectRaw("CONCAT(cp.title, ' > ',categories.title) AS title") ->leftJoin('categories as cp', 'cp.id', '=', 'categories.parentid') ->orderBy('categories.id'); if ($activeOnly) { $sql->where('categories.status', '=', self::STATUS_ACTIVE); } if (\count($excludedCats) > 0) { $sql->whereNotIn('categories.id', $excludedCats); } return $sql->get()->toArray(); } }