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('posts') export function postPath(postSlug: string) { return `/post/${postSlug}` } export function updatePost(post: Post, updates: Partial) { 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(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(q) } export function listenForDateDocs(setDateDocs: (dateDocs: DateDoc[]) => void) { const q = query(posts, where('type', '==', 'date-doc')) return listenForValues(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(q) const post = docs.length === 0 ? null : docs[0] return { post, user } }