summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Weimann <mail@michael-weimann.eu>2019-12-12 21:30:28 +0100
committerIgor Scheller <igor.scheller@igorshp.de>2019-12-30 01:53:20 +0100
commit95adeca0ae1cd6c5475242d036ee75584aedd2a1 (patch)
tree593dbc9888cf447429f3c8f954b52b60095d2ca0 /src
parent46f80fbed262a30ba31e1d031e2512f278352e12 (diff)
Add message model
Diffstat (limited to 'src')
-rw-r--r--src/Models/Message.php68
-rw-r--r--src/Models/User/User.php38
2 files changed, 106 insertions, 0 deletions
diff --git a/src/Models/Message.php b/src/Models/Message.php
new file mode 100644
index 00000000..cb658fc6
--- /dev/null
+++ b/src/Models/Message.php
@@ -0,0 +1,68 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Engelsystem\Models;
+
+use Engelsystem\Models\User\User;
+use Engelsystem\Models\User\UsesUserModel;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Support\Carbon;
+
+/**
+ * This class represents a message send trough the system.
+ *
+ * @property integer $id
+ * @property integer $receiver_id
+ * @property boolean $read
+ * @property string $text
+ * @property Carbon|null $created_at
+ * @property Carbon|null $updated_at
+ * @property-read User $receiver
+ * @method static Builder|Message newModelQuery()
+ * @method static Builder|Message newQuery()
+ * @method static Builder|Message query()
+ * @method static Builder|Message whereCreatedAt($value)
+ * @method static Builder|Message whereId($value)
+ * @method static Builder|Message whereRead($value)
+ * @method static Builder|Message whereReceiverId($value)
+ * @method static Builder|Message whereSenderId($value)
+ * @method static Builder|Message whereText($value)
+ * @method static Builder|Message whereUpdatedAt($value)
+ */
+class Message extends BaseModel
+{
+ use UsesUserModel;
+
+ /** @var bool enable timestamps */
+ public $timestamps = true;
+
+ /** @var string[] */
+ protected $casts = [
+ 'user_id' => 'integer',
+ 'receiver_id' => 'integer',
+ 'read' => 'boolean',
+ ];
+
+ /** @var string[] */
+ protected $fillable = [
+ 'user_id',
+ 'receiver_id',
+ 'read',
+ 'text',
+ ];
+
+ /** @var array */
+ protected $attributes = [
+ 'read' => false,
+ ];
+
+ /**
+ * @return BelongsTo
+ */
+ public function receiver(): BelongsTo
+ {
+ return $this->belongsTo(User::class, 'receiver_id');
+ }
+}
diff --git a/src/Models/User/User.php b/src/Models/User/User.php
index e2ee9b21..c4bc1fcb 100644
--- a/src/Models/User/User.php
+++ b/src/Models/User/User.php
@@ -4,6 +4,7 @@ namespace Engelsystem\Models\User;
use Carbon\Carbon;
use Engelsystem\Models\BaseModel;
+use Engelsystem\Models\Message;
use Engelsystem\Models\News;
use Engelsystem\Models\NewsComment;
use Engelsystem\Models\Question;
@@ -42,6 +43,9 @@ use Illuminate\Database\Query\Builder as QueryBuilder;
*
* @property-read Collection|Question[] $questionsAsked
* @property-read Collection|Question[] $questionsAnswered
+ * @property-read Collection|Message[] $messagesReceived
+ * @property-read Collection|Message[] $messagesSent
+ * @property-read Collection|Message[] $messages
*/
class User extends BaseModel
{
@@ -141,4 +145,38 @@ class User extends BaseModel
return $this->hasMany(Question::class, 'answerer_id')
->where('answerer_id', $this->id);
}
+
+ /**
+ * @return HasMany
+ */
+ public function messagesSent(): HasMany
+ {
+ return $this->hasMany(Message::class, 'user_id')
+ ->orderBy('created_at', 'DESC')
+ ->orderBy('id', 'DESC');
+ }
+
+ /**
+ * @return HasMany
+ */
+ public function messagesReceived(): HasMany
+ {
+ return $this->hasMany(Message::class, 'receiver_id')
+ ->orderBy('read')
+ ->orderBy('created_at', 'DESC')
+ ->orderBy('id', 'DESC');
+ }
+
+ /**
+ * Returns a HasMany relation for all messages sent or received by the user.
+ *
+ * @return HasMany
+ */
+ public function messages(): HasMany
+ {
+ return $this->messagesSent()
+ ->union($this->messagesReceived())
+ ->orderBy('read')
+ ->orderBy('id', 'DESC');
+ }
}