Skip to content

Commit

Permalink
fix(trait): Fix bulk create trait
Browse files Browse the repository at this point in the history
Signed-off-by: Muhammad Naufal <[email protected]>
  • Loading branch information
falkia34 committed Aug 17, 2024
1 parent 019e4d5 commit 5e8093b
Show file tree
Hide file tree
Showing 13 changed files with 60 additions and 66 deletions.
3 changes: 1 addition & 2 deletions app/Http/Controllers/Api/V1/ChatMessageController.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,7 @@ public function show(ChatMessage $chatMessage): JsonResponse
*/
public function update(UpdateChatMessageRequest $request, ChatMessage $chatMessage): JsonResponse
{
$chatMessage->fill($request->validated());
$chatMessage->save();
$chatMessage->update($request->validated());

event(new ChatMessageUpdated($chatMessage));

Expand Down
3 changes: 1 addition & 2 deletions app/Http/Controllers/Api/V1/ChatSessionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,7 @@ public function show(ChatSession $chatSession): JsonResponse
*/
public function update(UpdateChatSessionRequest $request, ChatSession $chatSession): JsonResponse
{
$chatSession->fill($request->validated());
$chatSession->save();
$chatSession->update($request->validated());

return ResponseFormatter::singleton('chat_session', $chatSession);
}
Expand Down
3 changes: 1 addition & 2 deletions app/Http/Controllers/Api/V1/FinancialSurveyController.php
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,7 @@ public function show(Survey $survey): JsonResponse
*/
public function update(UpdateSurveyRequest $request, Survey $survey): JsonResponse
{
$survey->fill($request->validated());
$survey->save();
$survey->update($request->validated());

return ResponseFormatter::singleton('financial_survey', $survey);
}
Expand Down
3 changes: 1 addition & 2 deletions app/Http/Controllers/Api/V1/HotlineController.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ public function show(Hotline $hotline): JsonResponse
*/
public function update(UpdateHotlineRequest $request, Hotline $hotline): JsonResponse
{
$hotline->fill($request->validated());
$hotline->save();
$hotline->update($request->validated());

return ResponseFormatter::singleton('hotline', $hotline);
}
Expand Down
3 changes: 1 addition & 2 deletions app/Http/Controllers/Api/V1/InstanceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,11 @@ public function update(UpdateInstanceRequest $request, Instance $instance): Json
$manifest = $this->storageFacade->store($request->file('logo'), 'logo/instances');
}

$instance->fill(
$instance->update(
$hasLogo
? array_replace($request->validated(), ['logo' => $manifest])
: $request->validated()
);
$instance->save();

return ResponseFormatter::singleton('instance', $instance);
}
Expand Down
3 changes: 1 addition & 2 deletions app/Http/Controllers/Api/V1/PaylaterController.php
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,11 @@ public function update(UpdatePaylaterRequest $request, Paylater $paylater): Json
$manifest = $this->storageFacade->store($request->file('logo'), 'logo/paylaters');
}

