プロジェクト

全般

プロフィール

操作問い合わせ #3805 » ObjectLockService.php

保守サポート 担当362, 2026/07/07 15:17

 
<?php
/*
** Job Arranger Manager
** Copyright (C) 2023 Daiwa Institute of Research Ltd. All Rights Reserved.
**
** Licensed to the Apache Software Foundation (ASF) under one or more
** contributor license agreements. See the NOTICE file distributed with
** this work for additional information regarding copyright ownership.
** The ASF licenses this file to you under the Apache License, Version 2.0
** (the "License"); you may not use this file except in compliance with
** the License. You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
**
**/

namespace App\Services;

use App\Utils\Service;
use App\Utils\Core;
use App\Utils\Constants;
use App\Services\ObjectDetailService;
use App\Models\ObjectLockModel;
use App\Models\CalendarModel;
use App\Models\FilterModel;
use App\Models\JobnetModel;
use App\Models\ScheduleModel;
use App\Models\UserModel;
use App\Utils\Util;
use Datetime, DateInterval;
use PDOException;

/**
* This service is used to manage the object lock services.
*
* @version 6.1.0
* @since Class available since version 6.1.0
*/
class ObjectLockService extends Service
{


/**
* @var \App\Services\ObjectDetailService
*/
private $objectDetailService;
/**
* @var ObjectLockModel
*/
private $objectLockModel;
/**
* @var CalendarModel
*/
private $calendarModel;
/**
* @var FilterModel
*/
private $filterModel;
/**
* @var ScheduleModel
*/
private $scheduleModel;
/**
* @var JobnetModel
*/
private $jobnetModel;
/**
* @var UserModel
*/
private $userModel;
protected $logger;

public function __construct()
{
parent::__construct();
$this->logger = Core::logger();
$this->objectDetailService = new ObjectDetailService();
$this->objectLockModel = new ObjectLockModel();
$this->calendarModel = new CalendarModel();
$this->filterModel = new FilterModel();
$this->scheduleModel = new ScheduleModel();
$this->jobnetModel = new JobnetModel();
$this->userModel = new UserModel();
$this->util = new Util();
}

public function getClientIpAddress()
{
if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
$ip = $_SERVER["HTTP_CLIENT_IP"];
} elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
$ip = $_SERVER["REMOTE_ADDR"];
}
return $ip;
}
/**
* It checks whether or not current login user got permission for the object
*
* @param object $detail detail information of object.
* @param string $action type of the action. "VALID" or "DEL"
* @param int $type type of object
* @throws PDOException
* @return bool
* @since Method available since version 6.1.0
*/
public function isValid($detail, $action, $type = null)
{
$this->logger->info('Check editable service is started.', ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
try {
$this->logger->info('#3805 => start working [isValid method of objectLockService]');
$this->logger->info('#3805 => details in [isValid method of objectLockService] : '. print_r($detail, true));
$this->logger->info('#3805 => action in [isValid method of objectLockService] : '. print_r($action, true));
$this->logger->info('#3805 => type in [isValid method of objectLockService] : '. print_r($type, true));
if (Constants::OBJECT_TYPE_SCHEDULE == $type) {
$username = $detail['userName'];
} else {
$username = $detail->user_name;
}
$this->logger->info('#3805 => user name in [isValid method of objectLockService] : '. print_r($user_name, true));
$objectUserGroupList = $this->userModel->getGroupIDListByAlias($username);
$this->logger->info('#3805 => object User Group List in [isValid method of objectLockService]/ user owned object/ : '. print_r($objectUserGroupList, true));
$userGroupList = $_SESSION['userInfo']['groupList'];
$this->logger->info('#3805 => user Group List in [isValid method of objectLockService]/ session user/ : '. print_r($userGroupList, true));
$objectOwnType = Constants::OBJECT_USER_TYPE_OTHER;
if ($this->userModel->isExistGroupId($userGroupList, $objectUserGroupList)) {
$objectOwnType = Constants::OBJECT_USER_TYPE_OWN;
}
$this->logger->info('#3805 => object own type in [isValid method of objectLockService] : '. print_r($objectOwnType, true));
$valid = true;
$this->logger->info('#3805 => user Info in [isValid method of objectLockService] : '. print_r($_ESSSION['userInfo'], true));
$this->logger->info('#3805 => user Type in [isValid method of objectLockService] : '. print_r($_SESSION['userInfo']['userType'], true));
if ($_SESSION['userInfo']['userType'] == Constants::USER_TYPE_GENERAL) {
$this->logger->info('#3805 => this is first condition in [isValid method of objectLockService].');
$valid = false;
} else if ($_SESSION['userInfo']['userType'] != Constants::USER_TYPE_SUPER && $objectOwnType == Constants::OBJECT_USER_TYPE_OTHER && $action == Constants::OBJ_VALID_PROC) {
$this->logger->info('#3805 => this is first condition in [isValid method of objectLockService].');
$valid = false;
} else if ($_SESSION['userInfo']['userType'] != Constants::USER_TYPE_ADMIN && $_SESSION['userInfo']['userType'] != Constants::USER_TYPE_SUPER && $objectOwnType == Constants::OBJECT_USER_TYPE_OTHER && $action == Constants::OBJ_DELETE_PROC) {
$this->logger->info('#3805 => user Type is user role in [isValid method of objectLockService].');
$valid = false;
}
return $valid;
} catch (PDOException $e) {
$this->logger->info('#3805 => PDOException in [isValid method of ObjectLockService]: ' . $e->getMessage());
return Constants::SERVICE_INTERNAL_SERVER_ERROR;
}
}

/**
* It checks object is editable or not.
*
* @param object $detail detail information of object.
* @param int $type type of object
* @param bool $version
* @throws PDOException
* @return string $editable
* @since Method available since version 6.1.0
*/
public function isEditable($detail, $type, $version = false): String
{
$this->logger->debug('Check editable service is started.', ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
try {
if (Constants::OBJECT_TYPE_SCHEDULE == $type) {
$detail = $detail[0];
$validFlag = $detail['validFlag'];
$objectUserGroupList = $this->userModel->getGroupIDListByAlias($detail['userName']);
} else {
$validFlag = $detail->valid_flag;
$objectUserGroupList = $this->userModel->getGroupIDListByAlias($detail->user_name);
}

$userGroupList = $_SESSION['userInfo']['groupList'];
$editable = Constants::SERVICE_MESSAGE_UNEDITABLE;

$objectOwnType = Constants::OBJECT_USER_TYPE_OTHER;
if ($this->userModel->isExistGroupId($userGroupList, $objectUserGroupList)) {
$objectOwnType = Constants::OBJECT_USER_TYPE_OWN;
}
if ($_SESSION['userInfo']['userType'] == Constants::USER_TYPE_SUPER || ($objectOwnType == Constants::OBJECT_USER_TYPE_OWN && $_SESSION['userInfo']['userType'] == Constants::USER_TYPE_ADMIN)) {
if ($version) {
$editable = Constants::SERVICE_MESSAGE_EDITABLE;
} else {
if ($validFlag == 0) {
$editable = Constants::SERVICE_MESSAGE_EDITABLE;
}
}
}
return $editable;
} catch (PDOException $e) {
return Constants::SERVICE_INTERNAL_SERVER_ERROR;
}
}

/**
* It checks object is editable or not for editing.
*
* @param object $data object info.
* @param string $type
* @throws PDOException
* @return string|array could be array if editable, could be string if uneditable
* @since Method available since version 6.1.0
*/
public function process($data, $type, $version = false): String
{
$this->logger->debug($type . ' service is started.', ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
$detail = $this->objectDetailService->getSingleObject($data->objectId, $data->objectType, null);
if ($detail == Constants::SERVICE_MESSAGE_ITEM_NOT_FOUND) {
return Constants::SERVICE_INTERNAL_SERVER_ERROR;
}
$isEditable = $this->isEditable($detail, $data->objectType, $version);
if ($isEditable != Constants::SERVICE_MESSAGE_EDITABLE) {
$this->logger->debug('Object is not editable.', ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
return $isEditable;
}

$this->logger->debug('Object is editable.', ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);

try {

$checkWhere = "object_id = '$data->objectId' AND object_type = $data->objectType";
$checkResult = $this->objectLockModel->checkObjectLock($checkWhere);
if ($checkResult) {
if ($checkResult->username == $_SESSION['userInfo']['userName'] && $checkResult->attempt_ip == $data->attemptIp) {
//Lock user is same
$this->logger->info(Constants::SERVICE_MESSAGE_OBJ_LOCK_USER_SAME, ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
return Constants::SERVICE_MESSAGE_OBJ_LOCK_USER_SAME;
}
$this->logger->info(Constants::SERVICE_MESSAGE_OBJ_LOCK_BY_OTHERS, ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
return Constants::SERVICE_MESSAGE_OBJ_LOCK_BY_OTHERS;

} else {
//Object is not locked.
if ($type == Constants::SERVICE_TYPE_LOCK) {
return $this->lockObject($data);
} else {
$this->logger->info(Constants::SERVICE_MESSAGE_OBJ_NOT_LOCK, ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
return Constants::SERVICE_MESSAGE_OBJ_NOT_LOCK;
}
}
} catch (PDOException $e) {
$this->logger->info(Constants::SERVICE_INTERNAL_SERVER_ERROR, ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
return Constants::SERVICE_INTERNAL_SERVER_ERROR;
}
}



/**
* It locks for editing object.
*
* @param object $data data of object to lock.
* @throws PDOException
* @return string fail or success message for lock process
* @since Method available since version 6.1.0
*/
public function lockObject($data): String
{
$this->logger->debug('Lock object service is started.', ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
$createdDate = time();
$objectData = [
'object_id' => $data->objectId,
'object_type' => $data->objectType,
'username' => $_SESSION['userInfo']['userName'],
'attempt_ip' => $data->attemptIp,
'created_date' => $createdDate,
'last_active_time' => $createdDate,
];

try {
if ($this->objectLockModel->insertObjectLock($objectData)) {
return Constants::SERVICE_MESSAGE_SUCCESS;
} else {
return Constants::SERVICE_MESSAGE_FAIL;
}
} catch (PDOException $e) {
return Constants::SERVICE_INTERNAL_SERVER_ERROR;
}
}

/**
* It retrieves locked object lists.
*
* @throws PDOException
* @return array|string could be array if success, could be string if fail
* @since Method available since version 6.1.0
*/
// public function init()
// {
// $this->logger->debug('Init service is started.', ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
// try {
// $data = $this->objectLockModel->getData();
// if ($data) {
// return $data;
// } else {
// $this->logger->error('Object init data is not found.', ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
// return Constants::SERVICE_MESSAGE_FAIL;
// }
// } catch (PDOException $e) {
// return Constants::SERVICE_INTERNAL_SERVER_ERROR;
// }
// }

/**
* It retrieves all locked object lists on search data.
*
* @param array $para
* @throws PDOException
* @return array|string could be array if success, could be string if fail
* @since Method available since version 6.1.0
*/
// public function lazySearch($para)
// {
// $this->logger->debug('Object lock lazy search service is started.', ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
// $sort = $para['sort'];
// $limit = $para['limit'];
// $searchArr = $para['whereArr'];

// $search = "";
// if ($searchArr[0] !== "") {
// $search = $search . "username LIKE '%" . $searchArr[0] . "%'" . " and";
// }
// if ($searchArr[1] !== "") {
// $search = $search . " object_id LIKE '%" . $searchArr[1] . "%'" . " and";
// }
// if ($searchArr[2] !== "") {
// $search = $search . " object_type LIKE " . $searchArr[2] . " and";
// }

// try {
// return $this->objectLockModel->searchLockData($sort, $limit, $search);
// } catch (PDOException $e) {
// return Constants::SERVICE_INTERNAL_SERVER_ERROR;
// }
// }

/**
* It deletes locked object.
*
* @param object $data data of locked object.
* @throws PDOException
* @return string fail or success message for unlock process
* @since Method available since version 6.1.0
*/
public function deleteLockObject($data): String
{
$this->logger->debug('Delete lock service is started.', ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
try {
$deleteWhere = "object_id = '$data->objectId' AND object_type = $data->objectType";
if ($this->objectLockModel->deleteObjectLock($deleteWhere)) {
return Constants::SERVICE_MESSAGE_SUCCESS;
} else {
return Constants::SERVICE_MESSAGE_FAIL;
$this->logger->debug('Object lock delete failed. id:' . $data->objectId, ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
}
} catch (PDOException $e) {
$this->logger->error($e->getMessage(), ['controller' => __METHOD__, 'user' => $_SESSION['userInfo']['userName']]);
return Constants::SERVICE_INTERNAL_SERVER_ERROR;
}
}
}
(8-8/9)