feat(web): add Subject creation to Memory index

This commit is contained in:
2026-10-04 22:35:21 +09:00
parent 1bbc48dad0
commit 1c5966c535
11 changed files with 1076 additions and 19 deletions
+2
View File
@@ -9851,6 +9851,8 @@ pub fn memory_api_typescript() -> String {
// `ts-rs` solely for this read-only projection.
let subjektiv_browser_declarations = r#"export type SubjektivSubjectState = "active" | "retired";
export type SubjektivSubjectCreateRequest = { role: string, };
export type SubjektivSubjectResponse = { id: string, role: string, state: SubjektivSubjectState, store_revision: number, created_at: string, updated_at: string, current_worker?: | import("./worker-launch-api").WorkerLaunchWorkerSummary | null, };
export type SubjektivSubjectListResponse = { limit: number, items: Array<SubjektivSubjectResponse>, next_cursor?: string | null, has_more: boolean, };
+61
View File
@@ -38573,6 +38573,67 @@ mod tests {
)
.await;
assert_eq!(subjects["items"][0]["id"], subject.id);
request_json(
app.clone(),
"POST",
&format!("/api/w/{TEST_WORKSPACE_ID}/subjektiv/subjects"),
Some(serde_json::json!({ "role": "Browser author" })),
StatusCode::UNAUTHORIZED,
)
.await;
let created = request_json_authenticated(
app.clone(),
"POST",
&format!("/api/w/{TEST_WORKSPACE_ID}/subjektiv/subjects"),
Some(serde_json::json!({ "role": " Browser author " })),
&owner_token,
StatusCode::CREATED,
)
.await;
assert_eq!(created["role"], " Browser author ");
assert_eq!(created["state"], "active");
assert_eq!(created["store_revision"], 0);
assert!(created.get("current_worker").is_none());
let created_id = created["id"].as_str().unwrap();
let persisted = store.subject(created_id).unwrap().unwrap();
assert_eq!(persisted.role.as_str(), " Browser author ");
assert!(
api.store
.current_worker_singleton_owner(
TEST_WORKSPACE_ID,
&subjektiv_singleton_key(created_id).unwrap(),
)
.unwrap()
.is_none()
);
let subject_count_after_create = store.list_subjects(100).unwrap().items.len();
request_json_authenticated(
app.clone(),
"POST",
&format!("/api/w/{TEST_WORKSPACE_ID}/subjektiv/subjects"),
Some(serde_json::json!({ "role": " " })),
&owner_token,
StatusCode::BAD_REQUEST,
)
.await;
assert_eq!(
store.list_subjects(100).unwrap().items.len(),
subject_count_after_create
);
request_json_authenticated(
app.clone(),
"POST",
"/api/w/another-workspace/subjektiv/subjects",
Some(serde_json::json!({ "role": "Cross Workspace" })),
&owner_token,
StatusCode::NOT_FOUND,
)
.await;
assert_eq!(
store.list_subjects(100).unwrap().items.len(),
subject_count_after_create
);
for uri in [
subject_root.clone(),
format!("{subject_root}/surface"),