Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d8a590eb79 | |||
| baf829349c | |||
| 3145acc423 | |||
| ce3fc36835 |
+3
-3
@@ -73,9 +73,9 @@ curl -s https://gitea-mobile.testing.leeworks.dev | head -5
|
||||
3. Tap on a PR to see details
|
||||
4. **Expected**: PR diff summary or review status displays correctly
|
||||
|
||||
## Step 7: Core Functionality -- Triage Queue
|
||||
## Step 7: Core Functionality -- Dashboard / Triage Queue
|
||||
|
||||
1. Navigate to the Triage tab (`/triage`)
|
||||
1. Navigate to the Dashboard/Triage tab (`/`)
|
||||
2. **Expected**: Unassigned issues and PRs awaiting review appear sorted by priority
|
||||
|
||||
## Step 8: Create Issue (Write Operation)
|
||||
@@ -116,7 +116,7 @@ curl -s https://gitea-mobile.testing.leeworks.dev | head -5
|
||||
| 4 | Auth | Token saved, API calls work |
|
||||
| 5 | Issues | List loads, filter works |
|
||||
| 6 | PRs | List loads with review status |
|
||||
| 7 | Triage | Queue displays correctly |
|
||||
| 7 | Dashboard/Triage | Queue displays correctly at `/` |
|
||||
| 8 | Create issue | Issue created in Gitea |
|
||||
| 9 | Apply label | Label applied via API |
|
||||
| 10 | PWA | Standalone mode, safe areas, dark mode |
|
||||
|
||||
@@ -78,6 +78,31 @@ func getToken(r *http.Request) string {
|
||||
return middleware.TokenFromContext(r.Context())
|
||||
}
|
||||
|
||||
// isTokenError returns true if the error indicates an expired or revoked API token.
|
||||
func isTokenError(err error) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
msg := err.Error()
|
||||
return strings.Contains(msg, "API error 401") || strings.Contains(msg, "API error 403")
|
||||
}
|
||||
|
||||
// redirectOnTokenError checks if the error is a token auth error and redirects
|
||||
// to /settings with an error banner. Returns true if a redirect was performed.
|
||||
func redirectOnTokenError(w http.ResponseWriter, r *http.Request, err error) bool {
|
||||
if !isTokenError(err) {
|
||||
return false
|
||||
}
|
||||
slog.Warn("Gitea API token expired or revoked, redirecting to settings", "error", err)
|
||||
if isHTMX(r) {
|
||||
w.Header().Set("HX-Redirect", "/settings?error=token_expired")
|
||||
w.WriteHeader(http.StatusOK)
|
||||
} else {
|
||||
http.Redirect(w, r, "/settings?error=token_expired", http.StatusSeeOther)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// getUserOrgs returns the list of org names the user belongs to.
|
||||
func (h *Handler) getUserOrgs(r *http.Request) []string {
|
||||
token := getToken(r)
|
||||
@@ -263,6 +288,9 @@ func (h *Handler) Dashboard(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
queue, err := h.Client.GetTriageQueue(r.Context(), token, queryOrgs)
|
||||
if err != nil {
|
||||
if redirectOnTokenError(w, r, err) {
|
||||
return
|
||||
}
|
||||
slog.Error("failed to get triage queue", "error", err)
|
||||
data.Error = "Error loading triage queue."
|
||||
} else {
|
||||
@@ -346,6 +374,9 @@ func (h *Handler) ListIssues(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
result, err := h.Client.ListAllIssues(r.Context(), token, queryOrgs, selectedState, page, selectedLabel, selectedRepo)
|
||||
if err != nil {
|
||||
if redirectOnTokenError(w, r, err) {
|
||||
return
|
||||
}
|
||||
slog.Error("failed to list issues", "error", err)
|
||||
data.Error = "Error loading issues."
|
||||
} else {
|
||||
@@ -451,6 +482,9 @@ func (h *Handler) ListPulls(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
result, err := h.Client.ListAllPullRequests(r.Context(), token, queryOrgs, selectedState, page, selectedLabel, selectedRepo)
|
||||
if err != nil {
|
||||
if redirectOnTokenError(w, r, err) {
|
||||
return
|
||||
}
|
||||
slog.Error("failed to list pull requests", "error", err)
|
||||
data.Error = "Error loading pull requests."
|
||||
} else {
|
||||
|
||||
@@ -45,6 +45,13 @@ func (h *SettingsHandler) handleGet(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
data := settingsData{HasToken: hasToken}
|
||||
|
||||
// Show error banner when redirected due to expired/revoked token.
|
||||
if r.URL.Query().Get("error") == "token_expired" {
|
||||
data.Message = "Your Gitea API token is expired or has been revoked. Please enter a new token."
|
||||
data.MessageType = "error"
|
||||
}
|
||||
|
||||
h.renderSettings(w, data)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user