<?php
namespace ApiV3Bundle\Controller;
use ApiV3Bundle\Common\Paginator;
use ApiV3Bundle\Util\AssetHelper;
use AppBundle\Common\ArrayToolkit;
use AppBundle\Twig\WebExtension;
use Biz\Course\Service\CourseService;
use Biz\Role\Util\PermissionBuilder;
use Biz\System\Service\SettingService;
use Biz\Testpaper\Service\TestpaperService;
use Biz\User\CurrentUser;
use Common\PrepareOrgTrait;
use Common\ValidatorTrait;
use CorporateTrainingBundle\Biz\ManagePermission\Service\ManagePermissionOrgService;
use CorporateTrainingBundle\Biz\Org\Service\OrgService;
use CorporateTrainingBundle\Biz\ResourceScope\Service\ResourceAccessScopeService;
use CorporateTrainingBundle\Biz\ResourceScope\Service\ResourceVisibleScopeService;
use CorporateTrainingBundle\Biz\User\Service\UserService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class BaseController extends AbstractController
{
use PrepareOrgTrait;
use ValidatorTrait;
public const APP_MODULE = 'app';
public const TOKEN_TYPE = 'mobile_login';
public const PREFIX_SORT_DESC = '-';
public const NEW_TOKEN_HEADER = 'Access-Token';
/**
* @return CurrentUser
*/
protected function getCurrentUser()
{
return $this->getUser();
}
protected function getBiz()
{
return $this->get('biz');
}
/**
* @return CurrentUser
*/
public function getUser()
{
return $this->getTokenStorage()->getToken()->getUser();
}
protected function getHeaderInfo($request)
{
if (null === $request->headers->get(self::NEW_TOKEN_HEADER)) {
return false;
}
return true;
}
public function setCurrentUser($userId, $request)
{
$user = $this->getUserService()->getUserWithOrgScopes($userId);
$currentUser = new CurrentUser();
if (empty($user)) {
$user = ['id' => 0];
}
$user['currentIp'] = $request->getClientIp();
$currentUser = $currentUser->fromArray($user);
$permissions = PermissionBuilder::instance()->findPermissionsByRoles($currentUser->getRoles());
$currentUser->setPermissions($permissions);
$biz = $this->getBiz();
$biz['user'] = $currentUser;
}
protected function trans($id, array $parameters = [], $domain = null, $locale = null)
{
return $this->container->get('translator')->trans($id, $parameters, $domain, $locale);
}
protected function isPluginInstalled($pluginName)
{
return $this->get('kernel')->getPluginConfigurationManager()->isPluginInstalled($pluginName);
}
protected function createJsonResponse($data = null, $status = Response::HTTP_OK, $headers = [])
{
return new JsonResponse($data, $status, $headers);
}
protected function createSuccessJsonResponse($data = null, $code = null)
{
$resultData = ['status' => true];
if (null !== $data) {
$resultData['data'] = $data;
}
if (null !== $code) {
$resultData['code'] = $code;
}
return $this->createJsonResponse($resultData);
}
protected function createViolationJsonResponse($message = '', $arguments = [], $code = 0, $data = null)
{
if (null === $data) {
return $this->createJsonResponse([
'status' => false,
'code' => $code,
'message' => $this->trans($message, $arguments),
], Response::HTTP_BAD_REQUEST);
}
return $this->createJsonResponse([
'status' => false,
'code' => $code,
'data' => $data,
'message' => $this->trans($message, $arguments),
], Response::HTTP_BAD_REQUEST);
}
protected function createPaginationJsonResponse($data, Paginator $paginator)
{
return $this->createJsonResponse(['status' => true, 'data' => $data, 'paginator' => $paginator->__toArray()], Response::HTTP_OK);
}
protected function getLdapConfigParameter($name)
{
return $this->container->getParameter($name);
}
protected function log($action, $message, $data)
{
$this->getLogService()->info(
self::APP_MODULE,
$action,
$message,
$data
);
}
protected function getListSort(Request $request)
{
$sortStr = $request->query->get('sort');
if ($sortStr) {
$explodeSort = explode(',', $sortStr);
$sort = [];
foreach ($explodeSort as $part) {
$prefix = substr($part, 0, 1);
$field = str_replace(self::PREFIX_SORT_DESC, '', $part);
if (self::PREFIX_SORT_DESC == $prefix) {
$sort[$field] = 'DESC';
} else {
$sort[$field] = 'ASC';
}
}
return $sort;
}
return [];
}
protected function getUsersInfo($userId)
{
$user = $this->getUserService()->getUser($userId);
if ($user) {
$user['userGroup'] = $this->getUserGroupMemberService()->findUserGroupsByUserId($user['id']);
$user['permissionOrg'] = $this->getManagePermissionOrgService()->findUserManageOrgIdsByUserId($user['id']);
$profile = $this->getUserService()->getUserProfile($user['id']);
$user = array_merge($profile, $user);
$relevantColumns = ['org', 'post', 'role', 'permissionOrg'];
$users = $this->getUserService()->searchUserRelevantInfoByUsers([$user], $relevantColumns);
if (!empty($users[$user['id']]['orgIds'])) {
$orgs = $this->getOrgService()->findOrgsByIds($users[$user['id']]['orgIds']);
$users[$user['id']]['orgNames'] = implode('|', array_column($orgs, 'name'));
}
return $users[$user['id']];
}
return $user;
}
protected function packageUserInfo($users)
{
$userInfo = [];
$userInfo['truename'] = $users['truename'];
$userInfo['nickname'] = $users['nickname'];
$userInfo['postName'] = !empty($users['post']['name']) ? $users['post']['name'] : '';
$userInfo['postId'] = !empty($users['post']['id']) ? $users['post']['id'] : '';
$userInfo['fullOrg'] = $users['fullOrg'];
$userInfo['fullOrgIds'] = implode('|', ArrayToolkit::column($users['org'], 'id'));
return $userInfo;
}
protected function getFilePath($uri, $default = '', $absolute = false)
{
/**
* @var WebExtension $webExtension
*/
$webExtension = $this->container->get('web.twig.extension');
return $webExtension->getFilePath($uri, $default, $absolute);
}
protected function getFpath($path, $defaultKey = false, $package = 'content')
{
/**
* @var WebExtension $webExtension
*/
$webExtension = $this->container->get('web.twig.extension');
return $webExtension->getFpath($path, $defaultKey, $package);
}
public function filterHtml($text)
{
if (empty($text)) {
return '';
}
preg_match_all('/\<img.*?src\s*=\s*[\'\"](.*?)[\'\"]/i', $text, $matches);
if (empty($matches)) {
return $text;
}
$path = trim($this->container->getParameter('topxia.upload.public_url_path'), '/');
foreach ($matches[1] as $url) {
$uri = preg_replace("/^\/{$path}\//", '', $url); // getFurl方法会默认加上 $path
$text = str_replace($url, AssetHelper::getFurl($uri, 'content'), $text);
}
return $text;
}
protected function formatUserInfo($ownerId)
{
$userInfo = current($this->getUserService()->searchUsers([
'id' => $ownerId ?? -1,
'noNeedLocked' => 1,
], [], 0, 1, ['id', 'truename', 'nickname', 'smallAvatar', 'mediumAvatar', 'largeAvatar']));
$userInfo['smallAvatar'] = AssetHelper::getFurl($userInfo['smallAvatar'] ?? '', 'avatar.png');
$userInfo['mediumAvatar'] = AssetHelper::getFurl($userInfo['mediumAvatar'] ?? '', 'avatar.png');
$userInfo['largeAvatar'] = AssetHelper::getFurl($userInfo['largeAvatar'] ?? '', 'avatar.png');
return $userInfo;
}
protected function formatOrgInfos(array $orgIds)
{
$orgs = $this->getOrgService()->findOrgsByIds($orgIds ?? -1);
$orgInfos = array_map(function ($org) {
return $org ? [
'id' => $org['id'],
'name' => $org['name'],
'orgCode' => $org['orgCode'],
] : null;
}, $orgs);
return ArrayToolkit::index($orgInfos, 'id');
}
protected function formatUserInfos(array $userIds, ?string $type = null)
{
$conditions = [
'userIds' => $userIds ?: '-1',
'noNeedLocked' => 1,
];
if ('all' === $type) {
$conditions['type'] = 'all';
$conditions['isExcludeTypes'] = true;
}
$userInfos = $this->getUserService()->searchUsers($conditions, [], 0, PHP_INT_MAX, ['id', 'truename', 'nickname', 'smallAvatar', 'mediumAvatar', 'largeAvatar', 'locked']);
$userInfos = ArrayToolkit::index($userInfos, 'id');
foreach ($userInfos as $key => $userInfo) {
$userInfos[$key]['smallAvatar'] = AssetHelper::getFurl($userInfo['smallAvatar'] ?? '', 'avatar.png');
$userInfos[$key]['mediumAvatar'] = AssetHelper::getFurl($userInfo['mediumAvatar'] ?? '', 'avatar.png');
$userInfos[$key]['largeAvatar'] = AssetHelper::getFurl($userInfo['largeAvatar'] ?? '', 'avatar.png');
}
return $userInfos;
}
protected function getOrgIdStringByCodeString($orgCodeString)
{
$orgCodes = explode(',', $orgCodeString);
$orgs = $this->getOrgService()->findOrgsByOrgCodes($orgCodes);
return implode(',', array_column($orgs, 'id'));
}
/**
* @return SettingService
*/
protected function getSettingService()
{
return $this->createService('System:SettingService');
}
/**
* @return UserService
*/
protected function getUserService()
{
return $this->createService('User:UserService');
}
public function getLogService()
{
return $this->createService('System:LogService');
}
/**
* @return CourseService
*/
protected function getCourseService()
{
return $this->createService('Course:CourseService');
}
/**
* @return \Biz\Course\Service\Impl\CourseSetServiceImpl
*/
protected function getCourseSetService()
{
return $this->createService('Course:CourseSetService');
}
protected function getTaskService()
{
return $this->createService('Task:TaskService');
}
protected function getActivityService()
{
return $this->createService('Activity:ActivityService');
}
/**
* @return TestpaperService
*/
protected function getTestpaperService()
{
return $this->createService('Testpaper:TestpaperService');
}
protected function getUserGroupMemberService()
{
return $this->createService('CorporateTrainingBundle:UserGroup:MemberService');
}
/**
* @return ManagePermissionOrgService
*/
protected function getManagePermissionOrgService()
{
return $this->createService('CorporateTrainingBundle:ManagePermission:ManagePermissionOrgService');
}
protected function createService($alias)
{
$biz = $this->getBiz();
return $biz->service($alias);
}
protected function getTokenStorage()
{
return $this->container->get('security.token_storage');
}
/**
* @return OrgService
*/
protected function getOrgService()
{
return $this->getBiz()->service('Org:OrgService');
}
/**
* @return ResourceAccessScopeService
*/
protected function getResourceAccessService()
{
return $this->createService('CorporateTrainingBundle:ResourceScope:ResourceAccessScopeService');
}
/**
* @return ResourceVisibleScopeService
*/
protected function getResourceVisibleScopeService()
{
return $this->getBiz()->service('ResourceScope:ResourceVisibleScopeService');
}
}