Skip to content

Commit d782450

Browse files
authored
Merge pull request #47 from SIT-DigiCre/chore/improve-architecture
ドキュメント追加とDBスキーマの改善
2 parents acd8801 + c6c1a1e commit d782450

File tree

26 files changed

+2022
-1006
lines changed

26 files changed

+2022
-1006
lines changed

.devcontainer/devcontainer.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
"stylelint.vscode-stylelint",
1515
"prisma.prisma",
1616
"eamodio.gitlens",
17-
"oderwat.indent-rainbow"
17+
"oderwat.indent-rainbow",
18+
"github.copilot",
19+
"github.copilot-chat"
1820
]
1921
}
2022
}

.github/workflows/lint.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ jobs:
1717
version: 9
1818
- name: Install dependencies
1919
run: pnpm install
20+
- name: Generate Prisma schema
21+
run: npx prisma generate
2022
- name: TypeScript Compile Check
2123
run: pnpm tsc --noEmit
2224
- name: Run ESLint

README.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,18 @@
22

33
芝浦工業大学デジクリのサークル内SNS「digichat」
44

5-
## 環境設定の手順
5+
## ドキュメント
6+
7+
| | |
8+
| ------------------ | -------------------------------------------- |
9+
| 環境構築 | [README.md](README.md) |
10+
| 開発ルール | [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md) |
11+
| 認証のセットアップ | [docs/AUTH_SETUP.md](docs/AUTH_SETUP.md) |
12+
| ADR | [docs/ADR.md](docs/ADR.md) |
13+
| Prismaの操作方法 | [prisma/README.md](prisma/README.md) |
14+
| データベース設計 | [prisma/ERD.md](prisma/ERD.md) |
15+
16+
## 環境構築の手順
617

718
### .envの用意
819

@@ -17,7 +28,7 @@ cp .env.sample .env
1728
画面左下の青いところをクリック。
1829
![](docs/images/readme-1.png)
1930

20-
その後、`コンテナーで開く`を選択。しばらく待つとDevContainerが自動で立ち上がる。
31+
その後、`コンテナーで開く`を選択。しばらく待つとDevContainerが自動で立ち上がる。以降、コマンドはDevContainer内で実行すること。
2132

2233
### 依存関係のインストール
2334

@@ -34,6 +45,7 @@ pnpm install
3445
```bash
3546
pnpm prisma migrate dev
3647
```
48+
3749
### seedデータの適用
3850

3951
マイグレーションが終わったらseedデータを適用する。

