Events

Events are used to communicate between different aspects of the Nextcloud eco system. They are used in the Nextcloud server internally, for server-to-apps communication as well as inter-app communication.

Overview

The term "events" is a bit broad in Nextcloud and there are multiple ways of emitting them.

OCP event dispatcher

This mechanism is a versatile and typed approach to events in Nextcloud's php code. It uses objects rather than just passing primitives or untyped arrays. This should help provide a better developer experience while lowering the risk of unexpected changes in the API that are hard to find after the initial implementation.

Naming scheme

The name should reflect the subject and the actions. Suffixing event classes with Event makes it easier to recognize their purpose.

For example, if a user is created, a UserCreatedEvent will be emitted.

Events are usually emitted after the event has happened. If it's emitted before, it should be prefixed with Before.

Thus BeforeUserCreatedEvent is emitted before the user data is written to the database.

Writing events

As a rule events are dedicated classes extending \OCP\EventDispatcher\Event.

<?php

use OCP\EventDispatcher\Event;

namespace OCA\MyApp\Event;

class AddEvent extends Event {}

The event above allows signalling that something happened. But in many cases you want to actually transport data like the affected resource with the event. Then the events act as simple data transfer objects. Therefore they need a constructor that takes the arguments, private members to store them and getters to access the values in listeners.

<?php

use OCP\EventDispatcher\Event;
use OCP\IUser;

class UserCreatedEvent extends Event {
    private IUser $user;

    public function __construct(IUser $user) {
        parent::__construct();
        $this->user = $user;
    }

    public function getUser(): IUser {
        return $this->user;
    }

}

Writing a listener

