Skip to content

Commit

Permalink
refactor: repositoryの変更の適用
Browse files Browse the repository at this point in the history
  • Loading branch information
KinjiKawaguchi committed Feb 9, 2025
1 parent ca749c0 commit b7c1e3b
Show file tree
Hide file tree
Showing 20 changed files with 2,110 additions and 3,655 deletions.
8 changes: 4 additions & 4 deletions src/commands/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import {
} from "discord.js";
import type { UserRecord } from "firebase-admin/lib/auth/user-record";
import {
getMemberByDiscordId,
getMemberByEmail,
getMemberByDiscordIdController,
getMemberByEmailController,
} from "../controllers/MemberController";
import Department from "../entities/department";
import { adminAuth } from "../infra/firebase";
Expand Down Expand Up @@ -40,7 +40,7 @@ async function authCommandHandler(interaction: CommandInteraction) {
return await interaction.reply("このコマンドはサーバーでのみ実行可能です");

// Firestoreからメンバー情報を取得
const member = await getMemberByDiscordId(interaction.user.id);
const member = await getMemberByDiscordIdController(interaction.user.id);
if (!member) {
await interaction.reply("メンバー情報が見つかりませんでした");
return;
Expand Down Expand Up @@ -121,7 +121,7 @@ async function giveDepartmentRole(
}

// 認証用のアカウントから、メンバー情報を取得
const member = await getMemberByEmail(userAccount.email);
const member = await getMemberByEmailController(userAccount.email);
if (!member) {
throw new Error("Member not found");
}
Expand Down
7 changes: 4 additions & 3 deletions src/commands/register.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { type CommandInteraction, SlashCommandBuilder } from "discord.js";
import { addMember } from "../controllers/MemberController";
import { addMemberController } from "../controllers/MemberController";
import Department from "../entities/department";
import type Member from "../entities/member";
import type CommandWithArgs from "../types/commandWithArgs";
import checkIsAdmin from "../utils/checkMemberRole";
import { MemberCreateInput } from "../infra/repository/IMemberRepository";

const registerCommand: CommandWithArgs = {
data: new SlashCommandBuilder()
Expand Down Expand Up @@ -47,12 +48,12 @@ async function addMemberCommandHandler(interaction: CommandInteraction) {
);
if (!isArgsValid) return await interaction.reply("引数が不正です。");

await addMember({
await addMemberController({
mail: interaction.options.get("mail")?.value as string,
name: interaction.options.get("name")?.value as string,
department: interaction.options.get("department")?.value as string,
student_number: interaction.options.get("student_number")?.value as string,
} as Member);
} as MemberCreateInput);

await interaction.reply(
`${interaction.options.get("name")?.value}さんを登録しました`,
Expand Down
4 changes: 2 additions & 2 deletions src/commands/rename_all.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { type CommandInteraction, SlashCommandBuilder } from "discord.js";
import { getMemberByDiscordId } from "../controllers/MemberController";
import { getMemberByDiscordIdController } from "../controllers/MemberController";
import type { Command } from "../types/command";
import checkIsAdmin from "../utils/checkMemberRole";

Expand All @@ -25,7 +25,7 @@ async function renameALLHandler(interaction: CommandInteraction) {

const members = await interaction.guild.members.fetch();
const renamePromises = members.map(async (member) => {
const memberOnFirebase = await getMemberByDiscordId(member.id);
const memberOnFirebase = await getMemberByDiscordIdController(member.id);
if (!memberOnFirebase) return;

try {
Expand Down
4 changes: 2 additions & 2 deletions src/commands/who.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
SlashCommandBuilder,
type User,
} from "discord.js";
import { getMemberByDiscordId } from "../controllers/MemberController";
import { getMemberByDiscordIdController } from "../controllers/MemberController";
import type CommandWithArgs from "../types/commandWithArgs";

const whoCommand: CommandWithArgs = {
Expand Down Expand Up @@ -34,7 +34,7 @@ async function whoCommandHandler(interaction: CommandInteraction) {
}

const user: User = userOption.user;
const member = await getMemberByDiscordId(user.id);
const member = await getMemberByDiscordIdController(user.id);

if (!member) {
await interaction.reply("メンバー情報が見つかりませんでした。");
Expand Down
98 changes: 65 additions & 33 deletions src/controllers/MemberController.ts
Original file line number Diff line number Diff line change
@@ -1,66 +1,98 @@
import type Member from "../entities/member";
import getMembers from "../usecases/getMembers";
import insertMember from "../usecases/insertMember";
import setDiscordId from "../usecases/setDiscordId";
import type {
MemberCreateInput,
CreateDiscordAccountInput,
} from "../infra/repository/IMemberRepository";

export async function getAllMembers(): Promise<Member[] | undefined> {
// UseCase のインポート
import getAllMembers from "../usecases/member/getAllMembers";
import getMemberByEmail from "../usecases/member/getMemberByEmail";
import getMemberByDiscordId from "../usecases/member/getMemberByDiscordId";
import insertMember from "../usecases/member/insertMember";
import connectDiscordAccount from "../usecases/member/connectDiscordAccount";

// リポジトリの実装と Prisma のインスタンス(インフラ層)
import MemberRepository from "../infra/repository/memberRepository";
import prismaClient from "../infra/prisma";

// リポジトリインスタンスの生成(DI)
const memberRepository = new MemberRepository(prismaClient);

/**
* 全メンバー取得エンドポイント
*/
export async function getAllMembersController(): Promise<Member[]> {
try {
return await getMembers();
return await getAllMembers(memberRepository);
} catch (error) {
console.error("Error getting members:", error);
return undefined;
throw error;
}
}

export async function getMemberByEmail(
/**
* メールアドレスからメンバーを取得するエンドポイント
*/
export async function getMemberByEmailController(
email: string,
): Promise<Member | undefined> {
try {
const members = await getMembers();
return members.find((m) => m.mail === email);
const member = await getMemberByEmail(memberRepository, email);
if (!member) {
return undefined;
}
return member;
} catch (error) {
console.error("Error getting member by email:", error);
return undefined;
throw error;
}
}

export async function getMemberByDiscordId(
/**
* Discord IDからメンバーを取得するエンドポイント
*/
export async function getMemberByDiscordIdController(
discordId: string,
): Promise<Member | undefined> {
try {
const members = await getMembers();
return members.find((m) => m.discordId === discordId);
const member = await getMemberByDiscordId(memberRepository, discordId);
if (!member) {
return undefined;
}
return member;
} catch (error) {
console.error("Error getting member by discord id:", error);
return undefined;
throw error;
}
}

export async function addDiscordId(
member: Member,
discordId: string,
): Promise<boolean> {
if (!member.id) {
console.error("Member ID is undefined");
return false;
}

/**
* 新規メンバー作成エンドポイント
*/
export async function addMemberController(
input: MemberCreateInput,
): Promise<Member> {
try {
await setDiscordId(member.id, discordId);
return true;
const member = await insertMember(memberRepository, input);
console.log("Member successfully added");
return member;
} catch (error) {
console.error("Error adding discord id:", error);
return false;
console.error("Error adding member:", error);
throw error;
}
}

export async function addMember(memberData: Member): Promise<boolean> {
/**
* Discordアカウントをメンバーに紐付けるエンドポイント
*/
export async function addDiscordAccountController(
memberId: string,
discordId: string,
): Promise<Member> {
try {
await insertMember(memberData);
console.log("Member successfully added");
return true;
return await connectDiscordAccount(memberRepository, memberId, discordId);
} catch (error) {
console.error("Error adding member:", error);
return false;
console.error("Error connecting discord account:", error);
throw error;
}
}
21 changes: 16 additions & 5 deletions src/controllers/authController.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,48 @@
import type Member from "../entities/member";
import type AuthData from "../types/authData";
import sendAuthMail from "../usecases/sendAuthMail";
import setDiscordId from "../usecases/setDiscordId";
import { getMemberByEmail } from "./MemberController";
import setDiscordId from "../usecases/member/connectDiscordAccount";
import MemberRepository from "../infra/repository/memberRepository";
import prismaClient from "../infra/prisma";
import connectDiscordAccount from "../usecases/member/connectDiscordAccount";
import getMemberByEmail from "../usecases/member/getMemberByEmail";

const memberRepository = new MemberRepository(prismaClient);

async function sendAuthMailController(userInfo: AuthData) {
try {
if (!checkAuthData(userInfo)) {
console.error("Invalid AuthData");
throw new Error("Invalid AuthData");
}

const { mail, student_number, department, discordId } = userInfo;

if (!mail || !student_number || !department || !discordId) {
console.error("Missing required fields in AuthData");
throw new Error("Missing required fields in AuthData");
}

await sendAuthMail(mail, student_number, department);

const member = await getMemberByEmail(mail);
const member = await getMemberByEmail(memberRepository, mail);

if (!member) {
console.error("Member not found");
throw new Error("Member not found");
}

checkMember(member);

if (!member.id) {
console.error("Member ID is missing");
throw new Error("Member ID is missing");
}

await setDiscordId(member.id, discordId);
await connectDiscordAccount(memberRepository, member.id, discordId);
} catch (e) {
console.error(e);
throw e; // エラーを上位に伝播させる
throw e;
}
}

Expand All @@ -48,9 +57,11 @@ function checkAuthData(userInfo: AuthData): boolean {

function checkMember(member: Member | undefined): void {
if (!member) {
console.error("Member not found");
throw new Error("Member not found");
}
if (!member.id) {
console.error("Member id is not provided");
throw new Error("Member id is not provided");
}
}
Expand Down
1 change: 0 additions & 1 deletion src/infra/firebase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,5 @@ const firebaseConfig = {

const app: FirebaseApp = initializeApp(firebaseConfig);

export const db: admin.firestore.Firestore = admin.firestore();
export const adminAuth = admin.auth();
export const auth = getAuth(app);
5 changes: 5 additions & 0 deletions src/infra/prisma.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { PrismaClient } from "@shizuoka-its/core";

const prismaClient = new PrismaClient();

export default prismaClient;
Loading

0 comments on commit b7c1e3b

Please sign in to comment.