first commit
This commit is contained in:
371
app/Core/Service/PropertyCompetitorGroupService.php
Normal file
371
app/Core/Service/PropertyCompetitorGroupService.php
Normal file
@@ -0,0 +1,371 @@
|
||||
<?php
|
||||
|
||||
namespace App\Core\Service;
|
||||
|
||||
use App;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Exception;
|
||||
use App\Exceptions\ApiErrorException;
|
||||
use App\Core\Repository\PropertyCompetitorGroup\PropertyCompetitorGroupRepository;
|
||||
use App\Core\Repository\PropertyCompetitorGroupMapping\PropertyCompetitorGroupMappingRepository;
|
||||
|
||||
class PropertyCompetitorGroupService
|
||||
{
|
||||
|
||||
private $propertyCompetitorGroupRepository;
|
||||
private $propertyCompetitorGroupMappingRepository;
|
||||
|
||||
public function __construct(
|
||||
PropertyCompetitorGroupRepository $propertyCompetitorGroupRepository,
|
||||
PropertyCompetitorGroupMappingRepository $propertyCompetitorGroupMappingRepository
|
||||
)
|
||||
{
|
||||
$this->propertyCompetitorGroupRepository = $propertyCompetitorGroupRepository;
|
||||
$this->propertyCompetitorGroupMappingRepository = $propertyCompetitorGroupMappingRepository;
|
||||
}
|
||||
|
||||
public function createPropertyCompetitorGroup($param = [])
|
||||
{
|
||||
$response = ['status' => -1, 'message' => '', 'data' => null];
|
||||
try {
|
||||
|
||||
$insertData = [
|
||||
"property_id" => fillOnUndefined($param, "property_id"),
|
||||
"name" => fillOnUndefined($param, "name"),
|
||||
"status" => fillOnUndefined($param, "status", 1),
|
||||
"created_by" => fillOnUndefined($param, "created_by"),
|
||||
"updated_by" => fillOnUndefined($param, "updated_by"),
|
||||
"created_at" => time(),
|
||||
"updated_at" => time(),
|
||||
];
|
||||
|
||||
$insertDataResult = $this->propertyCompetitorGroupRepository->create($insertData);
|
||||
if ($insertDataResult['status'] != 'success') {
|
||||
throw new Exception($insertDataResult['message']);
|
||||
}
|
||||
|
||||
$insertDataResult = $insertDataResult["data"];
|
||||
|
||||
$response = [
|
||||
'status' => true,
|
||||
'data' => $insertDataResult,
|
||||
];
|
||||
|
||||
} catch (ApiErrorException $e) {
|
||||
$response['message'] = implode(', ', $e->getMessageArr());
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
$response['message'] = 'api-unknown_error';
|
||||
}
|
||||
|
||||
return output($response);
|
||||
}
|
||||
|
||||
public function selectPropertyCompetitorGroup($param = [], $column = ['*'])
|
||||
{
|
||||
|
||||
$response = ['status' => -1, 'message' => '', 'data' => null];
|
||||
|
||||
try {
|
||||
|
||||
$data = $this->propertyCompetitorGroupRepository->findByCriteria($param, $column);
|
||||
|
||||
$propertyList = [];
|
||||
foreach ($data as $property) {
|
||||
$propertyList[] = [
|
||||
'id' => $property['id'],
|
||||
'property_id' => $property['property_id'],
|
||||
'name' => $property['name'],
|
||||
'status' => $property['status'],
|
||||
];
|
||||
}
|
||||
|
||||
$response = [
|
||||
'status' => true,
|
||||
'data' => $propertyList,
|
||||
];
|
||||
|
||||
} catch (ApiErrorException $e) {
|
||||
$response['message'] = $e->getMessage();
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
$response['message'] = $e->getMessage();
|
||||
}
|
||||
|
||||
return output($response);
|
||||
}
|
||||
|
||||
public function syncPropertyCompetitorGroup($param = [])
|
||||
{
|
||||
$response = ['status' => -1, 'message' => '', 'data' => null];
|
||||
try {
|
||||
|
||||
$id = fillOnUndefined($param, "id");
|
||||
$propertyId = fillOnUndefined($param, "property_id");
|
||||
$name = fillOnUndefined($param, "name");
|
||||
$status = fillOnUndefined($param, "status", 1);
|
||||
$userId = fillOnUndefined($param, "user_id");
|
||||
|
||||
if ($id) {
|
||||
// Güncelleme öncesi: kayıt ve yetki kontrolü
|
||||
$existingRow = $this->propertyCompetitorGroupRepository->findByCriteria([
|
||||
'criteria' => [
|
||||
['field' => 'id', 'condition' => '=', 'value' => $id],
|
||||
],
|
||||
'firstRow' => 1
|
||||
], ['id','property_id']);
|
||||
|
||||
if (!$existingRow) {
|
||||
throw new ApiErrorException('Record not found');
|
||||
}
|
||||
|
||||
// Eğer dışarıdan property_id gönderildiyse, kayıtla eşleşmesini zorunlu tutalım
|
||||
if (!is_null($propertyId) && (int)$propertyId !== (int)$existingRow['property_id']) {
|
||||
// Bu durum, kullanıcının farklı bir property_id ile kayıt güncellemeye çalıştığını gösterir
|
||||
throw new ApiErrorException('Permission denied for this property');
|
||||
}
|
||||
|
||||
// Güvenlik: update sırasında property_id değiştirilmesin
|
||||
$updateData = [
|
||||
"name" => $name,
|
||||
"status" => $status,
|
||||
"updated_by" => $userId,
|
||||
"updated_at" => time(),
|
||||
];
|
||||
|
||||
// Repository update signature: update($id, $data)
|
||||
$updateResult = $this->propertyCompetitorGroupRepository->update($id, $updateData);
|
||||
if ($updateResult['status'] != 'success') {
|
||||
throw new Exception($updateResult['message']);
|
||||
}
|
||||
$data = $updateResult["data"];
|
||||
} else {
|
||||
// Ekleme
|
||||
$insertData = [
|
||||
"property_id" => $propertyId,
|
||||
"name" => $name,
|
||||
"status" => $status,
|
||||
"created_by" => $userId,
|
||||
"updated_by" => $userId,
|
||||
"created_at" => time(),
|
||||
"updated_at" => time(),
|
||||
];
|
||||
|
||||
$insertResult = $this->propertyCompetitorGroupRepository->create($insertData);
|
||||
if ($insertResult['status'] != 'success') {
|
||||
throw new Exception($insertResult['message']);
|
||||
}
|
||||
$data = $insertResult["data"];
|
||||
}
|
||||
|
||||
$response = [
|
||||
'status' => true,
|
||||
'data' => $data,
|
||||
];
|
||||
|
||||
} catch (ApiErrorException $e) {
|
||||
$response['message'] = implode(', ', $e->getMessageArr());
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
$response['message'] = 'api-unknown_error';
|
||||
}
|
||||
|
||||
return output($response);
|
||||
}
|
||||
|
||||
public function deletePropertyCompetitorGroup($deleteThisId)
|
||||
{
|
||||
$response = ['status' => -1, 'message' => '', 'data' => null];
|
||||
try {
|
||||
|
||||
$deleteThisId = is_array($deleteThisId) ? $deleteThisId : [$deleteThisId];
|
||||
$deleteThisArray = $this->propertyCompetitorGroupRepository->destroy($deleteThisId);
|
||||
|
||||
if ($deleteThisArray['status'] != 'success') {
|
||||
throw new Exception('api-unknown_error');
|
||||
}
|
||||
|
||||
$response = [
|
||||
'status' => true,
|
||||
'data' => null,
|
||||
];
|
||||
|
||||
} catch (ApiErrorException $e) {
|
||||
$response['message'] = implode(', ', $e->getMessageArr());
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
|
||||
Log::error($message);
|
||||
$response['message'] = $e->getMessage();
|
||||
}
|
||||
|
||||
return output($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mapping GET
|
||||
* GET isteklerinde meta alanlar (created_by, updated_by, created_at, updated_at) gizlenir.
|
||||
*/
|
||||
public function getPropertyCompetitorGroupMapping($param = [], $columns = [
|
||||
'id',
|
||||
'competitor_group_id',
|
||||
'property_id',
|
||||
'competitor_property_source',
|
||||
'competitor_property_key',
|
||||
'status',
|
||||
])
|
||||
{
|
||||
$response = ['status' => -1, 'message' => '', 'data' => null];
|
||||
|
||||
try {
|
||||
$propertyId = fillOnUndefined($param, 'property_id');
|
||||
$competitorGroupId = fillOnUndefined($param, 'competitor_group_id');
|
||||
|
||||
if (!$propertyId || !$competitorGroupId) {
|
||||
throw new ApiErrorException('property_id and competitor_group_id are required');
|
||||
}
|
||||
|
||||
$selectParams = [
|
||||
'criteria' => [
|
||||
['field' => 'property_id', 'condition' => '=', 'value' => $propertyId],
|
||||
['field' => 'competitor_group_id', 'condition' => '=', 'value' => $competitorGroupId],
|
||||
]
|
||||
];
|
||||
|
||||
$data = $this->propertyCompetitorGroupMappingRepository->findByCriteria($selectParams, $columns);
|
||||
|
||||
$response = [
|
||||
'status' => true,
|
||||
'data' => $data,
|
||||
];
|
||||
} catch (ApiErrorException $e) {
|
||||
$response['message'] = implode(', ', $e->getMessageArr());
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . ' ' . $e->getLine() . ' ' . $e->getMessage();
|
||||
Log::error($message);
|
||||
$response['message'] = 'api-unknown_error';
|
||||
}
|
||||
|
||||
return output($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mapping SYNC
|
||||
* Tam senkron: önce mevcutları sil, sonra yeni gelenleri ekle.
|
||||
* Dönüşte ilgili kayıtları (meta alanlar dahil) array olarak döndürür.
|
||||
*/
|
||||
public function syncPropertyCompetitorGroupMapping($param = [])
|
||||
{
|
||||
$response = ['status' => -1, 'message' => '', 'data' => null];
|
||||
|
||||
try {
|
||||
$propertyId = fillOnUndefined($param, 'property_id');
|
||||
$competitorGroupId = fillOnUndefined($param, 'competitor_group_id');
|
||||
$competitors = fillOnUndefined($param, 'competitor', []);
|
||||
$userId = fillOnUndefined($param, 'user_id');
|
||||
|
||||
if (!$propertyId || !$competitorGroupId) {
|
||||
throw new ApiErrorException('property_id and competitor_group_id are required');
|
||||
}
|
||||
|
||||
// YETKİ KONTROLÜ: competitor_group_id gerçekten bu property_id'ye ait mi?
|
||||
// Kullanıcı, farklı bir gruba (başka property'ye ait) yazmaya çalışırsa engelle.
|
||||
$groupRow = $this->propertyCompetitorGroupRepository->findByCriteria([
|
||||
'criteria' => [
|
||||
['field' => 'id', 'condition' => '=', 'value' => $competitorGroupId],
|
||||
],
|
||||
'firstRow' => 1
|
||||
], ['id', 'property_id']);
|
||||
|
||||
if (!$groupRow) {
|
||||
throw new ApiErrorException('Competitor group not found');
|
||||
}
|
||||
|
||||
if ((int)$groupRow['property_id'] !== (int)$propertyId) {
|
||||
// İstenen davranış: kullanıcı farklı bir grup ID gönderirse ve bu grup bu property'e ait değilse izin verme
|
||||
throw new ApiErrorException('Permission denied for this competitor group');
|
||||
}
|
||||
|
||||
// 1) Eski kayıtları temizle (tam eşitleme) — yalnızca ilgili property_id + competitor_group_id çiftini hedefle
|
||||
// Not: Repository delete() metodunda filtre anahtarı 'criteria' olmalı; 'where' kullanılırsa tüm kayıtlar silinebilir.
|
||||
$deleteWhere = [
|
||||
'criteria' => [
|
||||
['field' => 'property_id', 'condition' => '=', 'value' => $propertyId],
|
||||
['field' => 'competitor_group_id', 'condition' => '=', 'value' => $competitorGroupId],
|
||||
]
|
||||
];
|
||||
$deleteResult = $this->propertyCompetitorGroupMappingRepository->delete($deleteWhere);
|
||||
if (($deleteResult['status'] ?? 'success') !== 'success') {
|
||||
throw new Exception($deleteResult['message'] ?? 'delete_error');
|
||||
}
|
||||
|
||||
// 2) Yeni kayıtları ekle
|
||||
$now = time();
|
||||
$rows = [];
|
||||
foreach ($competitors as $c) {
|
||||
$source = $c['source'] ?? 'extranetwork';
|
||||
$key = $c['key'] ?? null;
|
||||
if (!$key) { // key zorunlu
|
||||
continue;
|
||||
}
|
||||
$rows[] = [
|
||||
'competitor_group_id' => $competitorGroupId,
|
||||
'property_id' => $propertyId,
|
||||
'competitor_property_source' => $source ?: 'extranetwork',
|
||||
'competitor_property_key' => (string)$key,
|
||||
'status' => 1,
|
||||
'created_by' => $userId,
|
||||
'updated_by' => $userId,
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now,
|
||||
];
|
||||
}
|
||||
|
||||
if (!empty($rows)) {
|
||||
$insertResult = $this->propertyCompetitorGroupMappingRepository->insert($rows);
|
||||
if (($insertResult['status'] ?? '') !== 'success') {
|
||||
throw new Exception($insertResult['message'] ?? 'insert_error');
|
||||
}
|
||||
}
|
||||
|
||||
// 3) Güncel kayıtları geri döndür
|
||||
$selectParams = [
|
||||
'criteria' => [
|
||||
['field' => 'property_id', 'condition' => '=', 'value' => $propertyId],
|
||||
['field' => 'competitor_group_id', 'condition' => '=', 'value' => $competitorGroupId],
|
||||
]
|
||||
];
|
||||
|
||||
$columns = [
|
||||
'id',
|
||||
'competitor_group_id',
|
||||
'property_id',
|
||||
'competitor_property_source',
|
||||
'competitor_property_key',
|
||||
'status',
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'created_at',
|
||||
'updated_at',
|
||||
];
|
||||
|
||||
$rowsResult = $this->propertyCompetitorGroupMappingRepository->findByCriteria($selectParams, $columns);
|
||||
|
||||
$response = [
|
||||
'status' => true,
|
||||
'data' => $rowsResult,
|
||||
];
|
||||
} catch (ApiErrorException $e) {
|
||||
$response['message'] = implode(', ', $e->getMessageArr());
|
||||
} catch (Exception $e) {
|
||||
$message = $e->getFile() . ' ' . $e->getLine() . ' ' . $e->getMessage();
|
||||
Log::error($message);
|
||||
$response['message'] = 'api-unknown_error';
|
||||
}
|
||||
|
||||
return output($response);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user