Skip to content

Commit c2367e8

Browse files
author
Gareth Redfern
authored
Merge pull request #1 from garethredfern/feature/user-avatar
Add the avatar upload functionality
2 parents 498cc9a + 606f11f commit c2367e8

File tree

8 files changed

+280
-10
lines changed

8 files changed

+280
-10
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use Exception;
6+
use Illuminate\Http\Request;
7+
use App\Http\Resources\UserResource;
8+
use Illuminate\Support\Facades\Auth;
9+
use Illuminate\Support\Facades\Storage;
10+
11+
class AvatarController extends Controller
12+
{
13+
public function store(Request $request)
14+
{
15+
try {
16+
$user = Auth::user();
17+
$filePath = Storage::disk('spaces')
18+
->putFile('avatars/user-'.$user->id, $request->file, 'public');
19+
$user->avatar = env('DO_SPACES_PUBLIC').$filePath;
20+
$user->save();
21+
} catch (Exception $exception) {
22+
return response()->json(['message' => $exception->getMessage()], 409);
23+
}
24+
return new UserResource($user);
25+
}
26+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
use Illuminate\Http\Resources\Json\JsonResource;
6+
7+
class UserResource extends JsonResource
8+
{
9+
/**
10+
* Transform the resource into an array.
11+
*
12+
* @param \Illuminate\Http\Request $request
13+
* @return array
14+
*/
15+
public function toArray($request)
16+
{
17+
return [
18+
'id' => $this->id,
19+
'name' => $this->name,
20+
'email' => $this->email,
21+
'avatar' => $this->avatar,
22+
'emailVerified' => $this->email_verified_at,
23+
];
24+
}
25+
}

app/Models/User.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class User extends Authenticatable implements MustVerifyEmail
2020
protected $fillable = [
2121
'name',
2222
'email',
23+
'avatar',
2324
'password',
2425
];
2526

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
"laravel/fortify": "^1.7",
1616
"laravel/framework": "^8.12",
1717
"laravel/sanctum": "^2.8",
18-
"laravel/tinker": "^2.5"
18+
"laravel/tinker": "^2.5",
19+
"league/flysystem-aws-s3-v3": "^1.0"
1920
},
2021
"require-dev": {
2122
"facade/ignition": "^2.5",

composer.lock

Lines changed: 203 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/filesystems.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@
5252
'endpoint' => env('AWS_ENDPOINT'),
5353
],
5454

55+
'spaces' => [
56+
'driver' => 's3',
57+
'key' => env('DO_SPACES_KEY'),
58+
'secret' => env('DO_SPACES_SECRET'),
59+
'endpoint' => env('DO_SPACES_ENDPOINT'),
60+
'region' => env('DO_SPACES_REGION'),
61+
'bucket' => env('DO_SPACES_BUCKET'),
62+
],
63+
5564
],
5665

5766
/*

database/migrations/2014_10_12_000000_create_users_table.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public function up()
1818
$table->string('name');
1919
$table->string('email')->unique();
2020
$table->timestamp('email_verified_at')->nullable();
21+
$table->string('avatar')->nullable();
2122
$table->string('password');
2223
$table->rememberToken();
2324
$table->timestamps();

routes/api.php

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use Illuminate\Http\Request;
44
use Illuminate\Support\Facades\Route;
55
use App\Http\Controllers\TokenController;
6+
use App\Http\Controllers\AvatarController;
67
use App\Models\User;
78

89
/*
@@ -18,14 +19,18 @@
1819

1920
Route::post('/sanctum/token', TokenController::class);
2021

21-
Route::middleware('auth:sanctum')->get('/users/{user}', function (Request $request) {
22-
return $request->user();
23-
});
22+
Route::middleware(['auth:sanctum'])->group(function () {
23+
Route::get('/users/{user}', function (Request $request) {
24+
return $request->user();
25+
});
2426

25-
Route::middleware('auth:sanctum')->get('/users', function (Request $request) {
26-
return User::all();
27-
});
27+
Route::get('/users', function () {
28+
return User::all();
29+
});
30+
31+
Route::get('/users/auth', function () {
32+
return auth()->user();
33+
});
2834

29-
Route::middleware('auth:sanctum')->get('/users/auth', function (Request $request) {
30-
return auth()->user();
35+
Route::post('/users/auth/avatar', [AvatarController::class, 'store']);
3136
});

0 commit comments

Comments
 (0)