All files / src/application/utils group.ts

0% Statements 0/14
0% Branches 0/4
0% Functions 0/4
0% Lines 0/13

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 50                                                                                                   
// hono
import { HTTPException } from 'hono/http-exception';
// drizzle
import { eq, and } from 'drizzle-orm';
import { groupMembership } from '../../db/schema';
// types
import { DatabaseType, UserInfoType } from './types';
// utils
import { getUserNameMap } from './user';
 
export const validateIsGroupMember = async (db: DatabaseType, groupId: string, loginUserId: string): Promise<void> => {
  // loginUser が body.group_id のグループのメンバーであることを確認
  const me = await db
    .select({
      groupMembershipId: groupMembership.id,
    })
    .from(groupMembership)
    .where(and(eq(groupMembership.groupId, groupId), eq(groupMembership.userId, loginUserId)))
    .limit(1);
 
  // body.group_id のグループのメンバーでない場合はエラー
  if (me.length === 0) {
    throw new HTTPException(400, { message: 'Bad Request' });
  }
};
 
export const getGroupMembers = async (db: DatabaseType, groupId: string): Promise<UserInfoType[]> => {
  // グループに所属しているユーザIDを取得
  const memberUserIds = await db
    .select({ userId: groupMembership.userId })
    .from(groupMembership)
    .where(eq(groupMembership.groupId, groupId));
 
  // グループに所属しているユーザ名を取得
  const userIds = memberUserIds.map((member) => member.userId);
  const nameMap = await getUserNameMap(db, userIds);
 
  return memberUserIds.map((member) => {
    const name = nameMap.get(member.userId);
    if (typeof name === 'undefined') {
      // データ整合性の問題として扱い、サーバエラーを返す
      throw new HTTPException(500, { message: 'Internal Server Error' });
    }
    return {
      id: member.userId,
      name: name,
    };
  });
};