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
90 changes: 83 additions & 7 deletions app/Http/Controllers/SearchResourcesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,105 @@
use App\Filters\ResourceFilters;
use App\ResourceItem;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;

class SearchResourcesController extends Controller
{
/**
* Return unique ResourceItems and attach `main_language` field
* based on selectedLanguages (fallback to first related language).
*
* @param ResourceFilters $filters
* @param Request $request
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|\Illuminate\Http\JsonResponse
*/
public function search(ResourceFilters $filters, Request $request)
{
try {
// 1) Build base query (keep Filters behavior intact)
$builder = $this->getItems($filters)->select('resource_items.*');

$items = $this->getItems($filters);
// 2) Fetch raw (may contain duplicates due to groupBy in filters)
$raw = $builder->get();

$items->load(['types', 'levels', 'programmingLanguages', 'subjects', 'categories', 'languages']);
// 3) Deduplicate by resource id
$unique = $raw->unique('id')->values();

return $items;
// 4) Eager-load relations once for unique set
$unique->load(['types', 'levels', 'programmingLanguages', 'subjects', 'categories', 'languages']);

// 5) Determine main_language per item using selectedLanguages from request
$selectedLanguageIds = collect($request->input('selectedLanguages', []))
->pluck('id')
->map(fn ($v) => (int) $v)
->filter()
->values()
->all();

foreach ($unique as $item) {
/** @var \Illuminate\Support\Collection $langs */
$langs = $item->languages ?? collect();

// prefer the first language that matches the filter order
$main = null;
if (!empty($selectedLanguageIds) && $langs->isNotEmpty()) {
foreach ($selectedLanguageIds as $lid) {
$match = $langs->firstWhere('id', $lid);
if ($match) {
$main = $match;
break;
}
}
}

// fallback: first related language (if any)
if (!$main && $langs->isNotEmpty()) {
$main = $langs->first();
}

// attach lightweight field for FE
$item->setAttribute('main_language', $main ? [
'id' => (int) $main->id,
'name' => (string) $main->name,
] : null);
}

// 6) Paginate AFTER deduplication
$perPage = 30;
$page = LengthAwarePaginator::resolveCurrentPage() ?: 1;

$slice = $unique->forPage($page, $perPage)->values();
$paginator = new LengthAwarePaginator(
$slice,
$unique->count(),
$perPage,
$page,
['path' => Paginator::resolveCurrentPath()]
);

return $paginator;
} catch (\Throwable $e) {
return response()->json([
'status' => false,
'message' => 'Failed to search resources.',
'error' => $e->getMessage(),
], 500);
}
}

/**
* Keep original builder composition; pagination moved to controller.
*
* @param ResourceFilters $filters
* @return \Illuminate\Database\Eloquent\Builder
*/
protected function getItems(ResourceFilters $filters)
{

$items = ResourceItem::filter($filters)
return ResourceItem::filter($filters)
->whereActive(true)
->orderBy('weight', 'desc')
->orderBy('created_at', 'desc')
->orderBy('name', 'asc');

return $items->distinct()->paginate(30);
}
}
1 change: 1 addition & 0 deletions public/build/assets/app-BxMi-dVo.css

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion public/build/assets/app-CERvPNNr.css

This file was deleted.

237 changes: 0 additions & 237 deletions public/build/assets/app-DACzthI5.js

This file was deleted.

237 changes: 237 additions & 0 deletions public/build/assets/app-DIN1GlLN.js

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

