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
2 changes: 1 addition & 1 deletion app/Http/Controllers/CommentController.php
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ public function show(string $commentableType, int $commentableId, int $index)
}
}

\Log::debug("Returned comments: " . json_encode($flattenedComments));
Log::debug("Returned comments: " . json_encode($flattenedComments));
return [
'comments' => $flattenedComments,
'users' => $users->values(),
Expand Down
4 changes: 2 additions & 2 deletions app/Http/Controllers/ComputerScienceResourceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ public function store(StoreResourceRequest $request)
$resource = ComputerScienceResource::create([
'user_id' => Auth::id(),
'name' => $validatedData['name'],
'image_url' => $validatedData['image_url'],
'description' => $validatedData['description'],
'image_url' => $validatedData['image_url'] ?? null,
'page_url' => $validatedData['page_url'],
'platforms' => $validatedData['platforms'],
'difficulty' => $validatedData['difficulty'],
Expand All @@ -55,7 +55,7 @@ public function store(StoreResourceRequest $request)

// Add topics as tags
$resource->topic_tags = $validatedData['topic_tags'];

// Add programming languages as tags (if provided)
if (isset($validatedData['programming_language_tags'])) {
$resource->programming_language_tags = $validatedData['programming_language_tags'];
Expand Down
28 changes: 25 additions & 3 deletions app/Http/Controllers/ResourceEditsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

namespace App\Http\Controllers;

use App\Http\Requests\ResourceEdit\StoreResourceEdit;
use App\Models\ComputerScienceResource;
use App\Models\ResourceEdits;
use App\Services\ResourceEditsService;
use App\Http\Requests\ResourceEdit\StoreResourceEdit;
use App\Http\Resources\ComputerScienceResourceResource;
use Arr;
use Auth;
use Inertia\Inertia;
use Log;
Expand Down Expand Up @@ -39,6 +41,18 @@ public function create(ComputerScienceResource $computerScienceResource)
]);
}


// TODO: Make an array facade
function normalize($array) {
ksort($array);
foreach ($array as &$value) {
if (is_array($value)) {
sort($value); // Assumes it's a flat array of values
}
}
return $array;
}

/**
* Store the edits request.
*/
Expand All @@ -47,15 +61,23 @@ public function store(ComputerScienceResource $computerScienceResource, StoreRes
$validatedData = $request->validated();
Log::debug("Creating a resource edit: " . json_encode($validatedData));

// Ensure that they are not the same
$originalData = $this->normalize((new ComputerScienceResourceResource($computerScienceResource))->resolve());
$editData = $this->normalize($validatedData);
unset($editData['edit_title'], $editData['edit_description']);

if ($originalData == $editData) {
return response()->json(['message' => 'No changes detected'], 422);
}

$resourceEdit = ResourceEdits::create([
'user_id' => Auth::id(),
'computer_science_resource_id' => $computerScienceResource->id,
'edit_title' => $validatedData['edit_title'],
'edit_description' => $validatedData['edit_description'],

'image_url' => $validatedData['image_url'],
'name' => $validatedData['name'],
'description' => $validatedData['description'],
'image_url' => $validatedData['image_url'] ?? null,
'page_url' => $validatedData['page_url'],
'platforms' => $validatedData['platforms'],
'difficulty' => $validatedData['difficulty'],
Expand Down
17 changes: 15 additions & 2 deletions app/Http/Controllers/ResourceReviewController.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,29 @@
use App\Models\ResourceReview;
use Auth;
use Illuminate\Support\Facades\Log;
use Redirect;

class ResourceReviewController extends Controller
{
// Store the review on the resource
public function store(StoreResourceReview $request, ComputerScienceResource $computerScienceResource)
{
Log::debug("Storing resource review: " . json_encode($request));

// Validate the request data
$validatedData = $request->validated();

$existingReview = ResourceReview::where([
'user_id' => Auth::id(),
'computer_science_resource_id' => $computerScienceResource->id,
])->first();

if ($existingReview) {
Log::debug("User has already posted a review");
// TODO: Make it a json with errors instead
return back()->with('warning', 'You already have a review posted, you should edit your existing one instead.');
}

Log::debug("Storing resource review: " . json_encode($validatedData));

// Create the resource review
$review = ResourceReview::create([
'user_id' => Auth::id(),
Expand All @@ -37,6 +49,7 @@ public function store(StoreResourceReview $request, ComputerScienceResource $com

ResourceReviewProcessed::dispatch($computerScienceResource->id, null, $review->attributesToArray());

// Json with success
return to_route('resources.show', ['computerScienceResource' => $review->computer_science_resource_id])
->with('success', 'Review created successfully!');
}
Expand Down
23 changes: 4 additions & 19 deletions app/Http/Requests/ComputerScienceResource/StoreResourceRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

namespace App\Http\Requests\ComputerScienceResource;

use App\Http\Requests\Shared\ComputerScienceResourceRequest;
use Auth;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class StoreResourceRequest extends FormRequest
{
use ComputerScienceResourceRequest;

/**
* Determine if the user is authorized to make this request.
*/
Expand All @@ -23,23 +25,6 @@ public function authorize(): bool
*/
public function rules(): array
{
return [
'name' => ['required', 'string', 'max:100'],
'description' => ['required', 'string', 'max:10000'],
'platforms' => ['required', 'array'],
'platforms.*' => ['distinct', 'string', Rule::in(config('computerScienceResource.platforms'))],
'page_url' => ['required', 'string', 'url:http,https', 'max:255'],
'difficulty' => ['required', 'string', Rule::in(config('computerScienceResource.difficulties'))],
'pricing' => ['required', 'string', Rule::in(config('computerScienceResource.pricings'))],
'topic_tags' => ['required', 'array', 'min:3'],
'topic_tags.*' => ['required', 'distinct', 'string', 'max:50'],

// Optional fields
'image_url' => ['nullable', 'string', 'url:http,https', 'max:255'],
'general_tags' => ['nullable', 'array'],
'general_tags.*' => ['distinct', 'string', 'max:50'],
'programming_language_tags' => ['nullable', 'array'],
'programming_language_tags.*' => ['distinct', 'string', 'max:50']
];
return $this->baseResourceRules();
}
}
10 changes: 4 additions & 6 deletions app/Http/Requests/ResourceEdit/StoreResourceEdit.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

namespace App\Http\Requests\ResourceEdit;

use App\Http\Requests\ComputerScienceResource\StoreResourceRequest;
use App\Http\Requests\Shared\ComputerScienceResourceRequest;
use Auth;
use Illuminate\Foundation\Http\FormRequest;

class StoreResourceEdit extends FormRequest
{
use ComputerScienceResourceRequest;
/**
* Determine if the user is authorized to make this request.
*/
Expand All @@ -23,12 +24,9 @@ public function authorize(): bool
*/
public function rules(): array
{
// Have the same validation rules as a resource
$storeResourceRequest = new StoreResourceRequest();

return array_merge([
return array_merge($this->baseResourceRules(), [
'edit_title' => ['required', 'string', 'max:100'],
'edit_description' => ['required', 'string', 'max:10000'],
], $storeResourceRequest->rules());
]);
}
}
1 change: 0 additions & 1 deletion app/Http/Requests/ResourceReview/StoreResourceReview.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace App\Http\Requests\ResourceReview;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class StoreResourceReview extends FormRequest
{
Expand Down
32 changes: 32 additions & 0 deletions app/Http/Requests/Shared/ComputerScienceResourceRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace App\Http\Requests\Shared;

use Illuminate\Validation\Rule;

trait ComputerScienceResourceRequest
{
public function baseResourceRules(): array
{
return [
'name' => ['required', 'string', 'max:100'],
'description' => ['required', 'string', 'max:10000'],
'platforms' => ['required', 'array', 'min:1'],
'platforms.*' => ['required', 'distinct', 'string', Rule::in(config('computerScienceResource.platforms'))],
'page_url' => ['required', 'string', 'url:http,https', 'max:255'],
'image_url' => ['nullable', 'string', 'url:http,https', 'max:255'],
'difficulty' => ['required', 'string', Rule::in(config('computerScienceResource.difficulties'))],
'pricing' => ['required', 'string', Rule::in(config('computerScienceResource.pricings'))],

'topic_tags' => ['required', 'array', 'min:3'],
'topic_tags.*' => ['required', 'distinct', 'string', 'max:50'],

// Optional
'general_tags' => ['array'],
'general_tags.*' => ['required', 'distinct', 'string', 'max:50'],
'programming_language_tags' => ['array'],
'programming_language_tags.*' => ['required', 'distinct', 'string', 'max:50'],
];
}

}
30 changes: 30 additions & 0 deletions app/Http/Resources/ComputerScienceResourceResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class ComputerScienceResourceResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'name' => $this->name,
'description' => $this->description,
'page_url' => $this->page_url,
'image_url' => $this->image_url,
'platforms' => $this->platforms,
'difficulty' => $this->difficulty,
'pricing' => $this->pricing,
'topic_tags' => $this->topic_tags,
'programming_language_tags' => $this->programming_language_tags,
'general_tags' => $this->general_tags,
];
}
}
2 changes: 1 addition & 1 deletion config/comment.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
return [
'max_replies' => 150,
'max_depth' => 7, // 1-indexed, 1 is the start
'pagination_limit' => 2,
'pagination_limit' => 3,
'commentable_types' => ['review', 'comment', 'edit', 'resource']
];
2 changes: 0 additions & 2 deletions config/computerScienceResource.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<?php

use Illuminate\Support\Str;

return [
'platforms' => ['book', 'podcast', 'youtube_channel', 'blog', 'website', 'organization', 'bootcamp', 'newsletter', 'workshop', 'course', 'forum', 'mobile_app', 'desktop_app', 'magazine'],
'difficulties' => ['beginner', 'industry_simple', 'industry_standard', 'industry_professional', 'academic'],
Expand Down
13 changes: 10 additions & 3 deletions database/factories/ResourceEditsFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,16 @@ public function definition(): array
$pricings = config('computerScienceResource.pricings');

return [
'computer_science_resource_id' => ComputerScienceResource::factory(),
'user_id' => User::factory(),

'computer_science_resource_id' => function () {
return ComputerScienceResource::inRandomOrder()->firstOr(function () {
return ComputerScienceResource::factory()->create();
})->id;
},
'user_id' => function () {
return User::inRandomOrder()->firstOr(function () {
return User::factory()->create();
})->id;
},
'edit_title' => $this->faker->sentence,
'edit_description' => $this->faker->paragraph,

Expand Down
6 changes: 1 addition & 5 deletions database/factories/ResourceReviewFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,7 @@ class ResourceReviewFactory extends Factory
public function definition(): array
{
return [
'user_id' => function () {
return User::inRandomOrder()->firstOr(function () {
return User::factory()->create();
})->id;
},
'user_id' => User::factory()->create()->id, // Is creating a new user since we need users to be unique per review
'computer_science_resource_id' => function () {
return ComputerScienceResource::firstOr(function () {
return ComputerScienceResource::factory()->create();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ public function up(): void

$table->string('name')->fulltext();
$table->text('description')->fulltext();
$table->string('image_url');
$table->string('image_url')->nullable();

// TODO: Have a url for each platform the resource is on.
$table->string('page_url');

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ public function up(): void
$table->id();
$table->foreignIdFor(User::class)->index();
$table->foreignIdFor(ComputerScienceResource::class)->index();

$table->unique([
'user_id',
'computer_science_resource_id'
]);

// Text
$table->string('title');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ public function up(): void
// Copied Schema of Computer Science Resource
$table->string('name')->fulltext();
$table->text('description')->fulltext();
$table->string('image_url');

// TODO: have it be nullable or something
$table->string('image_url')->nullable();

$table->string('page_url');

Expand Down
1 change: 0 additions & 1 deletion database/seeders/ComputerScienceResourceSeeder.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ class ComputerScienceResourceSeeder extends Seeder
*/
public function run(): void
{
Log::info('Running ComputerScienceResourceSeeder');
ComputerScienceResource::factory(1)->create();
}
}
10 changes: 3 additions & 7 deletions tests/Feature/ComputerScienceResourceControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public function test_can_post_resource()

$formData = ComputerScienceResourceTestResource::fake();

Log::debug("Form data: ". json_encode($formData));
$response = $this->postJson(route('resources.store'), $formData);

$response->assertStatus(302); // a redirect after successful creation
Expand All @@ -36,11 +37,6 @@ public function test_can_post_resource()
// Check it is created
$createdResource = ComputerScienceResource::where('name', $formData['name'])->first();
$this->assertNotNull($createdResource);

// Check tags
$this->assertEquals($formData['topic_tags'], $createdResource->topic_tags);
$this->assertEquals($formData['programming_language_tags'], $createdResource->programming_language_tags);
$this->assertEquals($formData['general_tags'], $createdResource->general_tags);
}

public function test_cannot_post_resource_unauthed()
Expand Down Expand Up @@ -84,8 +80,8 @@ public function test_cannot_post_resource_with_invalid_fields()
'pricing' => 'invalid_pricing',
'topic_tags' => ['tag1', 'tag2'], // Less than required minimum of 3
'image_url' => 'not-a-url',
'general_tags' => 'not-an-array',
'programming_language_tags' => 'not-an-array'
'programming_language_tags' => null,
'general_tags' => ['a','a','a'], // Not distinct
];

// Choose from one of the invalid fields
Expand Down
Loading
Loading