Closed DaleSeo closed 1 month ago
sequenceDiagram
participant Client
participant GitHub API
Client->>GitHub API: Fetch all teams (with token)
GitHub API-->>Client: Return list of teams
loop For each team
Client->>GitHub API: Fetch team members (with token)
GitHub API-->>Client: Return team member lists
end
Client->>GitHub API: Query directory structure<br>(GET /repos/DaleStudy/leetcode-study/git/trees/main?recursive=1)
GitHub API-->>Client: Return directory structure including files and folders
Client->>Client: Process and gather cohort member lists
Client->>Client: Calculate progress by analyzing matched files
Client->>Client: Pass progress data to component for rendering
데이터 흐름은 간단하게 이렇게만 나오네요.
달레님께서 확인 요청하셨던 '레포지토리의 디렉토리를 필터링'할 수 있는 기능은 제공되지 않는것같습니다. 오직 특정 브랜치나 태그에 대한 조회만 가능해 보입니다.
또한 생각보다는 성능상 문제도 프리페칭 한다면 어느정도 감수할만 해 보입니다.
간단한 브라우저 테스트 기준으로는 아래와 같습니다.
fetched in 476ms (No throttle) fetched in 497ms (Fast 4G) fetched in 1060ms (Slow 4G) fetched in 3596ms (3G)
아래는 추가적으로 한번 서버에 붙여본 report API입니다..ㅎㅎ
@HC-kang 님, Mermaid로 시각화도 해주시고 멋지십니다. 아래 피드백 드립니다.
@DaleSeo 님, 피드백 감사합니다
Fetch teams에 대한 과정을 누락했네요. 해당 내용은 위쪽 다이어그램에 추가하여 업데이트 해두었습니다!
각 단계별 Request
, Response
는 아래와 같습니다.
get teams
curl \
-H "Authorization: bearer GITHUB_API_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/orgs/DaleStudy/teams
Response
[
{
"name": "leetcode",
"id": 10738755,
"node_id": "T_kwDOBijJi84Ao9xD",
"slug": "leetcode",
"description": "리트코드 스터디 2기",
"privacy": "closed",
"notification_setting": "notifications_enabled",
"url": "https://api.github.com/organizations/103336331/team/10738755",
"html_url": "https://github.com/orgs/DaleStudy/teams/leetcode",
"members_url": "https://api.github.com/organizations/103336331/team/10738755/members{/member}",
"repositories_url": "https://api.github.com/organizations/103336331/team/10738755/repos",
"permission": "pull",
"parent": null
},
...
]
get team members
curl \
-H "Authorization: bearer GITHUB_API_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/orgs/DaleStudy/teams/leetcode/members
Response
[
{
"login": "DaleSeo",
"id": 5466341,
"node_id": "MDQ6VXNlcjU0NjYzNDE=",
"avatar_url": "https://avatars.githubusercontent.com/u/5466341?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/DaleSeo",
"html_url": "https://github.com/DaleSeo",
"followers_url": "https://api.github.com/users/DaleSeo/followers",
"following_url": "https://api.github.com/users/DaleSeo/following{/other_user}",
"gists_url": "https://api.github.com/users/DaleSeo/gists{/gist_id}",
"starred_url": "https://api.github.com/users/DaleSeo/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/DaleSeo/subscriptions",
"organizations_url": "https://api.github.com/users/DaleSeo/orgs",
"repos_url": "https://api.github.com/users/DaleSeo/repos",
"events_url": "https://api.github.com/users/DaleSeo/events{/privacy}",
"received_events_url": "https://api.github.com/users/DaleSeo/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
...
]
Request
curl \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/DaleStudy/leetcode-study/git/trees/main?recursive=1
Response
{
"sha": "afb1e8a5325a7cfecd934577b67d7f7e77c51722",
"url": "https://api.github.com/repos/DaleStudy/leetcode-study/git/trees/afb1e8a5325a7cfecd934577b67d7f7e77c51722",
"tree": [
{
"path": "best-time-to-buy-and-sell-stock/Seunghyun-Lim.java",
"mode": "100644",
"type": "blob",
"sha": "3750c95fab962f163b8a2f7778b23911e10a11b3",
"size": 974,
"url": "https://api.github.com/repos/DaleStudy/leetcode-study/git/blobs/3750c95fab962f163b8a2f7778b23911e10a11b3"
},
{
"path": "best-time-to-buy-and-sell-stock/TonyKim9401.java",
"mode": "100644",
"type": "blob",
"sha": "edf024d07b81829366c09de6c0ffc32a46d6ab8b",
"size": 426,
"url": "https://api.github.com/repos/DaleStudy/leetcode-study/git/blobs/edf024d07b81829366c09de6c0ffc32a46d6ab8b"
},
...
],
"truncated": false
}
멤버 한명에 대한 정보만을 빠르게 가져오는 API는 현재로서는 존재하지 않습니다.
따라서 3. get team repositories
에서 가져온 정보를 유지하고, 필요한 정보만을 필터하여 사용해야 할 것 같습니다.
추가적으로 고려할만한 요소가 몇 가지 있습니다.
사용자 계정과, 제출하는 파일의 이름이 일치하지 않을 수 있습니다. 이러한 경우, 사용자 계정과 파일 이름을 매핑하는 정보를 추가로 관리해야 할 것으로 보입니다. +@) 현재는 중도에 제출 파일명이 변경되는 케이스는 처리하고있지 않습니다.
{
// 1기
"meoooh": "han",
"koreas9408": "seunghyun-lim",
"leokim0922": "leo",
// 2기
"obzva": "flynn",
"kim-young": "kimyoung",
"kjb512": "kayden",
"lymchgmk": "egon",
"jeonghwanmin": "hwanmini",
};
제출한 파일명의 오탈자나, 잘못된 파일명을 사용할 수 있습니다. 이 경우, 현재로서는 확인이 어렵습니다.
현재는 하나의 문제를 여러 언어로 제출한 경우에도 1문제 풀이로 처리하고있습니다. 이번이 아니더라도, 추후 리더보드에 다른 언어로 제출한 경우도 포함하면 좋을 것 같습니다.
사용자 계정과, 제출하는 파일의 이름이 일치하지 않는 경우는 별도의 티켓으로 나중에 시간되면 처리
화면 별로 필요한 데이터 호출 정리