From 9138e0286a1ec3c107745eea4d50e1e94b96cda0 Mon Sep 17 00:00:00 2001 From: mahdahar <89adham@gmail.com> Date: Tue, 28 Apr 2026 09:01:32 +0700 Subject: [PATCH] feat(figma): add DB-backed dashboard filters and paginated APIs - add Figma API endpoints for summary, users, snapshots, comments, and admin sync - support date and user filters plus pagination for snapshots and comments - expand sync service and schema to store Figma user ids - refresh dashboard UI with summary cards, filters, pagination, and sync action - fold figma_user_id into base migration and remove extra migration --- app/Config/Routes.php | 1 + app/Controllers/Api/FigmaApi.php | 62 +++++- .../2026-04-27-000001_CreateFigmaTables.php | 12 ++ ...28-000001_AddFigmaUserIdToFileVersions.php | 27 --- app/Libraries/FigmaSyncService.php | 2 + app/Models/FigmaFileVersionsModel.php | 1 + app/Views/figma_dashboard.php | 184 +++++++++++------- 7 files changed, 192 insertions(+), 97 deletions(-) delete mode 100644 app/Database/Migrations/2026-04-28-000001_AddFigmaUserIdToFileVersions.php diff --git a/app/Config/Routes.php b/app/Config/Routes.php index b1ed20f..39d37c0 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -278,6 +278,7 @@ $routes->group('api/gitea', function($routes) { $routes->get('/figma', 'Figma::index'); $routes->group('api/figma', function($routes) { $routes->get('summary', 'Api\FigmaApi::summary'); + $routes->get('users', 'Api\FigmaApi::users'); $routes->get('snapshots', 'Api\FigmaApi::snapshots'); $routes->get('comments', 'Api\FigmaApi::comments'); $routes->post('sync', 'Api\FigmaApi::sync'); diff --git a/app/Controllers/Api/FigmaApi.php b/app/Controllers/Api/FigmaApi.php index 2d05c86..f006220 100644 --- a/app/Controllers/Api/FigmaApi.php +++ b/app/Controllers/Api/FigmaApi.php @@ -35,6 +35,12 @@ class FigmaApi extends BaseController return null; } + private function normalizeUsername(?string $username): ?string + { + $username = trim((string) $username); + return $username === '' ? null : mb_strtolower($username); + } + public function summary() { if ($response = $this->ensureLoggedIn()) { @@ -63,6 +69,50 @@ class FigmaApi extends BaseController ], 200); } + public function users() + { + if ($response = $this->ensureLoggedIn()) { + return $response; + } + + $db = \Config\Database::connect(); + $versionUsers = $db->table('figma_file_versions') + ->select('user_name') + ->where('user_name IS NOT NULL', null, false) + ->where('user_name !=', '') + ->get() + ->getResultArray(); + + $commentUsers = $db->table('figma_comments') + ->select('user_name') + ->where('user_name IS NOT NULL', null, false) + ->where('user_name !=', '') + ->get() + ->getResultArray(); + + $users = []; + foreach (array_merge($versionUsers, $commentUsers) as $row) { + $name = trim((string) ($row['user_name'] ?? '')); + if ($name === '') { + continue; + } + + $key = mb_strtolower($name); + if (!isset($users[$key])) { + $users[$key] = $name; + } + } + + $rows = array_values($users); + sort($rows, SORT_NATURAL | SORT_FLAG_CASE); + + return $this->respond([ + 'status' => 'success', + 'message' => 'Users fetched', + 'data' => $rows, + ], 200); + } + private function getPaginationParams(): array { $page = (int) ($this->request->getGet('page') ?? 1); @@ -86,6 +136,7 @@ class FigmaApi extends BaseController $startDate = $this->request->getGet('start_date'); $endDate = $this->request->getGet('end_date'); + $username = $this->normalizeUsername($this->request->getGet('username')); [$page, $perPage] = $this->getPaginationParams(); $offset = ($page - 1) * $perPage; @@ -101,9 +152,13 @@ class FigmaApi extends BaseController $baseBuilder->where('v.created_at_figma <=', $endDate . ' 23:59:59'); } + if (!empty($username)) { + $baseBuilder->where('LOWER(TRIM(v.user_name)) = ' . $db->escape($username), null, false); + } + $total = (int) (clone $baseBuilder)->countAllResults(); $rows = $baseBuilder - ->select('v.id, v.figma_version_id, v.version, v.label, v.description, v.name, v.editor_type, v.figma_user_id, v.last_modified_figma, v.created_at_figma, f.file_key, f.last_synced_at') + ->select('v.id, v.figma_version_id, v.version, v.label, v.description, v.name, v.editor_type, v.figma_user_id, v.user_name, v.last_modified_figma, v.created_at_figma, f.file_key, f.last_synced_at') ->orderBy('v.created_at_figma', 'DESC') ->limit($perPage, $offset) ->get() @@ -130,6 +185,7 @@ class FigmaApi extends BaseController $startDate = $this->request->getGet('start_date'); $endDate = $this->request->getGet('end_date'); + $username = $this->normalizeUsername($this->request->getGet('username')); [$page, $perPage] = $this->getPaginationParams(); $offset = ($page - 1) * $perPage; @@ -145,6 +201,10 @@ class FigmaApi extends BaseController $baseBuilder->where('c.created_at_figma <=', $endDate . ' 23:59:59'); } + if (!empty($username)) { + $baseBuilder->where('LOWER(TRIM(c.user_name)) = ' . $db->escape($username), null, false); + } + $total = (int) (clone $baseBuilder)->countAllResults(); $rows = $baseBuilder ->select('c.id, c.figma_comment_id, c.user_name, c.message, c.is_resolved, c.resolved_at, c.created_at_figma, c.client_meta_json, f.file_key') diff --git a/app/Database/Migrations/2026-04-27-000001_CreateFigmaTables.php b/app/Database/Migrations/2026-04-27-000001_CreateFigmaTables.php index e8bfd19..85dbbf5 100644 --- a/app/Database/Migrations/2026-04-27-000001_CreateFigmaTables.php +++ b/app/Database/Migrations/2026-04-27-000001_CreateFigmaTables.php @@ -103,6 +103,16 @@ class CreateFigmaTables extends Migration 'constraint' => 100, 'null' => true, ], + 'figma_user_id' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + 'null' => true, + ], + 'user_name' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + 'null' => true, + ], 'last_modified_figma' => [ 'type' => 'DATETIME', 'null' => true, @@ -123,6 +133,8 @@ class CreateFigmaTables extends Migration $this->forge->addKey('id', true); $this->forge->addUniqueKey(['file_id', 'figma_version_id']); $this->forge->addKey('file_id'); + $this->forge->addKey('figma_user_id'); + $this->forge->addKey('user_name'); $this->forge->addKey('created_at_figma'); $this->forge->addKey('last_modified_figma'); $this->forge->createTable('figma_file_versions', true); diff --git a/app/Database/Migrations/2026-04-28-000001_AddFigmaUserIdToFileVersions.php b/app/Database/Migrations/2026-04-28-000001_AddFigmaUserIdToFileVersions.php deleted file mode 100644 index f6f5025..0000000 --- a/app/Database/Migrations/2026-04-28-000001_AddFigmaUserIdToFileVersions.php +++ /dev/null @@ -1,27 +0,0 @@ -forge->addColumn('figma_file_versions', [ - 'figma_user_id' => [ - 'type' => 'VARCHAR', - 'constraint' => 255, - 'null' => true, - ], - ]); - - $this->db->query('CREATE INDEX idx_figma_file_versions_figma_user_id ON figma_file_versions(figma_user_id)'); - } - - public function down() - { - $this->db->query('DROP INDEX idx_figma_file_versions_figma_user_id ON figma_file_versions'); - $this->forge->dropColumn('figma_file_versions', 'figma_user_id'); - } -} diff --git a/app/Libraries/FigmaSyncService.php b/app/Libraries/FigmaSyncService.php index b51643b..fce791d 100644 --- a/app/Libraries/FigmaSyncService.php +++ b/app/Libraries/FigmaSyncService.php @@ -184,6 +184,7 @@ class FigmaSyncService $description = $version['description'] ?? $version['notes'] ?? $version['message'] ?? null; $createdAt = $this->normalizeDate($version['created_at'] ?? $version['createdAt'] ?? null); $figmaUserId = $version['user']['id'] ?? $version['user_id'] ?? null; + $userName = $version['user']['handle'] ?? $version['user']['name'] ?? $version['user_name'] ?? null; $data = [ 'file_id' => $fileId, @@ -194,6 +195,7 @@ class FigmaSyncService 'name' => (string) (env('FIGMA_FILE_NAME') ?: 'Figma File'), 'editor_type' => $this->normalizeEditorType($version['editorType'] ?? null), 'figma_user_id' => is_scalar($figmaUserId) ? (string) $figmaUserId : null, + 'user_name' => is_scalar($userName) ? (string) $userName : null, 'last_modified_figma' => $createdAt, 'created_at_figma' => $createdAt, ]; diff --git a/app/Models/FigmaFileVersionsModel.php b/app/Models/FigmaFileVersionsModel.php index 13bc3d5..65a71e4 100644 --- a/app/Models/FigmaFileVersionsModel.php +++ b/app/Models/FigmaFileVersionsModel.php @@ -19,6 +19,7 @@ class FigmaFileVersionsModel extends Model 'name', 'editor_type', 'figma_user_id', + 'user_name', 'last_modified_figma', 'created_at_figma', ]; diff --git a/app/Views/figma_dashboard.php b/app/Views/figma_dashboard.php index 688ec64..d192f11 100644 --- a/app/Views/figma_dashboard.php +++ b/app/Views/figma_dashboard.php @@ -15,6 +15,10 @@
+
+ + +
@@ -80,7 +84,7 @@ Description Version Editor - Figma User ID + Username @@ -131,6 +135,7 @@ section('script') ?>