diff --git a/packages/backend/src/apps/wordpress/actions/create-post/index.js b/packages/backend/src/apps/wordpress/actions/create-post/index.js new file mode 100644 index 00000000..da32678a --- /dev/null +++ b/packages/backend/src/apps/wordpress/actions/create-post/index.js @@ -0,0 +1,262 @@ +import defineAction from '../../../../helpers/define-action.js'; +import isEmpty from 'lodash/isEmpty.js'; +import omitBy from 'lodash/omitBy.js'; + +export default defineAction({ + name: 'Create post', + key: 'createPost', + description: 'Creates a new post.', + arguments: [ + { + label: 'Title', + key: 'title', + type: 'string', + required: true, + description: '', + variables: true, + }, + { + label: 'Content', + key: 'content', + type: 'string', + required: false, + description: '', + variables: true, + }, + { + label: 'Excerpt', + key: 'excerpt', + type: 'string', + required: false, + description: '', + variables: true, + }, + { + label: 'Password', + key: 'password', + type: 'string', + required: false, + description: 'A password to protect access to the content and excerpt.', + variables: true, + }, + { + label: 'Author', + key: 'author', + type: 'dropdown', + required: false, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listUsers', + }, + ], + }, + }, + { + label: 'Featured Media', + key: 'featuredMedia', + type: 'dropdown', + required: false, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listMedia', + }, + ], + }, + }, + { + label: 'Comment Status', + key: 'commentStatus', + type: 'dropdown', + required: false, + description: '', + variables: true, + options: [ + { label: 'Open', value: 'open' }, + { label: 'Closed', value: 'closed' }, + ], + }, + { + label: 'Ping Status', + key: 'pingStatus', + type: 'dropdown', + required: false, + description: '', + variables: true, + options: [ + { label: 'Open', value: 'open' }, + { label: 'Closed', value: 'closed' }, + ], + }, + { + label: 'Format', + key: 'format', + type: 'dropdown', + required: false, + description: '', + variables: true, + options: [ + { label: 'Standard', value: 'standard' }, + { label: 'Aside', value: 'aside' }, + { label: 'Chat', value: 'chat' }, + { label: 'Gallery', value: 'gallery' }, + { label: 'Link', value: 'link' }, + { label: 'Image', value: 'image' }, + { label: 'Quote', value: 'quote' }, + { label: 'Status', value: 'status' }, + { label: 'Status', value: 'status' }, + { label: 'Video', value: 'video' }, + { label: 'Audio', value: 'audio' }, + ], + }, + { + label: 'Sticky', + key: 'sticky', + type: 'dropdown', + required: false, + description: '', + variables: true, + options: [ + { label: 'False', value: 'false' }, + { label: 'True', value: 'true' }, + ], + }, + { + label: 'Categories', + key: 'categoryIds', + type: 'dynamic', + required: false, + description: '', + fields: [ + { + label: 'Category', + key: 'categoryId', + type: 'dropdown', + required: false, + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listCategories', + }, + ], + }, + }, + ], + }, + { + label: 'Tags', + key: 'tagIds', + type: 'dynamic', + required: false, + description: '', + fields: [ + { + label: 'Tag', + key: 'tagId', + type: 'dropdown', + required: false, + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listTags', + }, + ], + }, + }, + ], + }, + { + label: 'Status', + key: 'status', + type: 'dropdown', + required: false, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listStatuses', + }, + ], + }, + }, + { + label: 'Date', + key: 'date', + type: 'string', + required: false, + description: "Post publish date in the site's timezone", + variables: true, + }, + ], + + async run($) { + const { + title, + content, + excerpt, + password, + author, + featuredMedia, + commentStatus, + pingStatus, + format, + sticky, + categoryIds, + tagIds, + status, + date, + } = $.step.parameters; + + const allCategoryIds = categoryIds + ?.map((categoryId) => categoryId.categoryId) + .filter(Boolean); + + const allTagIds = tagIds?.map((tagId) => tagId.tagId).filter(Boolean); + + let body = { + title, + content, + excerpt, + password, + author, + featured_media: featuredMedia, + comment_status: commentStatus, + ping_status: pingStatus, + format, + sticky, + categories: allCategoryIds, + tags: allTagIds, + status, + date, + }; + + body = omitBy(body, isEmpty); + + const response = await $.http.post('?rest_route=/wp/v2/posts', body); + + $.setActionItem({ raw: response.data }); + }, +}); diff --git a/packages/backend/src/apps/wordpress/actions/index.js b/packages/backend/src/apps/wordpress/actions/index.js new file mode 100644 index 00000000..6f717545 --- /dev/null +++ b/packages/backend/src/apps/wordpress/actions/index.js @@ -0,0 +1,3 @@ +import createPost from './create-post/index.js'; + +export default [createPost]; diff --git a/packages/backend/src/apps/wordpress/dynamic-data/index.js b/packages/backend/src/apps/wordpress/dynamic-data/index.js index ce289b38..9069e4a0 100644 --- a/packages/backend/src/apps/wordpress/dynamic-data/index.js +++ b/packages/backend/src/apps/wordpress/dynamic-data/index.js @@ -1,3 +1,7 @@ +import listCategories from './list-categories/index.js'; +import listMedia from './list-media/index.js'; import listStatuses from './list-statuses/index.js'; +import listTags from './list-tags/index.js'; +import listUsers from './list-users/index.js'; -export default [listStatuses]; +export default [listCategories, listMedia, listStatuses, listTags, listUsers]; diff --git a/packages/backend/src/apps/wordpress/dynamic-data/list-categories/index.js b/packages/backend/src/apps/wordpress/dynamic-data/list-categories/index.js new file mode 100644 index 00000000..cc0edc7a --- /dev/null +++ b/packages/backend/src/apps/wordpress/dynamic-data/list-categories/index.js @@ -0,0 +1,40 @@ +export default { + name: 'List categories', + key: 'listCategories', + + async run($) { + const categories = { + data: [], + }; + + const params = { + page: 1, + per_page: 100, + order: 'desc', + }; + + let totalPages = 1; + do { + const { data, headers } = await $.http.get( + '?rest_route=/wp/v2/categories', + { + params, + } + ); + + params.page = params.page + 1; + totalPages = Number(headers['x-wp-totalpages']); + + if (data) { + for (const category of data) { + categories.data.push({ + value: category.id, + name: category.name, + }); + } + } + } while (params.page <= totalPages); + + return categories; + }, +}; diff --git a/packages/backend/src/apps/wordpress/dynamic-data/list-media/index.js b/packages/backend/src/apps/wordpress/dynamic-data/list-media/index.js new file mode 100644 index 00000000..e5505e6d --- /dev/null +++ b/packages/backend/src/apps/wordpress/dynamic-data/list-media/index.js @@ -0,0 +1,37 @@ +export default { + name: 'List media', + key: 'listMedia', + + async run($) { + const media = { + data: [], + }; + + const params = { + page: 1, + per_page: 100, + order: 'desc', + }; + + let totalPages = 1; + do { + const { data, headers } = await $.http.get('?rest_route=/wp/v2/media', { + params, + }); + + params.page = params.page + 1; + totalPages = Number(headers['x-wp-totalpages']); + + if (data) { + for (const medium of data) { + media.data.push({ + value: medium.id, + name: medium.slug, + }); + } + } + } while (params.page <= totalPages); + + return media; + }, +}; diff --git a/packages/backend/src/apps/wordpress/dynamic-data/list-tags/index.js b/packages/backend/src/apps/wordpress/dynamic-data/list-tags/index.js new file mode 100644 index 00000000..0bcfb63b --- /dev/null +++ b/packages/backend/src/apps/wordpress/dynamic-data/list-tags/index.js @@ -0,0 +1,37 @@ +export default { + name: 'List tags', + key: 'listTags', + + async run($) { + const tags = { + data: [], + }; + + const params = { + page: 1, + per_page: 100, + order: 'desc', + }; + + let totalPages = 1; + do { + const { data, headers } = await $.http.get('?rest_route=/wp/v2/tags', { + params, + }); + + params.page = params.page + 1; + totalPages = Number(headers['x-wp-totalpages']); + + if (data) { + for (const tag of data) { + tags.data.push({ + value: tag.id, + name: tag.name, + }); + } + } + } while (params.page <= totalPages); + + return tags; + }, +}; diff --git a/packages/backend/src/apps/wordpress/dynamic-data/list-users/index.js b/packages/backend/src/apps/wordpress/dynamic-data/list-users/index.js new file mode 100644 index 00000000..8558e3a3 --- /dev/null +++ b/packages/backend/src/apps/wordpress/dynamic-data/list-users/index.js @@ -0,0 +1,37 @@ +export default { + name: 'List users', + key: 'listUsers', + + async run($) { + const users = { + data: [], + }; + + const params = { + page: 1, + per_page: 100, + order: 'desc', + }; + + let totalPages = 1; + do { + const { data, headers } = await $.http.get('?rest_route=/wp/v2/users', { + params, + }); + + params.page = params.page + 1; + totalPages = Number(headers['x-wp-totalpages']); + + if (data) { + for (const user of data) { + users.data.push({ + value: user.id, + name: user.name, + }); + } + } + } while (params.page <= totalPages); + + return users; + }, +}; diff --git a/packages/backend/src/apps/wordpress/index.js b/packages/backend/src/apps/wordpress/index.js index 6a95024c..825fc76e 100644 --- a/packages/backend/src/apps/wordpress/index.js +++ b/packages/backend/src/apps/wordpress/index.js @@ -4,6 +4,7 @@ import setBaseUrl from './common/set-base-url.js'; import auth from './auth/index.js'; import triggers from './triggers/index.js'; import dynamicData from './dynamic-data/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'WordPress', @@ -18,4 +19,5 @@ export default defineApp({ auth, triggers, dynamicData, + actions, }); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index 219a1d51..61655253 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -518,6 +518,7 @@ export default defineConfig({ collapsible: true, collapsed: true, items: [ + { text: 'Actions', link: '/apps/wordpress/actions' }, { text: 'Triggers', link: '/apps/wordpress/triggers' }, { text: 'Connection', link: '/apps/wordpress/connection' }, ], diff --git a/packages/docs/pages/apps/wordpress/actions.md b/packages/docs/pages/apps/wordpress/actions.md new file mode 100644 index 00000000..9a5d2b59 --- /dev/null +++ b/packages/docs/pages/apps/wordpress/actions.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/wordpress.svg +items: + - name: Create post + desc: Creates a new post. +--- + + + +