some change

This commit is contained in:
john 2025-05-16 16:09:35 +02:00
parent d4a1492d56
commit 313f1def49
38 changed files with 475 additions and 401 deletions

View file

@ -0,0 +1,49 @@
import { Temporal } from '@js-temporal/polyfill'
import { components } from '../../api/schema.ts'
export class Post {
public readonly postId: string
public readonly content: string
public readonly media: PostMedia[]
public readonly createdAt: Temporal.Instant
public readonly authorName: string
constructor(
postId: string,
content: string,
media: PostMedia[],
createdAt: string | Temporal.Instant,
authorName: string,
) {
this.postId = postId
this.content = content
this.media = media
this.createdAt = Temporal.Instant.from(createdAt)
this.authorName = authorName
}
public static fromDto(dto: components['schemas']['PublicPostDto']): Post {
console.debug('make post', dto)
return new Post(
dto.postId,
dto.content,
dto.media.map((m) => new PostMediaImpl(new URL(m.url), m.width, m.height)),
Temporal.Instant.from(dto.createdAt),
dto.author.username,
)
}
}
export interface PostMedia {
readonly url: URL
readonly width: number | null
readonly height: number | null
}
class PostMediaImpl implements PostMedia {
constructor(
readonly url: URL,
readonly width: number | null,
readonly height: number | null,
) {}
}

View file

@ -0,0 +1,62 @@
import { Post } from './posts.ts'
import client from '../../api/client.ts'
export class PostsService {
constructor() {}
async createNew(authorId: string, content: string, media: CreatePostMedia[]): Promise<string> {
const response = await client.POST('/posts', {
body: {
authorId,
content,
media: media.map((m) => {
return { ...m, type: null, url: m.url.toString() }
}),
},
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', {
query: { cursor, amount, 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
}