Handle database errors in /-/insert, refs #1866, #1873

Also improved API explorer to show HTTP status of response, refs #1871
This commit is contained in:
Simon Willison 2022-11-01 12:59:17 -07:00
commit 497290beaf
3 changed files with 24 additions and 6 deletions

View file

@ -27,7 +27,8 @@
</form>
<div id="output" style="display: none">
<h2>API response</h2>
<h2>API response: HTTP <span id="response-status"></span></h2>
</h2>
<ul class="errors message-error"></ul>
<pre></pre>
</div>
@ -64,12 +65,15 @@ form.addEventListener("submit", (ev) => {
headers: {
'Content-Type': 'application/json',
}
}).then(r => r.json()).then(r => {
}).then(r => {
document.getElementById('response-status').textContent = r.status;
return r.json();
}).then(data => {
var errorList = output.querySelector('.errors');
if (r.errors) {
if (data.errors) {
errorList.style.display = 'block';
errorList.innerHTML = '';
r.errors.forEach(error => {
data.errors.forEach(error => {
var li = document.createElement('li');
li.textContent = error;
errorList.appendChild(li);
@ -77,7 +81,7 @@ form.addEventListener("submit", (ev) => {
} else {
errorList.style.display = 'none';
}
output.querySelector('pre').innerText = JSON.stringify(r, null, 2);
output.querySelector('pre').innerText = JSON.stringify(data, null, 2);
output.style.display = 'block';
}).catch(err => {
alert("Error: " + err);

View file

@ -1206,7 +1206,10 @@ class TableInsertView(BaseView):
else:
table.insert_all(rows, ignore=ignore, replace=replace)
rows = await db.execute_write_fn(insert_rows)
try:
rows = await db.execute_write_fn(insert_rows)
except Exception as e:
return _error([str(e)])
result = {"ok": True}
if should_return:
result["rows"] = rows

View file

@ -156,6 +156,13 @@ async def test_write_rows(ds_write, return_rows):
400,
["Too many rows, maximum allowed is 100"],
),
(
"/data/docs/-/insert",
{"rows": [{"id": 1, "title": "Test"}]},
"duplicate_id",
400,
["UNIQUE constraint failed: docs.id"],
),
(
"/data/docs/-/insert",
{"rows": [{"title": "Test"}], "ignore": True, "replace": True},
@ -194,6 +201,10 @@ async def test_write_row_errors(
ds_write, path, input, special_case, expected_status, expected_errors
):
token = write_token(ds_write)
if special_case == "duplicate_id":
await ds_write.get_database("data").execute_write(
"insert into docs (id) values (1)"
)
if special_case == "bad_token":
token += "bad"
kwargs = dict(