30 lines
1.4 KiB
Markdown
30 lines
1.4 KiB
Markdown
|
|
# Resources
|
||
|
|
|
||
|
|
Source: `src/domains/ResourcesDomain.ts`. Row operations on a resource as the
|
||
|
|
signed-in player through `/sdk/v1/resources/{slug}`. `client.resources(slug)`
|
||
|
|
returns a `ResourceHandle`; it performs no request by itself.
|
||
|
|
|
||
|
|
```ts
|
||
|
|
const items = client.resources('items');
|
||
|
|
items.list(): Promise<ListResourceRowsResponse> // GET /{slug} → { items?: ResourceRow[], total?: number }
|
||
|
|
items.get(id): Promise<ResourceRow> // GET /{slug}/{id}
|
||
|
|
items.create({ id?, data? }): Promise<ResourceRow> // POST /{slug}
|
||
|
|
items.update(id, { data?, version? }): Promise<ResourceRow> // PATCH /{slug}/{id}
|
||
|
|
items.delete(id): Promise<void> // DELETE /{slug}/{id}
|
||
|
|
```
|
||
|
|
|
||
|
|
`ResourceRow` is `{ id, playerId, data, version, rank, createdAt, updatedAt }`
|
||
|
|
(all optional in the generated type). Pass `version` on `update` for
|
||
|
|
optimistic concurrency.
|
||
|
|
|
||
|
|
```ts
|
||
|
|
const row = await client.resources('items').create({ data: { name: 'Sword' } });
|
||
|
|
await client.resources('items').update(row.id!, { data: { name: 'Axe' }, version: row.version });
|
||
|
|
```
|
||
|
|
|
||
|
|
What a player may read or write is decided by the resource's access rules on
|
||
|
|
the server; a denied operation rejects with `RudderHttpError` `code`
|
||
|
|
`forbidden`. Deleting a row that other rows still reference rejects with
|
||
|
|
status 409 and `code` `row_referenced`. Resources are not observable domains:
|
||
|
|
call `list()` again when you need fresh rows.
|