// ============================================================================ // 042 — CRUD API for Users // ============================================================================ // Full Create-Read-Update-Delete API using JSON serialization. // // Serve: soma serve 042_crud_api.cell // Test: curl -X POST localhost:8080/create?name=Alice&email=alice@test.com // curl localhost:8080/get/1 // curl localhost:8080/list // // Run: soma run 042_crud_api.cell demo // Expect: // Created: {"id": 1, "name": "Alice", "email": "alice@test.com"} // Created: {"id": 2, "name": "Bob", "email": "bob@test.com"} // All users: 2 cell UserCRUD { face { signal create(name: String, email: String) -> String signal get(id: String) -> String signal list_all() -> String signal update(id: String, name: String) -> String signal delete(id: String) -> Map signal demo() -> String } memory { users: Map [persistent, consistent] meta: Map [persistent, consistent] } on create(name: String, email: String) { // Auto-increment ID let current = meta.get("next_id") if current == () { meta.set("next_id", 1) } let id = meta.get("next_id") meta.set("next_id", id + 1) let id_str = to_string(id) // Store as JSON let user = map("id", id, "name", name, "email", email) users.set(id_str, to_json(user)) return user } on get(id: String) { let raw = users.get(id) if raw == () { return response(404, map("error", "user not found")) } return from_json(raw) } on list_all() { let keys = users.keys() let result = list() for key in keys { result = list(result, from_json(users.get(key))) } return result } on update(id: String, name: String) { let raw = users.get(id) if raw == () { return response(404, map("error", "user not found")) } let existing = from_json(raw) let updated = map("id", id, "name", name, "email", existing.email) users.set(id, to_json(updated)) return updated } on delete(id: String) { let existed = users.delete(id) if existed == false { return response(404, map("error", "user not found")) } return map("deleted", id) } // Self-contained demo on demo() { let u1 = create("Alice", "alice@test.com") print("Created: {u1}") let u2 = create("Bob", "bob@test.com") print("Created: {u2}") let all = list_all() let count = all.length print("All users: {count}") return "done" } }