docs/ADR.md

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
# Architecture Decision Record (ADR)
2+
3+
## 目次
4+
5+
- [ADR-010: emoji-mart](#adr-010)
6+
- [ADR-009: tiptap](#adr-009)
7+
- [ADR-008: unified](#adr-008)
8+
- [ADR-007: Jest](#adr-007)
9+
- [ADR-006: ESLint, Prettier, Stylelint](#adr-006)
10+
- [ADR-005: CSS Modules](#adr-005)
11+
- [ADR-004: Mantine](#adr-004)
12+
- [ADR-003: PostgreSQL, Prisma, Auth.js](#adr-003)
13+
- [ADR-002: DevContainer, Docker](#adr-002)
14+
- [ADR-001: Next.js App Router, TypeScript, pnpm](#adr-001)
15+
16+
<h2 id="adr-010">ADR-010: emoji-mart</h2>
17+
18+
### Date
19+
20+
2025-02-23
21+
22+
### Context
23+
24+
emoji-martは、React用の絵文字ピッカーコンポーネントであり、ユーザーが絵文字を簡単に選択できるようにするためのライブラリである。
25+
Mattermostがemoji-martを採用しているため、同じライブラリを選定した。
26+
27+
<h2 id="adr-009">ADR-009: tiptap</h2>
28+
29+
### Date
30+
31+
2025-02-23
32+
33+
### Context
34+
35+
tiptapは、React用のWYSIWYGエディタであり、リッチテキストエディタを簡単に実装するためのライブラリである。
36+
tiptapは、カスタマイズ性が高く、プラグインを使用して機能を拡張することができる。
37+
38+
<h2 id="adr-008">ADR-008: unified</h2>
39+
40+
### Date
41+
42+
2025-02-23
43+
44+
### Context
45+
46+
unifiedは、MarkdownやHTMLなどの異なるフォーマットを統一的に扱うためのライブラリである。
47+
48+
本プロジェクトでは単純なテキストをMarkdownだけでなくTeXやReactコンポーネントに変換する必要があり、高度なカスタム変換が必要になるため、拡張性の高いunifiedやremark, rehypeを採用することにした。
49+
50+
<h2 id="adr-007">ADR-007: Jest</h2>
51+
52+
### Date
53+
54+
2025-12-14
55+
56+
### Context
57+
58+
Jestは、JavaScriptのテストフレームワークであり、ユニットテストや統合テストを簡単に実行することができる。
59+
60+
よりモダンなライブラリであるVitestを検討したが、メンバーにJestの経験者がいることや、Prismaのモックライブラリが存在することからJestを採用することにした。
61+
62+
<h2 id="adr-006">ADR-006: ESLint, Prettier, Stylelint</h2>
63+
64+
### Date
65+
66+
2024-12-14
67+
68+
### Context
69+
70+
ESLintは、JavaScriptの静的コード解析ツールであり、コードの品質を向上させるために使用される。
71+
Prettierは、コードフォーマッターであり、コードのスタイルを統一するために使用される。
72+
Stylelintは、CSSの静的コード解析ツールであり、CSSの品質を向上させるために使用される。
73+
74+
代替としてBiomeを検討したが、カスタムルールの作成に対応していないことや、まだ採用実績が少ないことから見送った。
75+
76+
<h2 id="adr-005">ADR-005: CSS Modules</h2>
77+
78+
### Date
79+
80+
2024-12-14
81+
82+
### Context
83+
84+
CSS Modulesは、CSSのスコープをコンポーネント単位で管理するための技術であり、スタイルの衝突を防ぐことができる。
85+
Tailwind CSSの導入も検討したが、複雑なUIを構築する場合、Tailwind CSSのユーティリティクラスが多くなり、可読性が低下する可能性があるため、CSS Modulesを採用することにした。
86+
87+
<h2 id="adr-004">ADR-004: Mantine</h2>
88+
89+
### Date
90+
91+
2024-12-14
92+
93+
### Context
94+
95+
MantineはReactのUIコンポーネントライブラリであり、デザインシステムを構築するためのコンポーネントやスタイルを提供している。
96+
コンポーネントやhooksの多さ、リリース頻度、React Server Componentへの対応などを考慮し、開発スピード向上とデザインの統一感を得るために採用することにした。
97+
98+
<h2 id="adr-003">ADR-003: PostgreSQL, Prisma, Auth.js</h2>
99+
100+
### Date
101+
102+
2024-12-14
103+
104+
### Context
105+
106+
既存の部内システムではMySQLを使用することが多かったが、拡張性の観点からPostgreSQLを採用することにした。
107+
108+
ORMとしてPrismaを採用することで、データベースの操作を簡素化することができる。Prismaはマイグレーション機能が充実しており、データベースのスキーマ変更を簡単に行うことができる。Prisma以外のORMも検討したが、エコシステムの充実度や採用実績を考慮し、Prismaを選択した。
109+
110+
Auth.jsは認証ライブラリであり、Google認証をはじめとするOAuth認証を簡単に実装することができる。
111+
112+
<h2 id="adr-002">ADR-002: DevContainer, Docker</h2>
113+
114+
### Date
115+
116+
2024-12-14
117+
118+
### Context
119+
120+
開発環境をDevContainerで提供することにした。これにより、開発環境の構築が容易になり、メンバー間での環境差異を減らすことができる。
121+
また、Dockerを使用することで、開発環境を簡単に再現できるため、新しいメンバーが参加した際の学習コストを削減できる。
122+
さらに、Dockerを使用することで、開発環境を本番環境に近づけることができるため、デプロイ時のトラブルを減らすことができる。
123+
124+
<h2 id="adr-001">ADR-001: Next.js App Router, TypeScript, pnpm</h2>
125+
126+
### Date
127+
128+
2024-12-14
129+
130+
### Context
131+
132+
Next.jsはReactのフレームワークであり、サーバーサイドレンダリングやファイルベースのルーティングなどの機能を提供している。
133+
134+
現段階においてサークル内にWebアプリケーションの開発経験があるメンバーが少ない。バックエンドにGoを採用することも検討したが、今後のメンバーの学習コストを考慮し、なるべく少ない技術領域で実装できるようフロント・バックともNext.jsで完結させることにした。
135+
136+
また、TypeScriptを採用することで、型安全性を確保し、開発効率を向上させることができる。
137+
138+
pnpmはNode.jsのパッケージマネージャーである。npmよりパッケージのインストール速度が速く、yarnのようにバージョンごとの破壊的変更がないため、pnpmを採用することにした。Bunの採用も検討したが、数は少ないながらも対応しているライブラリがあり、大規模プロジェクトにおける採用には不安が残るため見送った。

docs/CONTRIBUTING.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# Contributing
2+
3+
## 貢献方法
4+
5+
1. 機能追加やバグ修正を行った場合は、プルリクエストを作成してください。
6+
2. プルリクエストは、`main`ブランチに対して作成してください。
7+
3. 作業ブランチには`feat/``fix/`などのプレフィックスをつけることを推奨します。例: `feat/add-new-feature``fix/bug-fix`
8+
4. マージを行う前に、必ず1人以上のレビュアーにレビューを依頼してください。レビュアーは、プロジェクトメンバーの中から選択してください。GitHubでアサインしたうえで、Mattermostの`~system-development`チャンネルでメンションしてください。
9+
5. プロジェクトメンバーから1人以上の承認を得たら、プルリクエストをマージしてください。
10+
6. プルリクエストをマージしたら、作業ブランチは削除してください。
11+
7. 大きな機能を追加する場合や、検討が必要な点がある場合は、事前にIssueを作成するか、Mattermostの`~system-development`チャンネルで相談してください。
12+
13+
## ディレクトリ構成
14+
15+
```
16+
.
17+
├── .devcontainer
18+
├── .github
19+
├── .vscode
20+
├── app
21+
│ ├── _components
22+
│ ├── api
23+
│ ├── channels
24+
│ ├── layout.tsx
25+
│ └── page.tsx
26+
├── components
27+
├── libs
28+
├── types
29+
├── prisma
30+
├── repositories
31+
├── docs
32+
└── public
33+
```
34+
35+
## コーディング規則
36+
37+
規則は厳密な遵守を求めるものではなく、あくまで慣習をドキュメント化したものです。ただし、リンタやフォーマッタで指定されているものは遵守してください(大抵はスクリプトを実行することで自動修正されます)。
38+
39+
### TypeScript
40+
41+
- 原則としてinterfaceを使用せず、typeを使用してください。
42+
- `any`は使用しないでください。型がわからない場合は`unknown`を使用してください。
43+
- 関数にはできる限りJSDocを記述してください。
44+
- インポート時はファイルパスにエイリアスを使用してください。例: `#/components/MyComponent`
45+
- ただし、同階層や`_components`ディレクトリのファイルをインポートする場合は相対パスを使用しても構いません。
46+
47+
### React
48+
49+
- コンポーネントは関数コンポーネントを使用してください。クラスコンポーネントは使用しないでください。
50+
- 1ファイルにつき1コンポーネントを原則とします。
51+
- コンポーネント名はアッパーパスカルケース(先頭大文字)で記述してください。例: `MyComponent`
52+
53+
### CSS
54+
55+
- 原則としてCSS Modulesを使用してください。ファイル名は`[対応するReactコンポーネント名].module.css`としてください。
56+
- クラス名はケバブケース(ハイフンでつなげる)で記述してください。例: `my-component`

package.json

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,31 @@
1212
"seed": "npx prisma migrate reset --force & npx tsx ./prisma/seed/init.ts"
1313
},
1414
"dependencies": {
15-
"@auth/prisma-adapter": "^2.7.4",
15+
"@auth/prisma-adapter": "^2.8.0",
1616
"@emoji-mart/data": "^1.2.1",
1717
"@emoji-mart/react": "^1.1.1",
18-
"@mantine/code-highlight": "^7.15.1",
19-
"@mantine/core": "^7.15.1",
20-
"@mantine/hooks": "^7.15.1",
21-
"@mantine/modals": "^7.15.1",
22-
"@mantine/spotlight": "^7.15.1",
23-
"@mantine/tiptap": "^7.15.1",
24-
"@prisma/client": "^6.2.1",
25-
"@tabler/icons-react": "^3.24.0",
26-
"@tiptap/extension-image": "^2.11.5",
27-
"@tiptap/extension-link": "^2.10.3",
28-
"@tiptap/pm": "^2.10.3",
29-
"@tiptap/react": "^2.10.3",
30-
"@tiptap/starter-kit": "^2.10.3",
18+
"@mantine/code-highlight": "^7.17.3",
19+
"@mantine/core": "^7.17.3",
20+
"@mantine/hooks": "^7.17.3",
21+
"@mantine/modals": "^7.17.3",
22+
"@mantine/spotlight": "^7.17.3",
23+
"@mantine/tiptap": "^7.17.3",
24+
"@prisma/client": "^6.5.0",
25+
"@tabler/icons-react": "^3.31.0",
26+
"@tiptap/extension-image": "^2.11.7",
27+
"@tiptap/extension-link": "^2.11.7",
28+
"@tiptap/pm": "^2.11.7",
29+
"@tiptap/react": "^2.11.7",
30+
"@tiptap/starter-kit": "^2.11.7",
3131
"aws-sdk": "^2.1692.0",
3232
"clsx": "^2.1.1",
3333
"dayjs": "^1.11.13",
3434
"dayjs-plugin-utc": "^0.1.2",
3535
"emoji-mart": "^5.6.0",
36-
"next": "15.1.0",
36+
"next": "15.2.4",
3737
"next-auth": "5.0.0-beta.25",
38-
"react": "^19.0.0",
39-
"react-dom": "^19.0.0",
38+
"react": "^19.1.0",
39+
"react-dom": "^19.1.0",
4040
"rehype-katex": "^7.0.1",
4141
"rehype-parse": "^9.0.1",
4242
"rehype-raw": "^7.0.0",
@@ -46,29 +46,40 @@
4646
"remark-gfm": "^4.0.1",
4747
"remark-math": "^6.0.0",
4848
"remark-parse": "^11.0.0",
49-
"remark-rehype": "^11.1.1",
50-
"sharp": "^0.33.5",
49+
"remark-rehype": "^11.1.2",
50+
"sharp": "^0.34.0",
5151
"unified": "^11.0.5",
52-
"uuid": "^11.0.5"
52+
"uuid": "^11.1.0"
5353
},
5454
"devDependencies": {
55-
"@eslint/eslintrc": "^3",
55+
"@eslint/eslintrc": "^3.3.1",
5656
"@next/eslint-plugin-next": "^15.2.4",
57-
"@types/node": "^20.17.11",
58-
"@types/react": "^19",
59-
"@types/react-dom": "^19",
57+
"@types/node": "^22.14.0",
58+
"@types/react": "^19.1.0",
59+
"@types/react-dom": "^19.1.1",
6060
"@types/uuid": "^10.0.0",
61-
"eslint": "^9.16.0",
62-
"eslint-config-next": "15.1.0",
63-
"eslint-config-prettier": "^9.1.0",
61+
"eslint": "^9.24.0",
62+
"eslint-config-next": "15.2.4",
63+
"eslint-config-prettier": "^10.1.1",
6464
"eslint-plugin-import": "^2.31.0",
6565
"eslint-plugin-react-hooks": "^5.2.0",
66-
"prettier": "^3.4.2",
67-
"prisma": "^6.2.1",
68-
"stylelint": "^16.11.0",
69-
"stylelint-config-recess-order": "^5.1.1",
70-
"stylelint-config-standard": "^36.0.1",
71-
"typescript": "^5",
72-
"typescript-eslint": "^8.19.0"
66+
"prettier": "^3.5.3",
67+
"prisma": "^6.5.0",
68+
"prisma-markdown": "^1.0.9",
69+
"stylelint": "^16.17.0",
70+
"stylelint-config-recess-order": "^6.0.0",
71+
"stylelint-config-standard": "^37.0.0",
72+
"typescript": "^5.8.3",
73+
"typescript-eslint": "^8.29.0"
74+
},
75+
"pnpm": {
76+
"onlyBuiltDependencies": [
77+
"@prisma/client",
78+
"@prisma/engines",
79+
"aws-sdk",
80+
"esbuild",
81+
"prisma",
82+
"sharp"
83+
]
7384
}
7485
}

0 commit comments

Comments
 (0)