ff6278b147
* Featured items to homepage * Fix nits
82 lines
1.9 KiB
TypeScript
82 lines
1.9 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 function getAllPosts() {
|
|
return getValues<Post>(posts)
|
|
}
|
|
|
|
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 }
|
|
}
|