Skip to content

Commit 0393772

Browse files
committed
It's possible to create spaces
1 parent a8c2199 commit 0393772

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
lines changed

README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,40 @@ funcli spaces get z2zK66AaEF
112112
funcli spaces get z2zK66AaEF --json
113113
```
114114

115+
#### Create a new space
116+
117+
```bash
118+
funcli spaces create <name>
119+
```
120+
121+
Creates a new space. **Note:** Requires manager permissions in your organization.
122+
123+
**Arguments:**
124+
- `<name>` - Space name (must be unique within your organization)
125+
126+
**Options:**
127+
- `-a, --access-mode <mode>` - Access mode: `public`, `restricted`, or `private` (default: `public`)
128+
129+
**Access Modes:**
130+
- **public**: Visible to all organization members
131+
- **restricted**: Visible to organization members but with limited access
132+
- **private**: Only visible to space members and teams
133+
134+
**Examples:**
135+
136+
```bash
137+
# Create a public space (default)
138+
funcli spaces create "My New Space"
139+
140+
# Create a private space
141+
funcli spaces create "Private Team Space" --access-mode private
142+
143+
# Create a restricted space
144+
funcli spaces create "Restricted Space" -a restricted
145+
```
146+
147+
**Note:** When a space is created, a home document is automatically created for it.
148+
115149
### Documents
116150

117151
#### List documents in a space

src/cli.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,37 @@ spacesCommand
8181
}
8282
});
8383

84+
spacesCommand
85+
.command("create <name>")
86+
.description("Create a new space")
87+
.option("-a, --access-mode <mode>", "Access mode: public, restricted, or private (default: public)", "public")
88+
.action(async (name, options) => {
89+
try {
90+
const config = new Config({
91+
apiKey: program.opts().token,
92+
baseUrl: program.opts().baseUrl
93+
});
94+
const client = new FundamentoClient(config);
95+
96+
// Validate access mode
97+
const validModes = ["public", "restricted", "private"];
98+
const accessMode = options.accessMode.toLowerCase();
99+
if (!validModes.includes(accessMode)) {
100+
console.error(chalk.red("Error:"), `Invalid access mode. Must be one of: ${validModes.join(", ")}`);
101+
process.exit(1);
102+
}
103+
104+
const space = await client.createSpace({ name, accessMode });
105+
106+
console.log(chalk.green("✓") + " Space created successfully!");
107+
console.log(chalk.bold(space.name) + chalk.gray(` (${space.npi})`));
108+
console.log(chalk.gray(`Access mode: ${space.access_mode}`));
109+
} catch (error) {
110+
console.error(chalk.red("Error:"), error.message);
111+
process.exit(1);
112+
}
113+
});
114+
84115
const documentsCommand = program
85116
.command("documents")
86117
.description("Manage documents");

src/client.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ export class FundamentoClient {
3333
return response.data;
3434
}
3535

36+
async createSpace({ name, accessMode }) {
37+
const response = await this.axios.post("/api/v1/spaces", {
38+
space: {
39+
name,
40+
access_mode: accessMode
41+
}
42+
});
43+
return response.data;
44+
}
45+
3646
async listDocuments(spaceNpi) {
3747
const response = await this.axios.get(`/api/v1/spaces/${spaceNpi}/documents`);
3848
return response.data;

test/client.test.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,36 @@ test("FundamentoClient createDocument should format request correctly", () => {
6565
// Restore original post
6666
client.axios.post = originalPost;
6767
});
68+
69+
test("FundamentoClient createSpace should format request correctly", () => {
70+
const config = new Config({ apiKey: "test-key" });
71+
const client = new FundamentoClient(config);
72+
73+
// Mock axios post
74+
const originalPost = client.axios.post;
75+
let capturedUrl, capturedData;
76+
77+
client.axios.post = async (url, data) => {
78+
capturedUrl = url;
79+
capturedData = data;
80+
return { data: { npi: "space123", name: "Test Space", access_mode: "public" } };
81+
};
82+
83+
// Call createSpace
84+
client.createSpace({
85+
name: "Test Space",
86+
accessMode: "public"
87+
});
88+
89+
// Verify the request format
90+
assert.strictEqual(capturedUrl, "/api/v1/spaces");
91+
assert.deepStrictEqual(capturedData, {
92+
space: {
93+
name: "Test Space",
94+
access_mode: "public"
95+
}
96+
});
97+
98+
// Restore original post
99+
client.axios.post = originalPost;
100+
});

0 commit comments

Comments
 (0)