Skip to content

Commit 5e21e23

Browse files
committed
add ticket messages api
1 parent 687b851 commit 5e21e23

File tree

10 files changed

+117
-22
lines changed

10 files changed

+117
-22
lines changed

config/laravel_ticket.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@
1515
'tickets' => 'tickets',
1616
'categories' => 'categories',
1717
'labels' => 'labels',
18-
'messages' => 'messages',
18+
'messages' => [
19+
'table' => 'messages',
20+
'columns' => [
21+
'ticket_foreing_id' => 'ticket_id',
22+
],
23+
],
1924
'label_ticket' => [
2025
'table' => 'label_ticket',
2126
'columns' => [

database/migrations/create_messages_table.php.stub

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,19 @@ namespace Coderflex\LaravelTicket\Database\Factories;
55
use Illuminate\Database\Migrations\Migration;
66
use Illuminate\Database\Schema\Blueprint;
77
use Illuminate\Support\Facades\Schema;
8+
use Illuminate\Support\Str;
89

910
return new class extends Migration
1011
{
1112
public function up()
1213
{
1314
$tableName = config('laravel_ticket.table_names.messages', 'messages');
1415

15-
Schema::create($tableName, function (Blueprint $table) {
16+
Schema::create($tableName['table'], function (Blueprint $table) use ($tableName) {
1617
$table->id();
1718
$table->foreignId('user_id');
18-
$table->foreignId('laravel_ticket_id');
19-
$table->text('comment');
19+
$table->foreignId($tableName['columns']['ticket_foreing_id']);
20+
$table->text('message');
2021
$table->timestamps();
2122
});
2223
}

src/Concerns/HasTickets.php

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

33
namespace Coderflex\LaravelTicket\Concerns;
44

5+
use Coderflex\LaravelTicket\Models\Message;
56
use Coderflex\LaravelTicket\Models\Ticket;
67
use Illuminate\Database\Eloquent\Relations\HasMany;
78

@@ -16,4 +17,14 @@ public function tickets(): HasMany
1617
{
1718
return $this->hasMany(Ticket::class, 'user_id');
1819
}
20+
21+
/**
22+
* Get User tickets relationship
23+
*
24+
* @return \Illuminate\Database\Eloquent\Relations\HasMany
25+
*/
26+
public function messages(): HasMany
27+
{
28+
return $this->hasMany(Message::class, 'user_id');
29+
}
1930
}

src/Concerns/InteractsWithTicketRelations.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace Coderflex\LaravelTicket\Concerns;
44

5+
use Illuminate\Database\Eloquent\Model;
6+
57
trait InteractsWithTicketRelations
68
{
79
/**
@@ -53,4 +55,30 @@ public function syncCategories($ids, $detaching = true)
5355
{
5456
return $this->categories()->sync($ids, $detaching);
5557
}
58+
59+
/**
60+
* Add new message on an existing ticket
61+
*
62+
* @param string $message
63+
* @return \Illuminate\Database\Eloquent\Model
64+
*/
65+
public function message(string $message): Model
66+
{
67+
return $this->messageAsUser(auth()->user(), $message);
68+
}
69+
70+
/**
71+
* Add new message on an existing ticket as a custom user
72+
*
73+
* @param \Illuminate\Database\Eloquent\Model|null $user
74+
* @param string $message
75+
* @return \Illuminate\Database\Eloquent\Model
76+
*/
77+
public function messageAsUser(?Model $user, string $message): Model
78+
{
79+
return $this->messages()->create([
80+
'user_id' => $user->id, // @phpstan-ignore-line
81+
'message' => $message,
82+
]);
83+
}
5684
}

src/Models/Message.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66
use Illuminate\Database\Eloquent\Model;
77
use Illuminate\Database\Eloquent\Relations\BelongsTo;
88

9+
/**
10+
* Coderflex\LaravelTicket\Models\Message
11+
*
12+
* @property int $user_id
13+
* @property string $message
14+
*/
915
class Message extends Model
1016
{
1117
use HasFactory;
@@ -24,7 +30,12 @@ class Message extends Model
2430
*/
2531
public function ticket(): BelongsTo
2632
{
27-
return $this->belongsTo(Ticket::class, 'laravel_ticket_id');
33+
$tableName = config('laravel_ticket.table_names.messages', 'messages');
34+
35+
return $this->belongsTo(
36+
Ticket::class,
37+
$tableName['columns']['ticket_foreing_id']
38+
);
2839
}
2940

3041
/**
@@ -35,7 +46,7 @@ public function ticket(): BelongsTo
3546
public function getTable()
3647
{
3748
return config(
38-
'laravel_ticket.table_names.messages',
49+
'laravel_ticket.table_names.messages.table',
3950
parent::getTable()
4051
);
4152
}

src/Models/Ticket.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,14 @@ public function user(): BelongsTo
5252
*
5353
* @return \Illuminate\Database\Eloquent\Relations\HasMany
5454
*/
55-
public function comments(): HasMany
55+
public function messages(): HasMany
5656
{
57-
return $this->hasMany(Message::class);
57+
$tableName = config('laravel_ticket.table_names.messages', 'messages');
58+
59+
return $this->hasMany(
60+
Message::class,
61+
(string) $tableName['columns']['ticket_foreing_id'],
62+
);
5863
}
5964

6065
/**

tests/Database/Factories/MessageFactory.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ class MessageFactory extends Factory
1313

1414
public function definition()
1515
{
16+
$tableName = config('laravel_ticket.table_names.messages', 'messages');
17+
1618
return [
1719
'user_id' => User::factory(),
18-
'laravel_ticket_id' => Ticket::factory(),
19-
'comment' => $this->faker->paragraph(2),
20+
$tableName['columns']['ticket_foreing_id'] => Ticket::factory(),
21+
'message' => $this->faker->paragraph(2),
2022
];
2123
}
2224
}

tests/Feature/TicketRelationsTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,24 @@
7777
$this->assertEquals($ticket->categories->count(), 5);
7878
});
7979

80+
it('can create a message inside the ticket by authenticated user', function () {
81+
$this->actingAs(User::factory()->create());
82+
83+
$ticket = Ticket::factory()->create();
84+
85+
$ticket->message('How are you today?');
86+
87+
$this->assertEquals($ticket->messages->count(), 1);
88+
});
89+
90+
it('can create a message inside the ticket by another user', function () {
91+
$user = $this->actingAs(User::factory()->create());
92+
$anotherUser = User::factory()->create();
93+
94+
$ticket = Ticket::factory()->create();
95+
96+
$ticket->messageAsUser($anotherUser, 'How are you today?');
97+
98+
$this->assertEquals($ticket->messages->count(), 1);
99+
$this->assertEquals($ticket->messages->first()->user_id, $anotherUser->id);
100+
});

tests/Models/User.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,24 @@
44

55
use Coderflex\LaravelTicket\Concerns\HasTickets;
66
use Coderflex\LaravelTicket\Contracts\CanUseTickets;
7+
use Illuminate\Auth\Authenticatable;
8+
use Illuminate\Auth\MustVerifyEmail;
9+
use Illuminate\Auth\Passwords\CanResetPassword;
10+
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
11+
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
12+
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
713
use Illuminate\Database\Eloquent\Factories\HasFactory;
814
use Illuminate\Database\Eloquent\Model;
15+
use Illuminate\Foundation\Auth\Access\Authorizable;
916

10-
class User extends Model implements CanUseTickets
17+
class User extends Model implements CanUseTickets, AuthenticatableContract, AuthorizableContract, CanResetPasswordContract
1118
{
12-
use HasFactory;
13-
use HasTickets;
19+
use Authenticatable,
20+
Authorizable,
21+
CanResetPassword,
22+
MustVerifyEmail,
23+
HasFactory,
24+
HasTickets;
1425

1526
protected $guarded = [];
1627
}

tests/Unit/MessageTest.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@
88
'title' => 'Laravel is cool!',
99
]);
1010

11-
$message = Message::factory()
12-
->create([
13-
'laravel_ticket_id' => $ticket->id,
14-
'comment' => 'Message from a ticket',
15-
]);
16-
1711
$tableName = config(
1812
'laravel_ticket.table_names.messages',
1913
'messages'
2014
);
2115

22-
$this->assertDatabaseHas($tableName, [
23-
'laravel_ticket_id' => $ticket->id,
24-
'comment' => 'Message from a ticket',
16+
$message = Message::factory()
17+
->create([
18+
$tableName['columns']['ticket_foreing_id'] => $ticket->id,
19+
'message' => 'Message from a ticket',
20+
]);
21+
22+
$this->assertDatabaseHas($tableName['table'], [
23+
$tableName['columns']['ticket_foreing_id'] => $ticket->id,
24+
'message' => 'Message from a ticket',
2525
]);
2626

2727
$this->assertEquals($message->count(), 1);

0 commit comments

Comments
 (0)