From 12d72e31118655e8d0b526024b1c196020f7c5cf Mon Sep 17 00:00:00 2001 From: Arjun Komath Date: Sat, 7 Dec 2024 14:12:19 +1100 Subject: [PATCH 1/8] Add tags column to posts --- packages/supabase/migrations/14_post_tags.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 packages/supabase/migrations/14_post_tags.sql diff --git a/packages/supabase/migrations/14_post_tags.sql b/packages/supabase/migrations/14_post_tags.sql new file mode 100644 index 0000000..b3538d5 --- /dev/null +++ b/packages/supabase/migrations/14_post_tags.sql @@ -0,0 +1,2 @@ +ALTER TABLE IF EXISTS public.posts +ADD COLUMN tags text [] not null DEFAULT '{}'; \ No newline at end of file From ff375c87476d706ec0ac3dcec9788e7c588ee0c0 Mon Sep 17 00:00:00 2001 From: Arjun Komath Date: Sun, 8 Dec 2024 22:53:45 +1100 Subject: [PATCH 2/8] Update type --- packages/supabase/types/index.ts | 52 ++++++++++++-------------------- 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/packages/supabase/types/index.ts b/packages/supabase/types/index.ts index 18edfe4..51f96e7 100644 --- a/packages/supabase/types/index.ts +++ b/packages/supabase/types/index.ts @@ -152,13 +152,6 @@ export type Database = { referencedRelation: "pages" referencedColumns: ["id"] }, - { - foreignKeyName: "page_settings_user_id_fkey" - columns: ["user_id"] - isOneToOne: false - referencedRelation: "users" - referencedColumns: ["id"] - }, ] } page_views: { @@ -236,15 +229,7 @@ export type Database = { url_slug?: string | null user_id?: string } - Relationships: [ - { - foreignKeyName: "pages_user_id_fkey" - columns: ["user_id"] - isOneToOne: false - referencedRelation: "users" - referencedColumns: ["id"] - }, - ] + Relationships: [] } post_reactions: { Row: { @@ -303,6 +288,7 @@ export type Database = { publication_date: string | null publish_at: string | null status: Database["public"]["Enums"]["post_status"] + tags: string[] title: string type: Database["public"]["Enums"]["post_type"] updated_at: string @@ -320,6 +306,7 @@ export type Database = { publication_date?: string | null publish_at?: string | null status: Database["public"]["Enums"]["post_status"] + tags?: string[] title: string type: Database["public"]["Enums"]["post_type"] updated_at?: string @@ -337,6 +324,7 @@ export type Database = { publication_date?: string | null publish_at?: string | null status?: Database["public"]["Enums"]["post_status"] + tags?: string[] title?: string type?: Database["public"]["Enums"]["post_type"] updated_at?: string @@ -350,13 +338,6 @@ export type Database = { referencedRelation: "pages" referencedColumns: ["id"] }, - { - foreignKeyName: "posts_user_id_fkey" - columns: ["user_id"] - isOneToOne: false - referencedRelation: "users" - referencedColumns: ["id"] - }, ] } users: { @@ -384,15 +365,7 @@ export type Database = { stripe_subscription?: Json | null stripe_subscription_id?: string | null } - Relationships: [ - { - foreignKeyName: "users_id_fkey" - columns: ["id"] - isOneToOne: true - referencedRelation: "users" - referencedColumns: ["id"] - }, - ] + Relationships: [] } } Views: { @@ -548,3 +521,18 @@ export type Enums< : PublicEnumNameOrOptions extends keyof PublicSchema["Enums"] ? PublicSchema["Enums"][PublicEnumNameOrOptions] : never + +export type CompositeTypes< + PublicCompositeTypeNameOrOptions extends + | keyof PublicSchema["CompositeTypes"] + | { schema: keyof Database }, + CompositeTypeName extends PublicCompositeTypeNameOrOptions extends { + schema: keyof Database + } + ? keyof Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"] + : never = never, +> = PublicCompositeTypeNameOrOptions extends { schema: keyof Database } + ? Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName] + : PublicCompositeTypeNameOrOptions extends keyof PublicSchema["CompositeTypes"] + ? PublicSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions] + : never From 21ca76491e88c665d73e4b14e6dec7b61c1c73c9 Mon Sep 17 00:00:00 2001 From: Arjun Komath Date: Fri, 27 Dec 2024 18:33:52 +1100 Subject: [PATCH 3/8] Update UI to handle multiple tags --- apps/page/components/post.tsx | 7 +++- apps/page/lib/data.ts | 22 +++++------ apps/page/pages/_sites/[site]/plain.tsx | 6 ++- .../components/forms/post-form.component.tsx | 38 +++++++++++++------ apps/web/components/post/post.tsx | 7 +++- apps/web/pages/api/posts/index.ts | 4 +- packages/supabase/migrations/14_post_tags.sql | 5 ++- 7 files changed, 59 insertions(+), 30 deletions(-) diff --git a/apps/page/components/post.tsx b/apps/page/components/post.tsx index ca013c8..81d29ed 100644 --- a/apps/page/components/post.tsx +++ b/apps/page/components/post.tsx @@ -1,3 +1,4 @@ +import { PostType } from "@changes-page/supabase/types/page"; import { PostTypeBadge } from "@changes-page/ui"; import classNames from "classnames"; import dynamic from "next/dynamic"; @@ -51,7 +52,11 @@ export default function Post({
- + {(post?.tags ?? []).map((tag) => ( +
+ +
+ ))} {isPinned && }
diff --git a/apps/page/lib/data.ts b/apps/page/lib/data.ts index 1753e02..12e42c6 100644 --- a/apps/page/lib/data.ts +++ b/apps/page/lib/data.ts @@ -70,6 +70,9 @@ export const BLACKLISTED_SLUGS = [ "press-kit", ]; +const postSelectParams = + "id,title,content,tags,publication_date,updated_at,created_at,allow_reactions"; + function translateHostToPageIdentifier(host: string): { page: string | null; domain: string | null; @@ -209,12 +212,9 @@ async function fetchPosts( ): Promise<{ posts: IPost[]; postsCount: number }> { const postsQuery = supabaseAdmin .from("posts") - .select( - "id,title,content,type,publication_date,updated_at,created_at,allow_reactions", - { - count: "exact", - } - ) + .select(postSelectParams, { + count: "exact", + }) .eq("page_id", String(pageId)) .eq("status", "published") .range( @@ -242,9 +242,7 @@ async function fetchPosts( // Get pinned post const { data: pinnedPost, error: pinnedPostError } = await supabaseAdmin .from("posts") - .select( - "id,title,content,type,publication_date,updated_at,created_at,allow_reactions" - ) + .select(postSelectParams) .eq("id", pinned_post_id) .eq("status", "published") .maybeSingle(); @@ -283,7 +281,7 @@ export type IPostPublicData = Pick< | "id" | "title" | "content" - | "type" + | "tags" | "publication_date" | "updated_at" | "created_at" @@ -299,9 +297,7 @@ async function fetchPostById( }> { const { data: post, error: postError } = await supabaseAdmin .from("posts") - .select( - "id,title,content,type,publication_date,updated_at,created_at,allow_reactions" - ) + .select(postSelectParams) .eq("id", String(postId)) .eq("page_id", String(pageId)) .eq("status", "published") diff --git a/apps/page/pages/_sites/[site]/plain.tsx b/apps/page/pages/_sites/[site]/plain.tsx index 356164c..88ce472 100644 --- a/apps/page/pages/_sites/[site]/plain.tsx +++ b/apps/page/pages/_sites/[site]/plain.tsx @@ -2,6 +2,7 @@ import { IPage, IPageSettings, IPost, + PostType, PostTypeToLabel, } from "@changes-page/supabase/types/page"; import { DateTime } from "@changes-page/utils"; @@ -61,7 +62,10 @@ export default function Index({

{post.title}

- {PostTypeToLabel[post?.type]},{" "} + {(post.tags ?? []) + .map((tag) => PostTypeToLabel[tag as PostType]) + .join(", ")} + {" | "}