Skip to content

Commit 35b16ef

Browse files
committed
feat(api): add error_type field and HTTP status codes for errors
- Add optional error_type parameter to respJsonError template for reliable client-side error detection - Add httpCode parameter to return proper HTTP status codes - Use HTTP 404 for not_found errors (tweet/user not found) - Use "not_found" error_type for tweet and user not found errors This allows clients to: 1. Check error_type === 'not_found' instead of parsing error messages 2. Rely on HTTP status codes for proper REST semantics Example error response: HTTP/1.1 404 Not Found { "code": -1, "error": "Tweet not found", "error_type": "not_found" }
1 parent 7ca4f79 commit 35b16ef

File tree

3 files changed

+9
-7
lines changed

3 files changed

+9
-7
lines changed

src/jsons/status.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ proc createJsonApiStatusRouter*(cfg: Config) =
6060
var error = "Tweet not found"
6161
if conv != nil and conv.tweet != nil and conv.tweet.tombstone.len > 0:
6262
error = conv.tweet.tombstone
63-
respJsonError error
63+
respJsonError(error, "not_found", Http404)
6464

6565
respJsonSuccess formatConversationAsJson(conv)
6666

src/jsons/timeline.nim

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ proc createJsonApiTimelineRouter*(cfg: Config) =
121121
if username.len > 0:
122122
respJsonSuccess formatUserName(username)
123123
else:
124-
respJsonError "User not found"
124+
respJsonError("User not found", "not_found", Http404)
125125

126126
get "/api/@name/profile":
127127
cond @"name" notin ["pic", "gif", "video", "search", "settings", "login",
@@ -135,7 +135,7 @@ proc createJsonApiTimelineRouter*(cfg: Config) =
135135
query.fromUser = names
136136

137137
var profile = await fetchProfile("", query, skipRail = false)
138-
if profile.user.username.len == 0: respJsonError "User not found"
138+
if profile.user.username.len == 0: respJsonError("User not found", "not_found", Http404)
139139

140140
respJsonSuccess formatProfileAsJson(profile)
141141

@@ -160,6 +160,6 @@ proc createJsonApiTimelineRouter*(cfg: Config) =
160160
respJsonSuccess formatTimelineAsJson(timeline)
161161
else:
162162
var profile = await fetchProfile(after, query, skipRail = true)
163-
if profile.tweets.content.len == 0: respJsonError "User not found"
163+
if profile.tweets.content.len == 0: respJsonError("User not found", "not_found", Http404)
164164
profile.tweets.beginning = true
165165
respJsonSuccess formatTimelineAsJson(profile.tweets)

src/routes/router_utils.nim

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,14 @@ template respJsonSuccess*(data: JsonNode) =
5353
}
5454
resp $successResponse, "application/json"
5555

56-
template respJsonError*(message: string) =
57-
let errorResponse = %*{
56+
template respJsonError*(message: string, errorType: string = "", httpCode: HttpCode = Http200) =
57+
var errorResponse = %*{
5858
"code": -1,
5959
"error": message
6060
}
61-
resp $errorResponse, "application/json"
61+
if errorType.len > 0:
62+
errorResponse["error_type"] = %errorType
63+
resp httpCode, $errorResponse, "application/json"
6264

6365
template respJsonNull*() =
6466
let nullResponse = newJNull()

0 commit comments

Comments
 (0)