66 changes: 33 additions & 33 deletions public/build/manifest.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
{
"resources/assets/sass/app.scss": {
"file": "assets/app-BuU2LYOA.css",
"file": "assets/app-DWRjsHRv.css",
"src": "resources/assets/sass/app.scss",
"isEntry": true
},
"resources/css/app.css": {
"file": "assets/app-CERvPNNr.css",
"file": "assets/app-BxMi-dVo.css",
"src": "resources/css/app.css",
"isEntry": true
},
"resources/js/app.js": {
"file": "assets/app-DACzthI5.js",
"file": "assets/app-DIN1GlLN.js",
"name": "app",
"src": "resources/js/app.js",
"isEntry": true,
Expand Down Expand Up @@ -51,181 +51,181 @@
]
},
"resources/lang/php_al.json": {
"file": "assets/php_al-Bn4EHcYp.js",
"file": "assets/php_al-BjwTomF1.js",
"name": "php_al",
"src": "resources/lang/php_al.json",
"isDynamicEntry": true
},
"resources/lang/php_ba.json": {
"file": "assets/php_ba-CS6DdXXC.js",
"file": "assets/php_ba-ByK1FIo_.js",
"name": "php_ba",
"src": "resources/lang/php_ba.json",
"isDynamicEntry": true
},
"resources/lang/php_bg.json": {
"file": "assets/php_bg-CN0AMmxm.js",
"file": "assets/php_bg-Cn6UmBoh.js",
"name": "php_bg",
"src": "resources/lang/php_bg.json",
"isDynamicEntry": true
},
"resources/lang/php_cs.json": {
"file": "assets/php_cs-C4vQ27nc.js",
"file": "assets/php_cs-BIv3xhQw.js",
"name": "php_cs",
"src": "resources/lang/php_cs.json",
"isDynamicEntry": true
},
"resources/lang/php_da.json": {
"file": "assets/php_da-CaYunAIN.js",
"file": "assets/php_da-DYfpOnGQ.js",
"name": "php_da",
"src": "resources/lang/php_da.json",
"isDynamicEntry": true
},
"resources/lang/php_de.json": {
"file": "assets/php_de-DvMSLwkx.js",
"file": "assets/php_de-B49h_8nv.js",
"name": "php_de",
"src": "resources/lang/php_de.json",
"isDynamicEntry": true
},
"resources/lang/php_el.json": {
"file": "assets/php_el-DQ9PTXOJ.js",
"file": "assets/php_el-V_dVO9S6.js",
"name": "php_el",
"src": "resources/lang/php_el.json",
"isDynamicEntry": true
},
"resources/lang/php_en.json": {
"file": "assets/php_en-B_4MyBvm.js",
"file": "assets/php_en-CJdCVi6I.js",
"name": "php_en",
"src": "resources/lang/php_en.json",
"isDynamicEntry": true
},
"resources/lang/php_es.json": {
"file": "assets/php_es-D7AsCfUZ.js",
"file": "assets/php_es-CBjAegpg.js",
"name": "php_es",
"src": "resources/lang/php_es.json",
"isDynamicEntry": true
},
"resources/lang/php_et.json": {
"file": "assets/php_et-eY3E0N2-.js",
"file": "assets/php_et-Bc3E_9N_.js",
"name": "php_et",
"src": "resources/lang/php_et.json",
"isDynamicEntry": true
},
"resources/lang/php_fi.json": {
"file": "assets/php_fi-C8ccYjSw.js",
"file": "assets/php_fi-BdkyMVsi.js",
"name": "php_fi",
"src": "resources/lang/php_fi.json",
"isDynamicEntry": true
},
"resources/lang/php_fr.json": {
"file": "assets/php_fr-CERV_zYW.js",
"file": "assets/php_fr-DjBUbDPE.js",
"name": "php_fr",
"src": "resources/lang/php_fr.json",
"isDynamicEntry": true
},
"resources/lang/php_hr.json": {
"file": "assets/php_hr-DbtnhMKF.js",
"file": "assets/php_hr-DmHztw9E.js",
"name": "php_hr",
"src": "resources/lang/php_hr.json",
"isDynamicEntry": true
},
"resources/lang/php_hu.json": {
"file": "assets/php_hu-DarOJh2J.js",
"file": "assets/php_hu-BRLOv6_i.js",
"name": "php_hu",
"src": "resources/lang/php_hu.json",
"isDynamicEntry": true
},
"resources/lang/php_it.json": {
"file": "assets/php_it-pZE40Lev.js",
"file": "assets/php_it-C6MxjLu7.js",
"name": "php_it",
"src": "resources/lang/php_it.json",
"isDynamicEntry": true
},
"resources/lang/php_lt.json": {
"file": "assets/php_lt-CB3wivAa.js",
"file": "assets/php_lt-CEPGvss1.js",
"name": "php_lt",
"src": "resources/lang/php_lt.json",
"isDynamicEntry": true
},
"resources/lang/php_lv.json": {
"file": "assets/php_lv-C4AQMGyS.js",
"file": "assets/php_lv-DPS-gfUn.js",
"name": "php_lv",
"src": "resources/lang/php_lv.json",
"isDynamicEntry": true
},
"resources/lang/php_me.json": {
"file": "assets/php_me-t-xAlWx2.js",
"file": "assets/php_me-Cjh17UDP.js",
"name": "php_me",
"src": "resources/lang/php_me.json",
"isDynamicEntry": true
},
"resources/lang/php_mk.json": {
"file": "assets/php_mk-Cld0NAck.js",
"file": "assets/php_mk-B_PU1WFN.js",
"name": "php_mk",
"src": "resources/lang/php_mk.json",
"isDynamicEntry": true
},
"resources/lang/php_mt.json": {
"file": "assets/php_mt-CURrlwLY.js",
"file": "assets/php_mt-CjxM-EBZ.js",
"name": "php_mt",
"src": "resources/lang/php_mt.json",
"isDynamicEntry": true
},
"resources/lang/php_nl.json": {
"file": "assets/php_nl-B_anfuV2.js",
"file": "assets/php_nl-_w7T4irI.js",
"name": "php_nl",
"src": "resources/lang/php_nl.json",
"isDynamicEntry": true
},
"resources/lang/php_pl.json": {
"file": "assets/php_pl-BQN53jqj.js",
"file": "assets/php_pl-CFP-ihjt.js",
"name": "php_pl",
"src": "resources/lang/php_pl.json",
"isDynamicEntry": true
},
"resources/lang/php_pt.json": {
"file": "assets/php_pt-A-jEPacu.js",
"file": "assets/php_pt-i32t06-b.js",
"name": "php_pt",
"src": "resources/lang/php_pt.json",
"isDynamicEntry": true
},
"resources/lang/php_ro.json": {
"file": "assets/php_ro-xEiKbMiT.js",
"file": "assets/php_ro-CQJKC5gH.js",
"name": "php_ro",
"src": "resources/lang/php_ro.json",
"isDynamicEntry": true
},
"resources/lang/php_rs.json": {
"file": "assets/php_rs-m1qFX-Np.js",
"file": "assets/php_rs-DK447crh.js",
"name": "php_rs",
"src": "resources/lang/php_rs.json",
"isDynamicEntry": true
},
"resources/lang/php_sk.json": {
"file": "assets/php_sk-CNmfkYn-.js",
"file": "assets/php_sk-BdcVh0gx.js",
"name": "php_sk",
"src": "resources/lang/php_sk.json",
"isDynamicEntry": true
},
"resources/lang/php_sl.json": {
"file": "assets/php_sl-C7vM1foP.js",
"file": "assets/php_sl-C8zYwZcw.js",
"name": "php_sl",
"src": "resources/lang/php_sl.json",
"isDynamicEntry": true
},
"resources/lang/php_sv.json": {
"file": "assets/php_sv-Bt49BJuK.js",
"file": "assets/php_sv-CAch7Ndi.js",
"name": "php_sv",
"src": "resources/lang/php_sv.json",
"isDynamicEntry": true
},
"resources/lang/php_tr.json": {
"file": "assets/php_tr-C5ORudMF.js",
"file": "assets/php_tr-ChmhwO41.js",
"name": "php_tr",
"src": "resources/lang/php_tr.json",
"isDynamicEntry": true
},
"resources/lang/php_ua.json": {
"file": "assets/php_ua-D33RRV5m.js",
"file": "assets/php_ua-C0cpE4dP.js",
"name": "php_ua",
"src": "resources/lang/php_ua.json",
"isDynamicEntry": true
Expand Down
6 changes: 3 additions & 3 deletions resources/js/components/ResourceCard.vue
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@
</div>

<div
v-if="resource.languages?.[0]?.name"
class="text-slate-500 text-[16px] leading-[22px]"
v-if="resource.main_language?.name || resource.languages?.[0]?.name"
class="text-slate-500 text-[16px] leading-[22px] h-[22px]"
>
Language: {{ resource.languages?.[0]?.name || '' }}
Language: {{ resource.main_language?.name || resource.languages?.[0]?.name || '' }}
</div>

<div
Expand Down
1 change: 1 addition & 0 deletions resources/lang/al/myevents.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
'second_link' => 'udhëzuesin për organizatorët',
],
'view' => 'Shikoni',
'view_lesson' => 'Shiko mësimin',
'status' => [
'APPROVED' => 'MIRATUAR',
'REJECTED' => 'REFUZUAR',
Expand Down
6 changes: 6 additions & 0 deletions resources/lang/al/resources.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,12 @@
'Austrian' => 'Austrian',
'Irish' => 'Irish',
'Slovak' => 'Slovak',
'Hindi' => 'Hindi',
'Bahasa Indonesia' => 'Indonezisht',
'Kiswahili' => 'Suahili',
'Telugu' => 'Telugu',
'Arabic' => 'Arabisht',
'Simplified Chinese' => 'Kinezçe e thjeshtuar',
],
'levels' => [
'Beginner' => 'fillestar',
Expand Down
1 change: 1 addition & 0 deletions resources/lang/ba/myevents.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
'second_link' => 'vodič za organizatore',
],
'view' => 'Pogledajte',
'view_lesson' => 'Pogledaj lekciju',
'status' => [
'APPROVED' => 'ODOBRENO',
'REJECTED' => 'ODBIJENO',
Expand Down
Loading
Loading