summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorJoas Schilling <213943+nickvergessen@users.noreply.github.com>2023-12-06 05:57:34 +0100
committerGitHub <noreply@github.com>2023-12-06 05:57:34 +0100
commit675d25e86545db960dc258f530cb837eaf88e908 (patch)
treeccd2286554f9f2d0e68c7c3abf0fdd2e8a3d2fb1 /apps
parent819d474a48bb67736b2df0ccb03eeebf4f4c6b50 (diff)
parentdf4a76a4e6c92c2b51c8647be6a836e53d009aef (diff)
downloadnextcloud-server-675d25e86545db960dc258f530cb837eaf88e908.tar.gz
nextcloud-server-675d25e86545db960dc258f530cb837eaf88e908.zip
Merge pull request #42029 from nextcloud/backport/41962/stable28
[stable28] fix(dav): Make current ooo info time-dependent
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/appinfo/routes.php3
-rw-r--r--apps/dav/lib/Controller/OutOfOfficeController.php39
-rw-r--r--apps/dav/lib/ResponseDefinitions.php17
-rw-r--r--apps/dav/lib/Service/AbsenceService.php16
-rw-r--r--apps/dav/openapi.json182
5 files changed, 231 insertions, 26 deletions
diff --git a/apps/dav/appinfo/routes.php b/apps/dav/appinfo/routes.php
index a6874aeb57d..529bd0781fa 100644
--- a/apps/dav/appinfo/routes.php
+++ b/apps/dav/appinfo/routes.php
@@ -33,7 +33,8 @@ return [
],
'ocs' => [
['name' => 'direct#getUrl', 'url' => '/api/v1/direct', 'verb' => 'POST'],
- ['name' => 'out_of_office#getCurrentOutOfOfficeData', 'url' => '/api/v1/outOfOffice/{userId}', 'verb' => 'GET'],
+ ['name' => 'out_of_office#getCurrentOutOfOfficeData', 'url' => '/api/v1/outOfOffice/{userId}/now', 'verb' => 'GET'],
+ ['name' => 'out_of_office#getOutOfOffice', 'url' => '/api/v1/outOfOffice/{userId}', 'verb' => 'GET'],
['name' => 'out_of_office#setOutOfOffice', 'url' => '/api/v1/outOfOffice/{userId}', 'verb' => 'POST'],
['name' => 'out_of_office#clearOutOfOffice', 'url' => '/api/v1/outOfOffice/{userId}', 'verb' => 'DELETE'],
],
diff --git a/apps/dav/lib/Controller/OutOfOfficeController.php b/apps/dav/lib/Controller/OutOfOfficeController.php
index ffac1247a6c..a2e7378f32d 100644
--- a/apps/dav/lib/Controller/OutOfOfficeController.php
+++ b/apps/dav/lib/Controller/OutOfOfficeController.php
@@ -27,7 +27,6 @@ declare(strict_types=1);
namespace OCA\DAV\Controller;
use DateTimeImmutable;
-use OCA\DAV\Db\AbsenceMapper;
use OCA\DAV\ResponseDefinitions;
use OCA\DAV\Service\AbsenceService;
use OCP\AppFramework\Db\DoesNotExistException;
@@ -36,18 +35,20 @@ use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCSController;
use OCP\IRequest;
+use OCP\IUserManager;
use OCP\IUserSession;
use OCP\User\IAvailabilityCoordinator;
/**
* @psalm-import-type DAVOutOfOfficeData from ResponseDefinitions
+ * @psalm-import-type DAVCurrentOutOfOfficeData from ResponseDefinitions
*/
class OutOfOfficeController extends OCSController {
public function __construct(
string $appName,
IRequest $request,
- private AbsenceMapper $absenceMapper,
+ private IUserManager $userManager,
private ?IUserSession $userSession,
private AbsenceService $absenceService,
private IAvailabilityCoordinator $coordinator,
@@ -59,15 +60,45 @@ class OutOfOfficeController extends OCSController {
* Get the currently configured out-of-office data of a user.
*
* @param string $userId The user id to get out-of-office data for.
- * @return DataResponse<Http::STATUS_OK, DAVOutOfOfficeData, array{}>|DataResponse<Http::STATUS_NOT_FOUND, null, array{}>
+ * @return DataResponse<Http::STATUS_OK, DAVCurrentOutOfOfficeData, array{}>|DataResponse<Http::STATUS_NOT_FOUND, null, array{}>
*
* 200: Out-of-office data
* 404: No out-of-office data was found
*/
#[NoAdminRequired]
public function getCurrentOutOfOfficeData(string $userId): DataResponse {
+ $user = $this->userManager->get($userId);
+ if ($user === null) {
+ return new DataResponse(null, Http::STATUS_NOT_FOUND);
+ }
+ try {
+ $data = $this->absenceService->getCurrentAbsence($user);
+ if ($data === null) {
+ return new DataResponse(null, Http::STATUS_NOT_FOUND);
+ }
+ } catch (DoesNotExistException) {
+ return new DataResponse(null, Http::STATUS_NOT_FOUND);
+ }
+
+ return new DataResponse($data->jsonSerialize());
+ }
+
+ /**
+ * Get the configured out-of-office data of a user.
+ *
+ * @param string $userId The user id to get out-of-office data for.
+ * @return DataResponse<Http::STATUS_OK, DAVOutOfOfficeData, array{}>|DataResponse<Http::STATUS_NOT_FOUND, null, array{}>
+ *
+ * 200: Out-of-office data
+ * 404: No out-of-office data was found
+ */
+ #[NoAdminRequired]
+ public function getOutOfOffice(string $userId): DataResponse {
try {
- $data = $this->absenceMapper->findByUserId($userId);
+ $data = $this->absenceService->getAbsence($userId);
+ if ($data === null) {
+ return new DataResponse(null, Http::STATUS_NOT_FOUND);
+ }
} catch (DoesNotExistException) {
return new DataResponse(null, Http::STATUS_NOT_FOUND);
}
diff --git a/apps/dav/lib/ResponseDefinitions.php b/apps/dav/lib/ResponseDefinitions.php
index 97bd8e9efe9..e6de3d5a65c 100644
--- a/apps/dav/lib/ResponseDefinitions.php
+++ b/apps/dav/lib/ResponseDefinitions.php
@@ -27,13 +27,24 @@ declare(strict_types=1);
namespace OCA\DAV;
/**
- * @psalm-type DAVOutOfOfficeData = array{
+ * @psalm-type DAVOutOfOfficeDataCommon = array{
+ * userId: string,
+ * message: string,
+ * }
+ *
+ * @psalm-type DAVOutOfOfficeData = DAVOutOfOfficeDataCommon&array{
* id: int,
- * userId: string,
* firstDay: string,
* lastDay: string,
* status: string,
- * message: string,
+ * }
+ *
+ * @todo this is a copy of \OCP\User\IOutOfOfficeData
+ * @psalm-type DAVCurrentOutOfOfficeData = DAVOutOfOfficeDataCommon&array{
+ * id: string,
+ * startDate: int,
+ * endDate: int,
+ * shortMessage: string,
* }
*/
class ResponseDefinitions {
diff --git a/apps/dav/lib/Service/AbsenceService.php b/apps/dav/lib/Service/AbsenceService.php
index 7c0d6eec082..3e2a218d52b 100644
--- a/apps/dav/lib/Service/AbsenceService.php
+++ b/apps/dav/lib/Service/AbsenceService.php
@@ -145,6 +145,22 @@ class AbsenceService {
}
}
+ public function getCurrentAbsence(IUser $user): ?IOutOfOfficeData {
+ try {
+ $absence = $this->absenceMapper->findByUserId($user->getUID());
+ $oooData = $absence->toOutOufOfficeData(
+ $user,
+ $this->timezoneService->getUserTimezone($user->getUID()) ?? $this->timezoneService->getDefaultTimezone(),
+ );
+ if ($this->isInEffect($oooData)) {
+ return $oooData;
+ }
+ } catch (DoesNotExistException) {
+ // Nothing there to process
+ }
+ return null;
+ }
+
public function isInEffect(IOutOfOfficeData $absence): bool {
$now = $this->timeFactory->getTime();
return $absence->getStartDate() <= $now && $absence->getEndDate() >= $now;
diff --git a/apps/dav/openapi.json b/apps/dav/openapi.json
index a235e3bff1d..a0df1cedd16 100644
--- a/apps/dav/openapi.json
+++ b/apps/dav/openapi.json
@@ -42,6 +42,38 @@
}
}
},
+ "CurrentOutOfOfficeData": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/OutOfOfficeDataCommon"
+ },
+ {
+ "type": "object",
+ "required": [
+ "id",
+ "startDate",
+ "endDate",
+ "shortMessage"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "startDate": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "endDate": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "shortMessage": {
+ "type": "string"
+ }
+ }
+ }
+ ]
+ },
"OCSMeta": {
"type": "object",
"required": [
@@ -67,32 +99,46 @@
}
},
"OutOfOfficeData": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/OutOfOfficeDataCommon"
+ },
+ {
+ "type": "object",
+ "required": [
+ "id",
+ "firstDay",
+ "lastDay",
+ "status"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "firstDay": {
+ "type": "string"
+ },
+ "lastDay": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ }
+ }
+ }
+ ]
+ },
+ "OutOfOfficeDataCommon": {
"type": "object",
"required": [
- "id",
"userId",
- "firstDay",
- "lastDay",
- "status",
"message"
],
"properties": {
- "id": {
- "type": "integer",
- "format": "int64"
- },
"userId": {
"type": "string"
},
- "firstDay": {
- "type": "string"
- },
- "lastDay": {
- "type": "string"
- },
- "status": {
- "type": "string"
- },
"message": {
"type": "string"
}
@@ -219,7 +265,7 @@
}
}
},
- "/ocs/v2.php/apps/dav/api/v1/outOfOffice/{userId}": {
+ "/ocs/v2.php/apps/dav/api/v1/outOfOffice/{userId}/now": {
"get": {
"operationId": "out_of_office-get-current-out-of-office-data",
"summary": "Get the currently configured out-of-office data of a user.",
@@ -277,6 +323,106 @@
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
+ "$ref": "#/components/schemas/CurrentOutOfOfficeData"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "No out-of-office data was found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "nullable": true
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/ocs/v2.php/apps/dav/api/v1/outOfOffice/{userId}": {
+ "get": {
+ "operationId": "out_of_office-get-out-of-office",
+ "summary": "Get the configured out-of-office data of a user.",
+ "tags": [
+ "out_of_office"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "userId",
+ "in": "path",
+ "description": "The user id to get out-of-office data for.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Out-of-office data",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
"$ref": "#/components/schemas/OutOfOfficeData"
}
}