diff --git a/components/members/members-table.tsx b/components/members/members-table.tsx index c1865a6..6004f91 100644 --- a/components/members/members-table.tsx +++ b/components/members/members-table.tsx @@ -31,6 +31,7 @@ import { } from "@/lib/db_actions/competition-members"; import type { VCompetitionMember } from "@/types/db_types"; import { cn } from "@/lib/utils"; +import Image from "next/image"; interface MembersTableProps { members: VCompetitionMember[]; @@ -126,9 +127,19 @@ function MemberRow({ )} > {/* Avatar / Initial */} -
- {member.user_name.charAt(0).toUpperCase()} -
+ {member.user_picture_url ? ( + {member.user_name} + ) : ( +
+ {member.user_name.charAt(0).toUpperCase()} +
+ )} {/* Name and email */}
diff --git a/migrations/1773516227456_add-picture-url-to-competition-members-view.ts b/migrations/1773516227456_add-picture-url-to-competition-members-view.ts new file mode 100644 index 0000000..32b05ad --- /dev/null +++ b/migrations/1773516227456_add-picture-url-to-competition-members-view.ts @@ -0,0 +1,48 @@ +import { type Kysely, sql } from "kysely"; + +export async function up(db: Kysely): Promise { + await db.schema.dropView("v_competition_members").execute(); + + await sql` + CREATE VIEW v_competition_members WITH (security_barrier, security_invoker) AS + SELECT + cm.id AS membership_id, + cm.competition_id, + cm.user_id, + cm.role, + cm.created_at AS membership_created_at, + cm.updated_at AS membership_updated_at, + c.name AS competition_name, + c.is_private AS competition_is_private, + u.name AS user_name, + u.email AS user_email, + u.username AS user_username, + u.picture_url AS user_picture_url + FROM competition_members cm + JOIN competitions c ON cm.competition_id = c.id + JOIN users u ON cm.user_id = u.id; + `.execute(db); +} + +export async function down(db: Kysely): Promise { + await db.schema.dropView("v_competition_members").execute(); + + await sql` + CREATE VIEW v_competition_members WITH (security_barrier, security_invoker) AS + SELECT + cm.id AS membership_id, + cm.competition_id, + cm.user_id, + cm.role, + cm.created_at AS membership_created_at, + cm.updated_at AS membership_updated_at, + c.name AS competition_name, + c.is_private AS competition_is_private, + u.name AS user_name, + u.email AS user_email, + u.username AS user_username + FROM competition_members cm + JOIN competitions c ON cm.competition_id = c.id + JOIN users u ON cm.user_id = u.id; + `.execute(db); +} diff --git a/types/db_types.ts b/types/db_types.ts index 4153120..d81e72a 100644 --- a/types/db_types.ts +++ b/types/db_types.ts @@ -245,5 +245,6 @@ export interface VCompetitionMembersView { user_name: string; user_email: string; user_username: string | null; + user_picture_url: string | null; } export type VCompetitionMember = Selectable;