aboutsummaryrefslogtreecommitdiff
path: root/lib/models/Forum/ForumSubscription.php
blob: 2ba8335f302d8002f228b653ea7b0eba6153e1a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
namespace Forum;

use Range;
use SimpleORMap;
use User;
use Forum\Enum\SubscriptionNotificationType;

/**
 * @property int $id
 * @property string $subject_id
 * @property string $range_id
 * @property string $subject
 * @property SubscriptionNotificationType $notification_type
 * @property int $mkdate
 * @property int $chdate
 *
 * @property ForumDiscussion | ForumTopic $subject_object
 * @property User $user
 * @property Range $range
 */

class ForumSubscription extends SimpleORMap
{
    protected static function configure($config = [])
    {
        $config['db_table'] = 'forum_subscriptions';

        $config['belongs_to']['user'] = [
            'class_name' => User::class,
            'foreign_key' => 'user_id',
            'assoc_foreign_key' => 'user_id'
        ];

        $config['additional_fields']['range'] = [
            'set' => function (ForumSubscription $subscription, string $field, Range $range) {
                $subscription->range_id = $range->getRangeId();
            },
            'get' => function (ForumSubscription $subscription): Range {
                return get_object_by_range_id($subscription->range_id);
            },
        ];

        $config['additional_fields']['subject_object']['get'] = 'getSubjectObject';

        parent::configure($config);
    }

    /**
     * @return self[]
     */
    public static function getUserSubscriptions(string $range_id, string $user_id): array
    {
        return self::findBySQL(
            "range_id = :range_id AND user_id = :user_id ORDER BY mkdate DESC",
            [
                'range_id' => $range_id,
                'user_id' => $user_id
            ]
        );
    }

    public function getSubjectObject(): ForumDiscussion | ForumTopic
    {
        return match ($this->subject) {
            'topic' => ForumTopic::find($this->subject_id),
            'discussion' => ForumDiscussion::find($this->subject_id)
        };
    }
}