Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 1x | import * as db from "../db" import { Knex } from "knex" import { PostRow } from "../../clientUtils/owidTypes" export namespace Post { export const table = "posts" export const select = <K extends keyof PostRow>( ...args: K[] ): { from: (query: Knex.QueryBuilder) => Promise<Pick<PostRow, K>[]> } => ({ from: (query) => query.select(...args) as any, }) export const tagsByPostId = async (): Promise< Map<number, { id: number; name: string }[]> > => { const postTags = await db.queryMysql(` SELECT pt.post_id AS postId, pt.tag_id AS tagId, t.name as tagName FROM post_tags pt JOIN posts p ON p.id=pt.post_id JOIN tags t ON t.id=pt.tag_id `) const tagsByPostId: Map<number, { id: number; name: string }[]> = new Map() for (const pt of postTags) { const tags = tagsByPostId.get(pt.postId) || [] tags.push({ id: pt.tagId, name: pt.tagName }) tagsByPostId.set(pt.postId, tags) } return tagsByPostId } export const setTags = async (postId: number, tagIds: number[]) => await db.transaction(async (t) => { const tagRows = tagIds.map((tagId) => [tagId, postId]) await t.execute(`DELETE FROM post_tags WHERE post_id=?`, [postId]) if (tagRows.length) await t.execute( `INSERT INTO post_tags (tag_id, post_id) VALUES ?`, [tagRows] ) }) export const bySlug = async (slug: string): Promise<PostRow | undefined> => (await db.knexTable("posts").where({ slug: slug }))[0] } |