Creating and Managing Content
In a social media app, content creation and management are crucial features. Tapestry provides powerful endpoints to handle these operations efficiently. This guide will walk you through creating, updating, and deleting posts using the socialfi package or the API directly. We recommend using the socialfi package as it's simpler and handles much of the complexity for you.
Installing and Setting Up the Socialfi Package (Recommended)
We recommend using the socialfi package for easier integration:
npm install socialfi
import { SocialFi } from 'socialfi';
const API_URL = 'https://api.usetapestry.dev/v1/'; // tapestry prod URL
// const API_URL = 'https://api.dev.usetapestry.dev/v1/'; // tapestry dev URL
const API_KEY = process.env.TAPESTRY_API_KEY; // Get your API key from https://app.usetapestry.dev/
const client = new SocialFi({
baseURL: API_URL,
apiKey: API_KEY,
});
Creating a Post
The first step in most social media apps is allowing users to create posts. This is achieved through the content creation endpoint.
Using the Socialfi Package
Here's an example of how to create a new post:
try {
const newPost = await client.contents.findOrCreateCreate(
{
apiKey: API_KEY,
},
{
profileId: 'user123',
content: 'Hello world! This is my first post on Tapestry.',
contentType: 'text',
customProperties: [
{
key: 'title',
value: 'My First Post'
},
{
key: 'url',
value: 'example.com/post1'
},
{
key: 'tags',
value: 'introduction,hello-world'
}
],
blockchain: 'SOLANA',
execution: 'FAST_UNCONFIRMED'
}
);
console.log('Post created:', newPost);
} catch (error) {
console.error('Error creating post:', error);
}
Using the API Directly
If you prefer to call the API directly:
try {
const response = await fetch('https://api.usetapestry.dev/v1/contents/create?apiKey=YOUR_API_KEY', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
profileId: 'user123',
content: 'Hello world! This is my first post on Tapestry.',
contentType: 'text',
customProperties: [
{
key: 'title',
value: 'My First Post'
},
{
key: 'url',
value: 'example.com/post1'
},
{
key: 'tags',
value: 'introduction,hello-world'
}
],
blockchain: 'SOLANA',
execution: 'FAST_UNCONFIRMED'
}),
});
const newPost = await response.json();
console.log('Post created:', newPost);
} catch (error) {
console.error('Error creating post:', error);
}
In this example:
profileId
represents the user creating the postcontent
is the main text content of the postcustomProperties
is an array of key-value pairs for additional metadatacontentType
specifies the type of content (text, image, video, etc.)
Reading Posts
To retrieve posts, you can use various methods:
Get a specific post by ID
Using Socialfi Package
try {
const post = await client.contents.getContent(
{
apiKey: API_KEY,
contentId: 'post123'
}
);
console.log('Post data:', post);
} catch (error) {
console.error('Error fetching post:', error);
}
Using the API Directly
try {
const response = await fetch(
'https://api.usetapestry.dev/v1/contents/post123?apiKey=YOUR_API_KEY'
);
const post = await response.json();
console.log('Post data:', post);
} catch (error) {
console.error('Error fetching post:', error);
}
Get posts by a specific user
Using Socialfi Package
try {
const userPosts = await client.contents.getContentsByProfile(
{
apiKey: API_KEY,
profileId: 'user123',
limit: 10,
offset: 0
}
);
console.log('User posts:', userPosts);
} catch (error) {
console.error('Error fetching user posts:', error);
}
Using the API Directly
try {
const response = await fetch(
'https://api.usetapestry.dev/v1/contents/profile/user123?apiKey=YOUR_API_KEY&limit=10&offset=0'
);
const userPosts = await response.json();
console.log('User posts:', userPosts);
} catch (error) {
console.error('Error fetching user posts:', error);
}
Updating a Post
Sometimes users may want to edit their posts. You can use the content update endpoint for this purpose:
Using Socialfi Package
try {
const updatedPost = await client.contents.updateContent(
{
apiKey: API_KEY,
},
{
id: 'post123',
content: 'Updated content: Hello, world! This is my edited post.',
customProperties: [
{
key: 'title',
value: 'My Updated Post'
},
{
key: 'edited',
value: 'true'
}
],
blockchain: 'SOLANA',
execution: 'FAST_UNCONFIRMED'
}
);
console.log('Post updated:', updatedPost);
} catch (error) {
console.error('Error updating post:', error);
}
Using the API Directly
try {
const response = await fetch('https://api.usetapestry.dev/v1/contents/update?apiKey=YOUR_API_KEY', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
id: 'post123',
content: 'Updated content: Hello, world! This is my edited post.',
customProperties: [
{
key: 'title',
value: 'My Updated Post'
},
{
key: 'edited',
value: 'true'
}
],
blockchain: 'SOLANA',
execution: 'FAST_UNCONFIRMED'
}),
});
const updatedPost = await response.json();
console.log('Post updated:', updatedPost);
} catch (error) {
console.error('Error updating post:', error);
}
Here, id
is the unique identifier of the post you want to update.
Deleting a Post
To allow users to delete their posts, use the content deletion endpoint:
Using Socialfi Package
try {
const deletionResult = await client.contents.deleteContent(
{
apiKey: API_KEY,
},
{
id: 'post123',
blockchain: 'SOLANA',
execution: 'FAST_UNCONFIRMED'
}
);
console.log('Post deleted:', deletionResult);
} catch (error) {
console.error('Error deleting post:', error);
}
Using the API Directly
try {
const response = await fetch('https://api.usetapestry.dev/v1/contents/delete?apiKey=YOUR_API_KEY', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
id: 'post123',
blockchain: 'SOLANA',
execution: 'FAST_UNCONFIRMED'
}),
});
const deletionResult = await response.json();
console.log('Post deleted:', deletionResult);
} catch (error) {
console.error('Error deleting post:', error);
}
Again, id
is the unique identifier of the post to be deleted.
Execution Methods
When creating, updating, or deleting content, you can specify an execution method. This determines how the transaction is processed on the blockchain. For more information on execution methods, see our Execution Methods documentation.
The available execution methods are:
FAST_UNCONFIRMED
- Fastest response time (default)QUICK_SIGNATURE
- Returns transaction signatureCONFIRMED_AND_PARSED
- Waits for full blockchain confirmation
Example Response Structure
Here's what a typical content response looks like:
{
"content": {
"id": "post123",
"profileId": "user123",
"content": "Hello world! This is my first post on Tapestry.",
"contentType": "text",
"blockchain": "SOLANA",
"customProperties": {
"title": "My First Post",
"url": "example.com/post1",
"tags": "introduction,hello-world"
},
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
},
"engagement": {
"likes": 0,
"comments": 0,
"shares": 0
}
}
Best Practices
By leveraging these content endpoints with the socialfi package or API directly, you can build a robust and interactive social media application on Tapestry. Remember to:
- Handle errors gracefully and provide user feedback
- Implement appropriate user interfaces for a seamless experience
- Use custom properties to store additional metadata
- Consider rate limiting and API usage best practices
- Validate user input before sending to the API