Skip to content

Commit

Permalink
Merge pull request #105 from Mouwf/feature/add-reply-function
Browse files Browse the repository at this point in the history
リプライ機能を追加した
  • Loading branch information
eigoninaritai-naokichi authored Mar 11, 2024
2 parents aa442f0 + 658846c commit 4170dd5
Show file tree
Hide file tree
Showing 82 changed files with 3,897 additions and 298 deletions.
27 changes: 27 additions & 0 deletions app/actions/post/reply-message-action.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import PostInteractor from "../../libraries/post/post-interactor";

/**
* リプライを行うアクション。
*/
export default class ReplyMessageAction {
/**
* リプライを行うアクションを生成する。
* @param postInteractor 投稿に関する処理を行うクラス。
*/
constructor(
private readonly postInteractor: PostInteractor,
) {
}

/**
* リプライを行う。
* @param replierId リプライ者ID。
* @param originalPostId リプライ先投稿ID。
* @param originalReplyId リプライ先リプライID。
* @param content リプライ内容。
*/
public async reply(replierId: number, originalPostId: number, originalReplyId: number | null, content: string): Promise<number> {
const replyId = await this.postInteractor.reply(replierId, originalPostId, originalReplyId, content);
return replyId;
}
}
22 changes: 21 additions & 1 deletion app/dependency-injector/production-app-load-context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,22 @@ import UserProfileManager from "../libraries/user/user-profile-manager";
import PostgresClientProvider from "../repositories/common/postgres-client-provider";
import PostgresUserRepository from "../repositories/user/postgres-user-repository";
import LatestPostsLoader from "../loaders/post/latest-posts-loader";
import PostLoader from "../loaders/post/post-loader";
import RepliesLoader from "../loaders/post/replies-loader";
import ReplyLoader from "../loaders/post/reply-loader";
import FirebaseClient from "../libraries/authentication/firebase-client";
import ReleaseInformationGetter from "../libraries/post/release-information-getter";
import ReleaseInformationLoader from "../loaders/post/release-information-loader";
import PostgresReleaseInformationRepository from "../repositories/post/postgres-release-information-repository";
import PostgresPostContentRepository from "../repositories/post/postgres-post-content-repository";
import PostgresReplyContentRepository from "../repositories/post/postgres-reply-content-repository";
import PostInteractor from "../libraries/post/post-interactor";
import PostMessageAction from "../actions/post/post-message-action";
import ReplyMessageAction from "../actions/post/reply-message-action";
import PostsFetcher from "../libraries/post/posts-fetcher";
import PostFetcher from "../libraries/post/post-fetcher";
import RepliesFetcher from "../libraries/post/replies-fetcher";
import ReplyFetcher from "../libraries/post/reply-fetcher";
import UserSettingAction from "../actions/user/user-setting-action";
import UserSettingLoader from "../loaders/user/user-setting-loader";

Expand Down Expand Up @@ -44,12 +52,20 @@ const userSettingLoader = new UserSettingLoader(userProfileManager);

// メッセージを投稿するためのクラスを生成する。
const postContentRepository = new PostgresPostContentRepository(postgresClientProvider);
const postInteractor = new PostInteractor(postContentRepository);
const replyContentRepository = new PostgresReplyContentRepository(postgresClientProvider);
const postInteractor = new PostInteractor(postContentRepository, replyContentRepository);
const postMessageAction = new PostMessageAction(postInteractor);
const replyMessageAction = new ReplyMessageAction(postInteractor);

// 最新の投稿を取得するためのクラスを生成する。
const postsFetcher = new PostsFetcher(postContentRepository);
const latestPostsLoader = new LatestPostsLoader(postsFetcher);
const postFetcher = new PostFetcher(postContentRepository);
const postLoader = new PostLoader(postFetcher);
const repliesFetcher = new RepliesFetcher(replyContentRepository);
const repliesLoader = new RepliesLoader(repliesFetcher);
const replyFetcher = new ReplyFetcher(replyContentRepository);
const replyLoader = new ReplyLoader(replyFetcher);

// リリース情報を取得するためのクラスを生成する。
const releaseInformationRepository = new PostgresReleaseInformationRepository(postgresClientProvider);
Expand All @@ -64,6 +80,10 @@ export const productionAppLoadContext: AppLoadContext = {
authenticatedUserLoader,
userSettingLoader,
latestPostsLoader,
postLoader,
repliesLoader,
replyLoader,
releaseInformationLoader,
postMessageAction,
replyMessageAction,
};
33 changes: 33 additions & 0 deletions app/libraries/post/post-fetcher.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import systemMessages from "../../messages/system-messages";
import PostContent from '../../models/post/post-content';
import IPostContentRepository from '../../repositories/post/i-post-content-repository';

