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,
};
});
};
|