From 52c2cefdb586975193e7997cf0cecb0f942d4d6a Mon Sep 17 00:00:00 2001 From: shimon Date: Sun, 11 Dec 2022 11:06:19 +0200 Subject: [PATCH] users usage --- app/controllers/api/users.php | 132 +++++++----------- .../Utopia/Response/Model/UsageUsers.php | 45 +----- 2 files changed, 50 insertions(+), 127 deletions(-) diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 89ea0be700..624eaca518 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -1080,96 +1080,60 @@ App::get('/v1/users/usage') ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_USAGE_USERS) ->param('range', '30d', new WhiteList(['24h', '7d', '30d', '90d'], true), 'Date range.', true) - ->param('provider', '', new WhiteList(\array_merge(['email', 'anonymous'], \array_map(fn ($value) => "oauth-" . $value, \array_keys(Config::getParam('providers', [])))), true), 'Provider Name.', true) ->inject('response') ->inject('dbForProject') ->inject('register') - ->action(function (string $range, string $provider, Response $response, Database $dbForProject) { + ->action(function (string $range, Response $response, Database $dbForProject) { - // $usage = []; - // if (App::getEnv('_APP_USAGE_STATS', 'enabled') == 'enabled') { - // $periods = [ - // '24h' => [ - // 'period' => '1h', - // 'limit' => 24, - // ], - // '7d' => [ - // 'period' => '1d', - // 'limit' => 7, - // ], - // '30d' => [ - // 'period' => '1d', - // 'limit' => 30, - // ], - // '90d' => [ - // 'period' => '1d', - // 'limit' => 90, - // ], - // ]; + $periods = Config::getParam('usage', []); + $stats = $usage = []; + $days = $periods[$range]; + $metrics = [ + 'users', + 'sessions', + ]; - // $metrics = [ - // 'users.$all.count.total', - // 'users.$all.requests.create', - // 'users.$all.requests.read', - // 'users.$all.requests.update', - // 'users.$all.requests.delete', - // 'sessions.$all.requests.create', - // 'sessions.$all.requests.delete', - // "sessions.$provider.requests.create", - // ]; + Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats) { + foreach ($metrics as $metric) { + $limit = $days['limit']; + $period = $days['period']; + $results = $dbForProject->find('stats', [ + Query::equal('period', [$period]), + Query::equal('metric', [$metric]), + Query::limit($limit), + Query::orderDesc('time'), + ]); + $stats[$metric] = []; + foreach ($results as $result) { + $stats[$metric][$result->getAttribute('time')] = [ + 'value' => $result->getAttribute('value'), + ]; + } + } + }); - // $stats = []; + $format = match ($days['period']) { + '1h' => 'Y-m-d\TH:00:00.000P', + '1d' => 'Y-m-d\T00:00:00.000P', + }; - // Authorization::skip(function () use ($dbForProject, $periods, $range, $metrics, &$stats) { - // foreach ($metrics as $metric) { - // $limit = $periods[$range]['limit']; - // $period = $periods[$range]['period']; + foreach ($metrics as $metric) { + $usage[$metric] = []; + $leap = time() - ($days['limit'] * $days['factor']); + while ($leap < time()) { + $leap += $days['factor']; + $formatDate = date($format, $leap); + $usage[$metric][] = [ + 'value' => $stats[$metric][$formatDate]['value'] ?? 0, + 'date' => $formatDate, + ]; + } + $usage[$metric] = array_reverse($usage[$metric]); + } - // $requestDocs = $dbForProject->find('stats', [ - // Query::equal('period', [$period]), - // Query::equal('metric', [$metric]), - // Query::limit($limit), - // Query::orderDesc('time'), - // ]); - - // $stats[$metric] = []; - // foreach ($requestDocs as $requestDoc) { - // $stats[$metric][] = [ - // 'value' => $requestDoc->getAttribute('value'), - // 'date' => $requestDoc->getAttribute('time'), - // ]; - // } - - // // backfill metrics with empty values for graphs - // $backfill = $limit - \count($requestDocs); - // while ($backfill > 0) { - // $last = $limit - $backfill - 1; // array index of last added metric - // $diff = match ($period) { // convert period to seconds for unix timestamp math - // '1h' => 3600, - // '1d' => 86400, - // }; - // $stats[$metric][] = [ - // 'value' => 0, - // 'date' => DateTime::formatTz(DateTime::addSeconds(new \DateTime($stats[$metric][$last]['date'] ?? null), -1 * $diff)), - // ]; - // $backfill--; - // } - // $stats[$metric] = array_reverse($stats[$metric]); - // } - // }); - - // $usage = new Document([ - // 'range' => $range, - // 'usersCount' => $stats['users.$all.count.total'] ?? [], - // 'usersCreate' => $stats['users.$all.requests.create'] ?? [], - // 'usersRead' => $stats['users.$all.requests.read'] ?? [], - // 'usersUpdate' => $stats['users.$all.requests.update'] ?? [], - // 'usersDelete' => $stats['users.$all.requests.delete'] ?? [], - // 'sessionsCreate' => $stats['sessions.$all.requests.create'] ?? [], - // 'sessionsProviderCreate' => $stats["sessions.$provider.requests.create"] ?? [], - // 'sessionsDelete' => $stats['sessions.$all.requests.delete' ?? []] - // ]); - // } - - // $response->dynamic($usage, Response::MODEL_USAGE_USERS); + $response->dynamic(new Document([ + 'range' => $range, + 'usersCount' => $usage[$metrics[0]], + 'sessionsCount' => $usage[$metrics[1]], + ]), Response::MODEL_USAGE_USERS); }); diff --git a/src/Appwrite/Utopia/Response/Model/UsageUsers.php b/src/Appwrite/Utopia/Response/Model/UsageUsers.php index 4c7b37d50f..335cb351a5 100644 --- a/src/Appwrite/Utopia/Response/Model/UsageUsers.php +++ b/src/Appwrite/Utopia/Response/Model/UsageUsers.php @@ -23,55 +23,14 @@ class UsageUsers extends Model 'example' => [], 'array' => true ]) - ->addRule('usersCreate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for users created.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('usersRead', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for users read.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('usersUpdate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for users updated.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('usersDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for users deleted.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('sessionsCreate', [ + + ->addRule('sessionsCount', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for sessions created.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('sessionsProviderCreate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for sessions created for a provider ( email, anonymous or oauth2 ).', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('sessionsDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for sessions deleted.', - 'default' => [], - 'example' => [], - 'array' => true - ]) ; }