/**
* 投稿を取得するクラス。
*/
export default class PostFetcher {
/**
* 投稿を取得するクラスを生成する。
* @param postContentRepository 投稿を取得するリポジトリ。
*/
constructor(
private readonly postContentRepository: IPostContentRepository,
) {
}

/**
* 指定された投稿を取得する。
* @param postId 投稿ID。
* @returns 取得した投稿。
*/
public async fetchPostById(postId: number): Promise<PostContent> {
try {
const post = await this.postContentRepository.getById(postId);
return post;
} catch (error) {
console.error(error);
if (error instanceof TypeError) throw new Error(systemMessages.error.networkError);
throw new Error(systemMessages.error.postRetrievalFailed);
}
}
}
23 changes: 22 additions & 1 deletion app/libraries/post/post-interactor.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import systemMessages from "../../messages/system-messages";
import IPostContentRepository from '../../repositories/post/i-post-content-repository';
import IPostContentRepository from "../../repositories/post/i-post-content-repository";
import IReplyContentRepository from "../../repositories/post/i-reply-content-repository";

/**
* 投稿に関する処理を行うクラス。
Expand All @@ -8,9 +9,11 @@ export default class PostInteractor {
/**
* 投稿に関する処理を行うクラスを生成する。
* @param postContentRepository 投稿内容リポジトリ。
* @param replyContentRepository リプライ内容リポジトリ。
*/
constructor(
private readonly postContentRepository: IPostContentRepository,
private readonly replyContentRepository: IReplyContentRepository,
) {
}

Expand All @@ -31,4 +34,22 @@ export default class PostInteractor {
throw new Error(systemMessages.error.postFailed);
}
}

/**
* リプライを行う。
* @param replierId リプライ者ID。
* @param originalPostId リプライ先投稿ID。
* @param originalReplyId リプライ先リプライID。
* @param content リプライ内容。
*/
public async reply(replierId: number, originalPostId: number, originalReplyId: number | null, content: string): Promise<number> {
try {
const replyId = await this.replyContentRepository.create(replierId, originalPostId, originalReplyId, content);
return replyId;
} catch (error) {
console.error(error);
if (error instanceof TypeError) throw new Error(systemMessages.error.networkError);
throw new Error(systemMessages.error.replyFailed);
}
}
}
4 changes: 2 additions & 2 deletions app/libraries/post/posts-fetcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import PostContent from '../../models/post/post-content';
import IPostContentRepository from '../../repositories/post/i-post-content-repository';

