From 64e479f44e34401bb84a199a21380ff8b46b8752 Mon Sep 17 00:00:00 2001 From: Troy Taylor <44444967+troystaylor@users.noreply.github.com> Date: Wed, 25 Oct 2023 07:56:32 -0400 Subject: [PATCH] Letterdrop (Independent Publisher) (#2955) * Revert "Merge branch 'microsoft:dev' into dev" This reverts commit 096a7c31993f909c3ee2ccacb4d6a206a1a2b2a3, reversing changes made to cb0948670feda35e9fc2a43241de68bc50e06812. * Revert "Merge branch 'microsoft:dev' into dev" This reverts commit cb0948670feda35e9fc2a43241de68bc50e06812, reversing changes made to dc26e8a0268f26bc2f38bf3a66e8c90e98df9404. * Revert "Revert "Merge branch 'microsoft:dev' into dev"" This reverts commit 01764d0a6d9e3afa849a6a4159d751aee6108580. * Revert "Revert "Merge branch 'microsoft:dev' into dev"" This reverts commit a3f086ef0f4e8b47ec14e9287ec7ebc29a09ea33. * Add files via upload * Revert "Add files via upload" This reverts commit eeff7b7a02a5c65406413e7c848ebc718c30183e. * Add files via upload * Delete independent-publisher-connectors/FileIO directory * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Revert "Add files via upload" This reverts commit 1d855069580b1ee4670c7c8e3b2edec4e0d63cd5. * Update readme.md * Revert "Update readme.md" This reverts commit b94447a14268a503fa5224ab942d8bbbdf443111. * Add files via upload --- .../Letterdrop/apiDefinition.swagger.json | 906 ++++++++++++++++++ .../Letterdrop/apiProperties.json | 23 + .../Letterdrop/readme.md | 31 + 3 files changed, 960 insertions(+) create mode 100644 independent-publisher-connectors/Letterdrop/apiDefinition.swagger.json create mode 100644 independent-publisher-connectors/Letterdrop/apiProperties.json create mode 100644 independent-publisher-connectors/Letterdrop/readme.md diff --git a/independent-publisher-connectors/Letterdrop/apiDefinition.swagger.json b/independent-publisher-connectors/Letterdrop/apiDefinition.swagger.json new file mode 100644 index 000000000..9d28851bd --- /dev/null +++ b/independent-publisher-connectors/Letterdrop/apiDefinition.swagger.json @@ -0,0 +1,906 @@ +{ + "swagger": "2.0", + "info": { + "title": "Letterdrop", + "description": "Letterdrop is the only SEO tool that optimizes for people-first content. Beyond SEO, it's actually a complete content marketing suite designed to help you go from idea to publish as quickly as possible while following best practices. This includes project management, social distribution, and repurposing content.", + "version": "1.0", + "contact": { + "name": "Troy Taylor", + "url": "https://www.hitachisolutions.com", + "email": "ttaylor@hitachisolutions.com" + } + }, + "host": "app.letterdrop.com", + "basePath": "/api/v1/", + "schemes": [ + "https" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/subscriber/add": { + "post": { + "responses": { + "200": { + "description": "default", + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "description": "Whether a success.", + "title": "Success" + }, + "email": { + "type": "string", + "description": "The email address.", + "title": "Email" + }, + "type": { + "type": "string", + "description": "The type.", + "title": "Type" + }, + "publication": { + "type": "string", + "description": "The publication.", + "title": "Publication" + }, + "message": { + "type": "string", + "description": "The message.", + "title": "Message" + } + } + } + } + }, + "summary": "Add subscriber", + "description": "Add a subscriber to your publication.", + "operationId": "SubscriberPost", + "parameters": [ + { + "name": "body", + "in": "body", + "required": false, + "schema": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "The email address.", + "title": "Email" + }, + "welcomeEmail": { + "type": "boolean", + "description": "Whether to send a welcome email.", + "title": "Welcome Email" + }, + "additionalData": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name.", + "title": "Name" + }, + "location": { + "type": "string", + "description": "The location.", + "title": "Location" + }, + "title": { + "type": "string", + "description": "The title.", + "title": "Title" + }, + "company": { + "type": "string", + "description": "The company.", + "title": "Company" + }, + "companySize": { + "type": "integer", + "format": "int32", + "description": "The company size.", + "title": "Company Size" + }, + "industry": { + "type": "string", + "description": "The industry.", + "title": "Industry" + }, + "twitter": { + "type": "string", + "description": "The Twitter handle.", + "title": "Twitter" + }, + "twitterFollowers": { + "type": "integer", + "format": "int32", + "description": "The number of Twitter followers.", + "title": "Twitter Followers" + }, + "linkedin": { + "type": "string", + "description": "The LinkedIn account.", + "title": "LinkedIn" + }, + "github": { + "type": "string", + "description": "The GitHub account.", + "title": "GitHub" + }, + "facebook": { + "type": "string", + "description": "The Facebook account.", + "title": "Facebook" + } + }, + "title": "Additional Data" + } + }, + "required": [ + "email" + ] + } + } + ], + "x-ms-visibility": "important" + } + }, + "/subscriber/remove": { + "post": { + "responses": { + "200": { + "description": "default", + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "description": "Whether a success.", + "title": "Success" + }, + "email": { + "type": "string", + "description": "The email address.", + "title": "Email" + }, + "publication": { + "type": "string", + "description": "The publication.", + "title": "Publication" + }, + "message": { + "type": "string", + "description": "The message.", + "title": "Message" + } + } + } + } + }, + "summary": "Remove subscriber", + "description": "Remove a subscriber from your publication.", + "operationId": "SubscriberRemovePost", + "parameters": [ + { + "name": "email", + "in": "query", + "x-ms-summary": "Email", + "description": "The email address.", + "required": true, + "type": "string" + } + ] + } + }, + "/posts": { + "post": { + "responses": { + "200": { + "description": "default", + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "description": "Whether a success.", + "title": "Success" + }, + "meta": { + "type": "object", + "properties": { + "page": { + "type": "integer", + "format": "int32", + "description": "The page number.", + "title": "Page" + }, + "hasNextPage": { + "type": "boolean", + "description": "Whether has next page.", + "title": "Has Next Page" + }, + "totalPosts": { + "type": "integer", + "format": "int32", + "description": "The total number of posts.", + "title": "Total Posts" + } + }, + "title": "Meta" + }, + "posts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier.", + "title": "ID" + }, + "title": { + "type": "string", + "description": "The title.", + "title": "Title" + }, + "subtitle": { + "type": "string", + "description": "The subtitle.", + "title": "Subtitle" + }, + "text": { + "type": "string", + "description": "The text.", + "title": "Text" + }, + "textPreview": { + "type": "string", + "description": "The text preview.", + "title": "Text Preview" + }, + "body": { + "type": "string", + "description": "The body.", + "title": "Body" + }, + "slug": { + "type": "string", + "description": "The slug.", + "title": "Slug" + }, + "url": { + "type": "string", + "description": "The URL address.", + "title": "URL" + }, + "publishedOn": { + "type": "string", + "description": "When published on.", + "title": "Published On" + }, + "coverImage": { + "type": "string", + "description": "The cover image.", + "title": "Cover Image" + }, + "thumbnail": { + "type": "string", + "description": "The thumbnail.", + "title": "Thumbnail" + }, + "metaTitle": { + "type": "string", + "description": "The meta title.", + "title": "Meta Title" + }, + "metaDescription": { + "type": "string", + "description": "The meta description.", + "title": "Meta Description" + }, + "status": { + "type": "string", + "description": "The status.", + "title": "Status" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The tags.", + "title": "Tags" + }, + "updated": { + "type": "string", + "description": "When updated.", + "title": "Updated" + }, + "publication": { + "type": "string", + "description": "The publication.", + "title": "Publication" + }, + "readTime": { + "type": "integer", + "format": "int32", + "description": "The read time.", + "title": "Read Time" + }, + "wordCount": { + "type": "integer", + "format": "int32", + "description": "The word count.", + "title": "Word Count" + }, + "featured": { + "type": "boolean", + "description": "Whether featured.", + "title": "Featured" + }, + "markdown": { + "type": "string", + "description": "The markdown.", + "title": "Markdown" + } + } + }, + "title": "Posts" + } + } + } + } + }, + "summary": "Get posts", + "description": "Retrieve a summary of all your posts to be displayed on your home page.", + "operationId": "PostsGetPost", + "parameters": [ + { + "name": "body", + "in": "body", + "required": false, + "schema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "The search query.", + "title": "Query" + }, + "offset": { + "type": "integer", + "format": "int32", + "description": "The offset.", + "title": "Offset", + "default": 0 + }, + "limit": { + "type": "integer", + "format": "int32", + "description": "The page limit.", + "title": "Limit" + } + }, + "required": [ + "query" + ] + } + } + ] + } + }, + "/post/get/{id}": { + "post": { + "responses": { + "200": { + "description": "default", + "schema": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier.", + "title": "ID" + }, + "title": { + "type": "string", + "description": "The title.", + "title": "Title" + }, + "subtitle": { + "type": "string", + "description": "The subtitle.", + "title": "Subtitle" + }, + "text": { + "type": "string", + "description": "The text.", + "title": "Text" + }, + "textPreview": { + "type": "string", + "description": "The text preview.", + "title": "Text Preview" + }, + "body": { + "type": "string", + "description": "The body.", + "title": "Body" + }, + "slug": { + "type": "string", + "description": "The slug.", + "title": "Slug" + }, + "url": { + "type": "string", + "description": "The URL address.", + "title": "URL" + }, + "publishedOn": { + "type": "string", + "description": "When published on.", + "title": "Published On" + }, + "coverImage": { + "type": "string", + "description": "The cover image.", + "title": "Cover Image" + }, + "thumbnail": { + "type": "string", + "description": "The thumbnail.", + "title": "Thumbnail" + }, + "metaTitle": { + "type": "string", + "description": "The meta title.", + "title": "Meta Title" + }, + "metaDescription": { + "type": "string", + "description": "The meta description.", + "title": "Meta Description" + }, + "status": { + "type": "string", + "description": "The status.", + "title": "Status" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The tags.", + "title": "Tags" + }, + "updated": { + "type": "string", + "description": "When updated.", + "title": "Updated" + }, + "publication": { + "type": "string", + "description": "The publication.", + "title": "Publication" + }, + "readTime": { + "type": "integer", + "format": "int32", + "description": "The read time.", + "title": "Read Time" + }, + "wordCount": { + "type": "integer", + "format": "int32", + "description": "The word count.", + "title": "Word Count" + }, + "featured": { + "type": "boolean", + "description": "Whether featured.", + "title": "Featured" + }, + "markdown": { + "type": "string", + "description": "The markdown.", + "title": "Markdown" + } + } + } + } + }, + "summary": "Get post", + "description": "Retrieve a single post.", + "operationId": "PostGetPost", + "parameters": [ + { + "name": "id", + "in": "path", + "x-ms-summary": "ID", + "x-ms-url-encoding": "single", + "description": "The identifier.", + "required": true, + "type": "string" + } + ] + } + }, + "/post/draft": { + "post": { + "responses": { + "200": { + "description": "default", + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "description": "Whether a success.", + "title": "Success" + }, + "draftLink": { + "type": "string", + "description": "The draft link.", + "title": "Draft Link" + } + } + } + } + }, + "summary": "Draft post", + "description": "Drafts a post.", + "operationId": "PostDraftPost", + "parameters": [ + { + "name": "body", + "in": "body", + "required": false, + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "The title.", + "title": "Title" + }, + "subtitle": { + "type": "string", + "description": "The subtitle.", + "title": "Subtitle" + }, + "html": { + "type": "string", + "description": "The HTML.", + "title": "HTML" + } + }, + "required": [ + "title", + "html" + ] + } + } + ], + "x-ms-visibility": "important" + } + }, + "/project/get/{id}": { + "post": { + "responses": { + "200": { + "description": "default", + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "The title.", + "title": "Title" + }, + "description": { + "type": "string", + "description": "The description.", + "title": "Description" + }, + "labels": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The labels.", + "title": "Labels" + }, + "keyword": { + "type": "string", + "description": "The keyword.", + "title": "Keyword" + }, + "status": { + "type": "string", + "description": "The status.", + "title": "Status" + }, + "suggestedBy": { + "type": "string", + "description": "The suggested by.", + "title": "Suggested By" + }, + "suggestedOn": { + "type": "string", + "description": "When suggested on.", + "title": "Suggested On" + }, + "assignedBy": { + "type": "string", + "description": "The assigned by.", + "title": "Assigned By" + }, + "assignedTo": { + "type": "string", + "description": "The assigned to.", + "title": "Assigned To" + }, + "contributors": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The contributors.", + "title": "Contributors" + }, + "contentMapDeadline": { + "type": "string", + "description": "The content map deadline.", + "title": "Content Map Deadline" + }, + "approvers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The approvers.", + "title": "Approvers" + }, + "reviewDeadline": { + "type": "string", + "description": "The review deadline.", + "title": "Review Deadline" + }, + "approvedBy": { + "type": "string", + "description": "The approved by.", + "title": "Approved By" + }, + "publishDate": { + "type": "string", + "description": "The publish date.", + "title": "Publish Date" + } + } + } + } + }, + "summary": "Get project", + "description": "Retrieve the details for a project.", + "operationId": "ProjectGetPost", + "parameters": [ + { + "name": "id", + "in": "path", + "x-ms-summary": "ID", + "x-ms-url-encoding": "single", + "description": "The identifier.", + "required": true, + "type": "string" + } + ] + } + }, + "/idea/new": { + "post": { + "responses": { + "200": { + "description": "default", + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "description": "Whether a success.", + "title": "Success" + }, + "title": { + "type": "string", + "description": "The title.", + "title": "Title" + }, + "description": { + "type": "string", + "description": "The description.", + "title": "Description" + }, + "labels": { + "type": "array", + "items": { + "type": "string" + }, + "description": "labels" + }, + "keyword": { + "type": "string", + "description": "The keyword.", + "title": "Keyword" + }, + "suggestedBy": { + "type": "string", + "description": "The suggested by.", + "title": "Suggested By" + }, + "message": { + "type": "string", + "description": "The message.", + "title": "Message" + } + } + } + } + }, + "x-ms-visibility": "important", + "summary": "Create idea", + "description": "Creates a new idea.", + "operationId": "IdeaCreatePost", + "parameters": [ + { + "name": "body", + "in": "body", + "required": false, + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "The title.", + "title": "Title" + }, + "description": { + "type": "string", + "description": "The description.", + "title": "Description" + }, + "suggestedBy": { + "type": "string", + "description": "The suggested by.", + "title": "Suggested By" + }, + "keyword": { + "type": "string", + "description": "The keyword.", + "title": "Keyword" + }, + "labels": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The labels.", + "title": "Labels" + } + }, + "required": [ + "title", + "suggestedBy" + ] + } + } + ] + } + }, + "/idea/assign": { + "post": { + "responses": { + "200": { + "description": "default", + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "description": "Whether a success.", + "title": "Success" + }, + "message": { + "type": "string", + "description": "The message.", + "title": "Message" + } + } + } + } + }, + "summary": "Assign idea", + "description": "Create a project from an idea.", + "operationId": "IdeaAssignPost", + "parameters": [ + { + "name": "body", + "in": "body", + "required": false, + "schema": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier.", + "title": "ID" + }, + "assignTo": { + "type": "string", + "description": "The assign to.", + "title": "Assign To" + }, + "publishOn": { + "type": "string", + "description": "The publish on.", + "title": "Publish On" + }, + "approvers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The approvers.", + "title": "Approvers" + } + }, + "required": [ + "id", + "publishOn", + "assignTo" + ] + } + } + ] + } + } + }, + "definitions": {}, + "parameters": {}, + "responses": {}, + "securityDefinitions": { + "API Key": { + "type": "apiKey", + "in": "header", + "name": "api-key" + } + }, + "security": [ + { + "API Key": [] + } + ], + "tags": [], + "x-ms-connector-metadata": [ + { + "propertyName": "Website", + "propertyValue": "https://letterdrop.com/" + }, + { + "propertyName": "Privacy policy", + "propertyValue": "https://letterdrop.com/privacy" + }, + { + "propertyName": "Categories", + "propertyValue": "Marketing;AI" + } + ] +} \ No newline at end of file diff --git a/independent-publisher-connectors/Letterdrop/apiProperties.json b/independent-publisher-connectors/Letterdrop/apiProperties.json new file mode 100644 index 000000000..aa7d8f194 --- /dev/null +++ b/independent-publisher-connectors/Letterdrop/apiProperties.json @@ -0,0 +1,23 @@ +{ + "properties": { + "connectionParameters": { + "api_key": { + "type": "securestring", + "uiDefinition": { + "displayName": "API Key", + "description": "The API Key for this api", + "tooltip": "Provide your API Key", + "constraints": { + "tabIndex": 2, + "clearText": false, + "required": "true" + } + } + } + }, + "iconBrandColor": "#da3b01", + "capabilities": [], + "publisher": "Troy Taylor", + "stackOwner": "Letterdrop" + } +} \ No newline at end of file diff --git a/independent-publisher-connectors/Letterdrop/readme.md b/independent-publisher-connectors/Letterdrop/readme.md new file mode 100644 index 000000000..ace62c6bd --- /dev/null +++ b/independent-publisher-connectors/Letterdrop/readme.md @@ -0,0 +1,31 @@ +# Letterdrop +Letterdrop is the only SEO tool that optimizes for people-first content. Beyond SEO, it's actually a complete content marketing suite designed to help you go from idea to publish as quickly as possible while following best practices. This includes project management, social distribution, and repurposing content. + +## Publisher: Troy Taylor, Hitachi Solutions + +## Prerequisites +You must create an account with [Letterdrop](https://app.letterdrop.com/login). + +## Obtaining Credentials +Once logged in to your workspace, you can find your API key on the Integrations page under the Settings menu. + +## Supported Operations +### Add subscriber +Add a subscriber to your publication. +### Remove subscriber +Remove a subscriber from your publication. +### Get posts +Retrieve a summary of all your posts to be displayed on your home page. +### Get post +Retrieve a single post. +### Draft post +Drafts a post. +### Get project +Retrieve the details for a project. +### Create idea +Creates a new idea. +### Assign idea +Create a project from an idea. + +## Known Issues and Limitations +There are no known issues at this time.