Browse Source

feat: add Context Chat OCP API

Signed-off-by: Edward Ly <contact@edward.ly>
pull/53859/head
Edward Ly 6 months ago
parent
commit
12b7129214
No known key found for this signature in database GPG Key ID: 62EA9B12D5B3AC47
  1. 50
      lib/private/ContextChat/ContentManager.php
  2. 2
      lib/private/Server.php
  3. 34
      lib/public/ContextChat/ContentItem.php
  4. 33
      lib/public/ContextChat/Events/ContentProviderRegisterEvent.php
  5. 105
      lib/public/ContextChat/IContentManager.php
  6. 47
      lib/public/ContextChat/IContentProvider.php
  7. 16
      lib/public/ContextChat/Type/UpdateAccessOp.php

50
lib/private/ContextChat/ContentManager.php

@ -0,0 +1,50 @@
<?php
/**
* SPDX-FileCopyrightText: 2024-2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OC\ContextChat;
use OCA\ContextChat\Public\ContentManager as ContextChatContentManager;
use OCP\ContextChat\IContentManager;
class ContentManager implements IContentManager {
public function __construct(
private ?ContextChatContentManager $contentManager,
) {
}
public function registerContentProvider(string $appId, string $providerId, string $providerClass): void {
$this->contentManager?->registerContentProvider($appId, $providerId, $providerClass);
}
public function collectAllContentProviders(): void {
$this->contentManager?->collectAllContentProviders();
}
public function submitContent(string $appId, array $items): void {
$this->contentManager?->submitContent($appId, $items);
}
public function updateAccess(string $appId, string $providerId, string $itemId, string $op, array $userIds): void {
$this->contentManager?->updateAccess($appId, $providerId, $itemId, $op, $userIds);
}
public function updateAccessProvider(string $appId, string $providerId, string $op, array $userIds): void {
$this->contentManager?->updateAccessProvider($appId, $providerId, $op, $userIds);
}
public function updateAccessDeclarative(string $appId, string $providerId, string $itemId, array $userIds): void {
$this->contentManager?->updateAccessDeclarative($appId, $providerId, $itemId, $op, $userIds);
}
public function deleteProvider(string $appId, string $providerId): void {
$this->contentManager?->deleteProvider($appId, $providerId);
}
public function deleteContent(string $appId, string $providerId, array $itemIds): void {
$this->contentManager?->deleteContent($appId, $providerId, $itemIds);
}
}

2
lib/private/Server.php

@ -277,6 +277,8 @@ class Server extends ServerContainer implements IServerContainer {
$this->registerAlias(\OCP\Contacts\IManager::class, \OC\ContactsManager::class);
$this->registerAlias(\OCP\ContextChat\IContentManager::class, \OC\ContextChat\ContentManager::class);
$this->registerAlias(\OCP\DirectEditing\IManager::class, \OC\DirectEditing\Manager::class);
$this->registerAlias(ITemplateManager::class, TemplateManager::class);
$this->registerAlias(\OCP\Template\ITemplateManager::class, \OC\Template\TemplateManager::class);

34
lib/public/ContextChat/ContentItem.php

@ -0,0 +1,34 @@
<?php
/**
* SPDX-FileCopyrightText: 2024-2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCP\ContextChat;
/**
* @since 32.0.0
*/
class ContentItem {
/**
* @param string $itemId
* @param string $providerId
* @param string $title
* @param string $content
* @param string $documentType
* @param \DateTime $lastModified
* @param string[] $users
* @since 32.0.0
*/
public function __construct(
public string $itemId,
public string $providerId,
public string $title,
public string $content,
public string $documentType,
public \DateTime $lastModified,
public array $users,
) {
}
}

33
lib/public/ContextChat/Events/ContentProviderRegisterEvent.php

