Skip to content

Commit 90ad3c9

Browse files
committed
wrap up change proposals
1 parent d352b5a commit 90ad3c9

File tree

9 files changed

+113
-36
lines changed

9 files changed

+113
-36
lines changed

app/Console/Commands/DeleteTempUploadedFiles.php

+11-4
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,19 @@ class DeleteTempUploadedFiles extends Command
2727
*/
2828
public function handle(): void
2929
{
30-
foreach (Storage::directories('tmp') as $directory) {
31-
$directoryLastModified = Carbon::createFromTimestamp(Storage::lastModified($directory));
30+
$startTime = microtime(true);
31+
foreach (Storage::files('tmp') as $file) {
32+
$lastModified = Carbon::createFromTimestamp(Storage::lastModified($file));
3233

33-
if (now()->diffInHours($directoryLastModified) > 24) {
34-
Storage::deleteDirectory($directory);
34+
$this->info("Checking $file");
35+
if (now()->diffInDays($lastModified) > 3) {
36+
Storage::delete($file);
37+
$this->info("Deleted $file");
3538
}
3639
}
40+
$endTime = microtime(true);
41+
$executionTime = $endTime - $startTime;
42+
43+
$this->info("[{$executionTime}] Deleting temp files finished successfully.");
3744
}
3845
}

app/Filament/Resources/ChangeProposalResource.php

+25
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
use Filament\Forms\Form;
1818
use Filament\Tables;
1919
use Filament\Tables\Table;
20+
use Illuminate\Support\Facades\Storage;
21+
use Illuminate\Support\HtmlString;
2022
use Novadaemon\FilamentPrettyJson\PrettyJson;
2123

2224
class ChangeProposalResource extends CustomResource
@@ -37,13 +39,36 @@ public static function canCreate(): bool
3739

3840
public static function form(Form $form): Form
3941
{
42+
$data = $form->getRecord()->data;
43+
4044
$basicSection = BasicSection::make([
4145
Forms\Components\Textarea::make('reviewer_description')
4246
->minLength(3)
4347
->columnSpanFull()
4448
->maxLength(1024),
4549
PrettyJson::make('data')
4650
->columnSpanFull(),
51+
Forms\Components\Section::make('Images')
52+
->visible(function () use ($data) {
53+
return collect($data)
54+
->hasAny(['image_path', 'screenshots_path']);
55+
})
56+
->schema([
57+
Forms\Components\Placeholder::make('image')
58+
->visible(fn () => collect($data)->has('image_path'))
59+
->content(function () use ($data) {
60+
return new HtmlString('<img src="'.Storage::url(data_get($data, 'image_path')).'" />');
61+
}),
62+
Forms\Components\Placeholder::make('screenshots')
63+
->visible(fn () => collect($data)->has('screenshots_path'))
64+
->content(function () use ($data) {
65+
return new HtmlString(
66+
collect(data_get($data, 'screenshots_path'))->map(function ($path) {
67+
return '<img src="'.Storage::url($path).'" />';
68+
})->implode(' ')
69+
);
70+
}),
71+
]),
4772
Forms\Components\Select::make('user_id')
4873
->searchable()
4974
->preload()

app/Filament/Resources/ChangeProposalResource/Pages/EditChangeProposal.php

+21-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Filament\Actions;
1010
use Filament\Notifications\Notification;
1111
use Filament\Resources\Pages\EditRecord;
12+
use Spatie\MediaLibrary\MediaCollections\Exceptions\FileDoesNotExist;
1213

1314
class EditChangeProposal extends EditRecord
1415
{
@@ -23,9 +24,28 @@ protected function mergeChangeProposal(ChangeProposal $changeProposal): void
2324
/** @var Project $project */
2425
$project = $changeProposal->model;
2526

26-
$project->update($collection->except('maintainers')->toArray());
27+
$project->update($collection->except(['maintainers', 'image_path', 'screenshots_path'])->toArray());
2728
$project->maintainers()->sync($collection->get('maintainers'));
2829

30+
if ($collection->has('image_path')) {
31+
try {
32+
$project
33+
->addMediaFromDisk($collection->get('image_path'))
34+
->toMediaCollection('image');
35+
} catch (FileDoesNotExist $e) {
36+
}
37+
}
38+
39+
if ($collection->has('screenshots_path')) {
40+
foreach ($collection->get('screenshots_path') as $screenshot) {
41+
try {
42+
$project->addMediaFromDisk($screenshot)
43+
->toMediaCollection('screenshots');
44+
} catch (FileDoesNotExist $e) {
45+
}
46+
}
47+
}
48+
2949
Notification::make()
3050
->title('Change Proposal merged successfully.')
3151
->success()

app/Http/Controllers/Project/ProjectController.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public function show(Project $project): ProjectFullResource
9595
'category',
9696
'user',
9797
'userReview.user',
98-
'reviews' => fn(HasMany $builder) => $builder
98+
'reviews' => fn (HasMany $builder) => $builder
9999
->with('user')
100100
->where('status', StatusEnum::Approved)
101101
->take(10),

app/Http/Controllers/Project/ProjectImageController.php

+13-16
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace App\Http\Controllers\Project;
44

5+
use App\Enums\StatusEnum;
56
use App\Http\Controllers\Controller;
67
use App\Models\Project;
78
use App\Rules\FileUpload;
@@ -20,28 +21,24 @@ class ProjectImageController extends Controller
2021
*/
2122
public function store(Request $request, Project $project): JsonResponse
2223
{
23-
$this->authorize('update', $project);
24+
$this->authorize('updateImages', $project);
2425

2526
$request->validate([
2627
'image_path' => ['bail', 'required', 'string', new FileUpload(['image/png', 'image/jpeg'])],
2728
]);
2829

29-
$project
30-
->addMediaFromDisk($request->input('image_path'))
31-
->toMediaCollection('image');
30+
if ($project->status === StatusEnum::Draft) {
31+
$project
32+
->addMediaFromDisk($request->input('image_path'))
33+
->toMediaCollection('image');
34+
} else {
35+
$changeProposal = $project->latestChangeProposal;
36+
$changeProposal->update(['data' => [
37+
...$changeProposal->data,
38+
'image_path' => $request->input('image_path'),
39+
]]);
40+
}
3241

3342
return new JsonResponse(['message' => 'Image has been saved successfully.']);
3443
}
35-
36-
/**
37-
* @throws AuthorizationException
38-
*/
39-
public function destroy(Project $project): JsonResponse
40-
{
41-
$this->authorize('update', $project);
42-
43-
$project->image?->delete();
44-
45-
return new JsonResponse(['message' => 'Image has been deleted successfully.']);
46-
}
4744
}

app/Http/Controllers/Project/ScreenshotController.php

+14-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace App\Http\Controllers\Project;
44

5+
use App\Enums\StatusEnum;
56
use App\Http\Controllers\Controller;
67
use App\Models\Project;
78
use App\Rules\FileUpload;
@@ -20,16 +21,24 @@ class ScreenshotController extends Controller
2021
*/
2122
public function store(Request $request, Project $project): JsonResponse
2223
{
23-
$this->authorize('update', $project);
24+
$this->authorize('updateImages', $project);
2425

2526
$request->validate([
2627
'screenshots_path' => ['required', 'array', 'max:5'],
2728
'screenshots_path.*' => ['bail', 'required', 'string', new FileUpload(['image/png', 'image/jpeg'])],
2829
]);
2930

30-
foreach ($request->input('screenshots_path') as $screenshot) {
31-
$project->addMediaFromDisk($screenshot)
32-
->toMediaCollection('screenshots');
31+
if ($project->status === StatusEnum::Draft) {
32+
foreach ($request->input('screenshots_path') as $screenshot) {
33+
$project->addMediaFromDisk($screenshot)
34+
->toMediaCollection('screenshots');
35+
}
36+
} else {
37+
$changeProposal = $project->latestChangeProposal;
38+
$changeProposal->update(['data' => [
39+
...$changeProposal->data,
40+
'screenshots_path' => $request->input('screenshots_path'),
41+
]]);
3342
}
3443

3544
return new JsonResponse(['message' => 'Screenshots has been saved successfully.']);
@@ -40,7 +49,7 @@ public function store(Request $request, Project $project): JsonResponse
4049
*/
4150
public function destroy(Project $project, int $media): JsonResponse
4251
{
43-
$this->authorize('update', $project);
52+
$this->authorize('deleteImages', $project);
4453

4554
$project->screenshots()
4655
->where('id', $media)

app/Http/Requests/Release/StoreReleaseRequest.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ public function after(): array
4242
new ValidateReleaseVersionName,
4343
];
4444

45-
// if (! app()->runningUnitTests()) {
46-
// $base[] = new ValidateReleaseFile;
47-
// }
45+
// if (! app()->runningUnitTests()) {
46+
// $base[] = new ValidateReleaseFile;
47+
// }
4848

4949
return $base;
5050
}

app/Policies/ProjectPolicy.php

+24-5
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@
77
use App\Models\User;
88
use App\Services\ProjectService;
99
use Illuminate\Auth\Access\Response;
10-
use Illuminate\Support\Facades\Auth;
1110

1211
class ProjectPolicy
1312
{
14-
public function __construct(private readonly ProjectService $projectService)
15-
{
16-
}
13+
public function __construct(private readonly ProjectService $projectService) {}
1714

1815
/**
1916
* Determine whether the user can view any models.
@@ -47,7 +44,7 @@ public function publish(User $user, Project $project): Response
4744
return Response::deny("You can publish a project to get reviewed only when It's in Draft");
4845
}
4946

50-
if (!$this->projectService->isMaintainer($user->id, $project)) {
47+
if (! $this->projectService->isMaintainer($user->id, $project)) {
5148
return Response::deny('You are not the maintainer of this project');
5249
}
5350

@@ -76,6 +73,28 @@ public function update(User $user, Project $project): Response
7673
: Response::deny("You're not a maintainer of this project");
7774
}
7875

76+
public function updateImages(User $user, Project $project): Response
77+
{
78+
if (! $this->projectService->isMaintainer($user->id, $project)) {
79+
Response::deny("You're not a maintainer of this project");
80+
}
81+
82+
if ($project->status !== StatusEnum::Draft && $project->latestChangeProposal?->status !== StatusEnum::UnderReview) {
83+
return Response::deny("You can update the images when there's a UnderReview change proposal.");
84+
}
85+
86+
return Response::allow();
87+
}
88+
89+
public function deleteImages(User $user, Project $project): Response
90+
{
91+
if (! $this->projectService->isMaintainer($user->id, $project)) {
92+
Response::deny("You're not a maintainer of this project");
93+
}
94+
95+
return Response::allow();
96+
}
97+
7998
/**
8099
* Determine whether the user can delete the model.
81100
*/

routes/api.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
Route::apiResource('projects', ProjectController::class);
3636
Route::post('projects/{project}/publish', [ProjectController::class, 'publish'])->name('projects.publish');
37-
Route::apiSingleton('projects.image', ProjectImageController::class)->creatable()->only(['store', 'destroy']);
37+
Route::apiSingleton('projects.image', ProjectImageController::class)->creatable()->only(['store']);
3838
Route::apiResource('projects.screenshots', ScreenshotController::class)->only(['store', 'destroy']);
3939

4040
Route::apiResource('categories', CategoryController::class)->only(['index', 'show']);

0 commit comments

Comments
 (0)