# プロジェクト概要
E2Cリモート接客システムの開発
**主な機能**
- チャットボットシステム
- リアルタイム有人チャット
- ビデオ通話, 画面共有機能
バックエンド、フロントエンド開発のアプリケーションチームとして従時。
新規0-1開発の要件定義フェーズから参画、Bizサイドとの打ち合わせ、詳細設計、実装、 テスト、 リリースまで行った。
現在はセカンドリリースに向けて新機能を開発中
## 担当業務
- Go, GraphQLでのAPI開発
- Next.js, GraphQL(ApploClient)でのフロントエンド開発
---
## Go, GraphQLでのAPI開発
### SendGrid(メール送信SaaS), Auth0を用いたユーザー登録・招待機能の実装
**使用した技術**
- SendGrid
- sendgrid-sdk-go
- Auth0
#### 詳細・気をつけたところ・工夫したところ
レイヤードアーキテクチャのinfra層からinterfaceを呼び出し各種APIを作成。数パターンの条件分岐に対応できるよう先にテストケースを洗い出しロジック実装を行った。
### S3への画像投稿APIの実装
**使用した技術**
- aws-sdk-go
- AWS S3
#### 詳細・気をつけたところ・工夫したところ
mainパッケージでDIPを行うことにより開発環境ではローカル上で静的ファイルを保持、本番環境ではクラウドにアップロード可能にした。
また追加実装があってもアップロード先を指定するだけで保存先を変更できるような実装にした。
### Redis Pub/Sub を使用したリアルタイムでの状態管理
**使用した技術**
- Redis keyspace notification
- go-redis/v8
- gqlgen Subscription
- websocket
#### 詳細・気をつけたところ・工夫したところ
サーバー起動時にgorutineでRedisのPSUBSCRIPTIONを待ち受ける。
keyspaceの機能を使用して各イベントに対してGraphQL側のSubscriptionで待ち受けているチャネルに流し込むことで状態管理を実現した。
この実装でgorutine, context, channelを多用し一気に理解を深めることができた。
工夫した点はcontext終了時にkey,valueを引継ぐパッケージを作成し追加実装があった時に対応できるようにした。
### GraphQL各種APIのスキーマ設計, 実装
**使用した技術**
- gqlgen
#### 詳細・気をつけたところ・工夫したところ
ビジネスロジックに必要な各種APIの設計と実装。
ビジネスロジックのコアとなるモデルのCRUDなAPI全般を開発した。
特に「GraphQLスキーマ設計ガイド」という書籍や、GitHubAPIを参考にした。
Query, Mutation, Subscription等のGraphQLの機能全般を習得。
工夫した点は、不要なAPIが増えやすい対策としてAPIをツリー構造で設計。N+1に対してのdataloader実装、グローバルID設計によるキャッシュの最適化を行なった。
### CI構築
#### 使用した技術
- GitHub Actions
- docker-compose
- Docker
- Ubuntu
#### 詳細・気をつけたところ・工夫したところ
1stリリースフェーズにてCI環境構築を行った。
開発環境ではdocker-composeで構築されておりコンテナ内でテストを走らせていた為、
同じ構成をCI上に再現する必要があった。問題はdocker-compose.ymlの配置されているレポジトリとAPIサーバーのレポジトリが別れており毎回 git clone して docker image build を行わないと行けないことだった。
GitHub ActionsでcacheライブラリとDocker save load 方式を採用しCI時間を2分の1に短縮した。
---
## Next.js, GraphQL(ApploClient)でのフロントエンド開発
### toB向けSaaS管理画面のフロントエンド実装
**使用した技術**
- ApolloClient
- react-hook-form
- tailwindcss
- WebRTC(skyway)
- graphql-codegen
- UIライブラリ複数
#### 詳細・気をつけたところ・工夫したところ
主にクライアントの管理画面側の実装を行なった。
特にこだわった点は クライアントとエンドユーザーのチャット+通話画面の実装。
サービスのコア部分という事もあり、UIUX・デザインに関してPM, デザイナーと綿密に議論した。
WebRTC接続での映像表示、各状態毎のボタン位置やリダイレクトのパターン、ガイダンスの吹き出しなどを実装し、かなり満足のいく機能へとブラッシュアップできた。
クライアントからもご好評頂いた。
その他、API側とセットで各種機能の実装。
---
**その他**
ログレベルの設計・実装、APIテスト(goledenテスト)
---
## 習得したスキル
- GoでのAPI開発
- アーキテクチャ設計(レイヤードアーキテクチャ)
- NoSQL (Redis)での状態管理
- WebSocket, Redis Pub/Sub でのリアルタイム通信
- goroutine を用いた並列処理
- GraphQLでのAPI実装, スキーマ設計
- ApolloClientでのフロンエンド開発