@ -0,0 +1,33 @@
<?php
/**
* SPDX-FileCopyrightText: 2024-2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCP\ContextChat\Events;
use OCP\ContextChat\IContentManager;
use OCP\ContextChat\IContentProvider;
use OCP\EventDispatcher\Event;
/**
* @since 32.0.0
*/
class ContentProviderRegisterEvent extends Event {
public function __construct(
private IContentManager $contentManager,
) {
}
/**
* @param string $appId
* @param string $providerId
* @param class-string<IContentProvider> $providerClass
* @return void
* @since 32.0.0
*/
public function registerContentProvider(string $appId, string $providerId, string $providerClass): void {
$this->contentManager->registerContentProvider($appId, $providerId, $providerClass);
}
}

105
lib/public/ContextChat/IContentManager.php

@ -0,0 +1,105 @@
<?php
/**
* SPDX-FileCopyrightText: 2024-2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCP\ContextChat;
/**
* @since 32.0.0
*/
interface IContentManager {
/**
* @param string $appId
* @param string $providerId
* @param class-string<IContentProvider> $providerClass
* @return void
* @since 32.0.0
*/
public function registerContentProvider(string $appId, string $providerId, string $providerClass): void;
/**
* Emits an event to collect all content providers
*
* @return void
* @since 32.0.0
*/
public function collectAllContentProviders(): void;
/**
* Providers can use this to submit content for indexing in context chat
*
* @param string $appId
* @param ContentItem[] $items
* @return void
* @since 32.0.0
*/
public function submitContent(string $appId, array $items): void;
/**
* Update access for a content item for specified users.
* This modifies the access list for the content item,
* allowing or denying access to the specified users.
* If no user has access to the content item, it will be removed from the knowledge base.
*
* @param string $appId
* @param string $providerId
* @param string $itemId
* @param Type\UpdateAccessOp::* $op
* @param array $userIds
* @return void
* @since 32.0.0
*/
public function updateAccess(string $appId, string $providerId, string $itemId, string $op, array $userIds): void;
/**
* Update access for content items from the given provider for specified users.
* If no user has access to the content item, it will be removed from the knowledge base.
*
* @param string $appId
* @param string $providerId
* @param Type\UpdateAccessOp::* $op
* @param array $userIds
* @return void
* @since 32.0.0
*/
public function updateAccessProvider(string $appId, string $providerId, string $op, array $userIds): void;
/**
* Update access for a content item for specified users declaratively.
* This overwrites the access list for the content item,
* allowing only the specified users access to it.
*
* @param string $appId
* @param string $providerId
* @param string $itemId
* @param array $userIds
* @return void
* @since 32.0.0
*/
public function updateAccessDeclarative(string $appId, string $providerId, string $itemId, array $userIds): void;
/**
* Delete all content items and access lists for a provider.
* This does not unregister the provider itself.
*
* @param string $appId
* @param string $providerId
* @return void
* @since 32.0.0
*/
public function deleteProvider(string $appId, string $providerId): void;
/**
* Remove a content item from the knowledge base of context chat.
*
* @param string $appId
* @param string $providerId
* @param string[] $itemIds
* @return void
* @since 32.0.0
*/
public function deleteContent(string $appId, string $providerId, array $itemIds): void;
}

47
lib/public/ContextChat/IContentProvider.php

@ -0,0 +1,47 @@
<?php
/**
* SPDX-FileCopyrightText: 2024-2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCP\ContextChat;
/**
* This interface defines methods to implement a content provider
* @since 32.0.0
*/
interface IContentProvider {
/**
* The ID of the provider
*
* @return string
* @since 32.0.0
*/
public function getId(): string;
/**
* The ID of the app making the provider avaialble
*
* @return string
* @since 32.0.0
*/
public function getAppId(): string;
/**
* The absolute URL to the content item
*
* @param string $id
* @return string
* @since 32.0.0
*/
public function getItemUrl(string $id): string;
/**
* Starts the initial import of content items into context chat
*
* @return void
* @since 32.0.0
*/
public function triggerInitialImport(): void;
}

16
lib/public/ContextChat/Type/UpdateAccessOp.php

@ -0,0 +1,16 @@
<?php
/**
* SPDX-FileCopyrightText: 2024-2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCP\ContextChat\Type;
/**
* @since 32.0.0
*/
class UpdateAccessOp {
public const ALLOW = 'allow';
public const DENY = 'deny';
}
Loading…
Cancel
Save