Skip to content

Commit a591ef5

Browse files
author
Gareth Redfern
authored
Merge pull request #2 from garethredfern/messaging
Messaging
2 parents 4591284 + ad36d3d commit a591ef5

File tree

8 files changed

+218
-0
lines changed

8 files changed

+218
-0
lines changed
+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use App\Models\Message;
6+
use Illuminate\Http\Request;
7+
use Illuminate\Support\Facades\Auth;
8+
use App\Http\Resources\MessageResource;
9+
use App\Http\Requests\StoreMessageRequest;
10+
11+
class MessageController extends Controller
12+
{
13+
/**
14+
* Display a listing of the resource.
15+
*
16+
* @return \Illuminate\Http\Response
17+
*/
18+
public function index()
19+
{
20+
$messages = Message::orderByDesc('created_at')->paginate(6);
21+
return MessageResource::collection($messages);
22+
}
23+
24+
/**
25+
* Store a newly created resource in storage.
26+
*
27+
* @param \Illuminate\Http\Request $request
28+
* @return \Illuminate\Http\Response
29+
*/
30+
public function store(StoreMessageRequest $request)
31+
{
32+
$user = Auth::user();
33+
$message = new Message(['body' => $request->body]);
34+
$user->messages()->save($message);
35+
36+
$messages = Message::orderByDesc('created_at')->paginate(6);
37+
return MessageResource::collection($messages);
38+
}
39+
40+
/**
41+
* Display the specified resource.
42+
*
43+
* @param int $id
44+
* @return \Illuminate\Http\Response
45+
*/
46+
public function show($id)
47+
{
48+
//
49+
}
50+
51+
/**
52+
* Update the specified resource in storage.
53+
*
54+
* @param \Illuminate\Http\Request $request
55+
* @param int $id
56+
* @return \Illuminate\Http\Response
57+
*/
58+
public function update(Request $request, $id)
59+
{
60+
//
61+
}
62+
63+
/**
64+
* Remove the specified resource from storage.
65+
*
66+
* @param int $id
67+
* @return \Illuminate\Http\Response
68+
*/
69+
public function destroy($id)
70+
{
71+
//
72+
}
73+
}
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace App\Http\Requests;
4+
5+
use Illuminate\Foundation\Http\FormRequest;
6+
7+
class StoreMessageRequest extends FormRequest
8+
{
9+
/**
10+
* Determine if the user is authorized to make this request.
11+
*
12+
* @return bool
13+
*/
14+
public function authorize()
15+
{
16+
return true;
17+
}
18+
19+
/**
20+
* Get the validation rules that apply to the request.
21+
*
22+
* @return array
23+
*/
24+
public function rules()
25+
{
26+
return [
27+
'body' => 'required|max:250',
28+
];
29+
}
30+
}
+25
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+
use Illuminate\Support\Carbon;
7+
8+
class MessageResource extends JsonResource
9+
{
10+
/**
11+
* Transform the resource into an array.
12+
*
13+
* @param \Illuminate\Http\Request $request
14+
* @return array
15+
*/
16+
public function toArray($request)
17+
{
18+
return [
19+
'id' => $this->id,
20+
'body' => $this->body,
21+
'user' => new UserBasicResource($this->user),
22+
'createdAt' => $this->created_at->diffForHumans(),
23+
];
24+
}
25+
}
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
use Illuminate\Http\Resources\Json\JsonResource;
6+
7+
class UserBasicResource 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+
];
22+
}
23+
}

app/Models/Message.php

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace App\Models;
4+
5+
use Illuminate\Database\Eloquent\Factories\HasFactory;
6+
use Illuminate\Database\Eloquent\Model;
7+
8+
class Message extends Model
9+
{
10+
use HasFactory;
11+
12+
/**
13+
* The attributes that are mass assignable.
14+
*
15+
* @var array
16+
*/
17+
protected $fillable = [
18+
'body',
19+
];
20+
21+
public function user()
22+
{
23+
return $this->belongsTo(User::class);
24+
}
25+
}

app/Models/User.php

+5
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,9 @@ public function isAdmin(): bool
4848
{
4949
return $this->is_admin;
5050
}
51+
52+
public function messages()
53+
{
54+
return $this->hasMany(Message::class);
55+
}
5156
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
class CreateMessagesTable extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*
12+
* @return void
13+
*/
14+
public function up()
15+
{
16+
Schema::create('messages', function (Blueprint $table) {
17+
$table->id();
18+
$table->foreignId('user_id')->constrained()->onDelete('cascade');
19+
$table->text('body');
20+
$table->timestamps();
21+
});
22+
}
23+
24+
/**
25+
* Reverse the migrations.
26+
*
27+
* @return void
28+
*/
29+
public function down()
30+
{
31+
Schema::dropIfExists('messages');
32+
}
33+
}

routes/api.php

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use App\Http\Controllers\UserController;
66
use App\Http\Controllers\TokenController;
77
use App\Http\Controllers\AvatarController;
8+
use App\Http\Controllers\MessageController;
89

910
/*
1011
|--------------------------------------------------------------------------
@@ -25,4 +26,7 @@
2526
Route::get('/users', [UserController::class, 'index']);
2627

2728
Route::post('/users/auth/avatar', [AvatarController::class, 'store']);
29+
30+
Route::post('/messages', [MessageController::class, 'store']);
31+
Route::get('/messages', [MessageController::class, 'index']);
2832
});

0 commit comments

Comments
 (0)