From e12ac7c0ff5989133f332cc49352f13479b80230 Mon Sep 17 00:00:00 2001 From: William Le Roux Date: Sat, 18 Oct 2025 17:12:11 +0000 Subject: [PATCH] Refactor repository handling and service integration - Replaced GitHubService with RepositoryService for commit history and readme fetching. - Introduced RepositoryDescriptor type to standardize repository information. - Updated ProjectList, CommitHistory, ContributionMetrics, and other components to utilize the new repository structure. - Enhanced URL parsing and repository descriptor creation for better flexibility. - Removed deprecated GitHubService and migrated all related functionality to RepositoryService. - Added unit tests for repository utility functions to ensure correct parsing and URL generation. --- .../page/dashboard/CreateProjectModal.tsx | 8 +- .../components/page/dashboard/ProjectCard.tsx | 8 +- .../components/page/dashboard/ProjectList.jsx | 11 +- .../components/page/project/CommitHistory.jsx | 35 +- .../page/project/ContributionMetrics.tsx | 16 +- .../components/page/project/LatestCommit.tsx | 2 +- .../components/page/project/ProjectInfo.astro | 42 +- .../components/page/project/ReadMoreModal.tsx | 24 +- .../components/page/project/ReadmeViewer.tsx | 2 +- .../page/project/UpdateHashModal.tsx | 2 +- dapp/src/pages/project/index.astro | 8 +- .../src/service/ContributionMetricsService.ts | 13 +- dapp/src/service/GithubService.ts | 163 ------- dapp/src/service/RepositoryService.ts | 461 ++++++++++++++++++ dapp/src/service/StateService.ts | 56 ++- dapp/src/types/projectConfig.ts | 3 + dapp/src/types/repository.ts | 21 + dapp/src/utils/editLinkFunctions.ts | 58 ++- dapp/src/utils/repository.ts | 343 +++++++++++++ dapp/src/utils/utils.ts | 30 +- dapp/tests/unit/repository-utils.spec.ts | 37 ++ 21 files changed, 1060 insertions(+), 283 deletions(-) delete mode 100644 dapp/src/service/GithubService.ts create mode 100644 dapp/src/service/RepositoryService.ts create mode 100644 dapp/src/types/repository.ts create mode 100644 dapp/src/utils/repository.ts create mode 100644 dapp/tests/unit/repository-utils.spec.ts diff --git a/dapp/src/components/page/dashboard/CreateProjectModal.tsx b/dapp/src/components/page/dashboard/CreateProjectModal.tsx index aed0f04a..eae1383d 100644 --- a/dapp/src/components/page/dashboard/CreateProjectModal.tsx +++ b/dapp/src/components/page/dashboard/CreateProjectModal.tsx @@ -345,8 +345,12 @@ ${maintainerGithubs.map((gh) => `[[PRINCIPALS]]\ngithub="${gh}"`).join("\n\n")} if (project && project.name && project.config && project.maintainers) { setProject(project); - const { username, repoName } = getAuthorRepo(project.config.url); - if (username && repoName) { + const { descriptor, username, repoName } = getAuthorRepo( + project.config.url, + ); + if (descriptor) { + setProjectRepoInfo(descriptor); + } else if (username && repoName) { setProjectRepoInfo(username, repoName); } diff --git a/dapp/src/components/page/dashboard/ProjectCard.tsx b/dapp/src/components/page/dashboard/ProjectCard.tsx index 989e446c..7ab16c7b 100644 --- a/dapp/src/components/page/dashboard/ProjectCard.tsx +++ b/dapp/src/components/page/dashboard/ProjectCard.tsx @@ -38,8 +38,12 @@ const ProjectCard = ({ config }: { config: ProjectConfig }) => { const project = await getProjectFromName(config.projectName); if (project && project.name && project.config && project.maintainers) { setProject(project); - const { username, repoName } = getAuthorRepo(project.config.url); - if (username && repoName) { + const { descriptor, username, repoName } = getAuthorRepo( + project.config.url, + ); + if (descriptor) { + setProjectRepoInfo(descriptor); + } else if (username && repoName) { setProjectRepoInfo(username, repoName); } const tomlData = await fetchTomlFromCid(project.config.ipfs); diff --git a/dapp/src/components/page/dashboard/ProjectList.jsx b/dapp/src/components/page/dashboard/ProjectList.jsx index 82cb1fe6..cad9d669 100644 --- a/dapp/src/components/page/dashboard/ProjectList.jsx +++ b/dapp/src/components/page/dashboard/ProjectList.jsx @@ -8,6 +8,7 @@ import { } from "../../../service/ReadContractService.ts"; import { loadConfigData } from "../../../service/StateService.ts"; import { convertGitHubLink } from "../../../utils/editLinkFunctions"; +import { parseRepositoryUrl } from "../../../utils/repository"; import { projectCardModalOpen } from "../../../utils/store.ts"; import { extractConfigData } from "../../../utils/utils"; import CreateProjectModal from "./CreateProjectModal.tsx"; @@ -214,6 +215,7 @@ const ProjectList = () => { const configData = extractConfigData(tomlData, project); setConfigInfo(configData); } else { + const repositoryDescriptor = parseRepositoryUrl(project.config.url); const configData = { projectName: project.name, logoImageLink: undefined, @@ -222,8 +224,15 @@ const ProjectList = () => { organizationName: "", officials: { githubLink: project.config.url, + ...(repositoryDescriptor + ? { repository: repositoryDescriptor } + : {}), + }, + socialLinks: { + twitter: "", + telegram: "", + discord: "", }, - socialLinks: {}, authorGithubNames: [], maintainersAddresses: project.maintainers, }; diff --git a/dapp/src/components/page/project/CommitHistory.jsx b/dapp/src/components/page/project/CommitHistory.jsx index 220c4799..10805f43 100644 --- a/dapp/src/components/page/project/CommitHistory.jsx +++ b/dapp/src/components/page/project/CommitHistory.jsx @@ -1,6 +1,6 @@ import { useStore } from "@nanostores/react"; import { useEffect, useState } from "react"; -import { getCommitHistory } from "../../../service/GithubService.ts"; +import { getCommitHistory } from "../../../service/RepositoryService.ts"; import { loadConfigData, loadProjectRepoInfo, @@ -18,24 +18,35 @@ const CommitHistory = () => { const fetchCommitHistory = async (page = 1) => { const projectRepoInfo = loadProjectRepoInfo(); - if (projectRepoInfo?.author && projectRepoInfo?.repository) { - const history = await getCommitHistory( + if (!projectRepoInfo) { + return; + } + + let history = null; + if (projectRepoInfo.descriptor) { + history = await getCommitHistory( + projectRepoInfo.descriptor, + undefined, + page, + ); + } else if (projectRepoInfo.author && projectRepoInfo.repository) { + history = await getCommitHistory( projectRepoInfo.author, projectRepoInfo.repository, page, ); + } - if (history) { - setCommitHistory(history); - setCurrentPage(page); + if (history) { + setCommitHistory(history); + setCurrentPage(page); - // Set the latest commit - if (history.length > 0 && history[0].commits.length > 0) { - latestCommit.set(history[0].commits[0].sha); - } - } else { - setCommitHistory([]); + // Set the latest commit + if (history.length > 0 && history[0].commits.length > 0) { + latestCommit.set(history[0].commits[0].sha); } + } else { + setCommitHistory([]); } }; diff --git a/dapp/src/components/page/project/ContributionMetrics.tsx b/dapp/src/components/page/project/ContributionMetrics.tsx index d878d1ca..1db117c3 100644 --- a/dapp/src/components/page/project/ContributionMetrics.tsx +++ b/dapp/src/components/page/project/ContributionMetrics.tsx @@ -8,14 +8,12 @@ import MonthlyActivityChart from "./MonthlyActivityChart"; interface ContributionMetricsProps { projectName: string; - owner: string; - repo: string; + repositoryUrl: string; } const ContributionMetrics = ({ projectName, - owner, - repo, + repositoryUrl, }: ContributionMetricsProps) => { const [metrics, setMetrics] = useState(null); const [loading, setLoading] = useState(true); @@ -28,10 +26,8 @@ const ContributionMetrics = ({ setLoading(true); setError(null); - const metrics = await ContributionMetricsService.fetchMetrics( - owner, - repo, - ); + const metrics = + await ContributionMetricsService.fetchMetrics(repositoryUrl); setMetrics(metrics); const configData = loadConfigData(); @@ -54,10 +50,10 @@ const ContributionMetrics = ({ } }; - if (projectName && owner && repo) { + if (projectName && repositoryUrl) { fetchMetrics(); } - }, [projectName, owner, repo]); + }, [projectName, repositoryUrl]); if (loading) { return ( diff --git a/dapp/src/components/page/project/LatestCommit.tsx b/dapp/src/components/page/project/LatestCommit.tsx index 9044b30b..55bdd80f 100644 --- a/dapp/src/components/page/project/LatestCommit.tsx +++ b/dapp/src/components/page/project/LatestCommit.tsx @@ -1,5 +1,5 @@ import { useStore } from "@nanostores/react"; -import { getLatestCommitData } from "@service/GithubService"; +import { getLatestCommitData } from "@service/RepositoryService"; import { getProjectHash } from "@service/ReadContractService"; import { loadProjectInfo } from "@service/StateService"; import Tooltip from "components/utils/Tooltip"; diff --git a/dapp/src/components/page/project/ProjectInfo.astro b/dapp/src/components/page/project/ProjectInfo.astro index 9073d4e8..ed2c91fe 100644 --- a/dapp/src/components/page/project/ProjectInfo.astro +++ b/dapp/src/components/page/project/ProjectInfo.astro @@ -108,7 +108,7 @@ import Button from "components/utils/Button";