# 【プロジェクトの概要を記載】
主にIPO準備を目指す企業が社内の業務を統制していることを記録、整理するために作成する内部統制文書を効率よく作成するためのSaaSプロダクトになります。
現在リリース1年が経ち、メイン機能を中心に中小企業から大企業向けのサービス提供に向けて開発をしています。
・従来:Excelを使用して「業務フローチャート」「業務記述書」「リスクコントロールマトリクス」の通称3点セットを作成していた
・smoove利用時:重複した記載の自動連携、証憑ファイルの添付や管理などをできるようにして、従来の作成時間が大幅にカットされるようにするイメージです。
# 【業務内容の深堀】
## 使用技術:
・フロントエンド:Typescript, React, Next.js, react-hook-form, yup(フロントバリデライブラリ), tailwind CSS, testing library など
・バックエンド:Rails, RSpec, factorybot, caxlsx, roo, など
# 開発フロー
スクラム開発を採用。通常は2週間に1回のリリース。PjMから受け取った機能別のフィーチャーチケットを細かく設計、タスク分割、見積もり決めをする
▼流れ
スプリント最終日:次スプリントの計画作り
1~5日目:開発期間
6日目:開発完了日、stagingにリリース物反映
7日目:QA実施
8,9日目:QAで出たバグ改修→staging反映
10日目:リリース、次スプリントの計画作り
# フロントエンド領域の開発業務
## ①:コンポーネント設計
モーダル、テキストフィールド、サイドバー、カード、トーストなどの各パーツをコンポーネントとして用意
props値の決定、useState, useContextを使った状態管理、useFormを使ったフォーム実装などを実装する
・工夫すること・考えること
### ◯基本的にはUIとロジックを分けてコンポーネントは作りたい
例えばそのコンポーネントのみで使っているAPIリクエストをしているメソッドがあればファイル内でカスタムフックとして用意しておく。そのフックを別箇所でも使いたい場合にexport をつけることですぐに横展開できるメリットがある。コンポーネント内部でメソッドを定義していて、そのメソッド内でコンポーネントで定義している useStateなどを参照していたらロジックのみ後から切り出すのが難しくなる。なので最初からロジックを分ける前提で作りたい。
### ◯reutrn内にはなるべくロジックを含めない
map処理などをしているとついついその処理ないでconst定義をしたくなるがDOM構築する箇所にロジックの記述があると可読性が損なわれると考えるため可能であればreturn の外で変数は準備しておきたい
## ②:インターフェース設計
主にバックエンドに投げるリクエストを決める。ここはバックエンド実装も一緒にやる時に考えることが多い
→フロント的に渡しやすい形は何か。
→バックエンド的に扱いやすい受け取り方は何か
を考えてその整合性が合うように作っていくイメージ。
・工夫すること・考えること
### ◯基本はテーブル構造と合わせる
その方がparamsで受け取ったバックエンドがそのままDB保存しやすいので。ただ少しの加工でフロントでの取り回しがしやすいものになるならそれは許容してバックエンド側で調整する
### ◯propsはSOLID原則に則って設計する
コンポーネントの入り口となるpropsはすぐに窓口が広がりがちになるので、結構慎重に決めることが多い。どこまでをそのコンポーネントの責務とするかをちゃんと考えないと汎用性のないでかコンポーネントができるだけなのでSOLIDを基本にインターフェースを考える
## ③:レイアウト調整
デザイナーの意図を組むこと・不安であれば積極的に会話をすること・似たようなコンポーネントができないように共通化を意識すること
--------------------------------
## バックエンド領域の開発業務
## ①:MVCを基本に設計・実装する
モデルにはそのモデル特有のロジックを定義する
コントローラーには可能な限りロジックを含めない。あくまでフロントから受けとったparamsをDB保存していいかの関門のイメージ。
どういてもロジックを含める必要があったときは、モデル側で管理できないかや、サービス層に切り出すかなどを検討
ビューは実質Nextが担ってるので割愛。
## ②:テーブル設計について
基本はnull: false, 1対多, 多対多がわかる名前にする
migrationファイルは下記の優先度で実装する
1. migrate, rollbackが1回ずつ必ず実行できる
2. 既存データが死なないこと
3. 過去に戻ってもデータの整合性がとれること
## ③:モデルについて
validatesをちゃんとつける
→存在チェック、ユニーク制約、「特定のモデルがあるときは〇〇になる」のようなカスタムバリデもモデルに定義
has_many, belongs_toによる関連付けを行う
dependent: :restrict_with_error, dependent: :destroyで紐づくモデルの対応もする
外で使わないメソッドはprivateメソッドで管理
## ④:コントローラーについて
エラーメッセージはフロントで管理するのでエラーコードだけ返すようにする
permit処理の実施
--------------------------------
# その他
## undo/redo の実装
図形の削除→undoボタン押下→図形の復活
というようなundo(Command + Z の機能)を自作した
/task という1つのエンドポイントで管理して、そこに操作アクションを定義してそのアクションの逆操作も一緒に定義して, taskQueue, undoStack, redoStackを操作ごとに詰んだり消したりしてundo/redoが行えるように実装した
## 共同編集の実装
Action Cable というRailsの機能を使って、バックエンドからWebsocket経由でフロントに他の人の操作が反映されるようにした。