Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
93.33% covered (success)
93.33%
14 / 15
85.71% covered (warning)
85.71%
6 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
PromptToneService
93.33% covered (success)
93.33%
14 / 15
85.71% covered (warning)
85.71%
6 / 7
7.01
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getAll
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 getById
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 create
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 update
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 delete
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 invalidateCache
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace App\Http\Services;
4
5use App\Http\Models\PromptTone;
6use App\Http\Repositories\interfaces\IPromptToneRepository;
7use Illuminate\Support\Collection;
8use Illuminate\Support\Facades\Cache;
9
10/**
11 * Service for prompt tone business logic.
12 *
13 * Handles all business logic related to prompt tone configurations,
14 * coordinating with the repository for data access and managing caching.
15 */
16class PromptToneService
17{
18    /**
19     * Cache key for all prompt tones.
20     */
21    private const CACHE_KEY_ALL = 'prompt_tone:all';
22
23    /**
24     * Cache TTL in seconds (1 hour).
25     */
26    private const CACHE_TTL = 3600;
27
28    public function __construct(
29        private IPromptToneRepository $promptToneRepository
30    ) {}
31
32    /**
33     * Get all prompt tones ordered by newest first.
34     *
35     * @return Collection<int, PromptTone> Collection of prompt tones
36     */
37    public function getAll(): Collection
38    {
39        return Cache::remember(self::CACHE_KEY_ALL, self::CACHE_TTL, function () {
40            return $this->promptToneRepository->getAll();
41        });
42    }
43
44    /**
45     * Find a prompt tone by its ID.
46     *
47     * @param  string  $id  The prompt tone ID
48     * @return PromptTone|null The prompt tone or null if not found
49     */
50    public function getById(string $id): ?PromptTone
51    {
52        return $this->promptToneRepository->findById($id);
53    }
54
55    /**
56     * Create a new prompt tone.
57     *
58     * @param  array{name: string, prompt: string}  $data  The prompt tone data
59     * @return PromptTone The created prompt tone
60     */
61    public function create(array $data): PromptTone
62    {
63        $tone = $this->promptToneRepository->create($data);
64
65        $this->invalidateCache();
66
67        return $tone;
68    }
69
70    /**
71     * Update an existing prompt tone.
72     *
73     * @param  PromptTone  $promptTone  The prompt tone to update
74     * @param  array{name?: string, prompt?: string}  $data  The update data
75     * @return PromptTone The updated prompt tone
76     */
77    public function update(PromptTone $promptTone, array $data): PromptTone
78    {
79        $promptTone = $this->promptToneRepository->update($promptTone, $data);
80
81        $this->invalidateCache();
82
83        return $promptTone;
84    }
85
86    /**
87     * Delete a prompt tone.
88     *
89     * @param  PromptTone  $promptTone  The prompt tone to delete
90     * @return bool True if deleted successfully
91     */
92    public function delete(PromptTone $promptTone): bool
93    {
94        $result = $this->promptToneRepository->delete($promptTone);
95
96        $this->invalidateCache();
97
98        return $result;
99    }
100
101    /**
102     * Invalidate prompt tone caches.
103     */
104    private function invalidateCache(): void
105    {
106        Cache::forget(self::CACHE_KEY_ALL);
107    }
108}