refactor(api): descriptive closure params; exhaustive FieldError match; field-endpoint auth tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-02 22:16:50 +02:00
parent b6a30c3995
commit 8b929c7180
2 changed files with 52 additions and 12 deletions
+14 -12
View File
@@ -377,22 +377,22 @@ pub(crate) async fn list_field_definitions(
Ok(Json(
defs.into_iter()
.map(|d| {
let (data_type, vocabulary_id, authority_kind) = d.field_type.to_parts();
.map(|def| {
let (data_type, vocabulary_id, authority_kind) = def.field_type.to_parts();
FieldDefinitionView {
key: d.key,
key: def.key,
data_type: data_type.to_owned(),
vocabulary_id: vocabulary_id.map(|v| v.to_string()),
authority_kind: authority_kind.map(|k| k.as_str().to_owned()),
required: d.required,
group: d.group_key,
labels: d
vocabulary_id: vocabulary_id.map(|vocab_id| vocab_id.to_string()),
authority_kind: authority_kind.map(|kind| kind.as_str().to_owned()),
required: def.required,
group: def.group_key,
labels: def
.labels
.into_iter()
.map(|l| LabelView {
lang: l.lang,
label: l.label,
.map(|label| LabelView {
lang: label.lang,
label: label.label,
})
.collect(),
}
@@ -447,7 +447,9 @@ pub(crate) async fn set_fields(
}
Err(db::catalog::FieldError::ObjectNotFound) => Err(StatusCode::NOT_FOUND),
Err(db::catalog::FieldError::Db(_)) => Err(StatusCode::INTERNAL_SERVER_ERROR),
Err(_) => Err(StatusCode::UNPROCESSABLE_ENTITY),
Err(db::catalog::FieldError::UnknownField(_)) => Err(StatusCode::UNPROCESSABLE_ENTITY),
Err(db::catalog::FieldError::TypeMismatch { .. }) => Err(StatusCode::UNPROCESSABLE_ENTITY),
Err(db::catalog::FieldError::Unresolved { .. }) => Err(StatusCode::UNPROCESSABLE_ENTITY),
}
}
+38
View File
@@ -454,3 +454,41 @@ async fn create_requires_auth(pool: PgPool) {
.unwrap();
assert_eq!(resp.status(), StatusCode::UNAUTHORIZED);
}
#[sqlx::test(migrations = "../db/migrations")]
async fn field_endpoints_require_auth(pool: PgPool) {
migrate_sessions(&db::Db::from_pool(pool.clone()))
.await
.unwrap();
let app = build_app(state(pool));
let defs = app
.clone()
.oneshot(
Request::builder()
.uri("/api/admin/field-definitions")
.body(Body::empty())
.unwrap(),
)
.await
.unwrap();
let set = app
.oneshot(
Request::builder()
.method("PUT")
.uri(format!(
"/api/admin/objects/{}/fields",
domain::ObjectId::new()
))
.header(header::CONTENT_TYPE, "application/json")
.body(Body::from(r#"{"k":"v"}"#))
.unwrap(),
)
.await
.unwrap();
assert_eq!(defs.status(), StatusCode::UNAUTHORIZED);
assert_eq!(set.status(), StatusCode::UNAUTHORIZED);
}