From 1a09af27d268d772a9eedb38f2323613d3711891 Mon Sep 17 00:00:00 2001 From: Fairpost Date: Sun, 5 Oct 2025 17:46:22 +0200 Subject: [PATCH] feat: Add support for put-post, put-source, put-feed and put-user fix: https://github.com/commonpike/fairpost/issues/174 --- README.md | 12 ++- src/cli.ts | 12 +++ src/mappers/UserMapper.ts | 7 +- src/services/Fairpost.ts | 180 +++++++++++++++++++++++++------------- 4 files changed, 141 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index e472471..c94dbcb 100644 --- a/README.md +++ b/README.md @@ -147,8 +147,11 @@ to get a new pair of tokens. # basic commands: fairpost: help fairpost: @userid get-user +fairpost: @userid put-user << payload +fairpost: @userid edit-user (cli only) fairpost: @userid get-feed -fairpost: @userid get-fields --model=user|feed|platform|source|post [--platform=xxx] +fairpost: @userid put-feed << payload +fairpost: @userid edit-feed (cli only) fairpost: @userid get-platform --platform=xxx fairpost: @userid put-platform --platform=xxx << payload fairpost: @userid edit-platform --platform=xxx (cli only) @@ -159,16 +162,21 @@ fairpost: @userid test-platforms [--platforms=xxx,xxx] fairpost: @userid refresh-platform --platform=xxx fairpost: @userid refresh-platforms [--platforms=xxx,xxx] fairpost: @userid get-source --source=xxx [--stage=xxx] +fairpost: @userid put-source << payload +fairpost: @userid edit-source (cli only) fairpost: @userid get-sources [--sources=xxx,xxx|--stage=xxx] fairpost: @userid get-post --post=xxx:xxx +fairpost: @userid put-post << payload +fairpost: @userid edit-post (cli only) fairpost: @userid get-posts [--status=xxx] [--sources=xxx,xxx|--stage=xxx] [--platforms=xxx,xxx] fairpost: @userid prepare-post --post=xxx:xxx fairpost: @userid schedule-post --post=xxx:xxx --date=xxxx-xx-xx fairpost: @userid schedule-posts [--source=xxx] [--platforms=xxx,xxx|--platform=xxx] --date=xxxx-xx-xx -fairpost: @userid schedule-next-post --platform=xxx [--date=xxxx-xx-xx] [--sources=xxx,xxx|--stage] +fairpost: @userid schedule-next-post --platform=xxx [--date=xxxx-xx-xx] [--sources=xxx,xxx|--stage=xxx] fairpost: @userid publish-post --post=xxx:xxx [--dry-run] fairpost: @userid publish-posts [--source=xxx] [--platforms=xxx,xxx|--platform=xxx] fairpost: @userid set-status [--post=xxx:xxx|--posts=xxx:xxx,xxx:xxx] +fairpost: @userid get-fields --model=user|feed|platform|source|post [--platform=xxx] # feed planning: fairpost: @userid prepare-posts [--sources=xxx,xxx|--source=xxx|--stage=xxx] [--platforms=xxx,xxx|--platform=xxx] diff --git a/src/cli.ts b/src/cli.ts index 742d8d8..39d56ac 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -117,6 +117,18 @@ switch (COMMAND) { case "edit-platform": console.info(await editPayload("get-platform", "put-platform")); break; + case "edit-user": + console.info(await editPayload("get-user", "put-user")); + break; + case "edit-feed": + console.info(await editPayload("get-feed", "put-feed")); + break; + case "edit-source": + console.info(await editPayload("get-source", "put-source")); + break; + case "edit-post": + console.info(await editPayload("get-post", "put-post")); + break; default: console.info(await execute(COMMAND)); } diff --git a/src/mappers/UserMapper.ts b/src/mappers/UserMapper.ts index 3599039..41cacff 100644 --- a/src/mappers/UserMapper.ts +++ b/src/mappers/UserMapper.ts @@ -14,8 +14,7 @@ export default class UserMapper extends AbstractMapper { type: "string", label: "ID", get: ["any"], - set: ["manageUsers"], - required: true, + set: ["none"], // todo - there should be a rename-user command instead }, homedir: { type: "string", @@ -79,10 +78,6 @@ export default class UserMapper extends AbstractMapper { for (const field in dto) { if (fields.includes(field)) { switch (field) { - case "id": - // todo - there should be a rename-user command instead - throw this.user.log.error("Cannot set ID: unimplemented"); - break; case "loglevel": this.user.data.set( "settings", diff --git a/src/services/Fairpost.ts b/src/services/Fairpost.ts index 86c50f8..f54b4a1 100644 --- a/src/services/Fairpost.ts +++ b/src/services/Fairpost.ts @@ -163,36 +163,6 @@ class Fairpost { break; } - /*case "get-settings": { - if (!permissions.manageAccount) { - throw new Error("Missing permissions for command " + command); - } - if (!user) { - throw new Error("user is required for command " + command); - } - output = user.getSettings(); - break; - } - - case "put-settings": { - if (!permissions.manageAccount) { - throw new Error("Missing permissions for command " + command); - } - if (!user) { - throw new Error("user is required for command " + command); - } - if (!args.payload) { - throw user.log.error( - "CommandHandler " + command, - "Missing argument: payload", - ); - } - await user.putSettings(args.payload as { [key: string]: string }); - output = { success: true }; - break; - } - */ - case "get-fields": { if (!permissions.manageAccount) { throw new Error("Missing permissions for command " + command); @@ -244,9 +214,31 @@ class Fairpost { case "get-user": { if (!user) { throw new Error("Missing user for command " + command); - } else { - output = await user.mapper.getDto(operator); } + output = await user.mapper.getDto(operator); + break; + } + + case "put-user": { + if (!user) { + throw new Error("user is required for command " + command); + } + if (!args.payload) { + throw user.log.error( + "CommandHandler " + command, + "Missing payload", + ); + } + if ( + Buffer.isBuffer(args.payload || typeof args.payload === "string") + ) { + throw user.log.error( + "CommandHandler " + command, + "Payload must be an object", + ); + } + await user.mapper.putDto(operator, args.payload as UserDto); + output = await user.mapper.getDto(operator); break; } @@ -262,51 +254,32 @@ class Fairpost { break; } - /*case "add-platform": { + case "put-feed": { if (!permissions.manageFeed) { throw new Error("Missing permissions for command " + command); } if (!user) { throw new Error("user is required for command " + command); } - if (!args.platform) { + if (!args.payload) { throw user.log.error( "CommandHandler " + command, - "Missing argument: platform", + "Missing payload", ); } - await user.addPlatform(args.platform); - output = { - [args.platform]: { - success: true, - message: "Proceed to setup.", - }, - }; - break; - } - - case "remove-platform": { - if (!permissions.manageFeed) { - throw new Error("Missing permissions for command " + command); - } - if (!user) { - throw new Error("user is required for command " + command); - } - if (!args.platform) { + if ( + Buffer.isBuffer(args.payload || typeof args.payload === "string") + ) { throw user.log.error( "CommandHandler " + command, - "Missing argument: platform", + "Payload must be an object", ); } - await user.removePlatform(args.platform); - output = { - [args.platform]: { - success: true, - }, - }; + const feed = user.getFeed(); + await feed.mapper.putDto(operator, args.payload as FeedDto); + output = await feed.mapper.getDto(operator); break; } - */ case "setup-platform": { if (!permissions.manageFeed) { @@ -527,6 +500,39 @@ class Fairpost { output = await source.mapper.getDto(operator); break; } + case "put-source": { + if (!permissions.manageSources) { + throw new Error("Missing permissions for command " + command); + } + if (!user) { + throw new Error("user is required for command " + command); + } + if (!args.payload) { + throw user.log.error( + "CommandHandler " + command, + "Missing payload", + ); + } + if (!args.source) { + throw user.log.error( + "CommandHandler " + command, + "Missing argument: source", + ); + } + if ( + Buffer.isBuffer(args.payload || typeof args.payload === "string") + ) { + throw user.log.error( + "CommandHandler " + command, + "Payload must be an object", + ); + } + const feed = user.getFeed(); + const source = await feed.getSource(args.source, args.stage); + await source.mapper.putDto(operator, args.payload as SourceDto); + output = await source.mapper.getDto(operator); + break; + } case "get-sources": { if (!permissions.manageSources) { throw new Error("Missing permissions for command " + command); @@ -568,6 +574,48 @@ class Fairpost { output = await post.mapper.getDto(operator); break; } + case "put-post": { + if (!permissions.managePosts) { + throw new Error("Missing permissions for command " + command); + } + if (!user) { + throw new Error("user is required for command " + command); + } + if (!args.payload) { + throw user.log.error( + "CommandHandler " + command, + "Missing payload", + ); + } + if (!args.source) { + throw user.log.error( + "CommandHandler " + command, + "Missing argument: source", + ); + } + if (!args.platform) { + throw user.log.error( + "CommandHandler " + command, + "Missing argument: platform", + ); + } + + if ( + Buffer.isBuffer(args.payload || typeof args.payload === "string") + ) { + throw user.log.error( + "CommandHandler " + command, + "Payload must be an object", + ); + } + const feed = user.getFeed(); + const platform = user.getPlatform(args.platform); + const source = await feed.getSource(args.source); + const post = await platform.getPost(source); + await post.mapper.putDto(operator, args.payload as PostDto); + output = await post.mapper.getDto(operator); + break; + } case "get-posts": { if (!permissions.readPosts) { throw new Error("Missing permissions for command " + command); @@ -1004,8 +1052,11 @@ class Fairpost { "# basic commands:", `${cmd} help`, `${cmd} @userid get-user`, + `${cmd} @userid put-user << payload`, + `${cmd} @userid edit-user (cli only)`, `${cmd} @userid get-feed`, - `${cmd} @userid get-fields --model=user|feed|platform|source|post [--platform=xxx]`, + `${cmd} @userid put-feed << payload`, + `${cmd} @userid edit-feed (cli only)`, `${cmd} @userid get-platform --platform=xxx`, `${cmd} @userid put-platform --platform=xxx << payload`, `${cmd} @userid edit-platform --platform=xxx (cli only)`, @@ -1016,8 +1067,12 @@ class Fairpost { `${cmd} @userid refresh-platform --platform=xxx`, `${cmd} @userid refresh-platforms [--platforms=xxx,xxx]`, `${cmd} @userid get-source --source=xxx [--stage=xxx] `, + `${cmd} @userid put-source << payload`, + `${cmd} @userid edit-source (cli only)`, `${cmd} @userid get-sources [--sources=xxx,xxx|--stage=xxx]`, `${cmd} @userid get-post --post=xxx:xxx`, + `${cmd} @userid put-post << payload`, + `${cmd} @userid edit-post (cli only)`, `${cmd} @userid get-posts [--status=xxx] [--sources=xxx,xxx|--stage=xxx] [--platforms=xxx,xxx] `, `${cmd} @userid prepare-post --post=xxx:xxx`, `${cmd} @userid schedule-post --post=xxx:xxx --date=xxxx-xx-xx `, @@ -1026,6 +1081,7 @@ class Fairpost { `${cmd} @userid publish-post --post=xxx:xxx [--dry-run]`, `${cmd} @userid publish-posts [--source=xxx] [--platforms=xxx,xxx|--platform=xxx]`, `${cmd} @userid set-status [--post=xxx:xxx|--posts=xxx:xxx,xxx:xxx]`, + `${cmd} @userid get-fields --model=user|feed|platform|source|post [--platform=xxx]`, "\n# feed planning:", `${cmd} @userid prepare-posts [--sources=xxx,xxx|--source=xxx|--stage=xxx] [--platforms=xxx,xxx|--platform=xxx]`, `${cmd} @userid schedule-next-posts [--date=xxxx-xx-xx] [--sources=xxx,xxx|--stage] [--platforms=xxx,xxx] `,