All files / Bandstand/src/app/(band)/members page.tsx

0% Statements 0/41
0% Branches 0/1
0% Functions 0/1
0% Lines 0/41

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                                                                                             
export const dynamic = 'force-dynamic'
 
import {prisma} from '@/lib/db'
import {pageAdmin} from '@/lib/guard'
import {requestOrigin} from '@/lib/band'
import Members from '@/components/Members'
import {avatarUrl} from '@/lib/avatars'
 
export const metadata = {title: 'Band members'}
 
export default async function MembersPage() {
  const {user, band} = await pageAdmin()
  const [rows, myAdminBands] = await Promise.all([
    prisma.membership.findMany({
      where: {bandId: band.id},
      include: {user: {include: {memberships: {select: {bandId: true}}}}},
      orderBy: [{user: {displayName: 'asc'}}, {user: {name: 'asc'}}],
    }),
    prisma.membership.findMany({
      where: {userId: user.id, isAdmin: true},
      select: {bandId: true},
    }),
  ])
  const mine = new Set(myAdminBands.map((m) => m.bandId))
  return (
    <Members
      me={user.id}
      bandName={band.name}
      site={requestOrigin()}
      initial={rows.map(({isAdmin, user: u}) => ({
        id: u.id,
        name: u.name ?? '',
        displayName: u.displayName ?? '',
        email: u.email ?? '',
        isAdmin,
        hasPassword: Boolean(u.passwordHash),
        avatar: avatarUrl(u),
        // Same rule as canManageAccount(), for every row at once
        managed:
          user.isOwner ||
          u.id === user.id ||
          u.memberships.every((m) => mine.has(m.bandId)),
      }))}
    />
  )
}