Skip to content

Commit 1f6f4f2

Browse files
authored
Merge branch 'main' into enhance-xtramcp-tool-return
2 parents 662751e + 7bf3073 commit 1f6f4f2

File tree

21 files changed

+261
-32
lines changed

21 files changed

+261
-32
lines changed

internal/api/actor.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55

66
"go.mongodb.org/mongo-driver/v2/bson"
7+
78
"paperdebugger/internal/accesscontrol"
89
"paperdebugger/internal/libs/jwt"
910
"paperdebugger/internal/libs/shared"
@@ -12,26 +13,26 @@ import (
1213

1314
func parseUserActor(ctx context.Context, token string, userService *services.UserService) (*accesscontrol.Actor, error) {
1415
if len(token) == 0 {
15-
return nil, shared.ErrInvalidToken()
16+
return nil, shared.ErrInvalidToken("Authentication token is required")
1617
}
1718

1819
claims, err := jwt.VerifyJwtToken(token)
1920
if err != nil {
20-
return nil, shared.ErrInvalidToken(err)
21+
return nil, shared.ErrInvalidToken(err.Error())
2122
}
2223

2324
if len(claims.Audience) == 0 || claims.Audience[0] != "paperdebugger/user" {
24-
return nil, shared.ErrInvalidActor()
25+
return nil, shared.ErrInvalidActor("Invalid token audience")
2526
}
2627

2728
actorID, err := bson.ObjectIDFromHex(claims.Subject)
2829
if err != nil {
29-
return nil, shared.ErrInvalidActor()
30+
return nil, shared.ErrInvalidActor("Invalid actor ID format")
3031
}
3132

3233
_, err = userService.GetUserByID(ctx, actorID)
3334
if err != nil {
34-
return nil, shared.ErrInvalidUser(err)
35+
return nil, shared.ErrInvalidUser(err.Error())
3536
}
3637

3738
return &accesscontrol.Actor{ID: actorID}, nil

internal/api/server.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ func (s *Server) errorHandler() func(ctx context.Context, mux *runtime.ServeMux,
166166

167167
err := &sharedv1.Error{
168168
Code: errCode,
169-
Message: reqError.Error(),
169+
Message: cleanErrorMessage(reqError),
170170
}
171171
w.Header().Set("Content-Type", "application/json")
172172
w.WriteHeader(shared.GetHTTPCode(reqError))
@@ -182,3 +182,15 @@ func (s *Server) errorHandler() func(ctx context.Context, mux *runtime.ServeMux,
182182
}
183183
}
184184
}
185+
186+
// cleanErrorMessage removes technical gRPC error prefixes from error messages
187+
func cleanErrorMessage(err error) string {
188+
msg := err.Error()
189+
// Remove "rpc error: code = Code(XXXX) desc = " prefix
190+
if strings.HasPrefix(msg, "rpc error:") {
191+
if idx := strings.Index(msg, "desc = "); idx != -1 {
192+
return msg[idx+7:]
193+
}
194+
}
195+
return msg
196+
}

internal/libs/shared/error.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,29 @@ import (
44
"fmt"
55
"net/http"
66

7+
sharedv1 "paperdebugger/pkg/gen/api/shared/v1"
8+
79
"github.com/samber/lo"
810
"google.golang.org/grpc/codes"
911
"google.golang.org/grpc/status"
10-
sharedv1 "paperdebugger/pkg/gen/api/shared/v1"
1112
)
1213

14+
// errorCodeMessages provides default user-friendly messages for each error code
15+
var errorCodeMessages = map[sharedv1.ErrorCode]string{
16+
sharedv1.ErrorCode_ERROR_CODE_UNSPECIFIED: "An unspecified error occurred",
17+
sharedv1.ErrorCode_ERROR_CODE_UNKNOWN: "An unknown error occurred",
18+
sharedv1.ErrorCode_ERROR_CODE_INTERNAL: "Internal server error",
19+
sharedv1.ErrorCode_ERROR_CODE_BAD_REQUEST: "Bad request",
20+
sharedv1.ErrorCode_ERROR_CODE_INVALID_LLM_RESPONSE: "Invalid LLM response",
21+
sharedv1.ErrorCode_ERROR_CODE_RECORD_NOT_FOUND: "Record not found",
22+
sharedv1.ErrorCode_ERROR_CODE_INVALID_CREDENTIAL: "Invalid credentials",
23+
sharedv1.ErrorCode_ERROR_CODE_INVALID_TOKEN: "Invalid or missing authentication token",
24+
sharedv1.ErrorCode_ERROR_CODE_INVALID_ACTOR: "Invalid actor or session",
25+
sharedv1.ErrorCode_ERROR_CODE_PERMISSION_DENIED: "Permission denied",
26+
sharedv1.ErrorCode_ERROR_CODE_INVALID_USER: "User not found or invalid",
27+
sharedv1.ErrorCode_ERROR_CODE_PROJECT_OUT_OF_DATE: "Project is out of date",
28+
}
29+
1330
var (
1431
ErrUnknown = makeErrorFunc(sharedv1.ErrorCode_ERROR_CODE_UNKNOWN)
1532
ErrInternal = makeErrorFunc(sharedv1.ErrorCode_ERROR_CODE_INTERNAL)
@@ -59,6 +76,13 @@ func makeErrorFunc(
5976
detail := lo.FirstOrEmpty(details)
6077
var errorMessage string
6178
switch v := detail.(type) {
79+
case nil:
80+
// Use default message from errorCodeMessages when no details provided
81+
if msg, ok := errorCodeMessages[errorCode]; ok {
82+
errorMessage = msg
83+
} else {
84+
errorMessage = "An error occurred"
85+
}
6286
case error:
6387
errorMessage = v.Error()
6488
case interface{ String() string }:

pkg/gen/api/auth/v1/auth.pb.go

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/gen/api/auth/v1/auth.pb.gw.go

Lines changed: 66 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

proto/auth/v1/auth.proto

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ service AuthService {
2323
option (google.api.http) = {
2424
post: "/_pd/api/v1/auth/refresh"
2525
body: "*"
26+
additional_bindings {
27+
post: "/_pd/api/v2/auth/refresh"
28+
body: "*"
29+
}
2630
};
2731
}
2832
rpc Logout(LogoutRequest) returns (LogoutResponse) {

webapp/_webapp/src/components/message-entry-container/tools/paper-score-comment/add-comments-button.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { OverleafComment } from "../../../../pkg/gen/apiclient/project/v1/projec
44
import { useSocketStore } from "../../../../stores/socket-store";
55
import { addClickedOverleafComment, hasClickedOverleafComment } from "../../../../libs/helpers";
66
import { acceptComments } from "../../../../query/api";
7-
import { fromJson } from "@bufbuild/protobuf";
7+
import { fromJson } from "../../../../libs/protobuf-utils";
88
import { CommentsAcceptedRequestSchema } from "../../../../pkg/gen/apiclient/comment/v1/comment_pb";
99
import { useConversationStore } from "../../../../stores/conversation/conversation-store";
1010

webapp/_webapp/src/components/message-entry-container/tools/paper-score-comment/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { fromJson, JsonValue } from "@bufbuild/protobuf";
1+
import { JsonValue } from "@bufbuild/protobuf";
2+
import { fromJson } from "../../../../libs/protobuf-utils";
23
import { OverleafCommentSchema } from "../../../../pkg/gen/apiclient/project/v1/project_pb";
34
import { getProjectId } from "../../../../libs/helpers";
45
import { useEffect, useState } from "react";

webapp/_webapp/src/components/message-entry-container/tools/paper-score.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { PaperScoreResultSchema } from "../../../pkg/gen/apiclient/project/v1/project_pb";
2-
import { fromJson } from "@bufbuild/protobuf";
2+
import { fromJson } from "../../../libs/protobuf-utils";
33
import { LoadingIndicator } from "../../loading-indicator";
44
import { logError } from "../../../libs/logger";
55
import { cn } from "@heroui/react";

webapp/_webapp/src/hooks/useSendMessageStream.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import {
2525
StreamPartEnd,
2626
} from "../pkg/gen/apiclient/chat/v2/chat_pb";
2727
import { MessageEntry, MessageEntryStatus } from "../stores/conversation/types";
28-
import { fromJson } from "@bufbuild/protobuf";
28+
import { fromJson } from "../libs/protobuf-utils";
2929
import { useConversationStore } from "../stores/conversation/conversation-store";
3030
import { useListConversationsQuery } from "../query";
3131
import { useSocketStore } from "../stores/socket-store";

0 commit comments

Comments
 (0)