A listener can be a simple callback function (or anything else that is callable, or a dedicated class.

Listener callbacks

You can use simple callback to react on events. They will receive the event object as first and only parameter. You can type-hint the base Event class or the subclass you expect and register for.

<?php

use OCA\MyApp\Event\AddEvent;
use OCP\AppFramework\App;
use OCP\EventDispatcher\IEventDispatcher;

namespace OCA\MyApp\AppInfo;

class Application extends App {
    public function __construct() {
        parent::__construct('myapp');
            /* @var IEventDispatcher $dispatcher */
            $dispatcher = $this->getContainer()->query(IEventDispatcher::class);
            $dispatcher->addListener(AddEvent::class, function(AddEvent $event) {
                // ...
            });
    }
}

Listener classes

A class that can handle an event will implement the \OCP\EventDispatcher\IEventListener interface. Class names should end with Listener.

<?php

use OCA\MyApp\Event\AddEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;

namespace OCA\MyApp\Event;

class AddTwoListener implements IEventListener {

    public function handle(Event $event): void {
        if (!($event instanceOf AddEvent)) {
            return;
        }

        $event->addToCounter(2);
    }
}

In the Application.php the event and the listener class are connected. The class is instantiated only when the actual event is fired.

<?php

use OCA\MyApp\Event\AddEvent;
use OCA\MyApp\Listener\AddTwoListener;
use OCP\AppFramework\App;
use OCP\EventDispatcher\IEventDispatcher;

namespace OCA\MyApp\AppInfo;

class Application extends App {
    public function __construct() {
        parent::__construct('myapp');
        /* @var IEventDispatcher $eventDispatcher */
        $dispatcher = $this->getContainer()->get(IEventDispatcher::class);
        $dispatcher->addServiceListener(AddEvent::class, AddTwoListener::class);
    }
}

Available Events

Here you find an overview of the public events that can be consumed in apps. See their source files for more details.

\OCA\DAV\Events\AddressBookCreatedEvent

This event is triggered when a user creates a new address-book.

\OCA\DAV\Events\AddressBookDeletedEvent

This event is triggered when a user deletes an address-book.

\OCA\DAV\Events\AddressBookShareUpdatedEvent

This event is triggered when a user shares or unshares an address-book.

\OCA\DAV\Events\AddressBookUpdatedEvent

This event is triggered when a user updates an address-book.

\OCA\DAV\Events\CachedCalendarObjectCreatedEvent

This event is triggered when a cached calendar object is being created while fetching a calendar-subscription.

\OCA\DAV\Events\CachedCalendarObjectDeletedEvent

This event is triggered when a cached calendar object is being deleted while fetching a calendar-subscription.

\OCA\DAV\Events\CachedCalendarObjectUpdatedEvent

This event is triggered when a cached calendar object is being updated while fetching a calendar-subscription.

\OCA\DAV\Events\CalendarCreatedEvent

This event is triggered when a user creates a new calendar.

\OCA\DAV\Events\CalendarDeletedEvent

This event is triggered when a user deletes a calendar.

\OCA\DAV\Events\CalendarObjectCreatedEvent

This event is triggered when a user creates a calendar-object.

\OCA\DAV\Events\CalendarObjectDeletedEvent

This event is triggered when a user deletes a calendar-object.

\OCA\DAV\Events\CalendarObjectUpdatedEvent

This event is triggered when a user updates a calendar-object.

\OCA\DAV\Events\CalendarPublishedEvent

This event is triggered when a user publishes a calendar.

\OCA\DAV\Events\CalendarShareUpdatedEvent

This event is triggered when a user shares or unshares a calendar.

\OCA\DAV\Events\CalendarUnpublishedEvent

This event is triggered when a user unpublishes calendar.

\OCA\DAV\Events\CalendarUpdatedEvent

This event is triggered when a user updates a calendar.

\OCA\DAV\Events\CardCreatedEvent

This event is triggered when a user creates a new card in an address-book.

\OCA\DAV\Events\CardDeletedEvent

This event is triggered when a user deletes a card in an address-book.

\OCA\DAV\Events\CardUpdatedEvent

This event is triggered when a user updates a card in an address-book.

OCA\DAV\Events\SabrePluginAddEvent

This event is triggered during the setup of the SabreDAV server to allow the registration of additional plugins.

\OCA\DAV\Events\SabrePluginAuthInitEvent

This event is triggered during the setup of the SabreDAV server to allow the registration of additional authentication backends.

\OCA\DAV\Events\SubscriptionCreatedEvent

This event is triggered when a user creates a new calendar-subscription.

\OCA\DAV\Events\SubscriptionDeletedEvent

This event is triggered when a user deletes a calendar-subscription.

\OCA\DAV\Events\SubscriptionUpdatedEvent

This event is triggered when a user updates a calendar subscription.

\OCA\FederatedFileSharing\Events\FederatedShareAddedEvent

This event is triggered when a federated share is successfully added.

\OCA\Files\Event\LoadAdditionalScriptsEvent

This event is triggered when the files app is rendered. It can be used to add additional scripts to the files app.

\OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent

Emitted before the rendering step of the public share page happens. The event holds a flag that specifies if it is the authentication page of a public share.

\OCA\Files_Trashbin\Events\MoveToTrashEvent

Emitted after a file or folder is moved to the trashbin.

\OCA\Settings\Events\BeforeTemplateRenderedEvent

This event is triggered right before the user management template is rendered.

\OCA\User_LDAP\Events\GroupBackendRegistered

This event is triggered right after the LDAP group backend is registered.

\OCA\User_LDAP\Events\UserBackendRegistered

This event is triggered right after the LDAP user backend is registered.

OCP\Accounts\UserUpdatedEvent

This event is triggered when the account data of a user was updated.

OCP\App\Events\AppDisableEvent

This event is triggered when an app is disabled.

OCP\App\Events\AppEnableEvent

This event is triggered when an app is enabled.

OCP\App\Events\AppUpdateEvent

This event is triggered when an app is updated.

OCP\App\ManagerEvent

Class ManagerEvent

OCP\AppFramework\Http\Events\BeforeLoginTemplateRenderedEvent

Emitted before the rendering step of the login TemplateResponse.

OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent

Emitted before the rendering step of each TemplateResponse. The event holds a flag that specifies if an user is logged in.

OCP\Authentication\Events\AnyLoginFailedEvent

Emitted when the authentication fails

OCP\Authentication\Events\LoginFailedEvent

Emitted when the authentication fails, but only if the login name can be associated with an existing user.

OCP\Authentication\Events\TokenInvalidatedEvent

Emitted when an authentication token is invalidated.

OCP\Authentication\TwoFactorAuth\RegistryEvent

OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengeFailed

OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengePassed

OCP\Authentication\TwoFactorAuth\TwoFactorProviderDisabled

OCP\Authentication\TwoFactorAuth\TwoFactorProviderForUserDisabled

OCP\Authentication\TwoFactorAuth\TwoFactorProviderForUserEnabled

OCP\Authentication\TwoFactorAuth\TwoFactorProviderForUserRegistered

OCP\Authentication\TwoFactorAuth\TwoFactorProviderForUserUnregistered

OCP\Authentication\TwoFactorAuth\TwoFactorProviderUserDeleted

OCP\BeforeSabrePubliclyLoadedEvent

Dispatched before Sabre is loaded when accessing public webdav endpoints This can be used to inject a Sabre plugin for example

OCP\Calendar\Events\CalendarObjectCreatedEvent

OCP\Calendar\Events\CalendarObjectDeletedEvent

OCP\Calendar\Events\CalendarObjectMovedEvent

OCP\Calendar\Events\CalendarObjectMovedToTrashEvent

OCP\Calendar\Events\CalendarObjectRestoredEvent

OCP\Calendar\Events\CalendarObjectUpdatedEvent

OCP\Collaboration\AutoComplete\AutoCompleteEvent

OCP\Collaboration\AutoComplete\AutoCompleteFilterEvent

OCP\Collaboration\Reference\RenderReferenceEvent

Event emitted when apps might render references like link previews or smart picker widgets. This can be used to inject scripts for extending that. Further details can be found in the :ref:`Reference providers` deep dive.

OCP\Collaboration\Resources\LoadAdditionalScriptsEvent

This event is used by apps to register their own frontend scripts for integrating projects in their app. Apps also need to dispatch the event in order to load scripts during page load

OCP\Comments\CommentsEntityEvent

Class CommentsEntityEvent

OCP\Comments\CommentsEvent

Class CommentsEvent

OCP\Config\BeforePreferenceDeletedEvent

OCP\Config\BeforePreferenceSetEvent

OCP\Console\ConsoleEvent

Class ConsoleEvent

OCP\Contacts\Events\ContactInteractedWithEvent

An event that allows apps to notify other components about an interaction between two users. This can be used to build better recommendations and suggestions in user interfaces. Emitters should add at least one identifier (uid, email, federated cloud ID) of the recipient of the interaction.

OCP\DB\Events\AddMissingColumnsEvent

Event to allow apps to register information about missing database columns This event will be dispatched for checking on the admin settings and when running occ db:add-missing-columns which will then create those columns

OCP\DB\Events\AddMissingIndicesEvent

Event to allow apps to register information about missing database indices This event will be dispatched for checking on the admin settings and when running occ db:add-missing-indices which will then create those indices

OCP\DB\Events\AddMissingPrimaryKeyEvent

Event to allow apps to register information about missing database primary keys This event will be dispatched for checking on the admin settings and when running occ db:add-missing-primary-keys which will then create those keys

OCP\DirectEditing\RegisterDirectEditorEvent

Event to allow to register the direct editor.

OCP\EventDispatcher\GenericEvent

Class GenericEvent convenience re-implementation of SymfonyComponentGenericEvent against OCPEventDispatcherEvent

OCP\Federation\Events\TrustedServerRemovedEvent

OCP\Files\Cache\AbstractCacheEvent

OCP\Files\Cache\CacheEntryInsertedEvent

Event for when an existing entry in the cache gets inserted

OCP\Files\Cache\CacheEntryRemovedEvent

Event for when an existing entry in the cache gets removed

OCP\Files\Cache\CacheEntryUpdatedEvent

Event for when an existing entry in the cache gets updated

OCP\Files\Cache\CacheInsertEvent

Event for when a new entry gets added to the cache

OCP\Files\Cache\CacheUpdateEvent

Event for when an existing entry in the cache gets updated

OCP\Files\Config\Event\UserMountAddedEvent

Event emitted when a user mount was added.

OCP\Files\Config\Event\UserMountRemovedEvent

Event emitted when a user mount was removed.

OCP\Files\Config\Event\UserMountUpdatedEvent

Event emitted when a user mount was moved.

OCP\Files\Events\BeforeDirectFileDownloadEvent

This event is triggered when a user tries to download a file directly.

OCP\Files\Events\BeforeFileScannedEvent

OCP\Files\Events\BeforeFileSystemSetupEvent

Event triggered before the file system is setup

OCP\Files\Events\BeforeFolderScannedEvent

OCP\Files\Events\BeforeZipCreatedEvent

This event is triggered before a archive is created when a user requested downloading a folder or multiple files. By setting successful to false the tar creation can be aborted and the download denied.

OCP\Files\Events\FileCacheUpdated

OCP\Files\Events\FileScannedEvent

OCP\Files\Events\FolderScannedEvent

OCP\Files\Events\InvalidateMountCacheEvent

Used to notify the filesystem setup manager that the available mounts for a user have changed

OCP\Files\Events\Node\BeforeNodeCopiedEvent

OCP\Files\Events\Node\BeforeNodeCreatedEvent

OCP\Files\Events\Node\BeforeNodeDeletedEvent

OCP\Files\Events\Node\BeforeNodeReadEvent

OCP\Files\Events\Node\BeforeNodeRenamedEvent

OCP\Files\Events\Node\BeforeNodeTouchedEvent

OCP\Files\Events\Node\BeforeNodeWrittenEvent

OCP\Files\Events\Node\FilesystemTornDownEvent

Event fired after the filesystem has been torn down

OCP\Files\Events\Node\NodeCopiedEvent

OCP\Files\Events\Node\NodeCreatedEvent

OCP\Files\Events\Node\NodeDeletedEvent

OCP\Files\Events\Node\NodeRenamedEvent

OCP\Files\Events\Node\NodeTouchedEvent

OCP\Files\Events\Node\NodeWrittenEvent

OCP\Files\Events\NodeAddedToCache

OCP\Files\Events\NodeAddedToFavorite

OCP\Files\Events\NodeRemovedFromCache

OCP\Files\Events\NodeRemovedFromFavorite

OCP\Files\ObjectStore\Events\BucketCreatedEvent

OCP\Files\Template\BeforeGetTemplatesEvent

OCP\Files\Template\FileCreatedFromTemplateEvent

OCP\Files\Template\RegisterTemplateCreatorEvent

OCP\FilesMetadata\Event\MetadataBackgroundEvent

MetadataBackgroundEvent is an event similar to MetadataLiveEvent but dispatched on a background thread instead of live thread. Meaning there is no limit to the time required for the generation of your metadata.

OCP\FilesMetadata\Event\MetadataLiveEvent

MetadataLiveEvent is an event initiated when a file is created or updated. The app contains the Node related to the created/updated file, and a FilesMetadata that already contains the currently known metadata.

Setting new metadata, or modifying already existing metadata with different value, will trigger the save of the metadata in the database.

OCP\FilesMetadata\Event\MetadataNamedEvent

MetadataNamedEvent is an event similar to MetadataBackgroundEvent completed with a target name, used to limit the refresh of metadata only listeners capable of filtering themselves out. Meaning that when using this event, your app must implement a filter on the event's registered name returned by getName()

This event is mostly triggered when a registered name is added to the files scan

i.e. ./occ files:scan --generate-metadata [name]

OCP\Group\Events\BeforeGroupChangedEvent

OCP\Group\Events\BeforeGroupCreatedEvent

OCP\Group\Events\BeforeGroupDeletedEvent

OCP\Group\Events\BeforeUserAddedEvent

OCP\Group\Events\BeforeUserRemovedEvent

OCP\Group\Events\GroupChangedEvent

OCP\Group\Events\GroupCreatedEvent

OCP\Group\Events\GroupDeletedEvent

OCP\Group\Events\SubAdminAddedEvent

OCP\Group\Events\SubAdminRemovedEvent

OCP\Group\Events\UserAddedEvent

OCP\Group\Events\UserRemovedEvent

OCP\Log\Audit\CriticalActionPerformedEvent

Emitted when the admin_audit app should log an entry

OCP\Log\BeforeMessageLoggedEvent

Even for when a log item is being logged

OCP\Mail\Events\BeforeMessageSent

Emitted before a system mail is sent. It can be used to alter the message.

OCP\Navigation\Events\LoadAdditionalEntriesEvent

OCP\OCM\Events\ResourceTypeRegisterEvent

Use this event to register additional OCM resources before the API returns them in the OCM provider list and capability

OCP\Preview\BeforePreviewFetchedEvent

Emitted before a file preview is being fetched. It can be used to block preview rendering by throwing a OCP\Files\NotFoundException

OCP\Profile\BeforeTemplateRenderedEvent

Emitted before the rendering step of the public profile page happens.

OCP\SabrePluginEvent

OCP\Security\CSP\AddContentSecurityPolicyEvent

Allows to inject something into the default content policy. This is for example useful when you're injecting Javascript code into a view belonging to another controller and cannot modify its Content-Security-Policy itself. Note that the adjustment is only applied to applications that use AppFramework controllers.

WARNING: Using this API incorrectly may make the instance more insecure. Do think twice before adding whitelisting resources. Please do also note that it is not possible to use the disallowXYZ functions.

OCP\Security\Events\GenerateSecurePasswordEvent

Event to request a secure password to be generated.

Since Nextcloud 31 this event also provides a getContext method allowing to apply different rules for different password context like account passwords or share passwords.

OCP\Security\Events\ValidatePasswordPolicyEvent

This event can be emitted to request a validation of a password. If a password policy app is installed and the password is invalid, an OCPHintException will be thrown.

Since Nextcloud 31 this event also provides a getContext method allowing to apply different rules for different password context like account passwords or share passwords.

OCP\Security\FeaturePolicy\AddFeaturePolicyEvent

Event that allows to register a feature policy header to a request.

OCP\Settings\Events\DeclarativeSettingsGetValueEvent

OCP\Settings\Events\DeclarativeSettingsRegisterFormEvent

OCP\Settings\Events\DeclarativeSettingsSetValueEvent

OCP\Share\Events\BeforeShareCreatedEvent

OCP\Share\Events\BeforeShareDeletedEvent

OCP\Share\Events\ShareAcceptedEvent

OCP\Share\Events\ShareCreatedEvent

OCP\Share\Events\ShareDeletedEvent

OCP\Share\Events\ShareDeletedFromSelfEvent

OCP\Share\Events\VerifyMountPointEvent

OCP\Share\ShareReview\Events\ShareReviewAccessCheckEvent

Authorization gate for deleting an app-managed share through a share-review app. Dispatched by the app that owns the share (its OCP\Share\ShareReview\IShareReviewSource implementation) at the beginning of deleteShare(), before anything is deleted. The share-review app listens to this event and answers with grantAccess() or denyAccess() depending on whether the current user is an authorized share-review operator; apps that merely expose shares must not listen to it. The event is default-deny: if no listener responds, the share must not be deleted. Once denied, further grants are ignored and event propagation is stopped.

OCP\Share\ShareReview\RegisterShareReviewSourceEvent

Event dispatched by a share-review app to collect share sources from other apps. Listeners register the class name of their OCP\Share\ShareReview\IShareReviewSource implementation, whose getShares() method returns a list of OCP\Share\ShareReview\ShareReviewEntry objects.

OCP\SpeechToText\Events\TranscriptionFailedEvent

This Event is emitted if a transcription of a media file using a Speech-To-Text provider failed

OCP\SpeechToText\Events\TranscriptionSuccessfulEvent

This Event is emitted when a transcription of a media file happened successfully

OCP\SystemTag\ManagerEvent

Class ManagerEvent

OCP\SystemTag\MapperEvent

Class MapperEvent

OCP\SystemTag\SystemTagsEntityEvent

Class SystemTagsEntityEvent

OCP\TaskProcessing\Events\GetTaskProcessingProvidersEvent

Event dispatched by the server to collect Task Processing Providers and custom Task Types from listeners (like AppAPI). Listeners should add their providers and task types using the addProvider() and addTaskType() methods.

OCP\TaskProcessing\Events\TaskFailedEvent

OCP\TaskProcessing\Events\TaskSuccessfulEvent

OCP\TextProcessing\Events\TaskFailedEvent

OCP\TextProcessing\Events\TaskSuccessfulEvent

OCP\TextToImage\Events\TaskFailedEvent

OCP\TextToImage\Events\TaskSuccessfulEvent

OCP\User\Events\BeforePasswordUpdatedEvent

Emitted before the user password is updated.

OCP\User\Events\BeforeUserCreatedEvent

Emitted before a new user is created on the back-end.

OCP\User\Events\BeforeUserDeletedEvent

OCP\User\Events\BeforeUserIdUnassignedEvent

Emitted before removing the mapping between an external user and an internal userid

OCP\User\Events\BeforeUserLoggedInEvent

OCP\User\Events\BeforeUserLoggedInWithCookieEvent

Emitted before a user is logged in via remember-me cookies.

OCP\User\Events\BeforeUserLoggedOutEvent

Emitted before a user is logged out.

OCP\User\Events\OutOfOfficeChangedEvent

Emitted when a user's out-of-office period has changed

OCP\User\Events\OutOfOfficeClearedEvent

Emitted when a user's out-of-office period is cleared

OCP\User\Events\OutOfOfficeEndedEvent

Emitted when a user's out-of-office period ended

OCP\User\Events\OutOfOfficeScheduledEvent

Emitted when a user's out-of-office period is scheduled

OCP\User\Events\OutOfOfficeStartedEvent

Emitted when a user's out-of-office period started

OCP\User\Events\PasswordUpdatedEvent

Emitted when the user password has been updated.

OCP\User\Events\PostLoginEvent

OCP\User\Events\UserChangedEvent

OCP\User\Events\UserCreatedEvent

Emitted when a new user has been created on the back-end.

OCP\User\Events\UserDeletedEvent

OCP\User\Events\UserFirstTimeLoggedInEvent

OCP\User\Events\UserIdAssignedEvent

Emitted by backends (like user_ldap) when a user created externally is mapped for the first time and assigned a userid

OCP\User\Events\UserIdUnassignedEvent

Emitted after removing the mapping between an external user and an internal userid

OCP\User\Events\UserLiveStatusEvent

OCP\User\Events\UserLoggedInEvent

OCP\User\Events\UserLoggedInWithCookieEvent

Emitted when a user has been successfully logged in via remember-me cookies.

OCP\User\Events\UserLoggedOutEvent

Emitted when a user has been logged out successfully.

OCP\User\GetQuotaEvent

Event to allow apps to

OCP\WorkflowEngine\Events\LoadSettingsScriptsEvent

Emitted when the workflow engine settings page is loaded.

OCP\WorkflowEngine\Events\RegisterChecksEvent

OCP\WorkflowEngine\Events\RegisterEntitiesEvent

OCP\WorkflowEngine\Events\RegisterOperationsEvent

Hooks

Hooks are used to execute code before or after an event has occurred. This is for instance useful to run cleanup code after users, groups or files have been deleted. Hooks should be registered in the :doc:`Bootstrapping process <../app_development/bootstrap>`.

Available hooks

The scope is the first parameter that is passed to the listen method, the second parameter is the method and the third one the callback that should be executed once the hook is being called, e.g.:

<?php

// listen on user predelete
$callback = function($user) {
    // your code that executes before $user is deleted
};
$userManager->listen('\OC\User', 'preDelete', $callback);

Hooks can also be removed by using the removeListener method on the object:

<?php

// delete previous callback
$userManager->removeListener(null, null, $callback);

The following hooks are available:

Session

Injectable from the ServerContainer with the \OCP\IUserSession service.

Hooks available in scope \OC\User:

  • preSetPassword (\OC\User\User $user, string $password, string $recoverPassword)

  • postSetPassword (\OC\User\User $user, string $password, string $recoverPassword)

  • changeUser (\OC\User\User $user, string $feature, string $value)

  • preDelete (\OC\User\User $user)

  • postDelete (\OC\User\User $user)

  • preCreateUser (string $uid, string $password)

  • postCreateUser (\OC\User\User $user)

  • preLogin (string $user, string $password)

  • postLogin (\OC\User\User $user, string $password)

  • logout ()

UserManager

Injectable from the ServerContainer with the \OCP\IUserManager service.

Hooks available in scope \OC\User:

  • preSetPassword (\OC\User\User $user, string $password, string $recoverPassword)

  • postSetPassword (\OC\User\User $user, string $password, string $recoverPassword)

  • preDelete (\OC\User\User $user)

  • postDelete (\OC\User\User $user)

  • preCreateUser (string $uid, string $password)

  • postCreateUser (\OC\User\User $user, string $password)

GroupManager

Hooks available in scope \OC\Group:

  • preAddUser (\OC\Group\Group $group, \OC\User\User $user)

  • postAddUser (\OC\Group\Group $group, \OC\User\User $user)

  • preRemoveUser (\OC\Group\Group $group, \OC\User\User $user)

  • postRemoveUser (\OC\Group\Group $group, \OC\User\User $user)

  • preDelete (\OC\Group\Group $group)

  • postDelete (\OC\Group\Group $group)

  • preCreate (string $groupId)

  • postCreate (\OC\Group\Group $group)

Filesystem root

Injectable from the ServerContainer by calling the method getRootFolder(), getUserFolder() or getAppFolder().

To enable these events for your app you should add the following to your info.xml file:

<types>
    <filesystem/>
</types>

Filesystem hooks available in scope \OC\Files:

  • preWrite (\OCP\Files\Node $node)

  • postWrite (\OCP\Files\Node $node)

  • preCreate (\OCP\Files\Node $node)

  • postCreate (\OCP\Files\Node $node)

  • preDelete (\OCP\Files\Node $node)

  • postDelete (\OCP\Files\Node $node)

  • preTouch (\OCP\Files\Node $node, int $mtime)

  • postTouch (\OCP\Files\Node $node)

  • preCopy (\OCP\Files\Node $source, \OCP\Files\Node $target)

  • postCopy (\OCP\Files\Node $source, \OCP\Files\Node $target)

  • preRename (\OCP\Files\Node $source, \OCP\Files\Node $target)

  • postRename (\OCP\Files\Node $source, \OCP\Files\Node $target)

Filesystem scanner

Filesystem scanner hooks available in scope \OC\Files\Utils\Scanner:

  • scanFile (string $absolutePath)

  • scanFolder (string $absolutePath)

  • postScanFile (string $absolutePath)

  • postScanFolder (string $absolutePath)

Public emitter

tbd