70 lines
1.5 KiB
TypeScript
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
|
|
}
|