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
16 changes: 10 additions & 6 deletions apps/weather_status/lib/Controller/WeatherStatusController.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@

/**
* @psalm-import-type WeatherStatusForecast from ResponseDefinitions
* @psalm-import-type WeatherStatusSuccess from ResponseDefinitions
* @psalm-import-type WeatherStatusLocation from ResponseDefinitions
* @psalm-import-type WeatherStatusLocationWithSuccess from ResponseDefinitions
* @psalm-import-type WeatherStatusLocationWithMode from ResponseDefinitions
*/
class WeatherStatusController extends OCSController {
public function __construct(
Expand All @@ -50,7 +54,7 @@ public function __construct(
*
* Try to use the address set in user personal settings as weather location
*
* @return DataResponse<Http::STATUS_OK, array{success: bool, lat: ?float, lon: ?float, address: ?string}, array{}>
* @return DataResponse<Http::STATUS_OK, WeatherStatusLocationWithSuccess, array{}>
*
* 200: Address updated
*/
Expand All @@ -66,7 +70,7 @@ public function usePersonalAddress(): DataResponse {
* - use the user defined address
*
* @param int $mode New mode
* @return DataResponse<Http::STATUS_OK, array{success: bool}, array{}>
* @return DataResponse<Http::STATUS_OK, WeatherStatusSuccess, array{}>
*
* 200: Weather status mode updated
*/
Expand All @@ -83,7 +87,7 @@ public function setMode(int $mode): DataResponse {
* @param string|null $address Any approximative or exact address
* @param float|null $lat Latitude in decimal degree format
* @param float|null $lon Longitude in decimal degree format
* @return DataResponse<Http::STATUS_OK, array{success: bool, lat: ?float, lon: ?float, address: ?string}, array{}>
* @return DataResponse<Http::STATUS_OK, WeatherStatusLocationWithSuccess, array{}>
*
* 200: Location updated
*/
Expand All @@ -97,7 +101,7 @@ public function setLocation(?string $address, ?float $lat, ?float $lon): DataRes
*
* Get stored user location
*
* @return DataResponse<Http::STATUS_OK, array{lat: float, lon: float, address: string, mode: int}, array{}>
* @return DataResponse<Http::STATUS_OK, WeatherStatusLocationWithMode, array{}>
*
* 200: Location returned
*/
Expand All @@ -111,7 +115,7 @@ public function getLocation(): DataResponse {
*
* Get forecast for current location
*
* @return DataResponse<Http::STATUS_OK, WeatherStatusForecast[], array{}>|DataResponse<Http::STATUS_NOT_FOUND, array{success: bool}, array{}>
* @return DataResponse<Http::STATUS_OK, WeatherStatusForecast[]|array{error: string}, array{}>|DataResponse<Http::STATUS_NOT_FOUND, WeatherStatusSuccess, array{}>
*
* 200: Forecast returned
* 404: Forecast not found
Expand Down Expand Up @@ -144,7 +148,7 @@ public function getFavorites(): DataResponse {
* Set favorites list
*
* @param string[] $favorites Favorite addresses
* @return DataResponse<Http::STATUS_OK, array{success: bool}, array{}>
* @return DataResponse<Http::STATUS_OK, WeatherStatusSuccess, array{}>
*
* 200: Favorites updated
*/
Expand Down
17 changes: 17 additions & 0 deletions apps/weather_status/lib/ResponseDefinitions.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,23 @@
* },
* },
* }
*
* @psalm-type WeatherStatusSuccess = array{
* success: bool,
* }
*
* @psalm-type WeatherStatusMode = array{
* mode: int,
* }
* @psalm-type WeatherStatusLocation = array{
* lat?: string,
* lon?: string,
* address?: ?string,
* }
*
* @psalm-type WeatherStatusLocationWithSuccess = WeatherStatusLocation&WeatherStatusSuccess
*
* @psalm-type WeatherStatusLocationWithMode = WeatherStatusLocation&WeatherStatusMode
*/
class ResponseDefinitions {
}
24 changes: 15 additions & 9 deletions apps/weather_status/lib/Service/WeatherStatusService.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
namespace OCA\WeatherStatus\Service;

use OCA\WeatherStatus\AppInfo\Application;
use OCA\WeatherStatus\ResponseDefinitions;
use OCP\Accounts\IAccountManager;
use OCP\Accounts\PropertyDoesNotExistException;
use OCP\App\IAppManager;
Expand All @@ -43,6 +44,11 @@
* Class WeatherStatusService
*
* @package OCA\WeatherStatus\Service
*
* @psalm-import-type WeatherStatusForecast from ResponseDefinitions
* @psalm-import-type WeatherStatusSuccess from ResponseDefinitions
* @psalm-import-type WeatherStatusLocationWithSuccess from ResponseDefinitions
* @psalm-import-type WeatherStatusLocationWithMode from ResponseDefinitions
*/
class WeatherStatusService {
public const MODE_BROWSER_LOCATION = 1;
Expand Down Expand Up @@ -73,7 +79,7 @@ public function __construct(
* - ask the browser
* - use the user defined address
* @param int $mode New mode
* @return array success state
* @return WeatherStatusSuccess success state
*/
public function setMode(int $mode): array {
$this->config->setUserValue($this->userId, Application::APP_ID, 'mode', strval($mode));
Expand All @@ -92,7 +98,7 @@ public function getFavorites(): array {
/**
* Set favorites list
* @param string[] $favorites
* @return array success state
* @return WeatherStatusSuccess success state
*/
public function setFavorites(array $favorites): array {
$this->config->setUserValue($this->userId, Application::APP_ID, 'favorites', json_encode($favorites));
Expand All @@ -102,7 +108,7 @@ public function setFavorites(array $favorites): array {
/**
* Try to use the address set in user personal settings as weather location
*
* @return array with success state and address information
* @return WeatherStatusLocationWithSuccess with success state and address information
*/
public function usePersonalAddress(): array {
$account = $this->accountManager->getAccount($this->userManager->get($this->userId));
Expand All @@ -124,7 +130,7 @@ public function usePersonalAddress(): array {
* @param string|null $address Any approximative or exact address
* @param float|null $lat Latitude in decimal degree format
* @param float|null $lon Longitude in decimal degree format
* @return array with success state and address information
* @return WeatherStatusLocationWithSuccess with success state and address information
*/
public function setLocation(?string $address, ?float $lat, ?float $lon): array {
if (!is_null($lat) && !is_null($lon)) {
Expand Down Expand Up @@ -228,7 +234,7 @@ private function formatOsmAddress(array $json): ?string {
* Set address and resolve it to get coordinates
*
* @param string $address Any approximative or exact address
* @return array with success state and address information (coordinates and formatted address)
* @return WeatherStatusLocationWithSuccess with success state and address information (coordinates and formatted address)
*/
public function setAddress(string $address): array {
$addressInfo = $this->searchForAddress($address);
Expand Down Expand Up @@ -256,7 +262,7 @@ public function setAddress(string $address): array {
* Ask nominatim information about an unformatted address
*
* @param string Unformatted address
* @return array Full Nominatim result for the given address
* @return array{display_name?: string, lat?: string, lon?: string, error?: string} Full Nominatim result for the given address
*/
private function searchForAddress(string $address): array {
$params = [
Expand All @@ -278,7 +284,7 @@ private function searchForAddress(string $address): array {
/**
* Get stored user location
*
* @return array which contains coordinates, formatted address and current weather status mode
* @return WeatherStatusLocationWithMode which contains coordinates, formatted address and current weather status mode
*/
public function getLocation(): array {
$lat = $this->config->getUserValue($this->userId, Application::APP_ID, 'lat', '');
Expand All @@ -296,7 +302,7 @@ public function getLocation(): array {
/**
* Get forecast for current location
*
* @return array which contains success state and filtered forecast data
* @return WeatherStatusForecast[]|array{error: string}|WeatherStatusSuccess which contains success state and filtered forecast data
*/
public function getForecast(): array {
$lat = $this->config->getUserValue($this->userId, Application::APP_ID, 'lat', '');
Expand All @@ -319,7 +325,7 @@ public function getForecast(): array {
* @param float $lon Longitude of requested forecast, in decimal degree format
* @param float $altitude Altitude of requested forecast, in meter
* @param int $nbValues Number of forecast values (hours)
* @return array Filtered forecast data
* @return WeatherStatusForecast[]|array{error: string} Filtered forecast data
*/
private function forecastRequest(float $lat, float $lon, float $altitude, int $nbValues = 10): array {
$params = [
Expand Down
Loading