/
kev
/
Nextcloud_Users-mod
Обзор
Документация
Войти
/
kev
/
Nextcloud_Users-mod
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lib/Controller/UsersApiController.php
328 строк
12 KB
Evgeny Konovalov
first_commit
01 мар 2026, 19:48
01 мар 2026, 19:48
b6c8230
Код
Авторство
О чём код?
<?php declare(strict_types=1); namespace OCA\Users_mod\Controller; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\Attribute\NoCSRFRequired; use OCP\AppFramework\Http\DataResponse; use OCP\IRequest; use OCP\IUserManager; use OCA\Users_mod\Service\UserManagementService; /** * API для списка, создания, редактирования и удаления пользователей (только для администраторов). */ class UsersApiController extends Controller { public function __construct( string $appName, IRequest $request, private UserManagementService $userService, private IUserManager $userManager, ) { parent::__construct($appName, $request); } /** * GET /api/users — список пользователей (поиск, лимит, смещение). */ #[NoCSRFRequired] public function index(): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } $search = $this->request->getParam('search', ''); $limit = (int) $this->request->getParam('limit', 100); $offset = (int) $this->request->getParam('offset', 0); $userIds = $this->userService->searchUsers($search, $limit, $offset); $list = []; foreach ($userIds as $uid) { $data = $this->userService->getUserData($uid); if ($data !== null) { $list[] = $data; } } return new DataResponse($list); } /** * GET /api/users/{userId} — данные одного пользователя. */ #[NoCSRFRequired] public function get(string $userId): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } $data = $this->userService->getUserData($userId); if ($data === null) { return new DataResponse(['error' => 'User not found'], 404); } return new DataResponse($data); } /** * Получить параметры запроса (GET + POST/JSON body). * Nextcloud может подставлять JSON body в getParams(); иначе пробуем прочитать поток один раз. */ private function getRequestBody(): array { $body = $this->request->getParams(); $contentType = (string) $this->request->getHeader('Content-Type'); if (!str_contains($contentType, 'application/json')) { return is_array($body) ? $body : []; } if (!method_exists($this->request, 'getInput')) { return is_array($body) ? $body : []; } try { $input = $this->request->getInput(); if ($input === null) { return is_array($body) ? $body : []; } $raw = null; if (is_resource($input)) { $raw = @stream_get_contents($input); } elseif (is_object($input) && method_exists($input, 'getContents')) { $raw = @$input->getContents(); } if ($raw !== null && $raw !== '' && is_string($raw)) { $decoded = json_decode($raw, true); if (is_array($decoded)) { $body = array_merge(is_array($body) ? $body : [], $decoded); } } } catch (\Throwable $e) { // оставляем только getParams() } return is_array($body) ? $body : []; } /** * POST /api/users — создание пользователя. */ public function create(): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } try { $body = $this->getRequestBody(); $userid = trim((string) ($body['userid'] ?? $body['id'] ?? '')); if ($userid === '') { return new DataResponse(['error' => 'userid is required'], 400); } $password = trim((string) ($body['password'] ?? '')); if ($password === '') { return new DataResponse(['error' => 'Password is required for new user'], 400); } $data = [ 'userid' => $userid, 'password' => $password, 'displayname' => (string) ($body['displayname'] ?? ''), 'email' => (string) ($body['email'] ?? ''), 'phone' => (string) ($body['phone'] ?? ''), 'address' => (string) ($body['address'] ?? ''), 'website' => (string) ($body['website'] ?? ''), 'twitter' => (string) ($body['twitter'] ?? ''), 'quota' => (string) ($body['quota'] ?? 'none'), 'groups' => isset($body['groups']) && is_array($body['groups']) ? $body['groups'] : [], ]; if ($data['quota'] === '') { $data['quota'] = 'none'; } $user = $this->userService->createUser($data); if ($user === null) { return new DataResponse([ 'error' => 'Could not create user (user may already exist or check data/nextcloud.log for details)', ], 400); } try { $out = $this->userService->getUserData($user->getUID()); } catch (\Throwable $e) { $out = ['id' => $user->getUID()]; } return new DataResponse($out ?: ['id' => $user->getUID()]); } catch (\Throwable $e) { return new DataResponse([ 'error' => 'Server error', 'message' => $e->getMessage(), ], 500); } } /** * PUT /api/users/{userId} — обновление пользователя. */ public function update(string $userId): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } $user = $this->userManager->get($userId); if ($user === null) { return new DataResponse(['error' => 'User not found'], 404); } $body = $this->getRequestBody(); $data = []; if (array_key_exists('displayname', $body)) { $data['displayname'] = (string) $body['displayname']; } if (array_key_exists('email', $body)) { $data['email'] = (string) $body['email']; } if (array_key_exists('phone', $body)) { $data['phone'] = (string) $body['phone']; } if (array_key_exists('address', $body)) { $data['address'] = (string) $body['address']; } if (array_key_exists('website', $body)) { $data['website'] = (string) $body['website']; } if (array_key_exists('twitter', $body)) { $data['twitter'] = (string) $body['twitter']; } if (array_key_exists('quota', $body)) { $data['quota'] = (string) $body['quota']; } if (array_key_exists('enabled', $body)) { $data['enabled'] = (bool) $body['enabled']; } if (array_key_exists('password', $body) && $body['password'] !== '') { $data['password'] = (string) $body['password']; } if (isset($body['groups']) && is_array($body['groups'])) { $data['groups'] = $body['groups']; } $this->userService->updateUserData($user, $data); $out = $this->userService->getUserData($userId); return new DataResponse($out ?: ['id' => $userId]); } /** * DELETE /api/users/{userId} — удаление пользователя. */ public function delete(string $userId): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } if ($this->userService->deleteUser($userId)) { return new DataResponse(['success' => true]); } return new DataResponse(['error' => 'Could not delete user'], 400); } /** * PUT /api/users/{userId}/enable — включить пользователя. */ public function enable(string $userId): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } if ($this->userService->setEnabled($userId, true)) { return new DataResponse(['success' => true]); } return new DataResponse(['error' => 'User not found'], 404); } /** * PUT /api/users/{userId}/disable — выключить пользователя. */ public function disable(string $userId): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } if ($this->userService->setEnabled($userId, false)) { return new DataResponse(['success' => true]); } return new DataResponse(['error' => 'User not found'], 404); } /** * GET /api/groups — список групп. */ #[NoCSRFRequired] public function groups(): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } return new DataResponse($this->userService->getGroupIds()); } /** * POST /api/groups — создание группы. */ public function groupCreate(): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } $body = $this->request->getParams(); $gid = trim((string) ($body['groupid'] ?? $body['id'] ?? '')); if ($gid === '') { return new DataResponse(['error' => 'groupid is required'], 400); } if (!$this->userService->createGroup($gid)) { return new DataResponse(['error' => 'Could not create group'], 400); } $data = $this->userService->getGroupData($gid); return new DataResponse($data ?: ['id' => $gid, 'members' => []]); } /** * GET /api/groups/{gid} — данные группы (участники). */ #[NoCSRFRequired] public function groupGet(string $gid): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } $data = $this->userService->getGroupData($gid); if ($data === null) { return new DataResponse(['error' => 'Group not found'], 404); } return new DataResponse($data); } /** * DELETE /api/groups/{gid} — удаление группы. */ public function groupDelete(string $gid): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } if ($this->userService->deleteGroup($gid)) { return new DataResponse(['success' => true]); } return new DataResponse(['error' => 'Could not delete group'], 400); } /** * POST /api/groups/{gid}/users — добавить пользователя в группу. */ public function groupAddUser(string $gid): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } $body = $this->request->getParams(); $uid = trim((string) ($body['userid'] ?? $body['uid'] ?? '')); if ($uid === '') { return new DataResponse(['error' => 'userid is required'], 400); } if ($this->userService->addUserToGroup($gid, $uid)) { return new DataResponse(['success' => true]); } return new DataResponse(['error' => 'Failed to add user'], 400); } /** * DELETE /api/groups/{gid}/users/{uid} — удалить пользователя из группы. */ public function groupRemoveUser(string $gid, string $uid): DataResponse { if (!$this->userService->isAdmin()) { return new DataResponse(['error' => 'Forbidden'], 403); } if ($this->userService->removeUserFromGroup($gid, $uid)) { return new DataResponse(['success' => true]); } return new DataResponse(['error' => 'Failed to remove user'], 400); } }