summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2023-07-26 18:38:09 +0200
committerJoas Schilling <coding@schilljs.com>2023-08-08 10:46:53 +0200
commit65893d2c4afa6d838d2dc438c7c413d473c0d9ab (patch)
treec75c55be68894824c5eeb1101a6b8692b485d2c5
parent71ee2c8cd08fbeae97d7f9cbff6f0b81636ff663 (diff)
feat(bots): Add API to list, enable and disable bots in a conversation
Signed-off-by: Joas Schilling <coding@schilljs.com>
-rw-r--r--appinfo/routes/routesBotController.php12
-rw-r--r--lib/Controller/BotController.php98
2 files changed, 107 insertions, 3 deletions
diff --git a/appinfo/routes/routesBotController.php b/appinfo/routes/routesBotController.php
index c8a1d5db1..f61d6aa1f 100644
--- a/appinfo/routes/routesBotController.php
+++ b/appinfo/routes/routesBotController.php
@@ -28,9 +28,21 @@ $requirements = [
'token' => '[a-z0-9]{4,30}',
];
+$requirementsWithBotId = [
+ 'apiVersion' => 'v1',
+ 'token' => '[a-z0-9]{4,30}',
+ 'botId' => '[0-9]+',
+];
+
return [
'ocs' => [
/** @see \OCA\Talk\Controller\BotController::sendMessage() */
['name' => 'Bot#sendMessage', 'url' => '/api/{apiVersion}/bot/{token}/message', 'verb' => 'POST', 'requirements' => $requirements],
+ /** @see \OCA\Talk\Controller\BotController::listBots() */
+ ['name' => 'Bot#listBots', 'url' => '/api/{apiVersion}/bot/{token}', 'verb' => 'GET', 'requirements' => $requirements],
+ /** @see \OCA\Talk\Controller\BotController::enableBot() */
+ ['name' => 'Bot#enableBot', 'url' => '/api/{apiVersion}/bot/{token}/{botId}', 'verb' => 'POST', 'requirements' => $requirementsWithBotId],
+ /** @see \OCA\Talk\Controller\BotController::disableBot() */
+ ['name' => 'Bot#disableBot', 'url' => '/api/{apiVersion}/bot/{token}/{botId}', 'verb' => 'DELETE', 'requirements' => $requirementsWithBotId],
],
];
diff --git a/lib/Controller/BotController.php b/lib/Controller/BotController.php
index 38a441ce5..522e40ad9 100644
--- a/lib/Controller/BotController.php
+++ b/lib/Controller/BotController.php
@@ -29,13 +29,19 @@ namespace OCA\Talk\Controller;
use OCA\Talk\Chat\ChatManager;
use OCA\Talk\Exceptions\UnauthorizedException;
use OCA\Talk\Manager;
+use OCA\Talk\Middleware\Attribute\RequireLoggedInModeratorParticipant;
use OCA\Talk\Model\Attendee;
use OCA\Talk\Model\Bot;
+use OCA\Talk\Model\BotConversation;
+use OCA\Talk\Model\BotConversationMapper;
+use OCA\Talk\Model\BotServerMapper;
use OCA\Talk\Service\BotService;
use OCA\Talk\Service\ChecksumVerificationService;
use OCA\Talk\Service\ParticipantService;
+use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\BruteForceProtection;
+use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\PublicPage;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Utility\ITimeFactory;
@@ -52,9 +58,11 @@ class BotController extends AEnvironmentAwareController {
protected ParticipantService $participantService,
protected ITimeFactory $timeFactory,
protected ChecksumVerificationService $checksumVerificationService,
- protected BotService $botService,
- protected Manager $manager,
- protected LoggerInterface $logger,
+ protected BotConversationMapper $botConversationMapper,
+ protected BotServerMapper $botServerMapper,
+ protected BotService $botService,
+ protected Manager $manager,
+ protected LoggerInterface $logger,
) {
parent::__construct($appName, $request);
}
@@ -139,4 +147,88 @@ class BotController extends AEnvironmentAwareController {
return new DataResponse([], Http::STATUS_CREATED);
}
+
+ #[NoAdminRequired]
+ #[RequireLoggedInModeratorParticipant]
+ public function listBots(): DataResponse {
+ $alreadyInstalled = array_map(static function (BotConversation $bot): int {
+ return $bot->getBotId();
+ }, $this->botConversationMapper->findForToken($this->room->getToken()));
+
+ $bots = $this->botServerMapper->getAllBots();
+ foreach ($bots as $bot) {
+ $state = in_array($bot->getId(), $alreadyInstalled, true) ? Bot::STATE_ENABLED : Bot::STATE_DISABLED;
+
+ if ($bot->getState() === Bot::STATE_NO_SETUP) {
+ if ($state === Bot::STATE_DISABLED) {
+ continue;
+ }
+ $state = Bot::STATE_NO_SETUP;
+ }
+
+ $data[] = [
+ 'id' => $bot->getId(),
+ 'name' => $bot->getName(),
+ 'description' => $bot->getDescription(),
+ 'state' => $state ,
+ ];
+ }
+
+ return new DataResponse($data);
+ }
+
+ #[NoAdminRequired]
+ #[RequireLoggedInModeratorParticipant]
+ public function enableBot(int $botId): DataResponse {
+ try {
+ $bot = $this->botServerMapper->findById($botId);
+ } catch (DoesNotExistException) {
+ return new DataResponse([
+ 'error' => 'bot',
+ ], Http::STATUS_BAD_REQUEST);
+ }
+
+ if ($bot->getState() !== Bot::STATE_ENABLED) {
+ return new DataResponse([
+ 'error' => 'bot',
+ ], Http::STATUS_BAD_REQUEST);
+ }
+
+ $alreadyInstalled = array_map(static function (BotConversation $bot): int {
+ return $bot->getBotId();
+ }, $this->botConversationMapper->findForToken($this->room->getToken()));
+
+ if (in_array($botId, $alreadyInstalled)) {
+ return new DataResponse([], Http::STATUS_OK);
+ }
+
+ $conversationBot = new BotConversation();
+ $conversationBot->setBotId($botId);
+ $conversationBot->setToken($this->room->getToken());
+ $conversationBot->setState(Bot::STATE_ENABLED);
+
+ $this->botConversationMapper->insert($conversationBot);
+ return new DataResponse([], Http::STATUS_CREATED);
+ }
+
+ #[NoAdminRequired]
+ #[RequireLoggedInModeratorParticipant]
+ public function disableBot(int $botId): DataResponse {
+ try {
+ $bot = $this->botServerMapper->findById($botId);
+ } catch (DoesNotExistException) {
+ return new DataResponse([
+ 'error' => 'bot',
+ ], Http::STATUS_BAD_REQUEST);
+ }
+
+ if ($bot->getState() !== Bot::STATE_ENABLED) {
+ return new DataResponse([
+ 'error' => 'bot',
+ ], Http::STATUS_BAD_REQUEST);
+ }
+
+ $this->botConversationMapper->deleteByBotIdAndTokens($botId, [$this->room->getToken()]);
+ return new DataResponse([], Http::STATUS_OK);
+ }
}