Skip to content

Commit 1a7eacb

Browse files
committed
feat: Add scopes to Analytics, add AnalyticsRepostiory.
1 parent a274841 commit 1a7eacb

File tree

4 files changed

+176
-0
lines changed

4 files changed

+176
-0
lines changed

src/Models/Analytics.php

+47
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace OhSeeSoftware\LaravelServerAnalytics\Models;
44

5+
use Illuminate\Database\Eloquent\Builder;
56
use Illuminate\Database\Eloquent\Model;
67
use OhSeeSoftware\LaravelServerAnalytics\ServerAnalytics;
78

@@ -49,6 +50,52 @@ public function addMeta(string $key, $value): AnalyticsMeta
4950
return $meta;
5051
}
5152

53+
/**
54+
* Scopes the query to include Analytics records
55+
* that are related to the given Model.
56+
*
57+
* @param Builder $builder
58+
* @param Model $model
59+
* @return void
60+
*/
61+
public function scopeRelatedTo(Builder $builder, Model $model)
62+
{
63+
$builder->whereHas('relations', function ($query) use ($model) {
64+
$query->where('relation_type', get_class($model))->where('relation_id', $model->id);
65+
});
66+
}
67+
68+
/**
69+
* Scopes the query to include Analytics records
70+
* that have meta data with the given key/value.
71+
*
72+
* @param Builder $builder
73+
* @param string $key
74+
* @param mixed $value
75+
* @return void
76+
*/
77+
public function scopeWithMetaValue(Builder $builder, string $key, $value)
78+
{
79+
$builder->whereHas('meta', function ($query) use ($key, $value) {
80+
$query->where('key', $key)->where('value', $value);
81+
});
82+
}
83+
84+
/**
85+
* Scopes the query to include Analytics records
86+
* that have meta records with the given key.
87+
*
88+
* @param Builder $builder
89+
* @param string $key
90+
* @return void
91+
*/
92+
public function scopeHasMeta(Builder $builder, string $key)
93+
{
94+
$builder->whereHas('meta', function ($query) use ($key) {
95+
$query->where('key', $key);
96+
});
97+
}
98+
5299
public function relations()
53100
{
54101
return $this->hasMany(AnalyticsRelation::class);
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace OhSeeSoftware\LaravelServerAnalytics\Repositories;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use OhSeeSoftware\LaravelServerAnalytics\Models\Analytics;
7+
8+
class AnalyticsRepository
9+
{
10+
/**
11+
* Returns a new Eloquent query builder
12+
* instance for Analytics records.
13+
*
14+
* @return Builder
15+
*/
16+
public function query(): Builder
17+
{
18+
return Analytics::query();
19+
}
20+
21+
/**
22+
* Method to find Analytics records by
23+
* the given column/value.
24+
*
25+
* @param string $column
26+
* @param mixed $value
27+
* @return Builder
28+
*/
29+
public function findBy(string $column, $value, string $comparator = '='): Builder
30+
{
31+
return $this->query()->where($column, $comparator, $value);
32+
}
33+
}

tests/Models/AnalyticsModelTest.php

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
namespace OhSeeSoftware\LaravelServerAnalytics\Tests\Models;
4+
5+
use Illuminate\Foundation\Testing\RefreshDatabase;
6+
use OhSeeSoftware\LaravelServerAnalytics\Models\Analytics;
7+
use OhSeeSoftware\LaravelServerAnalytics\Repositories\AnalyticsRepository;
8+
use OhSeeSoftware\LaravelServerAnalytics\Tests\TestCase;
9+
10+
class AnalyticsModelTest extends TestCase
11+
{
12+
use RefreshDatabase;
13+
14+
/** @var Analytics */
15+
public $analytics;
16+
17+
public function setUp(): void
18+
{
19+
parent::setUp();
20+
21+
$this->analytics = factory(Analytics::class)->create();
22+
}
23+
24+
/** @test */
25+
public function it_scopes_related_entities()
26+
{
27+
$relatedAnalytics = factory(Analytics::class)->create();
28+
29+
$this->assertCount(0, Analytics::relatedTo($relatedAnalytics)->get());
30+
31+
$this->analytics->addRelation($relatedAnalytics);
32+
$this->assertCount(1, Analytics::relatedTo($relatedAnalytics)->get());
33+
}
34+
35+
/** @test */
36+
public function it_scopes_analytics_that_have_meta_with_key()
37+
{
38+
$this->analytics->addMeta('foo', 'bar');
39+
40+
$this->assertCount(0, Analytics::hasMeta('bar')->get());
41+
$this->assertCount(1, Analytics::hasMeta('foo')->get());
42+
}
43+
44+
/** @test */
45+
public function it_scopes_analytics_that_have_specific_meta_value()
46+
{
47+
$this->analytics->addMeta('foo', 'bar');
48+
49+
$this->assertCount(0, Analytics::withMetaValue('foo', 'invalid')->get());
50+
$this->assertCount(1, Analytics::withMetaValue('foo', 'bar')->get());
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace OhSeeSoftware\LaravelServerAnalytics\Tests\Repositories;
4+
5+
use Illuminate\Foundation\Testing\RefreshDatabase;
6+
use OhSeeSoftware\LaravelServerAnalytics\Models\Analytics;
7+
use OhSeeSoftware\LaravelServerAnalytics\Repositories\AnalyticsRepository;
8+
use OhSeeSoftware\LaravelServerAnalytics\Tests\TestCase;
9+
10+
class AnalyticsRepositoryTest extends TestCase
11+
{
12+
use RefreshDatabase;
13+
14+
/** @var Analytics */
15+
public $analytics;
16+
17+
/** @var AnalyticsRepository */
18+
public $repository;
19+
20+
public function setUp(): void
21+
{
22+
parent::setUp();
23+
24+
$this->analytics = factory(Analytics::class)->create();
25+
$this->repository = resolve(AnalyticsRepository::class);
26+
}
27+
28+
/** @test */
29+
public function it_finds_analytics()
30+
{
31+
$this->assertCount(1, $this->repository->findBy('path', $this->analytics->path)->get());
32+
$this->assertCount(1, $this->repository->findBy('method', $this->analytics->method)->get());
33+
$this->assertCount(1, $this->repository->findBy('status_code', $this->analytics->status_code)->get());
34+
}
35+
36+
/** @test */
37+
public function it_finds_analytics_with_custom_comparator()
38+
{
39+
$this->analytics->update(['duration_ms' => 500]);
40+
41+
$this->assertCount(0, $this->repository->findBy('duration_ms', 250, '<=')->get());
42+
$this->assertCount(1, $this->repository->findBy('duration_ms', 250, '>=')->get());
43+
}
44+
}

0 commit comments

Comments
 (0)