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
114 changes: 63 additions & 51 deletions backend/src/github_pm/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,9 @@ async def connection() -> AsyncGenerator[GitHubCtx, None]:
repo = gh.get_repo(context.github_repo)
print(f"Repository: {repo.name}")
yield GitHubCtx(github=gh, repo=repo)
except HTTPException:
raise
except Exception as e:
print(f"Error interacting with GitHub: {type(e).__name__}->{str(e)!r}")
raise HTTPException(
status_code=400, detail=f"Can't interact with GitHub: {str(e)!r}"
)
raise HTTPException(status_code=400, detail=f"Can't get repository: {str(e)!r}")
finally:
if gh:
gh.close()
Expand Down Expand Up @@ -146,10 +142,52 @@ async def get_comments(
start = time.time()
comments = gitctx.repo.get_issue(issue_number).get_comments()
simplified = [i.raw_data for i in comments]
print(f"[{len(simplified)} comments: {time.time() - start:.3f} seconds]")
print(
f"[{len(simplified)} issue {issue_number} comments: {time.time() - start:.3f} seconds]"
)
return simplified


@api_router.get("/issues/{issue_number}/reactions")
async def get_issue_reactions(
gitctx: Annotated[GitHubCtx, Depends(connection)],
issue_number: Annotated[int, Path(title="Issue")],
):
start = time.time()
url = f"{gitctx.repo.url}/issues/{issue_number}/reactions"
print(f"URL: {url}")
reactions = gitctx.github.requester.requestJsonAndCheck("GET", url)
# NOTE: the requestor returns a tuple of headers and response. We
# only want the response.
response = reactions[1]
print(
f"[{len(response)} issue {issue_number} reactions: {time.time() - start:.3f} seconds]"
)
return response


@api_router.get("/comments/{comment_id}/reactions")
async def get_comment_reactions(
gitctx: Annotated[GitHubCtx, Depends(connection)],
comment_id: Annotated[int, Path(title="Comment")],
):
start = time.time()

# FIXME: This is a hack to work around what appears to be a bug in PyGithub.
# The "/issues" prefix is not being added to the URL. This seems to be the
# distinction between "commit comments" and "issue/PR comments".
url = f"{gitctx.repo.url}/issues/comments/{comment_id}/reactions"
print(f"URL: {url}")
reactions = gitctx.github.requester.requestJsonAndCheck("GET", url)
# NOTE: the requestor returns a tuple of headers and response. We
# only want the response.
response = reactions[1]
print(
f"[{len(response)} comment {comment_id} reactions: {time.time() - start:.3f} seconds]"
)
return response


"""Milestone Management"""


Expand Down Expand Up @@ -190,23 +228,14 @@ async def create_milestone(
):
start = time.time()
print(f"Creating milestone: {milestone!r}", flush=True)
try:
m = gitctx.repo.create_milestone(
title=milestone.title,
state="open",
description=milestone.description,
due_on=milestone.due_on,
)
print(
f"[{milestone.title} milestone created: {time.time() - start:.3f} seconds]"
)
return m.raw_data
except Exception as e:
raise
print(f"Error creating milestone: {e!r}", flush=True)
raise HTTPException(
status_code=400, detail=f"Can't create milestone: {str(e)!r}"
)
m = gitctx.repo.create_milestone(
title=milestone.title,
state="open",
description=milestone.description,
due_on=milestone.due_on,
)
print(f"[{milestone.title} milestone created: {time.time() - start:.3f} seconds]")
return m.raw_data


@api_router.delete("/milestones/{milestone_number}")
Expand All @@ -223,17 +252,9 @@ async def delete_milestone(
status_code=400,
detail=f"Milestone {milestone_number!r} not found: {str(e)!r}",
)
try:
milestone.delete()
print(
f"[{milestone_number} milestone deleted: {time.time() - start:.3f} seconds]"
)
return {"message": f"{milestone_number} milestone deleted"}
except Exception as e:
print(f"Error deleting milestone: {e!r}", flush=True)
raise HTTPException(
status_code=400, detail=f"Can't delete milestone: {str(e)!r}"
) from e
milestone.delete()
print(f"[{milestone_number} milestone deleted: {time.time() - start:.3f} seconds]")
return {"message": f"{milestone_number} milestone deleted"}


@api_router.post("/issues/{issue_number}/milestone/{milestone_number}")
Expand Down Expand Up @@ -292,16 +313,11 @@ async def create_label(
label: Annotated[CreateLabel, Body(title="Label")],
):
start = time.time()
try:
label = gitctx.repo.create_label(
name=label.name, color=label.color, description=label.description
)
print(f"[{label.name} label created: {time.time() - start:.3f} seconds]")
return label.raw_data
except Exception as e:
raise
print(f"Error creating label: {e}", flush=True)
raise HTTPException(status_code=400, detail=f"Can't create label: {str(e)!r}")
label = gitctx.repo.create_label(
name=label.name, color=label.color, description=label.description
)
print(f"[{label.name} label created: {time.time() - start:.3f} seconds]")
return label.raw_data


@api_router.delete("/labels/{label_name}")
Expand All @@ -316,13 +332,9 @@ async def delete_label(
raise HTTPException(
status_code=400, detail=f"Label {label_name!r} not found: {str(e)!r}"
)
try:
label.delete()
print(f"[{label_name} label deleted: {time.time() - start:.3f} seconds]")
return {"message": f"{label_name} label deleted"}
except Exception as e:
print(f"Error deleting label: {e}", flush=True)
raise HTTPException(status_code=400, detail=f"Can't delete label: {str(e)!r}")
label.delete()
print(f"[{label_name} label deleted: {time.time() - start:.3f} seconds]")
return {"message": f"{label_name} label deleted"}


@api_router.post("/issues/{issue_number}/labels/{label_name}")
Expand Down
Loading