/**
* 投稿を取得するクラス
* 複数の投稿を取得するクラス
*/
export default class PostsFetcher {
/**
* 投稿を取得するクラスを生成する
* 複数の投稿を取得するクラスを生成する
* @param postContentRepository 投稿を取得するリポジトリ。
*/
constructor(
Expand Down
34 changes: 34 additions & 0 deletions app/libraries/post/replies-fetcher.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import systemMessages from "../../messages/system-messages";
import ReplyContent from "../../models/post/reply-content";
import IReplyContentRepository from "../../repositories/post/i-reply-content-repository";


/**
* 複数のリプライを取得するクラス。
*/
export default class RepliesFetcher {
/**
* 複数のリプライを取得するクラスを生成する。
* @param replyContentRepository リプライ内容リポジトリ。
*/
constructor(
private readonly replyContentRepository: IReplyContentRepository,
) {
}

/**
* 指定された投稿の全てのリプライを取得する。
* @param postId 投稿ID。
* @returns 指定された投稿の全てのリプライ。
*/
public async fetchAllByPostId(postId: number): Promise<ReplyContent[]> {
try {
const replies = await this.replyContentRepository.getAllByPostId(postId);
return replies;
} catch (error) {
console.error(error);
if (error instanceof TypeError) throw new Error(systemMessages.error.networkError);
throw new Error(systemMessages.error.replyRetrievalFailed);
}
}
}
33 changes: 33 additions & 0 deletions app/libraries/post/reply-fetcher.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import systemMessages from "../../messages/system-messages";
import ReplyContent from "../../models/post/reply-content";
import IReplyContentRepository from "../../repositories/post/i-reply-content-repository";

/**
* リプライを取得するクラス。
*/
export default class ReplyFetcher {
/**
* リプライを取得するクラスを生成する。
* @param replyContentRepository リプライ内容リポジトリ。
*/
constructor(
private readonly replyContentRepository: IReplyContentRepository,
) {
}

/**
* 指定されたリプライを取得する。
* @param replyId リプライID。
* @returns 取得したリプライ。
*/
public async fetchReplyById(replyId: number): Promise<ReplyContent> {
try {
const reply = await this.replyContentRepository.getById(replyId);
return reply;
} catch (error) {
console.error(error);
if (error instanceof TypeError) throw new Error(systemMessages.error.networkError);
throw new Error(systemMessages.error.replyRetrievalFailed);
}
}
}
2 changes: 1 addition & 1 deletion app/loaders/post/latest-posts-loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import PostContent from "../../models/post/post-content";
export default class LatestPostsLoader extends PostFetchLimit {
/**
* 最新の投稿を取得するローダーを生成する。
* @param postsFetcher 投稿を取得するクラス
* @param postsFetcher 複数の投稿を取得するクラス
*/
constructor(
private readonly postsFetcher: PostsFetcher,
Expand Down
26 changes: 26 additions & 0 deletions app/loaders/post/post-loader.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import PostFetcher from "../../libraries/post/post-fetcher";
import PostContent from "../../models/post/post-content";

/**
* 投稿を取得するローダー。
*/
export default class PostLoader {
/**
* 投稿を取得するローダーを生成する。
* @param postFetcher 投稿を取得するクラス。
*/
constructor(
private readonly postFetcher: PostFetcher,
) {
}

/**
* 指定された投稿を取得する。
* @param postId 投稿ID。
* @returns 取得した投稿。
*/
public async getPostById(postId: number): Promise<PostContent> {
const post = await this.postFetcher.fetchPostById(postId);
return post;
}
}
26 changes: 26 additions & 0 deletions app/loaders/post/replies-loader.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import RepliesFetcher from "../../libraries/post/replies-fetcher";
import ReplyContent from "../../models/post/reply-content";

/**
* 指定された投稿の全てのリプライを取得するローダー。
*/
export default class RepliesLoader {
/**
* 指定された投稿の全てのリプライを取得するローダーを生成する。
* @param repliesFetcher 複数のリプライを取得するクラス。
*/
constructor(
private readonly repliesFetcher: RepliesFetcher,
) {
}

/**
* 指定された投稿の全てのリプライを取得する。
* @param postId 投稿ID。
* @returns 指定された投稿の全てのリプライ。
*/
public async getAllRepliesByPostId(postId: number): Promise<ReplyContent[]> {
const replies = await this.repliesFetcher.fetchAllByPostId(postId);
return replies;
}
}
26 changes: 26 additions & 0 deletions app/loaders/post/reply-loader.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import ReplyFetcher from "../../libraries/post/reply-fetcher";
import ReplyContent from "../../models/post/reply-content";

/**
* リプライを取得するローダー。
*/
export default class ReplyLoader {
/**
* リプライを取得するローダーを生成する。
* @param replyFetcher リプライを取得するクラス。
*/
constructor(
private readonly replyFetcher: ReplyFetcher,
) {
}

/**
* 指定されたリプライを取得する。
* @param replyId リプライID。
* @returns 取得したリプライ。
*/
public async getReplyById(replyId: number): Promise<ReplyContent> {
const reply = await this.replyFetcher.fetchReplyById(replyId);
return reply;
}
}
7 changes: 7 additions & 0 deletions app/messages/system-messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,20 @@ const systemMessages: Messages = {
userSettingRetrievalFailed: "ユーザー設定の取得に失敗しました。",
postContentNotInputted: "投稿内容が入力されていません。",
postFailed: "投稿に失敗しました。",
postNotExists: "投稿が存在しません。",
postRetrievalFailed: "投稿の取得に失敗しました。",
postDeletionFailed: "投稿の削除に失敗しました。",
releaseInformationRetrievalFailed: "リリース情報の取得に失敗しました。",
releaseInformationNotExists: "リリース情報が存在しません。",
replyContentNotInputted: "リプライ内容が入力されていません。",
replyFailed: "リプライに失敗しました。",
replyNotExists: "リプライが存在しません。",
replyRetrievalFailed: "リプライの取得に失敗しました。",
replyDeletionFailed: "リプライの削除に失敗しました。",
},
success: {
userSettingSaved: "ユーザー設定を保存しました。",
replyMessagePosted: "返信しました。",
},
}
export default systemMessages;
5 changes: 5 additions & 0 deletions app/models/post/post-content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ export default interface PostContent extends Entity {
*/
readonly releaseName: string;

/**
* リプライ数。
*/
readonly replyCount: number;

/**
* 投稿内容。
*/
Expand Down
Loading

0 comments on commit 4170dd5

Please sign in to comment.