@muench-dev/n8n-nodes-bluesky 2.9.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/nodes/Bluesky/V2/BlueskyTestNode.node.js +1 -0
- package/dist/nodes/Bluesky/V2/BlueskyTestNode.node.js.map +1 -1
- package/dist/nodes/Bluesky/V2/BlueskyV2.node.d.ts +1 -1
- package/dist/nodes/Bluesky/V2/BlueskyV2.node.js +95 -82
- package/dist/nodes/Bluesky/V2/BlueskyV2.node.js.map +1 -1
- package/dist/nodes/Bluesky/V2/__tests__/feedOperations.test.d.ts +1 -0
- package/dist/nodes/Bluesky/V2/__tests__/feedOperations.test.js +189 -0
- package/dist/nodes/Bluesky/V2/__tests__/feedOperations.test.js.map +1 -0
- package/dist/nodes/Bluesky/V2/__tests__/postOperations.test.d.ts +1 -0
- package/dist/nodes/Bluesky/V2/__tests__/postOperations.test.js +88 -0
- package/dist/nodes/Bluesky/V2/__tests__/postOperations.test.js.map +1 -0
- package/dist/nodes/Bluesky/V2/__tests__/userOperations.test.d.ts +1 -0
- package/dist/nodes/Bluesky/V2/__tests__/userOperations.test.js +212 -0
- package/dist/nodes/Bluesky/V2/__tests__/userOperations.test.js.map +1 -0
- package/dist/nodes/Bluesky/V2/feedOperations.d.ts +46 -1
- package/dist/nodes/Bluesky/V2/feedOperations.js +104 -63
- package/dist/nodes/Bluesky/V2/feedOperations.js.map +1 -1
- package/dist/nodes/Bluesky/V2/postOperations.js +46 -18
- package/dist/nodes/Bluesky/V2/postOperations.js.map +1 -1
- package/dist/package.json +4 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postOperations.test.js","sourceRoot":"","sources":["../../../../../nodes/Bluesky/V2/__tests__/postOperations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const api_1 = require("@atproto/api");
|
|
4
|
+
const userOperations_1 = require("../userOperations");
|
|
5
|
+
jest.mock('@atproto/api');
|
|
6
|
+
const mockMute = jest.fn();
|
|
7
|
+
const mockUnmute = jest.fn();
|
|
8
|
+
const mockGetProfile = jest.fn();
|
|
9
|
+
const mockBlockCreate = jest.fn();
|
|
10
|
+
const mockBlockDelete = jest.fn();
|
|
11
|
+
const MockedAtpAgent = api_1.AtpAgent;
|
|
12
|
+
MockedAtpAgent.mockImplementation(() => {
|
|
13
|
+
return {
|
|
14
|
+
mute: mockMute,
|
|
15
|
+
unmute: mockUnmute,
|
|
16
|
+
getProfile: mockGetProfile,
|
|
17
|
+
api: {
|
|
18
|
+
app: {
|
|
19
|
+
bsky: {
|
|
20
|
+
graph: {
|
|
21
|
+
block: {
|
|
22
|
+
create: mockBlockCreate,
|
|
23
|
+
delete: mockBlockDelete,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
describe('UserOperations', () => {
|
|
32
|
+
let agent;
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
agent = new MockedAtpAgent({ service: 'https://bsky.social' });
|
|
35
|
+
agent.mute.mockImplementation(mockMute);
|
|
36
|
+
agent.unmute.mockImplementation(mockUnmute);
|
|
37
|
+
agent.getProfile.mockImplementation(mockGetProfile);
|
|
38
|
+
agent.api.app.bsky.graph.block.create.mockImplementation(mockBlockCreate);
|
|
39
|
+
agent.api.app.bsky.graph.block.delete.mockImplementation(mockBlockDelete);
|
|
40
|
+
mockMute.mockClear();
|
|
41
|
+
mockUnmute.mockClear();
|
|
42
|
+
mockGetProfile.mockClear();
|
|
43
|
+
mockBlockCreate.mockClear();
|
|
44
|
+
mockBlockDelete.mockClear();
|
|
45
|
+
MockedAtpAgent.mockClear();
|
|
46
|
+
MockedAtpAgent.mockImplementation(() => {
|
|
47
|
+
return {
|
|
48
|
+
mute: mockMute,
|
|
49
|
+
unmute: mockUnmute,
|
|
50
|
+
getProfile: mockGetProfile,
|
|
51
|
+
api: {
|
|
52
|
+
app: {
|
|
53
|
+
bsky: {
|
|
54
|
+
graph: {
|
|
55
|
+
block: {
|
|
56
|
+
create: mockBlockCreate,
|
|
57
|
+
delete: mockBlockDelete,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('muteOperation', () => {
|
|
67
|
+
const actorDid = 'did:plc:testuser';
|
|
68
|
+
it('should call agent.mute with correct parameters and return data on success', async () => {
|
|
69
|
+
const mockSuccessResponse = { success: true, headers: {} };
|
|
70
|
+
mockMute.mockResolvedValue(mockSuccessResponse);
|
|
71
|
+
const result = await (0, userOperations_1.muteOperation)(agent, actorDid);
|
|
72
|
+
expect(mockMute).toHaveBeenCalledTimes(1);
|
|
73
|
+
expect(mockMute).toHaveBeenCalledWith(actorDid);
|
|
74
|
+
expect(result).toEqual(true);
|
|
75
|
+
});
|
|
76
|
+
it('should throw an error if agent.mute fails', async () => {
|
|
77
|
+
const errorMessage = 'Failed to mute user';
|
|
78
|
+
const mockErrorResponse = { success: false, error: 'NetworkError', message: errorMessage };
|
|
79
|
+
mockMute.mockResolvedValue(mockErrorResponse);
|
|
80
|
+
await expect((0, userOperations_1.muteOperation)(agent, actorDid))
|
|
81
|
+
.rejects
|
|
82
|
+
.toThrow(`Failed to mute user ${actorDid}: NetworkError - ${errorMessage}`);
|
|
83
|
+
expect(mockMute).toHaveBeenCalledTimes(1);
|
|
84
|
+
expect(mockMute).toHaveBeenCalledWith(actorDid);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('unmuteOperation', () => {
|
|
88
|
+
const actorDid = 'did:plc:testuser';
|
|
89
|
+
it('should call agent.unmute with correct parameters and return data on success', async () => {
|
|
90
|
+
const mockSuccessResponse = { success: true, headers: {} };
|
|
91
|
+
mockUnmute.mockResolvedValue(mockSuccessResponse);
|
|
92
|
+
const result = await (0, userOperations_1.unmuteOperation)(agent, actorDid);
|
|
93
|
+
expect(mockUnmute).toHaveBeenCalledTimes(1);
|
|
94
|
+
expect(mockUnmute).toHaveBeenCalledWith(actorDid);
|
|
95
|
+
expect(result).toEqual(true);
|
|
96
|
+
});
|
|
97
|
+
it('should throw an error if agent.unmute fails', async () => {
|
|
98
|
+
const errorMessage = 'Failed to unmute user';
|
|
99
|
+
const mockErrorResponse = { success: false, error: 'UpstreamFailure', message: errorMessage };
|
|
100
|
+
mockUnmute.mockResolvedValue(mockErrorResponse);
|
|
101
|
+
await expect((0, userOperations_1.unmuteOperation)(agent, actorDid))
|
|
102
|
+
.rejects
|
|
103
|
+
.toThrow(`Failed to unmute user ${actorDid}: UpstreamFailure - ${errorMessage}`);
|
|
104
|
+
expect(mockUnmute).toHaveBeenCalledTimes(1);
|
|
105
|
+
expect(mockUnmute).toHaveBeenCalledWith(actorDid);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe('getProfileOperation', () => {
|
|
109
|
+
const actorDid = 'did:plc:testuser';
|
|
110
|
+
const sampleProfileData = {
|
|
111
|
+
$type: 'app.bsky.actor.defs#profileViewDetailed',
|
|
112
|
+
did: actorDid,
|
|
113
|
+
handle: 'testuser.bsky.social',
|
|
114
|
+
displayName: 'Test User',
|
|
115
|
+
description: 'This is a test user profile.',
|
|
116
|
+
avatar: 'https://example.com/avatar.jpg',
|
|
117
|
+
banner: 'https://example.com/banner.jpg',
|
|
118
|
+
followersCount: 100,
|
|
119
|
+
followsCount: 50,
|
|
120
|
+
postsCount: 10,
|
|
121
|
+
indexedAt: new Date().toISOString(),
|
|
122
|
+
viewer: {
|
|
123
|
+
muted: false,
|
|
124
|
+
blockedBy: false,
|
|
125
|
+
},
|
|
126
|
+
labels: [],
|
|
127
|
+
};
|
|
128
|
+
it('should call agent.getProfile with correct parameters and return profile data on success', async () => {
|
|
129
|
+
const mockSuccessResponse = { success: true, data: sampleProfileData, headers: {} };
|
|
130
|
+
mockGetProfile.mockResolvedValue(mockSuccessResponse);
|
|
131
|
+
const result = await (0, userOperations_1.getProfileOperation)(agent, actorDid);
|
|
132
|
+
expect(mockGetProfile).toHaveBeenCalledTimes(1);
|
|
133
|
+
expect(mockGetProfile).toHaveBeenCalledWith({ actor: actorDid });
|
|
134
|
+
expect(result).toEqual(sampleProfileData);
|
|
135
|
+
});
|
|
136
|
+
it('should throw an error if agent.getProfile fails', async () => {
|
|
137
|
+
const errorMessage = 'Profile not found';
|
|
138
|
+
const mockErrorResponse = { success: false, error: 'NotFound', message: errorMessage };
|
|
139
|
+
mockGetProfile.mockResolvedValue(mockErrorResponse);
|
|
140
|
+
await expect((0, userOperations_1.getProfileOperation)(agent, actorDid))
|
|
141
|
+
.rejects
|
|
142
|
+
.toThrow(`Failed to get profile for ${actorDid}: NotFound - ${errorMessage}`);
|
|
143
|
+
expect(mockGetProfile).toHaveBeenCalledTimes(1);
|
|
144
|
+
expect(mockGetProfile).toHaveBeenCalledWith({ actor: actorDid });
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe('blockOperation', () => {
|
|
148
|
+
const subjectDid = 'did:plc:targetuser';
|
|
149
|
+
const mockRepo = 'did:plc:selfuser';
|
|
150
|
+
const expectedBlockUri = `at://${mockRepo}/app.bsky.graph.block/self`;
|
|
151
|
+
beforeEach(() => {
|
|
152
|
+
agent.session = { did: mockRepo };
|
|
153
|
+
});
|
|
154
|
+
it('should call agent.api.app.bsky.graph.block.create with correct parameters and return URI on success', async () => {
|
|
155
|
+
const mockSuccessResponse = {
|
|
156
|
+
success: true,
|
|
157
|
+
data: { uri: expectedBlockUri, cid: 'sampleCid' },
|
|
158
|
+
headers: {},
|
|
159
|
+
};
|
|
160
|
+
mockBlockCreate.mockResolvedValue(mockSuccessResponse);
|
|
161
|
+
const result = await (0, userOperations_1.blockOperation)(agent, subjectDid);
|
|
162
|
+
expect(mockBlockCreate).toHaveBeenCalledTimes(1);
|
|
163
|
+
expect(mockBlockCreate).toHaveBeenCalledWith({ repo: mockRepo }, { subject: subjectDid, createdAt: expect.any(String), $type: 'app.bsky.graph.block' });
|
|
164
|
+
expect(result).toEqual({ uri: expectedBlockUri });
|
|
165
|
+
});
|
|
166
|
+
it('should throw an error if agent.api.app.bsky.graph.block.create fails', async () => {
|
|
167
|
+
const errorMessage = 'Failed to create block';
|
|
168
|
+
const mockErrorResponse = { success: false, error: 'Forbidden', message: errorMessage };
|
|
169
|
+
mockBlockCreate.mockResolvedValue(mockErrorResponse);
|
|
170
|
+
await expect((0, userOperations_1.blockOperation)(agent, subjectDid))
|
|
171
|
+
.rejects
|
|
172
|
+
.toThrow(`Failed to block user ${subjectDid}: Forbidden - ${errorMessage}`);
|
|
173
|
+
expect(mockBlockCreate).toHaveBeenCalledTimes(1);
|
|
174
|
+
expect(mockBlockCreate).toHaveBeenCalledWith({ repo: mockRepo }, { subject: subjectDid, createdAt: expect.any(String), $type: 'app.bsky.graph.block' });
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
describe('unblockOperation', () => {
|
|
178
|
+
const mockRepo = 'did:plc:selfuser';
|
|
179
|
+
const recordRkey = 'self';
|
|
180
|
+
const blockUriToDelete = `at://${mockRepo}/app.bsky.graph.block/${recordRkey}`;
|
|
181
|
+
beforeEach(() => {
|
|
182
|
+
agent.session = { did: mockRepo };
|
|
183
|
+
});
|
|
184
|
+
it('should call agent.api.app.bsky.graph.block.delete with correct parameters and return original URI on success', async () => {
|
|
185
|
+
const mockSuccessResponse = { success: true, headers: {} };
|
|
186
|
+
mockBlockDelete.mockResolvedValue(mockSuccessResponse);
|
|
187
|
+
const result = await (0, userOperations_1.unblockOperation)(agent, blockUriToDelete);
|
|
188
|
+
expect(mockBlockDelete).toHaveBeenCalledTimes(1);
|
|
189
|
+
expect(mockBlockDelete).toHaveBeenCalledWith({
|
|
190
|
+
repo: mockRepo,
|
|
191
|
+
collection: 'app.bsky.graph.block',
|
|
192
|
+
rkey: recordRkey,
|
|
193
|
+
});
|
|
194
|
+
expect(result).toEqual({ success: true, uri: blockUriToDelete });
|
|
195
|
+
});
|
|
196
|
+
it('should throw an error if agent.api.app.bsky.graph.block.delete fails', async () => {
|
|
197
|
+
const errorMessage = 'Failed to delete block';
|
|
198
|
+
const mockErrorResponse = { success: false, error: 'NotFound', message: errorMessage };
|
|
199
|
+
mockBlockDelete.mockResolvedValue(mockErrorResponse);
|
|
200
|
+
await expect((0, userOperations_1.unblockOperation)(agent, blockUriToDelete))
|
|
201
|
+
.rejects
|
|
202
|
+
.toThrow(`Failed to unblock user via record ${blockUriToDelete}: NotFound - ${errorMessage}`);
|
|
203
|
+
expect(mockBlockDelete).toHaveBeenCalledTimes(1);
|
|
204
|
+
expect(mockBlockDelete).toHaveBeenCalledWith({
|
|
205
|
+
repo: mockRepo,
|
|
206
|
+
collection: 'app.bsky.graph.block',
|
|
207
|
+
rkey: recordRkey,
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=userOperations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userOperations.test.js","sourceRoot":"","sources":["../../../../../nodes/Bluesky/V2/__tests__/userOperations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,50 @@
|
|
|
1
|
-
import { AtpAgent } from '@atproto/api';
|
|
1
|
+
import { AppBskyFeedDefs, AppBskyFeedGetAuthorFeed, AppBskyFeedGetTimeline, AtpAgent, ComAtprotoLabelDefs, AppBskyActorDefs } from '@atproto/api';
|
|
2
2
|
import { INodeExecutionData, INodeProperties } from 'n8n-workflow';
|
|
3
|
+
export interface OutputPost {
|
|
4
|
+
uri: string;
|
|
5
|
+
cid: string;
|
|
6
|
+
author: {
|
|
7
|
+
did: string;
|
|
8
|
+
handle: string;
|
|
9
|
+
displayName?: string;
|
|
10
|
+
avatar?: string;
|
|
11
|
+
viewer?: AppBskyActorDefs.ViewerState;
|
|
12
|
+
labels?: ComAtprotoLabelDefs.Label[];
|
|
13
|
+
};
|
|
14
|
+
record: {
|
|
15
|
+
text?: string;
|
|
16
|
+
createdAt: string;
|
|
17
|
+
[key: string]: any;
|
|
18
|
+
};
|
|
19
|
+
embed?: AppBskyFeedDefs.PostView['embed'];
|
|
20
|
+
replyCount?: number;
|
|
21
|
+
repostCount?: number;
|
|
22
|
+
likeCount?: number;
|
|
23
|
+
indexedAt: string;
|
|
24
|
+
viewer?: AppBskyFeedDefs.ViewerState;
|
|
25
|
+
labels?: ComAtprotoLabelDefs.Label[];
|
|
26
|
+
replyParent?: {
|
|
27
|
+
uri: string;
|
|
28
|
+
cid: string;
|
|
29
|
+
authorDid?: string;
|
|
30
|
+
} | null;
|
|
31
|
+
repostedBy?: {
|
|
32
|
+
did: string;
|
|
33
|
+
handle: string;
|
|
34
|
+
displayName?: string;
|
|
35
|
+
avatar?: string;
|
|
36
|
+
viewer?: AppBskyActorDefs.ViewerState;
|
|
37
|
+
labels?: ComAtprotoLabelDefs.Label[];
|
|
38
|
+
};
|
|
39
|
+
feedContext?: string | {
|
|
40
|
+
text: string;
|
|
41
|
+
facets?: any[];
|
|
42
|
+
};
|
|
43
|
+
[key: string]: any;
|
|
44
|
+
}
|
|
45
|
+
export declare function mapFeedViewPostToOutputPost(feedViewPost: AppBskyFeedDefs.FeedViewPost): OutputPost;
|
|
46
|
+
export declare function _getAuthorFeedInternal(agent: AtpAgent, params: AppBskyFeedGetAuthorFeed.QueryParams): Promise<OutputPost[]>;
|
|
47
|
+
export declare function _getTimelineInternal(agent: AtpAgent, params: AppBskyFeedGetTimeline.QueryParams): Promise<OutputPost[]>;
|
|
3
48
|
export declare const feedProperties: INodeProperties[];
|
|
4
49
|
export declare function getAuthorFeed(agent: AtpAgent, actor: string, limit: number): Promise<INodeExecutionData[]>;
|
|
5
50
|
export declare function getTimeline(agent: AtpAgent, limit: number): Promise<INodeExecutionData[]>;
|
|
@@ -1,32 +1,112 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.feedProperties = void 0;
|
|
4
|
+
exports.mapFeedViewPostToOutputPost = mapFeedViewPostToOutputPost;
|
|
5
|
+
exports._getAuthorFeedInternal = _getAuthorFeedInternal;
|
|
6
|
+
exports._getTimelineInternal = _getTimelineInternal;
|
|
4
7
|
exports.getAuthorFeed = getAuthorFeed;
|
|
5
8
|
exports.getTimeline = getTimeline;
|
|
9
|
+
const api_1 = require("@atproto/api");
|
|
10
|
+
function mapFeedViewPostToOutputPost(feedViewPost) {
|
|
11
|
+
var _a, _b;
|
|
12
|
+
const post = feedViewPost.post;
|
|
13
|
+
const outputPost = {
|
|
14
|
+
uri: post.uri,
|
|
15
|
+
cid: post.cid,
|
|
16
|
+
author: {
|
|
17
|
+
did: post.author.did,
|
|
18
|
+
handle: post.author.handle,
|
|
19
|
+
displayName: post.author.displayName,
|
|
20
|
+
avatar: post.author.avatar,
|
|
21
|
+
viewer: post.author.viewer,
|
|
22
|
+
labels: post.author.labels,
|
|
23
|
+
},
|
|
24
|
+
record: {
|
|
25
|
+
text: (_a = post.record) === null || _a === void 0 ? void 0 : _a.text,
|
|
26
|
+
createdAt: (_b = post.record) === null || _b === void 0 ? void 0 : _b.createdAt,
|
|
27
|
+
...post.record,
|
|
28
|
+
},
|
|
29
|
+
embed: post.embed,
|
|
30
|
+
replyCount: post.replyCount,
|
|
31
|
+
repostCount: post.repostCount,
|
|
32
|
+
likeCount: post.likeCount,
|
|
33
|
+
indexedAt: post.indexedAt,
|
|
34
|
+
viewer: post.viewer,
|
|
35
|
+
labels: post.labels,
|
|
36
|
+
replyParent: null,
|
|
37
|
+
};
|
|
38
|
+
if (feedViewPost.reply) {
|
|
39
|
+
const parent = feedViewPost.reply.parent;
|
|
40
|
+
if (api_1.AppBskyFeedDefs.isPostView(parent)) {
|
|
41
|
+
outputPost.replyParent = {
|
|
42
|
+
uri: parent.uri,
|
|
43
|
+
cid: parent.cid,
|
|
44
|
+
authorDid: parent.author.did,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
else if (api_1.AppBskyFeedDefs.isNotFoundPost(parent)) {
|
|
48
|
+
outputPost.replyParent = { uri: parent.uri, cid: 'not_found_cid', authorDid: 'not_found_author' };
|
|
49
|
+
}
|
|
50
|
+
else if (api_1.AppBskyFeedDefs.isBlockedPost(parent)) {
|
|
51
|
+
outputPost.replyParent = { uri: parent.uri, cid: 'blocked_cid', authorDid: 'blocked_author' };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (feedViewPost.reason && api_1.AppBskyFeedDefs.isReasonRepost(feedViewPost.reason)) {
|
|
55
|
+
const reposter = feedViewPost.reason.by;
|
|
56
|
+
outputPost.repostedBy = {
|
|
57
|
+
did: reposter.did,
|
|
58
|
+
handle: reposter.handle,
|
|
59
|
+
displayName: reposter.displayName,
|
|
60
|
+
avatar: reposter.avatar,
|
|
61
|
+
viewer: reposter.viewer,
|
|
62
|
+
labels: reposter.labels,
|
|
63
|
+
};
|
|
64
|
+
outputPost.feedContext = `Reposted by @${reposter.handle}`;
|
|
65
|
+
}
|
|
66
|
+
if (feedViewPost.feedContext) {
|
|
67
|
+
if (typeof outputPost.feedContext === 'string' && typeof feedViewPost.feedContext === 'string') {
|
|
68
|
+
outputPost.feedContext = `${outputPost.feedContext}; ${feedViewPost.feedContext}`;
|
|
69
|
+
}
|
|
70
|
+
else if (!outputPost.feedContext) {
|
|
71
|
+
outputPost.feedContext = feedViewPost.feedContext;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return outputPost;
|
|
75
|
+
}
|
|
76
|
+
async function _getAuthorFeedInternal(agent, params) {
|
|
77
|
+
const response = await agent.getAuthorFeed(params);
|
|
78
|
+
if (!response.success) {
|
|
79
|
+
if ('error' in response && 'message' in response) {
|
|
80
|
+
throw new Error(`Failed to fetch author feed: ${response.error} - ${response.message}`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
throw new Error('Failed to fetch author feed due to an unknown error structure.');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return response.data.feed.map((item) => mapFeedViewPostToOutputPost(item));
|
|
87
|
+
}
|
|
88
|
+
async function _getTimelineInternal(agent, params) {
|
|
89
|
+
const response = await agent.getTimeline(params);
|
|
90
|
+
if (!response.success) {
|
|
91
|
+
if ('error' in response && 'message' in response) {
|
|
92
|
+
throw new Error(`Failed to fetch timeline: ${response.error} - ${response.message}`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
throw new Error('Failed to fetch timeline due to an unknown error structure.');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return response.data.feed.map((item) => mapFeedViewPostToOutputPost(item));
|
|
99
|
+
}
|
|
6
100
|
exports.feedProperties = [
|
|
7
101
|
{
|
|
8
102
|
displayName: 'Operation',
|
|
9
103
|
name: 'operation',
|
|
10
104
|
type: 'options',
|
|
11
105
|
noDataExpression: true,
|
|
12
|
-
displayOptions: {
|
|
13
|
-
show: {
|
|
14
|
-
resource: ['feed'],
|
|
15
|
-
},
|
|
16
|
-
},
|
|
106
|
+
displayOptions: { show: { resource: ['feed'] } },
|
|
17
107
|
options: [
|
|
18
|
-
{
|
|
19
|
-
|
|
20
|
-
value: 'getAuthorFeed',
|
|
21
|
-
description: 'Author feeds return posts by a single user',
|
|
22
|
-
action: 'Retrieve feed with posts by a single user',
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
name: 'Timeline',
|
|
26
|
-
value: 'getTimeline',
|
|
27
|
-
description: 'The default chronological feed of posts from users the authenticated user follows',
|
|
28
|
-
action: 'Retrieve user timeline',
|
|
29
|
-
},
|
|
108
|
+
{ name: 'Get Author Feed', value: 'getAuthorFeed', description: 'Author feeds return posts by a single user', action: 'Retrieve feed with posts by a single user' },
|
|
109
|
+
{ name: 'Timeline', value: 'getTimeline', description: 'The default chronological feed of posts from users the authenticated user follows', action: 'Retrieve user timeline' },
|
|
30
110
|
],
|
|
31
111
|
default: 'getAuthorFeed',
|
|
32
112
|
},
|
|
@@ -38,64 +118,25 @@ exports.feedProperties = [
|
|
|
38
118
|
required: true,
|
|
39
119
|
description: "The DID of the author whose posts you'd like to fetch",
|
|
40
120
|
hint: 'The user getProfile operation can be used to get the DID of a user',
|
|
41
|
-
displayOptions: {
|
|
42
|
-
show: {
|
|
43
|
-
resource: ['feed'],
|
|
44
|
-
operation: ['getAuthorFeed'],
|
|
45
|
-
},
|
|
46
|
-
},
|
|
121
|
+
displayOptions: { show: { resource: ['feed'], operation: ['getAuthorFeed'] } },
|
|
47
122
|
},
|
|
48
123
|
{
|
|
49
124
|
displayName: 'Limit',
|
|
50
125
|
name: 'limit',
|
|
51
126
|
type: 'number',
|
|
52
|
-
typeOptions: {
|
|
53
|
-
minValue: 1,
|
|
54
|
-
},
|
|
127
|
+
typeOptions: { minValue: 1 },
|
|
55
128
|
default: 50,
|
|
56
129
|
required: true,
|
|
57
130
|
description: 'Max number of results to return',
|
|
58
|
-
displayOptions: {
|
|
59
|
-
show: {
|
|
60
|
-
resource: ['feed'],
|
|
61
|
-
operation: ['getAuthorFeed', 'getTimeline'],
|
|
62
|
-
},
|
|
63
|
-
},
|
|
131
|
+
displayOptions: { show: { resource: ['feed'], operation: ['getAuthorFeed', 'getTimeline'] } },
|
|
64
132
|
},
|
|
65
133
|
];
|
|
66
134
|
async function getAuthorFeed(agent, actor, limit) {
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
actor: actor,
|
|
70
|
-
limit: limit,
|
|
71
|
-
});
|
|
72
|
-
authorFeedResponse.data.feed.forEach((feedPost) => {
|
|
73
|
-
returnData.push({
|
|
74
|
-
json: {
|
|
75
|
-
post: feedPost.post,
|
|
76
|
-
reply: feedPost.reply,
|
|
77
|
-
reason: feedPost.reason,
|
|
78
|
-
feedContext: feedPost.feedContext,
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
return returnData;
|
|
135
|
+
const outputPosts = await _getAuthorFeedInternal(agent, { actor: actor, limit: limit });
|
|
136
|
+
return outputPosts.map((post) => ({ json: post, pairedItem: { item: 0 } }));
|
|
83
137
|
}
|
|
84
138
|
async function getTimeline(agent, limit) {
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
limit: limit,
|
|
88
|
-
});
|
|
89
|
-
timelineResponse.data.feed.forEach((feedPost) => {
|
|
90
|
-
returnData.push({
|
|
91
|
-
json: {
|
|
92
|
-
post: feedPost.post,
|
|
93
|
-
reply: feedPost.reply,
|
|
94
|
-
reason: feedPost.reason,
|
|
95
|
-
feedContext: feedPost.feedContext,
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
return returnData;
|
|
139
|
+
const outputPosts = await _getTimelineInternal(agent, { limit: limit });
|
|
140
|
+
return outputPosts.map((post) => ({ json: post, pairedItem: { item: 0 } }));
|
|
100
141
|
}
|
|
101
142
|
//# sourceMappingURL=feedOperations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedOperations.js","sourceRoot":"","sources":["../../../../nodes/Bluesky/V2/feedOperations.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"feedOperations.js","sourceRoot":"","sources":["../../../../nodes/Bluesky/V2/feedOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ exports.deleteLikeOperation = deleteLikeOperation;
|
|
|
11
11
|
exports.repostOperation = repostOperation;
|
|
12
12
|
exports.deleteRepostOperation = deleteRepostOperation;
|
|
13
13
|
const api_1 = require("@atproto/api");
|
|
14
|
+
const sharp_1 = __importDefault(require("sharp"));
|
|
14
15
|
const languages_1 = require("./languages");
|
|
15
16
|
const open_graph_scraper_1 = __importDefault(require("open-graph-scraper"));
|
|
16
17
|
exports.postProperties = [
|
|
@@ -184,43 +185,70 @@ exports.postProperties = [
|
|
|
184
185
|
},
|
|
185
186
|
},
|
|
186
187
|
];
|
|
188
|
+
async function resizeImageIfNeeded(imageBuffer, maxWidth, maxSizeBytes) {
|
|
189
|
+
if (imageBuffer.length > maxSizeBytes) {
|
|
190
|
+
try {
|
|
191
|
+
return await (0, sharp_1.default)(imageBuffer)
|
|
192
|
+
.resize({ width: maxWidth, withoutEnlargement: true, fit: 'inside' })
|
|
193
|
+
.toBuffer();
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
console.warn(`Failed to resize image: ${error.message}. Returning original image.`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return imageBuffer;
|
|
200
|
+
}
|
|
187
201
|
async function postOperation(agent, postText, langs, websiteCard) {
|
|
188
202
|
const returnData = [];
|
|
189
203
|
let rt = new api_1.RichText({ text: postText });
|
|
190
204
|
await rt.detectFacets(agent);
|
|
191
205
|
let postData = {
|
|
192
|
-
text: rt.text,
|
|
206
|
+
text: rt.text || postText,
|
|
193
207
|
langs: langs,
|
|
194
208
|
facets: rt.facets,
|
|
195
209
|
};
|
|
196
210
|
if (websiteCard === null || websiteCard === void 0 ? void 0 : websiteCard.uri) {
|
|
197
211
|
let thumbBlob = undefined;
|
|
212
|
+
const imageSizeLimit = 976.56 * 1024;
|
|
213
|
+
const maxWidth = 1000;
|
|
198
214
|
if (websiteCard.thumbnailBinary) {
|
|
215
|
+
websiteCard.thumbnailBinary = await resizeImageIfNeeded(websiteCard.thumbnailBinary, maxWidth, imageSizeLimit);
|
|
199
216
|
const uploadResponse = await agent.uploadBlob(websiteCard.thumbnailBinary, {
|
|
200
217
|
encoding: 'image/png',
|
|
201
218
|
});
|
|
202
219
|
thumbBlob = uploadResponse.data.blob;
|
|
203
220
|
}
|
|
204
221
|
if (websiteCard.fetchOpenGraphTags === true) {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
222
|
+
try {
|
|
223
|
+
const ogsResponse = await (0, open_graph_scraper_1.default)({ url: websiteCard.uri });
|
|
224
|
+
if (ogsResponse.error) {
|
|
225
|
+
console.error(`Error fetching Open Graph tags: ${ogsResponse.error}`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
if (ogsResponse.result.ogImage) {
|
|
229
|
+
const imageUrl = ogsResponse.result.ogImage[0].url;
|
|
230
|
+
const imageDataResponse = await fetch(imageUrl);
|
|
231
|
+
if (imageDataResponse.ok) {
|
|
232
|
+
const thumbBlobArrayBuffer = await imageDataResponse.arrayBuffer();
|
|
233
|
+
let thumbBuffer = Buffer.from(thumbBlobArrayBuffer);
|
|
234
|
+
thumbBuffer = await resizeImageIfNeeded(thumbBuffer, maxWidth, imageSizeLimit);
|
|
235
|
+
const { data } = await agent.uploadBlob(thumbBuffer);
|
|
236
|
+
thumbBlob = data.blob;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (ogsResponse.result.ogTitle) {
|
|
240
|
+
websiteCard.title = ogsResponse.result.ogTitle;
|
|
241
|
+
}
|
|
242
|
+
if (ogsResponse.result.ogDescription) {
|
|
243
|
+
websiteCard.description = ogsResponse.result.ogDescription;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
websiteCard.description = '';
|
|
247
|
+
}
|
|
213
248
|
}
|
|
214
|
-
const thumbBlobArrayBuffer = await imageDataResponse.arrayBuffer();
|
|
215
|
-
thumbBlob = Buffer.from(thumbBlobArrayBuffer);
|
|
216
|
-
const { data } = await agent.uploadBlob(thumbBlob);
|
|
217
|
-
thumbBlob = data.blob;
|
|
218
|
-
}
|
|
219
|
-
if (ogsResponse.result.ogTitle) {
|
|
220
|
-
websiteCard.title = ogsResponse.result.ogTitle;
|
|
221
249
|
}
|
|
222
|
-
|
|
223
|
-
websiteCard.
|
|
250
|
+
catch (err) {
|
|
251
|
+
console.error(`Failed to fetch Open Graph tags for URL '${websiteCard.uri}': ${(err === null || err === void 0 ? void 0 : err.message) || err}`);
|
|
224
252
|
}
|
|
225
253
|
}
|
|
226
254
|
postData.embed = {
|