個人開発　Habitica-外部連携　詳細設計 バッチ処理


## 詳細設計とは
```
詳細設計とは、工程として基本設計の後に実施され、基本設計された動作・振る舞い・構造を
プログラム及びプログラムのモジュール構造に合わせた適切な形に変換し、プログラムに必要な情報を
決定、記述することです。
```

ソフトウェア、フレームワークに依存する考え方。

内部設計とも呼ばれる場合がある

# インプットとなる資料

https://qiita.com/RYA234/items/8a0016fc057cd977c44f

# 成果物


## 開発環境

名称|バージョン|説明
------------|---------|---
Windows|10|OS
Docker|---|コンテナ型仮想環境
Node.js|latest|Javascript実行環境
TypeScript|latest|プログラム言語
PostgreSQL|14.0|データベース
node-postgres|3.4.5|PostgreSQLのデータベースアクセスするためのライブラリ


※ BIツールの選定についてはまだ未着手

```plantuml
@startuml
title:開発環境
left to right direction
node Windows10{
node Docker_DB {
  database PostgreSQL as "PostgreSQL"

}

node Docker_App {
    component app as "Node.js"{
     card "Typescript"
    }
   
  }
component client_app as "VS_CODE \n IDE"
component db_client_app as "A5_SQL\nDBクライアントソフト"

}


node web{
component Api as "HabiticaAPI"
}
client_app --> app
db_client_app --> PostgreSQL
app --> PostgreSQL
app --> Api


@enduml
```

## 本番環境


```plantuml
@startuml
title:本番環境
left to right direction

node Windows10(myPC){
component BI as "BIツール"
}


node miniPC{
node Docker_DB {
  database PostgreSQL as "PostgreSQL"
}

node Docker_App {
    component app as "Node.js"{
     card "Typescript"
    }
   
  }

}


node web{
component Api as "HabiticaAPI"
}
app --> PostgreSQL
app --> Api
BI --> PostgreSQL
@enduml
```



#


## クラス図
オブジェクト指向言語のプログラム構造を図で表現するための図

```plantuml
@startuml

class  "HaibiticaTaskRepository" as Repository
class "HabiticaTaskService" as Service
class "HabiticaTaskController" as Batch
class "HabiticaTaskApi" as Api
interface "HabiticaTaskApiResponse" as ApiResponse
interface "HabiticaTaskModel.d" as Model


Model <-- Repository : use
Repository <-- Service : use
Api <-- Service : use
ApiResponse <-- Api : use
ApiResponse <-- Service : use
Service <-- Batch : use


Repository : insertTasks(habiticaTaskModels: HabiticaTaskModel[]):bool
Batch : run() : void

Api : public getTasks() :Promise<HabiticaTask[]>
Service : public storeRecord():Promise<void>
Service : responseToModel(habiticaTask : HabiticaTask):HabiticaTaskModel

@enduml


```

クラス名|説明
-------|----
HabiticaTaskController|エントリーポイント
HabiticaTaskService|</br>今回はビジネスロジックの実装はなし<br>API実行とDB書き込みのクラスを呼ぶクラス。
HabiticaTaskApi|HabiticaAPIを使うクラス
HabiticaTaskResponse|APIのレスポンス情報
HaibiticaTaskRepository|データベースにアクセスするための処理
HabiticaTaskModel|テーブル情報

## シーケンス図

実行時のインスタンスのメソッド呼び出しを時系列に表現

```plantuml
@startuml
title:動作（エラーなし）
autonumber

participant Linux
participant Controller as "HabiticaTask\nController"
participant Service as "HabiticaTask\nService"
participant Api as "Habitica\nTaskApi"
participant Repository as "Habitica\nRepository"


Linux --> Controller:linux\nコマンドで実行
activate Controller
Controller --> Service:処理部分に移行する
activate Service
Service --> Api:APIを呼ぶ
Api --> Service:レスポンスを取得する

Service --> Repository:データベースにapiで取得したデータを書き込む
Repository --> Service:成功する
Service --> Controller:
deactivate Service

Controller --> Linux:ログに「処理終了」と残る
deactivate Controller

@enduml


```



## 処理詳細
項目|値
----|---
トランザクション|単一トランザクション
多重処理|今回は一つの処理だけなので考慮しない



# 参考書籍


## 詳細設計とは
書籍：システム設計の謎を解く p14

## バッチ機能を設計する
書籍：システム設計の謎を解く p189-193

## クラス図
書籍：オブジェクト指向でなぜつくるのか　p210

## シーケンス図
書籍：オブジェクト指向でなぜつくるのか　p217

## 個人開発
https://qiita.com/RYA234/items/c7918ebadb035c12aca2