Skip to content

Commit e6e4bfa

Browse files
Feat/member list page (#44)
* feat: メンバーの一覧取得 * update:メンバー一覧 * fix:lint --------- Co-authored-by: SatooRu65536 <[email protected]>
1 parent eaf70c0 commit e6e4bfa

File tree

4 files changed

+89
-13
lines changed

4 files changed

+89
-13
lines changed

Diff for: app/pages/MemberListPage/index.tsx

+33-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,38 @@
1-
export default function MemberListPage() {
1+
import type { MemberList } from '@/repository/member.repository';
2+
3+
interface Props {
4+
members: MemberList;
5+
}
6+
7+
export default function MemberListPage({ members }: Props) {
28
return (
39
<div>
4-
<h1>メンバー一覧画面</h1>
10+
<div className="my-10 grid grid-cols-[repeat(auto-fit,minmax(200px,1fr))] place-items-center gap-10 px-10">
11+
{members.map((member) => (
12+
<div className="shadow-[0_2px_3px_rgba(0,0,0,0.25)]" key={member.id}>
13+
<a href={`/member/${member.id}`}>
14+
<img
15+
alt="Image"
16+
height={100}
17+
src={member.MemberBase?.iconUrl}
18+
width={200}
19+
/>
20+
<div className="p-2">
21+
<p>
22+
[
23+
{member.MemberAlumni?.graduatedYear ?? member.MemberActive?.grade ?? member.MemberActiveExternal?.organization}
24+
]
25+
{member.MemberActiveInternal?.studentId ?? member.MemberActiveExternal?.organization}
26+
</p>
27+
<p className="my-2">
28+
{member.MemberBase?.lastName}
29+
{member.MemberBase?.firstName}
30+
</p>
31+
</div>
32+
</a>
33+
</div>
34+
))}
35+
</div>
536
</div>
637
);
738
}

Diff for: app/repository/member.repository.ts

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import type { PrismaClient } from '@prisma/client';
2+
import { err } from 'neverthrow';
3+
4+
export const MemberRepository = {
5+
list: async (prisma: PrismaClient) => {
6+
const members = await prisma.member.findMany({
7+
select: {
8+
id: true,
9+
email: true,
10+
MemberBase: true,
11+
MemberActive: true,
12+
MemberActiveInternal: true,
13+
MemberActiveExternal: true,
14+
MemberAlumni: true,
15+
},
16+
});
17+
18+
const hasMemberProperties = members.every(
19+
(m) => {
20+
if (!m.MemberBase) return false;
21+
if (!m.MemberActive) return false;
22+
23+
if (!m.MemberActiveInternal && !m.MemberActiveExternal) return false;
24+
25+
return true;
26+
},
27+
);
28+
29+
if (!hasMemberProperties) err('Member properties are not valid');
30+
31+
return members;
32+
},
33+
};
34+
35+
export type MemberList = Awaited<ReturnType<typeof MemberRepository.list>>;

Diff for: app/routes/_main._index.tsx

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import type { LoaderFunctionArgs } from '@remix-run/cloudflare';
12
import MemberListPage from '@/pages/MemberListPage';
3+
import { MemberRepository } from '@/repository/member.repository';
4+
import { typedjson, useTypedLoaderData } from 'remix-typedjson';
25

36
export function meta() {
47
return [
@@ -7,12 +10,13 @@ export function meta() {
710
];
811
}
912

10-
interface LoaderData {}
11-
12-
export function loader(): LoaderData {
13-
return { };
13+
export async function loader({ context }: LoaderFunctionArgs) {
14+
const members = await MemberRepository.list(context.__prisma);
15+
return typedjson({ members });
1416
}
1517

1618
export default function Index() {
17-
return <MemberListPage />;
19+
const { members } = useTypedLoaderData<typeof loader>();
20+
21+
return <MemberListPage members={[...members, ...members, ...members, ...members, ...members, ...members, ...members]} />;
1822
};

Diff for: migrations/0001_create_table.sql

+12-6
Original file line numberDiff line numberDiff line change
@@ -154,18 +154,20 @@ CREATE UNIQUE INDEX "Snapshot_id_key" ON "Snapshot"("id");
154154
-- Seed
155155
INSERT INTO "Member" ("id", "subject", "email", "securityRole", "updatedAt") VALUES
156156
('0188c0f2-8e47-11ec-b909-0242ac120002', 'Mathematics', '[email protected]', 'OWNER', CURRENT_TIMESTAMP),
157-
('0188c0f2-8e47-11ec-b909-0242ac120003', 'Science', '[email protected]', 'USER', CURRENT_TIMESTAMP),
158-
('0188c0f2-8e47-11ec-b909-0242ac120004', 'History', '[email protected]', 'USER', CURRENT_TIMESTAMP);
157+
('0188c0f2-8e47-11ec-b909-0242ac120003', 'Science', '[email protected]', 'MEMBER', CURRENT_TIMESTAMP),
158+
('0188c0f2-8e47-11ec-b909-0242ac120004', 'History', '[email protected]', 'MEMBER', CURRENT_TIMESTAMP);
159159

160160
-- Seed Data for MemberBase
161161
INSERT INTO "MemberBase" ("memberId", "iconUrl", "firstName", "lastName", "firstNameKana", "lastNameKana", "updatedAt") VALUES
162-
('0188c0f2-8e47-11ec-b909-0242ac120002', 'http://example.com/icon1.png', 'Taro', 'Yamada', 'タロウ', 'ヤマダ', CURRENT_TIMESTAMP),
163-
('0188c0f2-8e47-11ec-b909-0242ac120003', 'http://example.com/icon2.png', 'Hanako', 'Tanaka', 'ハナコ', 'タナカ', CURRENT_TIMESTAMP),
164-
('0188c0f2-8e47-11ec-b909-0242ac120004', 'http://example.com/icon3.png', 'Kenji', 'Suzuki', 'ケンジ', 'スズキ', CURRENT_TIMESTAMP);
162+
('0188c0f2-8e47-11ec-b909-0242ac120002', 'https://placehold.jp/3d4070/ffffff/150x150.png?text=taro', 'Taro', 'Yamada', 'タロウ', 'ヤマダ', CURRENT_TIMESTAMP),
163+
('0188c0f2-8e47-11ec-b909-0242ac120003', 'https://placehold.jp/3d4070/ffffff/150x150.png?text=tanaka', 'Hanako', 'Tanaka', 'ハナコ', 'タナカ', CURRENT_TIMESTAMP),
164+
('0188c0f2-8e47-11ec-b909-0242ac120004', 'https://placehold.jp/3d4070/ffffff/150x150.png?text=suzuki', 'Kenji', 'Suzuki', 'ケンジ', 'スズキ', CURRENT_TIMESTAMP);
165165

166166
-- Seed Data for MemberActive
167167
INSERT INTO "MemberActive" ("memberId", "grade", "updatedAt") VALUES
168-
('0188c0f2-8e47-11ec-b909-0242ac120002', 'B1', CURRENT_TIMESTAMP);
168+
('0188c0f2-8e47-11ec-b909-0242ac120002', 'B1', CURRENT_TIMESTAMP),
169+
('0188c0f2-8e47-11ec-b909-0242ac120003', 'B2', CURRENT_TIMESTAMP),
170+
('0188c0f2-8e47-11ec-b909-0242ac120004', 'B3', CURRENT_TIMESTAMP);
169171

170172
-- Seed Data for MemberActiveInternal
171173
INSERT INTO "MemberActiveInternal" ("memberId", "studentId", "role", "updatedAt") VALUES
@@ -187,3 +189,7 @@ INSERT INTO "MemberStatus" ("memberId", "hasDeleted", "lastRenewalDate", "update
187189
('0188c0f2-8e47-11ec-b909-0242ac120002', false, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '0188c0f2-8e47-11ec-b909-0242ac120002', '0188c0f2-8e47-11ec-b909-0242ac120002'),
188190
('0188c0f2-8e47-11ec-b909-0242ac120003', false, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '0188c0f2-8e47-11ec-b909-0242ac120002', '0188c0f2-8e47-11ec-b909-0242ac120002'),
189191
('0188c0f2-8e47-11ec-b909-0242ac120004', false, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '0188c0f2-8e47-11ec-b909-0242ac120002', '0188c0f2-8e47-11ec-b909-0242ac120002');
192+
193+
-- Seed Data for MemberAlumni
194+
INSERT INTO "MemberAlumni" ("memberId", "graduatedYear", "oldRole", "updatedAt") VALUES
195+
('0188c0f2-8e47-11ec-b909-0242ac120002', 2023, '会長', CURRENT_TIMESTAMP);

0 commit comments

Comments
 (0)