diff --git a/docs/content/2.composables/9.useDirectusFields.md b/docs/content/2.composables/9.useDirectusFields.md new file mode 100644 index 00000000..ac97ebce --- /dev/null +++ b/docs/content/2.composables/9.useDirectusFields.md @@ -0,0 +1,181 @@ +# `useDirectusFields` + +--- + +> Check out the Directus [Fields](https://docs.directus.io/reference/system/fields.html) documentation. + +### `getFields` + +Get all fields in a specific collection + +- **Arguments:** + + - data: [`DirectusFieldsRequest`](https://github.com/Intevel/nuxt-directus/blob/main/src/runtime/types/index.d.ts) + - collection?: `string` + +- **Returns:** `Promise` + +```vue [pages/example.vue] + +``` + +### `getField` + +Get a specific field in a collection + +- **Arguments:** + + - data: [`DirectusFieldRequest`](https://github.com/Intevel/nuxt-directus/blob/main/src/runtime/types/index.d.ts) + - collection: `string` + - field?: `string` + +- **Returns:** `Promise` + +```vue [pages/example.vue] + +``` + +### `createField` + +Create a new field in a collection + +- **Arguments:** + + - data: [`DirectusFieldCreation`](https://github.com/Intevel/nuxt-directus/blob/main/src/runtime/types/index.d.ts) + - collection: `string` + - field: `string` + - type: `string` + - meta?: `Record` + - schema?: `Record` + +- **Returns:** `Promise` + +```vue [pages/example.vue] + +``` + +### `updateField` + +Update an existing field in a collection + +- **Arguments:** + + - data: [`DirectusFieldUpdate`](https://github.com/Intevel/nuxt-directus/blob/main/src/runtime/types/index.d.ts) + - collection: `string` + - field: `string` + - meta?: `Record` + - schema?: `Record` + +- **Returns:** `Promise` + +```vue [pages/example.vue] + +``` + +### `deleteField` + +Delete a field from a collection + +- **Arguments:** + + - data: [`DirectusFieldRequest`](https://github.com/Intevel/nuxt-directus/blob/main/src/runtime/types/index.d.ts) + - collection: `string` + - field: `string` + +- **Returns:** `Promise` + +```vue [pages/example.vue] + diff --git a/playground/app.vue b/playground/app.vue index f0ca63c6..d0e850e9 100644 --- a/playground/app.vue +++ b/playground/app.vue @@ -25,6 +25,9 @@ + @@ -57,6 +60,7 @@ const { login, loginWithProvider, logout } = useDirectusAuth() const user = useDirectusUser() const { getItems, getItemById, createItems, deleteItems } = useDirectusItems() const { getCollections } = useDirectusCollections() +const { getFields } = useDirectusFields() const router = useRouter() const { token } = useDirectusToken() @@ -75,6 +79,14 @@ interface Article { status: string; } +interface Field { + collection: string; + field: string; + type: string; + schema: Object; + meta: Object; +} + let articleIds: (string | number | undefined)[] = [] const onSubmit = async () => { @@ -152,6 +164,17 @@ const fetchCollections = async () => { } catch (e) {} } +const fetchFields = async () => { + try { + const fields = await getFields({ + collection: 'Articles' + }); + console.log(fields) + + router.push('/d') + } catch (e) {} +} + // User Composable Tests interface User { diff --git a/src/runtime/composables/useDirectusFields.ts b/src/runtime/composables/useDirectusFields.ts new file mode 100644 index 00000000..0028b396 --- /dev/null +++ b/src/runtime/composables/useDirectusFields.ts @@ -0,0 +1,84 @@ +import { + DirectusFieldRequest, + DirectusFieldCreation, + DirectusFieldUpdate, + DirectusFieldsRequest, + DirectusField +} from '../types' +import { useDirectus } from './useDirectus' + +export const useDirectusFields = () => { + const directus = useDirectus() + + const getFields = async ( + data: DirectusFieldsRequest + ): Promise => { + const fields = await directus<{ data: DirectusField[] }>( + `/fields/${data.collection}`, + { + method: 'GET' + } + ) + return fields.data + } + + const getField = async (data: DirectusFieldRequest): Promise => { + if (!data.field) { + throw new Error('Field name is required') + } + const field = await directus<{ data: DirectusField }>( + `/fields/${data.collection}/${data.field}`, + { + method: 'GET' + } + ) + return field.data + } + + const createField = async (data: DirectusFieldCreation): Promise => { + const field = await directus<{ data: DirectusField }>(`/fields/${data.collection}`, { + method: 'POST', + body: { + field: data.field, + type: data.type, + meta: data.meta, + schema: data.schema + } + }) + return field.data + } + + const updateField = async (data: DirectusFieldUpdate): Promise => { + const field = await directus<{ data: DirectusField }>( + `/fields/${data.collection}/${data.field}`, + { + method: 'PATCH', + body: { + meta: data.meta, + schema: data.schema + } + } + ) + return field.data + } + + const deleteField = async (data: DirectusFieldRequest): Promise => { + if (!data.field) { + throw new Error('Field name is required') + } + await directus( + `/fields/${data.collection}/${data.field}`, + { + method: 'DELETE' + } + ) + } + + return { + getFields, + getField, + createField, + updateField, + deleteField + } +} diff --git a/src/runtime/types/index.d.ts b/src/runtime/types/index.d.ts index c2a7e608..2b7d7595 100644 --- a/src/runtime/types/index.d.ts +++ b/src/runtime/types/index.d.ts @@ -168,6 +168,38 @@ export interface DirectusFileRequest { params?: DirectusQueryParams; } +export interface DirectusField { + collection: string; + field: string; + type: string; + meta: Record; + schema: Record; +} + +export interface DirectusFieldsRequest { + collection?: string; +} + +export interface DirectusFieldRequest { + collection: string + field?: string +} + +export interface DirectusFieldCreation { + collection: string + field: string + type: string + meta?: Record + schema?: Record +} + +export interface DirectusFieldUpdate { + collection: string + field: string + meta?: Record + schema?: Record +} + export interface DirectusNotificationObject { id?: number; timestamp?: string; @@ -180,6 +212,7 @@ export interface DirectusNotificationObject { item?: string; } + export interface DirectusCollectionRequest { collection?: string; } @@ -234,7 +267,7 @@ export interface DirectusRevision { export interface DirectusItemMetadata { total_count?: number; filter_count?: number; -}; +} export interface DirectusItems { data: NonNullable;