From c07a02ef31e842e043fb6ab237ac5c0e2a77aee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Fri, 24 May 2024 12:08:11 +0200 Subject: [PATCH] feat(bluesky): add create post action --- packages/backend/package.json | 1 + .../apps/bluesky/actions/create-post/index.js | 41 ++++++++++ .../backend/src/apps/bluesky/actions/index.js | 3 + packages/backend/src/apps/bluesky/index.js | 2 + packages/docs/pages/.vitepress/config.js | 5 +- packages/docs/pages/apps/bluesky/actions.md | 12 +++ packages/docs/pages/guide/available-apps.md | 1 + yarn.lock | 78 +++++++++++++++++++ 8 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/bluesky/actions/create-post/index.js create mode 100644 packages/backend/src/apps/bluesky/actions/index.js create mode 100644 packages/docs/pages/apps/bluesky/actions.md diff --git a/packages/backend/package.json b/packages/backend/package.json index 50b8109f..95a36678 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -20,6 +20,7 @@ "db:migrate": "node ./bin/database/convert-migrations.js && knex migrate:latest" }, "dependencies": { + "@atproto/api": "^0.12.13", "@bull-board/express": "^3.10.1", "@casl/ability": "^6.5.0", "@graphql-tools/graphql-file-loader": "^7.3.4", diff --git a/packages/backend/src/apps/bluesky/actions/create-post/index.js b/packages/backend/src/apps/bluesky/actions/create-post/index.js new file mode 100644 index 00000000..4ad4ee30 --- /dev/null +++ b/packages/backend/src/apps/bluesky/actions/create-post/index.js @@ -0,0 +1,41 @@ +import { BskyAgent, RichText } from '@atproto/api'; + +import defineAction from '../../../../helpers/define-action.js'; + +export default defineAction({ + name: 'Create post', + key: 'createPost', + description: 'Creates a new post.', + arguments: [ + { + label: 'Text', + key: 'text', + type: 'string', + required: true, + variables: true, + description: '', + }, + ], + + async run($) { + const text = $.step.parameters.text; + const agent = new BskyAgent({ service: 'https://bsky.social/xrpc' }); + const richText = new RichText({ text }); + await richText.detectFacets(agent); + + const body = { + repo: $.auth.data.did, + collection: 'app.bsky.feed.post', + record: { + $type: 'app.bsky.feed.post', + text: richText.text, + facets: richText.facets, + createdAt: new Date().toISOString(), + }, + }; + + const { data } = await $.http.post('/com.atproto.repo.createRecord', body); + + $.setActionItem({ raw: data }); + }, +}); diff --git a/packages/backend/src/apps/bluesky/actions/index.js b/packages/backend/src/apps/bluesky/actions/index.js new file mode 100644 index 00000000..6f717545 --- /dev/null +++ b/packages/backend/src/apps/bluesky/actions/index.js @@ -0,0 +1,3 @@ +import createPost from './create-post/index.js'; + +export default [createPost]; diff --git a/packages/backend/src/apps/bluesky/index.js b/packages/backend/src/apps/bluesky/index.js index 6f856a50..a65d5458 100644 --- a/packages/backend/src/apps/bluesky/index.js +++ b/packages/backend/src/apps/bluesky/index.js @@ -1,6 +1,7 @@ import defineApp from '../../helpers/define-app.js'; import addAuthHeader from './common/add-auth-header.js'; import auth from './auth/index.js'; +import actions from './actions/index.js'; export default defineApp({ name: 'Bluesky', @@ -13,4 +14,5 @@ export default defineApp({ primaryColor: '1185fd', beforeRequest: [addAuthHeader], auth, + actions, }); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index a9cc8a23..dd1a7d38 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -54,7 +54,10 @@ export default defineConfig({ text: 'Bluesky', collapsible: true, collapsed: true, - items: [{ text: 'Connection', link: '/apps/bluesky/connection' }], + items: [ + { text: 'Actions', link: '/apps/bluesky/actions' }, + { text: 'Connection', link: '/apps/bluesky/connection' }, + ], }, { text: 'Carbone', diff --git a/packages/docs/pages/apps/bluesky/actions.md b/packages/docs/pages/apps/bluesky/actions.md new file mode 100644 index 00000000..b6f59e95 --- /dev/null +++ b/packages/docs/pages/apps/bluesky/actions.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/bluesky.svg +items: + - name: Create post + desc: Creates a new post. +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index ad2b4c0c..2953ce83 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -4,6 +4,7 @@ The following integrations are currently supported by Automatisch. - [Airtable](/apps/airtable/actions) - [Appwrite](/apps/appwrite/triggers) +- [Bluesky](/apps/bluesky/actions) - [Carbone](/apps/carbone/actions) - [Datastore](/apps/datastore/actions) - [DeepL](/apps/deepl/actions) diff --git a/yarn.lock b/yarn.lock index 14538334..051808d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -170,6 +170,52 @@ tslib "^2.3.0" zen-observable-ts "~1.1.0" +"@atproto/api@^0.12.13": + version "0.12.13" + resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.12.13.tgz#269d6c57ea894e23f20b28bd3cbfed944bd28528" + integrity sha512-pRSID6w8AUiZJoCxgctMPRTSGVFHq7wphAnxEbRLBP3OQ1g+BRZUcqFw+e+17Pd3wrc8VImjiD4HCWtCJvCx3w== + dependencies: + "@atproto/common-web" "^0.3.0" + "@atproto/lexicon" "^0.4.0" + "@atproto/syntax" "^0.3.0" + "@atproto/xrpc" "^0.5.0" + multiformats "^9.9.0" + tlds "^1.234.0" + +"@atproto/common-web@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.3.0.tgz#36da8c2c31d8cf8a140c3c8f03223319bf4430bb" + integrity sha512-67VnV6JJyX+ZWyjV7xFQMypAgDmjVaR9ZCuU/QW+mqlqI7fex2uL4Fv+7/jHadgzhuJHVd6OHOvNn0wR5WZYtA== + dependencies: + graphemer "^1.4.0" + multiformats "^9.9.0" + uint8arrays "3.0.0" + zod "^3.21.4" + +"@atproto/lexicon@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@atproto/lexicon/-/lexicon-0.4.0.tgz#63e8829945d80c25524882caa8ed27b1151cc576" + integrity sha512-RvCBKdSI4M8qWm5uTNz1z3R2yIvIhmOsMuleOj8YR6BwRD+QbtUBy3l+xQ7iXf4M5fdfJFxaUNa6Ty0iRwdKqQ== + dependencies: + "@atproto/common-web" "^0.3.0" + "@atproto/syntax" "^0.3.0" + iso-datestring-validator "^2.2.2" + multiformats "^9.9.0" + zod "^3.21.4" + +"@atproto/syntax@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@atproto/syntax/-/syntax-0.3.0.tgz#fafa2dbea9add37253005cb663e7373e05e618b3" + integrity sha512-Weq0ZBxffGHDXHl9U7BQc2BFJi/e23AL+k+i5+D9hUq/bzT4yjGsrCejkjq0xt82xXDjmhhvQSZ0LqxyZ5woxA== + +"@atproto/xrpc@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@atproto/xrpc/-/xrpc-0.5.0.tgz#dacbfd8f7b13f0ab5bd56f8fdd4b460e132a6032" + integrity sha512-swu+wyOLvYW4l3n+VAuJbHcPcES+tin2Lsrp8Bw5aIXIICiuFn1YMFlwK9JwVUzTH21Py1s1nHEjr4CJeElJog== + dependencies: + "@atproto/lexicon" "^0.4.0" + zod "^3.21.4" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": version "7.16.7" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" @@ -8939,6 +8985,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + graphql-executor@0.0.18: version "0.0.18" resolved "https://registry.npmjs.org/graphql-executor/-/graphql-executor-0.0.18.tgz" @@ -9876,6 +9927,11 @@ isexe@^3.1.1: resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== +iso-datestring-validator@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz#2daa80d2900b7a954f9f731d42f96ee0c19a6895" + integrity sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA== + isobject@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" @@ -11592,6 +11648,11 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +multiformats@^9.4.2, multiformats@^9.9.0: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + multimatch@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz" @@ -15574,6 +15635,11 @@ tinyspy@^2.2.0: resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.0.tgz#9dc04b072746520b432f77ea2c2d17933de5d6ce" integrity sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg== +tlds@^1.234.0: + version "1.252.0" + resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.252.0.tgz#71d9617f4ef4cc7347843bee72428e71b8b0f419" + integrity sha512-GA16+8HXvqtfEnw/DTcwB0UU354QE1n3+wh08oFjr6Znl7ZLAeUgYzCcK+/CCrOyE0vnHR8/pu3XXG3vDijXpQ== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -15823,6 +15889,13 @@ uid-number@0.0.6: resolved "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= +uint8arrays@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.0.0.tgz#260869efb8422418b6f04e3fac73a3908175c63b" + integrity sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA== + dependencies: + multiformats "^9.4.2" + umask@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz" @@ -16948,3 +17021,8 @@ zen-observable@0.8.15: version "0.8.15" resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + +zod@^3.21.4: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==