manifold/web/lib/firebase/posts.ts
2022-10-06 18:50:53 -05:00

78 lines
1.8 KiB
TypeScript

import {
deleteDoc,
doc,
getDocs,
query,
updateDoc,
where,
} from 'firebase/firestore'
import { DateDoc, Post } from 'common/post'
import {
coll,
getValue,
getValues,
listenForValue,
listenForValues,
} from './utils'
import { getUserByUsername } from './users'
export const posts = coll<Post>('posts')
export function postPath(postSlug: string) {
return `/post/${postSlug}`
}
export function updatePost(post: Post, updates: Partial<Post>) {
return updateDoc(doc(posts, post.id), updates)
}
export function deletePost(post: Post) {
return deleteDoc(doc(posts, post.id))
}
export function getPost(postId: string) {
return getValue<Post>(doc(posts, postId))
}
export async function getPostBySlug(slug: string) {
const q = query(posts, where('slug', '==', slug))
const docs = (await getDocs(q)).docs
return docs.length === 0 ? null : docs[0].data()
}
export function listenForPost(
postId: string,
setPost: (post: Post | null) => void
) {
return listenForValue(doc(posts, postId), setPost)
}
export async function listPosts(postIds?: string[]) {
if (postIds === undefined) return []
return Promise.all(postIds.map(getPost))
}
export async function getDateDocs() {
const q = query(posts, where('type', '==', 'date-doc'))
return getValues<DateDoc>(q)
}
export function listenForDateDocs(setDateDocs: (dateDocs: DateDoc[]) => void) {
const q = query(posts, where('type', '==', 'date-doc'))
return listenForValues<DateDoc>(q, setDateDocs)
}
export async function getDateDoc(username: string) {
const user = await getUserByUsername(username)
if (!user) return null
const q = query(
posts,
where('type', '==', 'date-doc'),
where('creatorId', '==', user.id)
)
const docs = await getValues<DateDoc>(q)
const post = docs.length === 0 ? null : docs[0]
return { post, user }
}