質問編集履歴
1
関連するコードを全文記載しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -25,24 +25,174 @@
|
|
25
25
|
|
26
26
|
```Laravel
|
27
27
|
<-- api.php -->
|
28
|
+
<?php
|
29
|
+
|
30
|
+
use Illuminate\Http\Request;
|
31
|
+
use Illuminate\Support\Facades\Route;
|
32
|
+
|
33
|
+
/*
|
34
|
+
|--------------------------------------------------------------------------
|
35
|
+
| API Routes
|
36
|
+
|--------------------------------------------------------------------------
|
37
|
+
|
|
38
|
+
| Here is where you can register API routes for your application. These
|
39
|
+
| routes are loaded by the RouteServiceProvider within a group which
|
40
|
+
| is assigned the "api" middleware group. Enjoy building your API!
|
41
|
+
|
|
42
|
+
*/
|
43
|
+
|
44
|
+
Route::middleware(['auth:sanctum'])->get('/user', function (Request $request) {
|
45
|
+
return $request->user();
|
46
|
+
});
|
47
|
+
|
48
|
+
Route::middleware('auth:sanctum')->post('/tokens/create', function (Request $request) {
|
49
|
+
$token = $request->user()->createToken($request->token_name);
|
50
|
+
|
51
|
+
return ['token' => $token->plainTextToken];
|
52
|
+
});
|
53
|
+
|
54
|
+
Route::prefix('v1')->group(function () {
|
55
|
+
Route::post('/register', [\App\Http\Controllers\Api\V1\AuthController::class, 'register']);
|
56
|
+
Route::post('/login', [\App\Http\Controllers\Api\V1\AuthController::class, 'login']);
|
57
|
+
Route::delete('/logout', [\App\Http\Controllers\Api\V1\AuthController::class, 'logout']);
|
58
|
+
|
59
|
+
Route::prefix('products')->group(function () {
|
60
|
+
Route::get('/', [\App\Http\Controllers\Api\V1\ProductsController::class, 'index']);
|
61
|
+
Route::get('/{id}', [\App\Http\Controllers\Api\V1\ProductsController::class, 'show']);
|
62
|
+
Route::get('/{productId}/reviews', [\App\Http\Controllers\Api\V1\ReviewsController::class, 'index']);
|
28
|
-
Route::post('/{productId}/reviews', [\App\Http\Controllers\Api\V1\ReviewsController::class, 'store']);
|
63
|
+
Route::post('/{productId}/reviews', [\App\Http\Controllers\Api\V1\ReviewsController::class, 'store']);
|
64
|
+
});
|
65
|
+
|
66
|
+
Route::get('/tax_rates', [\App\Http\Controllers\Api\V1\TaxRatesController::class, 'index']);
|
67
|
+
|
68
|
+
Route::post('/check', [\App\Http\Controllers\Api\V1\AuthController::class, 'check']);
|
69
|
+
|
70
|
+
Route::group(['middleware' => 'auth:sanctum'], function () {
|
71
|
+
Route::prefix('carts')->group(function () {
|
72
|
+
Route::get('/', [\App\Http\Controllers\Api\V1\CartsController::class, 'index']);
|
73
|
+
Route::post('/', [\App\Http\Controllers\Api\V1\CartsController::class, 'store']);
|
74
|
+
Route::patch('/{id}', [\App\Http\Controllers\Api\V1\CartsController::class, 'update']);
|
75
|
+
Route::delete('/{id}', [\App\Http\Controllers\Api\V1\CartsController::class, 'delete']);
|
76
|
+
});
|
77
|
+
|
78
|
+
Route::prefix('orders')->group(function () {
|
79
|
+
Route::get('/', [\App\Http\Controllers\Api\V1\OrdersController::class, 'index']);
|
80
|
+
Route::post('/', [\App\Http\Controllers\Api\V1\OrdersController::class, 'create']);
|
81
|
+
});
|
82
|
+
});
|
83
|
+
});
|
84
|
+
|
29
85
|
|
30
86
|
<-- Controller -->
|
87
|
+
<?php
|
88
|
+
|
89
|
+
namespace App\Http\Controllers\Api\V1;
|
90
|
+
|
91
|
+
use Illuminate\Http\JsonResponse;
|
92
|
+
use Illuminate\Http\Request;
|
93
|
+
use App\Interfaces\Services\ReviewServiceInterface;
|
94
|
+
use App\Models\Review;
|
95
|
+
use App\Services\ReviewService;
|
96
|
+
use Illuminate\Support\Facades\Auth;
|
97
|
+
use App\Http\Requests\Review\ReviewsRequest;
|
98
|
+
use App\Http\Resources\ReviewResource;
|
99
|
+
use App\Interfaces\Repositories\ReviewRepositoryInterface;
|
100
|
+
use Illuminate\Support\Facades\Log;
|
101
|
+
|
102
|
+
/**
|
103
|
+
* レビュー関連コントローラ
|
104
|
+
*/
|
105
|
+
class ReviewsController extends BaseController
|
106
|
+
{
|
107
|
+
private ReviewServiceInterface $reviewService;
|
108
|
+
private ReviewRepositoryInterface $reviewRepository;
|
109
|
+
|
110
|
+
public function __construct(ReviewServiceInterface $reviewService, ReviewRepositoryInterface $reviewRepository)
|
111
|
+
{
|
112
|
+
$this->reviewService = $reviewService;
|
113
|
+
|
114
|
+
$this->middleware('reviews.request')->only('store');
|
115
|
+
}
|
116
|
+
|
117
|
+
public function index(int $productId): JsonResponse
|
118
|
+
{
|
119
|
+
Log::info("called index method");
|
120
|
+
|
121
|
+
$response = $this->reviewService->getReviewByProductId($productId);
|
122
|
+
return response()->json($response);
|
123
|
+
}
|
124
|
+
|
31
|
-
public function store(ReviewsRequest $request, int $productId)
|
125
|
+
public function store(ReviewsRequest $request, int $productId)
|
32
|
-
{
|
126
|
+
{
|
127
|
+
Log::info("called store method");
|
128
|
+
|
33
|
-
$reviewData = $request->
|
129
|
+
$reviewData = $request->all();
|
34
|
-
$response = $this->reviewService->saveReviewByProductId($reviewData);
|
130
|
+
$response = $this->reviewService->saveReviewByProductId($reviewData, $productId);
|
35
131
|
|
36
132
|
return response()->json($response, 201);
|
37
133
|
}
|
134
|
+
}
|
38
135
|
|
39
136
|
<-- Service -->
|
137
|
+
<?php
|
138
|
+
|
139
|
+
namespace App\Services;
|
140
|
+
|
141
|
+
use App\Http\Requests\ReviewsRequest;
|
142
|
+
use App\Http\Resources\ReviewResource;
|
143
|
+
use App\Interfaces\Repositories\ReviewRepositoryInterface;
|
144
|
+
use App\Interfaces\Services\ReviewServiceInterface;
|
145
|
+
|
146
|
+
class ReviewService implements ReviewServiceInterface
|
147
|
+
{
|
148
|
+
protected ReviewRepositoryInterface $reviewRepository;
|
149
|
+
|
150
|
+
public function __construct(ReviewRepositoryInterface $reviewRepository)
|
151
|
+
{
|
152
|
+
$this->reviewRepository = $reviewRepository;
|
153
|
+
}
|
154
|
+
|
155
|
+
public function getReviewByProductId(int $productId)
|
156
|
+
{
|
157
|
+
return $this->reviewRepository->getReview($productId);
|
158
|
+
}
|
159
|
+
|
40
|
-
public function saveReviewByProductId(array $reviewsData, $productId)
|
160
|
+
public function saveReviewByProductId(array $reviewsData, int $productId)
|
41
161
|
{
|
42
162
|
return $this->reviewRepository->saveReview($reviewsData, $productId);
|
43
163
|
}
|
164
|
+
}
|
165
|
+
|
44
166
|
|
45
167
|
<-- Repository -->
|
168
|
+
<?php
|
169
|
+
|
170
|
+
namespace App\Repositories;
|
171
|
+
|
172
|
+
use Illuminate\Database\Eloquent\Builder;
|
173
|
+
|
174
|
+
use App\Interfaces\Repositories\ReviewRepositoryInterface;
|
175
|
+
use App\Models\Review;
|
176
|
+
use Illuminate\Support\Facades\DB;
|
177
|
+
|
178
|
+
class ReviewRepository extends BaseRepository implements ReviewRepositoryInterface
|
179
|
+
{
|
180
|
+
protected Review $review;
|
181
|
+
|
182
|
+
public function __construct(Review $review)
|
183
|
+
{
|
184
|
+
$this->review = $review;
|
185
|
+
}
|
186
|
+
|
187
|
+
public function all(string $column = 'created_at', string $direction = 'asc'): Builder
|
188
|
+
{
|
189
|
+
return $this->review::orderBy($column, $direction);
|
190
|
+
}
|
191
|
+
public function getReview(int $productId)
|
192
|
+
{
|
193
|
+
return $this->review::where('product_id', $productId)->get();
|
194
|
+
}
|
195
|
+
|
46
196
|
public function saveReview(array $reviewData, int $productId): Review
|
47
197
|
{
|
48
198
|
return DB::transaction(function () use ($reviewData, $productId) {
|
@@ -54,6 +204,8 @@
|
|
54
204
|
}
|
55
205
|
});
|
56
206
|
}
|
207
|
+
}
|
208
|
+
|
57
209
|
```
|
58
210
|
|
59
211
|
### 試したこと・調べたこと
|