Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 99 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
### the Files Lock app

# Temporary files lock

![](screenshots/0.7.0.png)

Expand All @@ -25,3 +24,101 @@ Administrators can also lock files using the `./occ` command:

![](screenshots/cli.png)

## API

### Capability

If locking is available the app will expose itself through the capabilties endpoint under the files key:
```
curl http://admin:[email protected]/ocs/v1.php/cloud/capabilities\?format\=json -H 'OCS-APIRequest: true' \
| jq .ocs.data.capabilities.files
{
...
"locking": "1.0",
...
}
```

### Fetching lock details

WebDAV returns the following additional properties if requests through a `PROPFIND`:

- `{http://nextcloud.org/ns}lock`: `true` if the file is locked, otherwise `false`
- `{http://nextcloud.org/ns}lock-owner`: User id of the lock owner
- `{http://nextcloud.org/ns}lock-owner-displayname`: Display name of the lock owner
- `{http://nextcloud.org/ns}lock-time`: Timestamp of the log creation time

### Locking a file

`PUT /apps/files_lock/lock/{fileId}`

```bash
curl -X PUT 'http://admin:[email protected]/ocs/v2.php/apps/files_lock/lock/123' -H 'OCS-APIREQUEST: true'`
```

#### Success
```
<?xml version="1.0"?>
<ocs>
<meta>
<status>ok</status>
<statuscode>200</statuscode>
<message>OK</message>
</meta>
</ocs>
```

#### Failure
```
<?xml version="1.0"?>
<ocs>
<meta>
<status>failure</status>
<statuscode>500</statuscode>
<message/>
</meta>
<data>
<status>-1</status>
<exception>OCA\FilesLock\Exceptions\AlreadyLockedException</exception>
<message>File is already locked by admin</message>
</data>
</ocs>
```


### Unlocking a file

`DELETE /apps/files_lock/lock/{fileId}`

```bash
curl -X DELETE 'http://admin:[email protected]/ocs/v2.php/apps/files_lock/lock/123' -H 'OCS-APIREQUEST: true'
```

#### Success
```
<?xml version="1.0"?>
<ocs>
<meta>
<status>ok</status>
<statuscode>200</statuscode>
<message>OK</message>
</meta>
</ocs>
```

#### Failure
```
<?xml version="1.0"?>
<ocs>
<meta>
<status>failure</status>
<statuscode>500</statuscode>
<message/>
</meta>
<data>
<status>-1</status>
<exception>OCA\FilesLock\Exceptions\LockNotFoundException</exception>
<message></message>
</data>
</ocs>
```
3 changes: 1 addition & 2 deletions appinfo/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ Allow your users to temporary lock their files to avoid conflicts while working
</commands>

<dependencies>
<nextcloud min-version="21" max-version="23"/>
<nextcloud min-version="21" max-version="24"/>
</dependencies>

</info>
2 changes: 1 addition & 1 deletion appinfo/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@


return [
'routes' => [
'ocs' => [
['name' => 'Lock#locking', 'url' => '/lock/{fileId}', 'verb' => 'PUT'],
['name' => 'Lock#unlocking', 'url' => '/lock/{fileId}', 'verb' => 'DELETE'],
]
Expand Down
4 changes: 2 additions & 2 deletions js/files.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@
if (locked !== undefined && locked) {
$.ajax({
method: 'DELETE',
url: OC.generateUrl('/apps/files_lock/lock/' + fileId)
url: OC.linkToOCS('/apps/files_lock/lock', 2) + fileId
}).done(function(res) {
model.set('locked', false)
}).fail(function(res) {
Expand All @@ -125,7 +125,7 @@
} else {
$.ajax({
method: 'PUT',
url: OC.generateUrl('/apps/files_lock/lock/' + fileId)
url: OC.linkToOCS('/apps/files_lock/lock', 2) + fileId
}).done(function(res) {
model.set('locked', true)
model.set('lockOwner', OC.getCurrentUser().uid)
Expand Down
2 changes: 2 additions & 0 deletions lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
use OCA\DAV\Connector\Sabre\CachingTree;
use OCA\DAV\Connector\Sabre\ObjectTree;
use OCA\Files\Event\LoadAdditionalScriptsEvent;
use OCA\FilesLock\Capability;
use OCA\FilesLock\Listeners\LoadAdditionalScripts;
use OCA\FilesLock\Plugins\FilesLockPlugin;
use OCA\FilesLock\Service\FileService;
Expand Down Expand Up @@ -91,6 +92,7 @@ public function __construct(array $params = array()) {
* @param IRegistrationContext $context
*/
public function register(IRegistrationContext $context): void {
$context->registerCapability(Capability::class);
$context->registerEventListener(
LoadAdditionalScriptsEvent::class,
LoadAdditionalScripts::class
Expand Down
17 changes: 17 additions & 0 deletions lib/Capability.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace OCA\FilesLock;

use OCP\Capabilities\ICapability;

class Capability implements ICapability {

public function getCapabilities() {
return [
'files' => [
'locking' => '1.0',
]
];
}

}
4 changes: 2 additions & 2 deletions lib/Controller/LockController.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@
use OCA\FilesLock\Service\FileService;
use OCA\FilesLock\Service\LockService;
use OCA\FilesLock\Tools\Traits\TLogger;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCSController;
use OCP\IRequest;
use OCP\IUserSession;

Expand All @@ -47,7 +47,7 @@
*
* @package OCA\FilesLock\Controller
*/
class LockController extends Controller {
class LockController extends OCSController {


use TLogger;
Expand Down