femto-webapp/src/app/feed/posts/postsService.ts
2025-05-18 13:41:08 +02:00

70 lines
1.5 KiB
TypeScript

import { Post } from './posts.ts'
import client from '../../api/client.ts'
export class PostsService {
constructor() {}
async createNew(
authorId: string,
content: string,
media: CreatePostMedia[],
isPublic: boolean,
): Promise<string> {
const response = await client.POST('/posts', {
body: {
authorId,
content,
media: media.map((m) => {
return { ...m, type: null, url: m.url.toString() }
}),
isPublic,
},
credentials: 'include',
})
if (!response.data) {
throw new Error('Failed to create post')
}
return response.data.postId
}
async loadPublicFeed(cursor: string | null, amount: number | null): Promise<Post[]> {
const response = await client.GET('/posts', {
query: { cursor, amount },
credentials: 'include',
})
if (!response.data) {
return []
}
return response.data?.posts.map((post) => Post.fromDto(post))
}
async loadByAuthor(
username: string,
cursor: string | null,
amount: number | null,
): Promise<Post[]> {
const response = await client.GET('/posts', {
params: {
query: { From: cursor ?? undefined, Amount: amount ?? undefined, Author: username },
},
credentials: 'include',
})
if (!response.data) {
return []
}
return response.data?.posts.map((post) => Post.fromDto(post))
}
}
interface CreatePostMedia {
mediaId: string
url: string | URL
width: number | null
height: number | null
}