mirror of
https://github.com/versia-pub/server.git
synced 2025-12-06 00:18:19 +01:00
ActivityPub work
This commit is contained in:
parent
a9fb39f764
commit
e05dca9fc1
|
|
@ -76,3 +76,44 @@ export const emojiToLysand = (emoji: Emoji): LysandEmoji => {
|
|||
alt: emoji.alt || undefined,
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts the emoji to an ActivityPub object.
|
||||
* @returns The ActivityPub object.
|
||||
*/
|
||||
export const emojiToActivityPub = (emoji: Emoji): any => {
|
||||
// replace any with your ActivityPub Emoji type
|
||||
return {
|
||||
type: "Emoji",
|
||||
name: `:${emoji.shortcode}:`,
|
||||
updated: new Date().toISOString(),
|
||||
icon: {
|
||||
type: "Image",
|
||||
url: emoji.url,
|
||||
mediaType: emoji.content_type,
|
||||
alt: emoji.alt || undefined,
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export const addAPEmojiIfNotExists = async (apEmoji: any) => {
|
||||
// replace any with your ActivityPub Emoji type
|
||||
const existingEmoji = await client.emoji.findFirst({
|
||||
where: {
|
||||
shortcode: apEmoji.name.replace(/:/g, ""),
|
||||
instance: null,
|
||||
},
|
||||
});
|
||||
|
||||
if (existingEmoji) return existingEmoji;
|
||||
|
||||
return await client.emoji.create({
|
||||
data: {
|
||||
shortcode: apEmoji.name.replace(/:/g, ""),
|
||||
url: apEmoji.icon.url,
|
||||
alt: apEmoji.icon.alt || null,
|
||||
content_type: apEmoji.icon.mediaType,
|
||||
visible_in_picker: true,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -612,6 +612,53 @@ export const statusToAPI = async (
|
|||
};
|
||||
};
|
||||
|
||||
export const statusToActivityPub = async (
|
||||
status: StatusWithRelations,
|
||||
user?: UserWithRelations
|
||||
): Promise<any> => {
|
||||
// replace any with your ActivityPub type
|
||||
return {
|
||||
"@context": [
|
||||
"https://www.w3.org/ns/activitystreams",
|
||||
"https://mastodon.social/schemas/litepub-0.1.jsonld",
|
||||
],
|
||||
id: `${config.http.base_url}/users/${status.authorId}/statuses/${status.id}`,
|
||||
type: "Note",
|
||||
summary: status.spoilerText,
|
||||
content: status.content,
|
||||
published: new Date(status.createdAt).toISOString(),
|
||||
url: `${config.http.base_url}/users/${status.authorId}/statuses/${status.id}`,
|
||||
attributedTo: `${config.http.base_url}/users/${status.authorId}`,
|
||||
to: ["https://www.w3.org/ns/activitystreams#Public"],
|
||||
cc: [], // add recipients here
|
||||
sensitive: status.sensitive,
|
||||
attachment: (status.attachments ?? []).map(
|
||||
a => attachmentToActivityPub(a) as ActivityPubAttachment // replace with your function
|
||||
),
|
||||
tag: [], // add tags here
|
||||
replies: {
|
||||
id: `${config.http.base_url}/users/${status.authorId}/statuses/${status.id}/replies`,
|
||||
type: "Collection",
|
||||
totalItems: status._count.replies,
|
||||
},
|
||||
likes: {
|
||||
id: `${config.http.base_url}/users/${status.authorId}/statuses/${status.id}/likes`,
|
||||
type: "Collection",
|
||||
totalItems: status._count.likes,
|
||||
},
|
||||
shares: {
|
||||
id: `${config.http.base_url}/users/${status.authorId}/statuses/${status.id}/shares`,
|
||||
type: "Collection",
|
||||
totalItems: status._count.reblogs,
|
||||
},
|
||||
inReplyTo: status.inReplyToPostId
|
||||
? `${config.http.base_url}/users/${status.inReplyToPost?.authorId}/statuses/${status.inReplyToPostId}`
|
||||
: null,
|
||||
visibility: "public", // adjust as needed
|
||||
// add more fields as needed
|
||||
};
|
||||
};
|
||||
|
||||
export const statusToLysand = (status: StatusWithRelations): Note => {
|
||||
return {
|
||||
type: "Note",
|
||||
|
|
|
|||
141
types/activitypub.ts
Normal file
141
types/activitypub.ts
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
export type APActivityPubContext =
|
||||
| "https://www.w3.org/ns/activitystreams"
|
||||
| {
|
||||
ostatus: string;
|
||||
atomUri: string;
|
||||
inReplyToAtomUri: string;
|
||||
conversation: string;
|
||||
sensitive: string;
|
||||
toot: string;
|
||||
votersCount: string;
|
||||
litepub: string;
|
||||
directMessage: string;
|
||||
};
|
||||
|
||||
export interface APActivityPubObject {
|
||||
id: string;
|
||||
type: string;
|
||||
summary?: string;
|
||||
inReplyTo?: string;
|
||||
published: string;
|
||||
url: string;
|
||||
attributedTo: string;
|
||||
to: string[];
|
||||
cc: string[];
|
||||
sensitive?: boolean;
|
||||
atomUri: string;
|
||||
inReplyToAtomUri?: string;
|
||||
conversation: string;
|
||||
content: string;
|
||||
contentMap: Record<string, string>;
|
||||
attachment: APActivityPubAttachment[];
|
||||
tag: APTag[];
|
||||
context?: string;
|
||||
quoteUri?: string;
|
||||
quoteUrl?: string;
|
||||
source?: {
|
||||
content: string;
|
||||
mediaType: string;
|
||||
};
|
||||
}
|
||||
|
||||
export interface APActivityPubAttachment {
|
||||
type?: string;
|
||||
mediaType?: string;
|
||||
url?: string;
|
||||
name?: string;
|
||||
}
|
||||
|
||||
export interface APActivityPubCollection {
|
||||
id: string;
|
||||
type: string;
|
||||
first?: {
|
||||
type: string;
|
||||
next: string;
|
||||
partOf: string;
|
||||
items: any[]; // replace any with your item type
|
||||
};
|
||||
}
|
||||
|
||||
export interface APActivityPubNote extends APActivityPubObject {
|
||||
type: "Note";
|
||||
}
|
||||
|
||||
export interface APActivityPubActivity {
|
||||
"@context": APActivityPubContext[];
|
||||
id: string;
|
||||
type: string;
|
||||
actor: string;
|
||||
published: string;
|
||||
to: string[];
|
||||
cc: string[];
|
||||
object: APActivityPubNote;
|
||||
}
|
||||
|
||||
export type APActorContext =
|
||||
| "https://www.w3.org/ns/activitystreams"
|
||||
| "https://w3id.org/security/v1"
|
||||
| Record<
|
||||
string,
|
||||
| string
|
||||
| { "@id": string; "@type": string }
|
||||
| { "@container": string; "@id": string }
|
||||
>;
|
||||
|
||||
export interface APActorPublicKey {
|
||||
id: string;
|
||||
owner: string;
|
||||
publicKeyPem: string;
|
||||
}
|
||||
|
||||
export interface APActorEndpoints {
|
||||
sharedInbox: string;
|
||||
}
|
||||
|
||||
export interface APActorIcon {
|
||||
type: string;
|
||||
mediaType: string;
|
||||
url: string;
|
||||
}
|
||||
|
||||
export interface APActor {
|
||||
"@context": APActorContext[];
|
||||
id: string;
|
||||
type: string;
|
||||
following: string;
|
||||
followers: string;
|
||||
inbox: string;
|
||||
outbox: string;
|
||||
featured: string;
|
||||
featuredTags: string;
|
||||
preferredUsername: string;
|
||||
name: string;
|
||||
summary: string;
|
||||
url: string;
|
||||
manuallyApprovesFollowers: boolean;
|
||||
discoverable: boolean;
|
||||
indexable: boolean;
|
||||
published: string;
|
||||
memorial: boolean;
|
||||
devices: string;
|
||||
publicKey: APActorPublicKey;
|
||||
tag: APTag[];
|
||||
attachment: APAttachment[];
|
||||
endpoints: APActorEndpoints;
|
||||
icon: APActorIcon;
|
||||
}
|
||||
|
||||
export interface APTag {
|
||||
type: string;
|
||||
href: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface APAttachment {
|
||||
type: string;
|
||||
mediaType: string;
|
||||
url: string;
|
||||
name?: string;
|
||||
blurhash?: string;
|
||||
description?: string;
|
||||
}
|
||||
Loading…
Reference in a new issue