$paylater->fill(
$paylater->update(
$request->has('logo')
? array_replace($request->validated(), ['logo' => $manifest])
: $request->validated()
);
$paylater->save();

return ResponseFormatter::singleton('paylater', $paylater);
}
Expand Down
3 changes: 1 addition & 2 deletions app/Http/Controllers/Api/V1/PersonalitySurveyController.php
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,7 @@ public function show(Survey $survey): JsonResponse
*/
public function update(UpdateSurveyRequest $request, Survey $survey): JsonResponse
{
$survey->fill($request->validated());
$survey->save();
$survey->update($request->validated());

return ResponseFormatter::singleton('personality_survey', $survey);
}
Expand Down
22 changes: 6 additions & 16 deletions app/Http/Controllers/Api/V1/SurveyAnswerController.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
use App\Models\SurveyAnswer;
use App\Models\SurveyResult;
use App\Utils\ResponseFormatter;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Spatie\QueryBuilder\AllowedInclude;
Expand Down Expand Up @@ -59,16 +58,11 @@ public function store(StoreSurveyAnswerRequest $request, SurveyResult $surveyRes
$surveyAnswers = [];

foreach ($data as $datum) {
$surveyAnswer = new SurveyAnswer($datum);
$surveyAnswer->fill([
'result_id' => $surveyResult->id,
]);
$surveyAnswers[] = $surveyAnswer;
$datum['result_id'] = $surveyResult->id;
$surveyAnswers[] = $datum;
}

$surveyAnswers = Collection::make($surveyAnswers);

SurveyAnswer::bulkInsert($surveyAnswers);
$surveyAnswers = SurveyAnswer::createMany($surveyAnswers);

if ($surveyType === 'PERSONALITY') {
dispatch(new GetPersonality($surveyResult));
Expand All @@ -78,12 +72,9 @@ public function store(StoreSurveyAnswerRequest $request, SurveyResult $surveyRes

return ResponseFormatter::collection('survey_answers', $surveyAnswers, 201);
} else {
$surveyAnswer = new SurveyAnswer($data);
$surveyAnswer->fill([
'result_id' => $surveyResult->id,
]);
$data['result_id'] = $surveyResult->id;

$surveyAnswer->save();
$surveyAnswer = SurveyAnswer::create($data);

if ($surveyType === 'PERSONALITY') {
dispatch(new GetPersonality($surveyResult));
Expand Down Expand Up @@ -115,8 +106,7 @@ public function show(SurveyAnswer $surveyAnswer): JsonResponse
*/
public function update(UpdateSurveyAnswerRequest $request, SurveyAnswer $surveyAnswer): JsonResponse
{
$surveyAnswer->fill($request->validated());
$surveyAnswer->save();
$surveyAnswer->update($request->validated());

$surveyResult = $surveyAnswer->surveyResult;
$surveyType = $surveyResult->survey->type;
Expand Down
3 changes: 1 addition & 2 deletions app/Http/Controllers/Api/V1/SurveyQuestionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,7 @@ public function show(SurveyQuestion $surveyQuestion): JsonResponse
*/
public function update(UpdateSurveyQuestionRequest $request, SurveyQuestion $surveyQuestion): JsonResponse
{
$surveyQuestion->fill($request->validated());
$surveyQuestion->save();
$surveyQuestion->update($request->validated());

return ResponseFormatter::singleton('survey_question', $surveyQuestion);
}
Expand Down
15 changes: 5 additions & 10 deletions app/Http/Controllers/Api/V1/SurveyResultController.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,14 @@ public function index(Request $request, Survey $survey): JsonResponse
*/
public function store(StoreSurveyResultRequest $request, Survey $survey): JsonResponse
{
$surveyResult = new SurveyResult($request->validated());
$surveyResult->fill([
'survey_id' => $survey->id,
]);
$data = $request->validated();
$data['survey_id'] = $survey->id;

if ($request->user()->role !== 'ADMIN') {
$surveyResult->fill([
'user_id' => $request->user()->id,
]);
$data['user_id'] = $request->user()->id;
}

$surveyResult->save();
$surveyResult = SurveyResult::create($data);

return ResponseFormatter::singleton('survey_result', $surveyResult, 201);
}
Expand All @@ -104,8 +100,7 @@ public function show(SurveyResult $surveyResult): JsonResponse
*/
public function update(UpdateSurveyResultRequest $request, SurveyResult $surveyResult): JsonResponse
{
$surveyResult->fill($request->validated());
$surveyResult->save();
$surveyResult->update($request->validated());

return ResponseFormatter::singleton('survey_result', $surveyResult);
}
Expand Down
3 changes: 1 addition & 2 deletions app/Http/Controllers/Api/V1/TransactionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,7 @@ public function show(Transaction $transaction): JsonResponse
*/
public function update(UpdateTransactionRequest $request, Transaction $transaction): JsonResponse
{
$transaction->fill($request->validated());
$transaction->save();
$transaction->update($request->validated());

dispatch(new GetTotalTransactionAndTotalInstallment($transaction));

Expand Down
4 changes: 2 additions & 2 deletions app/Models/SurveyAnswer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace App\Models;

use App\Traits\HasBulkInsert;
use App\Traits\HasBulkCreate;
use App\Traits\HasUuids;
use DateTimeInterface;
use Illuminate\Database\Eloquent\Factories\HasFactory;
Expand All @@ -11,7 +11,7 @@

class SurveyAnswer extends Model
{
use HasBulkInsert, HasFactory, HasUuids;
use HasBulkCreate, HasFactory, HasUuids;

/**
* The attributes that are mass assignable.
Expand Down
58 changes: 38 additions & 20 deletions app/Traits/HasBulkInsert.php → app/Traits/HasBulkCreate.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,43 +10,64 @@
use Illuminate\Support\Collection;
use LogicException;

trait HasBulkInsert
trait HasBulkCreate
{
/**
* @param Collection|Model[] $models
* Create many models
*/
public static function bulkInsert(Collection $models): bool
public static function createMany(array $attributes): Collection
{
if (! is_subclass_of(static::class, Model::class)) {
throw new LogicException(
'Class using HasBulkInsert trait should be a subclass of '.Model::class
'Class using HasBulkCreate trait should be a subclass of '.Model::class
);
}

$models = collect($attributes)
->map(function (array $attribute) {
return (new static)->newModelInstance($attribute);
});

(new static)->saveMany($models);

return $models;
}

/**
* Save many models
*/
private function saveMany(Collection $models): bool
{
if (! is_subclass_of(static::class, Model::class)) {
throw new LogicException(
'Class using HasBulkCreate trait should be a subclass of '.Model::class
);
}

// Check the argument
foreach ($models as $model) {
if (! $model instanceof static) {
throw new LogicException(static::class.'::bulkInsert() cannot be used for '.\get_class($model));
throw new LogicException(static::class.'::saveMany() cannot be used for '.\get_class($model));
}

if ($model->exists) {
throw new LogicException(
'This Eloquent model has already been persisted: class = '.static::class.', primary key ='.$model->getKey()
'This instance has already been persisted (class '.static::class.', primary key '.$model->getKey().')'
);
}
}

if ($models->isEmpty()) {
return true;
}

// Before save
foreach ($models as $model) {
if ($model->fireModelEvent('saving') === false) {
return false;
}
}

if ($models->isEmpty()) {
return true;
}

// Before insert
foreach ($models as $model) {
if ($model->usesUniqueIds()) {
Expand All @@ -63,11 +84,11 @@ public static function bulkInsert(Collection $models): bool
}

// Perform insert
$attributesArray = static::convertModelsToArray($models);
$saved = (new static)->newQueryWithoutScopes()->insert($attributesArray);
if (! $saved) {
return false;
}
$query = (new static)->newModelQuery();

$attributes = (new static)->getAttributesForInsertMany($models);

$query->insert($attributes);

// After insert
foreach ($models as $model) {
Expand All @@ -77,20 +98,17 @@ public static function bulkInsert(Collection $models): bool
}

// After save
$options = [];
foreach ($models as $model) {
$model->finishSave($options);
$model->finishSave([]);
}

return true;
}

/**
* Create array of model attributes
*
* @param Collection|Model[] $models
*/
private static function convertModelsToArray(Collection $models): array
private function getAttributesForInsertMany(Collection $models): array
{
$attributesCollection = $models
->map(function (Model $model) {
Expand Down

0 comments on commit 5e8093b

Please sign in to comment.