Skip to content

Commit 78e0f0b

Browse files
authored
Huge Beta Release Fixes (#31)
* Fix1 * Create page in progress * Guidelines * Tests * Apply automatic changes * Mobile friendly * Tests n Stuff * Apply automatic changes * loading commentable * Tags * Tags, different lanes, needs migration and reset * Apply automatic changes * Tests * More Fixes * Fixed Filterbar * Resource edits * Apply automatic changes * Prefetch * Tag Upgrade * Good enough software * Upvote if resource created * Apply automatic changes * More fixes * Apply automatic changes * Tags * Admin Panel
1 parent 25f463c commit 78e0f0b

56 files changed

Lines changed: 7102 additions & 1919 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

_ide_helper.php

Lines changed: 5903 additions & 1149 deletions
Large diffs are not rendered by default.

app/Events/TagFrequencyChanged.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ class TagFrequencyChanged
1414
/**
1515
* Create a new event instance.
1616
*/
17-
public function __construct(public ?array $oldTags, public ?array $newTags) {}
17+
public function __construct(
18+
public string $tagType,
19+
public array $oldTags,
20+
public array $newTags
21+
) {}
1822

1923
/**
2024
* Get the channels the event should broadcast on.

app/Filament/Admin/Resources/ComputerScienceResource.php

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@
55
use App\Filament\Admin\Resources\ComputerScienceResource\Pages;
66
use App\Filament\Admin\Resources\UserResource\RelationManagers\UserRelationManager;
77
use App\Models\ComputerScienceResource as ModelsComputerScienceResource;
8+
use Filament\Forms;
9+
use Filament\Forms\Form;
810
use Filament\Resources\Resource;
911
use Filament\Tables;
12+
use Filament\Tables\Actions\BulkAction;
13+
use Filament\Tables\Actions\DeleteAction;
1014
use Filament\Tables\Columns\TextColumn;
1115
use Filament\Tables\Filters\SelectFilter;
1216
use Filament\Tables\Table;
1317
use Illuminate\Database\Eloquent\Builder;
18+
use Illuminate\Database\Eloquent\Collection;
1419

1520
class ComputerScienceResource extends Resource
1621
{
@@ -24,6 +29,51 @@ public static function getEloquentQuery(): Builder
2429

2530
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
2631

32+
public static function form(Form $form): Form
33+
{
34+
return $form
35+
->schema([
36+
Forms\Components\TextInput::make('name')
37+
->required()
38+
->maxLength(255),
39+
40+
Forms\Components\Textarea::make('description')
41+
->maxLength(65535)
42+
->columnSpanFull(),
43+
44+
Forms\Components\TextInput::make('slug')
45+
->maxLength(255),
46+
47+
Forms\Components\Select::make('user_id')
48+
->relationship('user', 'name')
49+
->required(),
50+
51+
Forms\Components\TagsInput::make('topic_tags')
52+
->label('Topic Tags')
53+
->disabled()
54+
->helperText('These are computed from relationships'),
55+
56+
Forms\Components\TagsInput::make('programming_language_tags')
57+
->label('Programming Language Tags')
58+
->disabled()
59+
->helperText('These are computed from relationships'),
60+
61+
Forms\Components\TagsInput::make('general_tags')
62+
->label('General Tags')
63+
->disabled()
64+
->helperText('These are computed from relationships'),
65+
66+
// Editable date fields
67+
Forms\Components\DateTimePicker::make('created_at')
68+
->label('Created Date')
69+
->seconds(false),
70+
71+
Forms\Components\DateTimePicker::make('updated_at')
72+
->label('Updated Date')
73+
->seconds(false),
74+
]);
75+
}
76+
2777
public static function table(Table $table): Table
2878
{
2979
return $table
@@ -35,7 +85,7 @@ public static function table(Table $table): Table
3585
TextColumn::make('name')->searchable()
3686
->description(fn (ModelsComputerScienceResource $resource): string => $resource->description)->wrap(),
3787
TextColumn::make('topic_tags')
38-
->label('Topics')
88+
->label('topics_tags')
3989
->badge()
4090
->color('primary')
4191
->getStateUsing(fn ($record) => $record->topic_tags),
@@ -57,10 +107,29 @@ public static function table(Table $table): Table
57107
])
58108
->actions([
59109
Tables\Actions\EditAction::make(),
110+
// Custom delete action that uses model delete() method
111+
DeleteAction::make()
112+
->action(function (ModelsComputerScienceResource $record) {
113+
// This calls the model's delete() method, triggering all events
114+
$record->delete();
115+
}),
60116
])
61117
->bulkActions([
62118
Tables\Actions\BulkActionGroup::make([
63-
Tables\Actions\DeleteBulkAction::make(),
119+
// Custom bulk delete action that uses model delete() method
120+
BulkAction::make('delete')
121+
->label('Delete selected')
122+
->icon('heroicon-o-trash')
123+
->color('danger')
124+
->requiresConfirmation()
125+
->action(function (Collection $records) {
126+
// Loop through each record and call delete() individually
127+
// This ensures all model events and custom logic are triggered
128+
$records->each(function ($record) {
129+
$record->delete();
130+
});
131+
})
132+
->deselectRecordsAfterCompletion(),
64133
]),
65134
]);
66135
}

app/Http/Controllers/ComputerScienceResourceController.php

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace App\Http\Controllers;
44

5-
use App\Events\TagFrequencyChanged;
65
use App\Http\Requests\StoreResourceRequest;
76
use App\Models\ComputerScienceResource;
87
use App\Models\NewsPost;
@@ -13,6 +12,7 @@
1312
use App\Services\ResourceReviewService;
1413
use App\Services\SortingManagers\GeneralVotesSortingManager;
1514
use App\Services\SortingManagers\ResourceSortingManager;
15+
use App\Services\UpvoteService;
1616
use Illuminate\Http\Request;
1717
use Illuminate\Support\Facades\Auth;
1818
use Illuminate\Support\Facades\DB;
@@ -27,6 +27,7 @@ public function __construct(
2727
protected GeneralVotesSortingManager $generalVotesSortingManager,
2828
protected ResourceReviewService $reviewService,
2929
protected ResourceSortingManager $resourceSortingManager,
30+
protected UpvoteService $upvoteService,
3031
) {}
3132

3233
/**
@@ -109,11 +110,10 @@ public function store(StoreResourceRequest $request)
109110
$resource->general_tags = $validatedData['general_tags'];
110111
}
111112

112-
// Dispatch tag frequency change event
113-
TagFrequencyChanged::dispatch(null, $resource->tagCounter());
114-
115113
DB::commit();
116114

115+
$this->upvoteService->upvote('resource', $resource->id);
116+
117117
Log::info('Resource created', [
118118
'resource_id' => $resource->id,
119119
'user_id' => Auth::id(),
@@ -122,8 +122,9 @@ public function store(StoreResourceRequest $request)
122122
'platforms' => $resource->platforms,
123123
]);
124124

125-
return redirect(route('resources.show', ['slug' => $resource->slug]))
126-
->with('success', 'Created Resource Succesfully!');
125+
session()->flash('success', 'Created Resource!');
126+
127+
return response()->json($resource);
127128
} catch (Throwable $e) {
128129
DB::rollBack();
129130
Log::critical('Failed to create resource', [
@@ -133,7 +134,7 @@ public function store(StoreResourceRequest $request)
133134
'data' => $validatedData,
134135
]);
135136

136-
return back()->withErrors(['error' => 'Failed to create resource. Please try again.']);
137+
return response()->json([], 500);
137138
}
138139
}
139140

@@ -168,14 +169,15 @@ public function show(Request $request, string $slug, string $tab = 'reviews')
168169
if ($tab === 'reviews') {
169170
$userReview = null;
170171
if ($userId = Auth::id()) {
171-
$userReview = ResourceReview::where('user_id', $userId)->first();
172+
$userReview = ResourceReview::whereBelongsTo($computerScienceResource)
173+
->firstWhere('user_id', $userId);
172174
}
173175

174176
$data['userReview'] = $userReview;
175177

176178
$data['reviews'] = Inertia::defer(
177179
function () use ($computerScienceResource, $sortBy, $request) {
178-
$query = ResourceReview::where('computer_science_resource_id', $computerScienceResource->id);
180+
$query = ResourceReview::whereBelongsTo($computerScienceResource);
179181
$query = $this->generalVotesSortingManager->applySort($query, $sortBy, ResourceReview::class);
180182

181183
return $query->with('user')->paginate(10)->appends($request->query());
@@ -184,7 +186,7 @@ function () use ($computerScienceResource, $sortBy, $request) {
184186
} elseif ($tab === 'edits') {
185187
$data['resourceEdits'] = Inertia::defer(
186188
function () use ($computerScienceResource, $sortBy, $request) {
187-
$query = ResourceEdits::where('computer_science_resource_id', $computerScienceResource->id);
189+
$query = ResourceEdits::whereBelongsTo($computerScienceResource);
188190
$query = $this->generalVotesSortingManager->applySort($query, $sortBy, ResourceEdits::class);
189191

190192
return $query->with('user')->paginate(10)->appends($request->query());

app/Http/Controllers/ResourceEditsController.php

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace App\Http\Controllers;
44

5-
use App\Events\TagFrequencyChanged;
65
use App\Http\Requests\StoreResourceEdit;
76
use App\Models\ComputerScienceResource;
87
use App\Models\ResourceEdits;
@@ -69,7 +68,7 @@ public function store(ComputerScienceResource $computerScienceResource, StoreRes
6968
]);
7069

7170
return redirect()->route('resource_edits.show', ['slug' => $resourceEdit->slug])
72-
->with('success', 'The proposed edits were created. Others can now view it.');
71+
->with('success', 'Edits Created!');
7372
}
7473

7574
/**
@@ -95,7 +94,7 @@ public function show(string $slug)
9594
{
9695
$resourceEdits = ResourceEdits::where('slug', $slug)->firstOrFail();
9796

98-
$resourceEdits->load('resource');
97+
$resourceEdits->load('computerScienceResource');
9998
$resourceEdits->load('user');
10099

101100
return Inertia::render('ResourceEdits/Show', [
@@ -112,7 +111,6 @@ public function merge(ResourceEditsService $editsService, ResourceEdits $resourc
112111
DB::beginTransaction();
113112
try {
114113
$resource = ComputerScienceResource::findOrFail($resourceEdits->computer_science_resource_id);
115-
$oldTagCounter = $resource->tagCounter();
116114

117115
// Go through each property in proposed_changes, and if it exists. then set the value
118116
$changes = $resourceEdits->proposed_changes;
@@ -151,11 +149,6 @@ public function merge(ResourceEditsService $editsService, ResourceEdits $resourc
151149
}
152150
}
153151

154-
// Get the new tag counter
155-
$newTags = collect($allTags)->flatten()->countBy()->toArray();
156-
// Change tag frequency
157-
TagFrequencyChanged::dispatch($oldTagCounter, $newTags);
158-
159152
// Delete the edit since we successfully merged the changes
160153
$resourceEdits->delete();
161154

@@ -170,7 +163,7 @@ public function merge(ResourceEditsService $editsService, ResourceEdits $resourc
170163
]);
171164

172165
return redirect(route('resources.show', ['slug' => $resource->slug]))
173-
->with('success', 'Successfully merged new changed!');
166+
->with('success', 'Successfully Merged Changes!');
174167
} catch (Throwable $e) {
175168
DB::rollBack();
176169
Log::critical('Failed to merge resource edits', [

app/Http/Controllers/ResourceReviewController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public function store(StoreResourceReview $request, ComputerScienceResource $com
5858
'review_id' => $review->id,
5959
]);
6060

61-
return response()->json();
61+
return response()->json($review);
6262
}
6363

6464
public function update(StoreResourceReview $request, ComputerScienceResource $computerScienceResource)
@@ -106,6 +106,6 @@ public function update(StoreResourceReview $request, ComputerScienceResource $co
106106
'review_id' => $existingReview->id,
107107
]);
108108

109-
return response()->json();
109+
return response()->json($existingReview);
110110
}
111111
}

app/Http/Controllers/TagFrequencyController.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,22 @@
66

77
class TagFrequencyController extends Controller
88
{
9-
public function search(string $query = '')
9+
public function search(string $type, string $query = '')
1010
{
1111
if (strlen($query) > 50) {
12-
return response()->json(['message' => 'Query too long.'], 422);
12+
return response()->json(['message' => 'Query too long'], 422);
1313
}
1414

15-
$prefixed_tags = TagFrequency::where('tag', 'like', $query.'%')
15+
if (! in_array($type, ['topics_tags', 'programming_languages_tags', 'general_tags'])) {
16+
return response()->json(['message' => 'Not a valid type'], 422);
17+
}
18+
19+
$escaped = addcslashes($query, '%_\\');
20+
21+
$prefixed_tags = TagFrequency::where('tag', 'like', $escaped.'%')
22+
->where('type', $type)
1623
->orderByDesc('count')
17-
->limit(20)
24+
->limit(30)
1825
->get();
1926

2027
return response()->json([

0 commit comments

Comments
 (0)