# Gdriveシステム仕様書
[TOC]
## 関数・クラスの各メソッドのインターフェース・機能
### GooglePJ自作モジュール
#### Account App
##### Accountクラス
**本体設計**
Location: `account/lib/account.py`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| get_account | メールアドレス | アカウント情報(辞書) | 操作可能なアカウントの取得 |
| post_account | アカウントクレデンシャル | アカウント情報(辞書) | 操作可能なアカウントの追加 |
**対応するテストの設計**
Location: `tests/account/lib/test_account.py`
継承: `unittest.TestCase`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_construct| | | コンストラクターのテスト<br>出力とエラーのチェック|
| test_get_account| | | get_accountのテスト<br>出力とエラーのチェック|
| test_post_account| | | post_accountのテスト<br>出力とエラーのチェック|
#### Gdrive App
##### Gdriveクラス
**本体設計**
Location: `drive/lib/drive.py`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| oauth|アカウントid, アカウントのメールアドレス, oathクライアントid, クライアントメールアドレス| | Oauth認証を通す|
| file_exist | file_id | ブール値 |ファイルが存在するかどうか判断する|
| get_account | メールアドレス | アカウント情報(辞書) | 操作可能なアカウントの取得 |
| post_account | アカウントクレデンシャル | アカウント情報(辞書) | 操作可能なアカウントの追加 |
| get_file_contents | ファイルのid | ファイル本体 | idからファイルそのものを取り出す |
| get_file_metadata | ファイルのid | ファイルメタデータ(辞書) | idからファイルのメタデータを取得する |
| change_file_metadata | ファイルのid , ファイルメタデータ| | ファイルメタデータを変更する|
| upload_file | ファイルを追加するフォルダのid, ファイルパス | | ファイルを指定フォルダへアップロードする|
| delete | ファイルのid | | ファイルを削除する |
| search | クエリ | ファイルidのリスト | ファイルを検索する|
| create_folder | parent_file_id, フォルダ名 | | フォルダ作成 |
| share | ファイルのid、共有タイプ、役割、共有先のメール | | ファイルを共有する |
**対応するテストの設計**
Location: `tests/drive/lib/test_drive.py`
継承: `unittest.TestCase`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_construct | | | コンストラクタのテスト|
| test_oauth | | | oauthのテスト<br>出力とエラーのチェック|
| test_file_exist | | | file_existのテスト<br>出力とエラーのチェック|
| test_get_file_contents | | | file_contentsのテスト<br>出力とエラーのチェック|
| test_get_file_metadata | | | file_metadataのテスト<br>出力とエラーのチェック|
| test_upload_file | | | upload_file のテスト<br>出力とエラーのチェック|
| test_create_folder | | | create_folder のテスト<br>出力とエラーのチェック|
| test_delete | | | get_deleteのテスト<br>出力とエラーのチェック|
| test_share | | |share のテスト<br>出力とエラーのチェック|
| test_search | | | searchのテスト<br>出力とエラーのチェック|
#### Spreadsheet App
##### Spreadsheetクラス
**本体設計**
Location: `spreadsheet/lib/spreadsheet.py`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
|oauth |アカウントid, アカウントのメールアドレス, oathクライアントid, クライアントメールアドレス| |Oauth認証を通す|
|get_workbook |アカウントid|ワークブックのid、名前|指定したアカウントで操作可能なスプシの取得|
|put_workbook |アカウントid | ワークブックのid、名前|シートの作成|
|get_worksheet |アカウントid,ワークブックid|ワークブックのindex,名前|指定したアカウントとスプシに存在するシートの取得|
|delete_worksheet |アカウントid,ワークブックid|ワークブックのindex,名前|指定したアカウントとスプシに存在するシートの削除|
|get_share |アカウントid, ワークブックid |ワークブックのindex |共有情報の取得|
|patch_share | アカウントid, ワークブックid |ワークブックのindex |共有情報の更新|
|get_sheet |アカウントid,ワークブックid,index|セルの情報(id,row_index,col_index,テキスト)|アカウント、ワークブックの情報からシートのセルの情報を取得する|
|patch_sheet |アカウントid,ワークブックid,index, セルの情報(id,row_index,col_index,テキスト)|セルの情報(id,row_index,col_index,テキスト)|シートのセルの情報を更新する|
**対応するテストの設計**
Location: `tests/spreadsheet/lib/test_spreadsheet.py`
継承: `unittest.TestCase`
| テスト名 | テスト関数 | テスト内容 |
| --- | --- | --- |
| test_oauth | oauth | 関数のエラーテスト、出力のテスト|
| test_get_workbook |get_workbook|関数のエラーテスト、出力のテスト|
| test_put_workbook |put_workbook |関数のエラーテスト、出力のテスト|
| test_get_wotksheet |get_worksheet|関数のエラーテスト、出力のテスト|
| test_delete_worksheet |delete_worksheet|関数のエラーテスト、出力のテスト|
| test_get_share |get_share|関数のエラーテスト、出力のテスト|
| test_patch_share |patch_share|関数のエラーテスト、出力のテスト|
| test_get_share |get_sheet|関数のエラーテスト、出力のテスト|
| test_patch_sheet |patch_sheet|関数のエラーテスト、出力のテスト|
### View
#### Account App
##### ExisitingAccountViewクラス
**本体設計**
Location: `account/views.py`
| メソッド | 引数 | 戻り値 | 機能 | 使うメソッド |
| --- | --- | --- | --- | --- |
| get | | account_id(mail) | ドライブアカウントごとに認証が必要 ドライブアカウント-tokenは内部で保持しておく | oauth(get_account) |
**対応するテストの設計**
Location: `tests/account/test_views.py`
継承: `django.test.Client`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_get | | | ExisitingAccountViewのgetのテスト |
##### NewAccountViewクラス
**本体設計**
Location: `account/views.py`
| メソッド | 引数 | 戻り値 | 機能 | 使うメソッド |
| --- | --- | --- | --- | --- |
| get | | url | Oauth2.0の認証フローを開始するために必要なurlを提供する | |
| post | url, account_id(mail) | account_id(mail) | 追加されたアカウントを返す | oauth(post_account) |
**対応するテストの設計**
Location: `tests/account/test_views.py`
継承: `django.test.Client`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_get | | | NewAccountViewのgetのテスト |
| test_post | | | NewAccountViewのpostのテスト |
#### Gdrive App
##### GdriveFileViewクラス
**本体設計**
Location: `drive/views.py`
| メソッド | 引数 | 戻り値 | 機能 | 使うメソッド |
| --- | --- | --- | --- | --- |
| get | account_id, file_id, content | metadata, content | ファイルのデータの中身や、ファイルのメタ情報を取得する | get_file_contents, get_file_metadata |
| delete | account_id, file_id | message | ファイルを削除する | delete |
| patch | account_id, file_id, VariableFileMetadata | message | ファイルメタデータ変更 | change_file_metadata ~~, share~~ |
| post | account_id, file_id, content | message | ファイルをアップロードする | ~~create_folder,~~ upload_file |
**対応するテストの設計**
Location: `tests/drive/test_views.py`
継承: `django.test.Client`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_get | | | GdriveFileViewのgetのテスト |
| test_delete | | | GdriveFileViewのdeleteのテスト |
| test_patch | | | GdriveFileViewのpatchのテスト |
| test_post | | | GdriveFileViewのpostのテスト |
##### GdriveSearchViewクラス
**本体設計**
Location: `drive/views.py`
| メソッド | 引数 | 戻り値 | 機能 | 使うメソッド |
| --- | --- | --- | --- | --- |
| get | account_id, query | message | クエリで絞り込んでファイルのIDのリストを返す| search |
**対応するテストの設計**
Location: `tests/drive/test_views.py`
継承: `django.test.Client`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_get | | | GdriveSearchViewのgetのテスト |
---
#### Spreadsheet App
##### workbookViewクラス
**本体設計**
Location:`spreadsheet/views.py `
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
|get|アカウントid|ワークブックのid、名前|指定したアカウントで操作可能なスプシの取得|
|put|アカウントid | ワークブックのid、名前|シートの作成|
**対応するテストの設計**
Location: `tests/spreadsheet/test_views.py`
継承:`django.test.Client`
| テスト名 | テスト関数 | テスト内容 |
| --- | --- | --- |
| test1_get_workbook |get_workbook|APIのテスト|
| test1_put_workbook |put_workbook |APIのテスト|
Location:`spreadsheet/views.py `
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
|get|アカウントid,ワークブックid|ワークブックのindex,名前|指定したアカウントとスプシに存在するシートの取得|
|delete|アカウントid,ワークブックid|ワークブックのindex,名前|指定したアカウントとスプシに存在するシートの削除|
**対応するテストの設計**
Location: `tests/spreadsheet/test_views.py`
継承:`django.test.Client`
| テスト名 | テスト関数 | テスト内容 |
| --- | --- | --- |
| test1_get_wotksheet |get_worksheet|APIのテスト|
| test1_delete_worksheet |delete_worksheet|APIのテスト|
##### shareViewクラス
**本体設計**
Location:`spreadsheet/views.py `
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| get |アカウントid, ワークブックid |ワークブックのindex |共有情報の取得|
| patch | アカウントid, ワークブックid |ワークブックのindex |共有情報の更新|
**対応するテストの設計**
Location: `tests/spreadsheet/test_views.py`
継承:`django.test.Client`
| テスト名 | テスト関数 | テスト内容 |
| --- | --- | --- |
| test1_get_share |get_share|APIのテスト|
| test1_patch_share |patch_share|APIのテスト|
##### sheetViewクラス
**本体設計**
Location:`spreadsheet/views.py `
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| get |アカウントid,ワークブックid,index|セルの情報(id,row_index,col_index,テキスト)|アカウント、ワークブックの情報からシートのセルの情報を取得する|
| patch |アカウントid,ワークブックid,index, セルの情報(id,row_index,col_index,テキスト)|セルの情報(id,row_index,col_index,テキスト)|シートのセルの情報を更新する|
**対応するテストの設計**
Location: `tests/spreadsheet/test_views.py`
継承:`django.test.Client`
| テスト名 | テスト関数 | テスト内容 |
| --- | --- | --- |
| test1_get_sheet |get_sheet|APIのテスト|
| test1_patch_sheet |patch_sheet|APIのテスト|
### Serializer
#### Account App
##### AccountCredentialSerializerクラス
**本体設計**
Location: `account/serializer.py`
| メソッド | 引数 | 戻り値 | 機能 | 使うメソッド |
| --- | --- | --- | --- | --- |
| create | validated_data | Accountインスタンス | Accountクラスを呼び出し、バリデーション済みの認証情報をDBへ保存する| Account.post_account |
**対応するテストの設計**
Location: `tests/account/test_serializer.py`
継承: `django.test.SimpleTestCase`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_get_selializer | | | AccountCredentialSerializerの.data, is_valid()のテスト |
| test_create_selializer | | | AccountCredentialSerializerのcreateのテスト |
#### Drive App
##### FileIdentificationSerializerクラス
**本体設計**
Location: `drive/serializer.py`
| メソッド | 引数 | 戻り値 | 機能 | 使うメソッド |
| --- | --- | --- | --- | --- |
**対応するテストの設計**
Location: `tests/drive/test_serializer.py`
継承: `django.test.SimpleTestCase`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_get_selializer | | | FileIdentificationSerializerの.data, is_valid()のテスト |
##### FileMetatdataSerializerクラス
**本体設計**
Location: `drive/serializer.py`
| メソッド | 引数 | 戻り値 | 機能 | 使うメソッド |
| --- | --- | --- | --- | --- |
| create | validated_data | Driveインスタンス | Driveクラスを呼び出し、バリデーション済みのファイルメタデータをDriveへ保存する| Account.post_account |
| update | validated_data | Driveインスタンス | Driveクラスを呼び出し、バリデーション済みのファイルメタデータでDriveを更新する| Account.post_account |
**対応するテストの設計**
Location: `tests/drive/test_serializer.py`
継承: `django.test.SimpleTestCase`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_get_selializer | | | FileMetatdataSerializerの.data, is_valid()のテスト |
| test_create_selializer | | | FileMetatdataSerializerのcreateのテスト |
| test_update_selializer | | | FileMetatdataSerializerのupdateのテスト |
##### FileContentSerializerクラス
**本体設計**
Location: `drive/serializer.py`
| メソッド | 引数 | 戻り値 | 機能 | 使うメソッド |
| --- | --- | --- | --- | --- |
| create | validated_data | Driveインスタンス | Driveクラスを呼び出し、バリデーション済みのファイルデータをDriveへ保存する| Account.post_account |
**対応するテストの設計**
Location: `tests/drive/test_serializer.py`
継承: `django.test.SimpleTestCase`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_get_selializer | | | FileContentSerializerの.data, is_valid()のテスト |
| test_create_selializer | | | FileContentSerializerのcreateのテスト |
#### Spreadsheet App
##### WorkBookSerializer
* workbook_id
**本体設計**
Location: `spreadsheet/serializer.py`
| メソッド | 引数 | 戻り値 | 機能 | 使うメソッド |
| --- | --- | --- | --- | --- |
| create | validated_data | Spreadsheetインスタンス | Spreadsheetインスタンスにデータを入力する| |
**対応するテストの設計**
Location: `tests/spreadsheet/test_serializer.py`
継承: `django.test.SimpleTestCase`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_get_selializer | | | FileContentSerializerの.data, is_valid()のテスト |
| test_create_selializer | | | FileContentSerializerのcreateのテスト |
##### WorkSheetSerializer(WorkBookSerializer継承)
* worksheet_id
**本体設計**
Location: `spreadsheet/serializer.py`
| メソッド | 引数 | 戻り値 | 機能 | 使うメソッド |
| --- | --- | --- | --- | --- |
| create | validated_data | Spreadsheetインスタンス |Spreadsheetインスタンスにデータを入力する| |
**対応するテストの設計**
Location: `tests/spreadsheet/test_serializer.py`
継承: `django.test.SimpleTestCase`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_get_selializer | | | FileContentSerializerの.data, is_valid()のテスト |
| test_create_selializer | | | FileContentSerializerのcreateのテスト |
##### CellSerializer(WorkSheetSerializer継承)
* cell
* id
* row_index
* col_index
* text
**本体設計**
Location: `spreadsheet/serializer.py`
| メソッド | 引数 | 戻り値 | 機能 | 使うメソッド |
| --- | --- | --- | --- | --- |
| create | validated_data | Spreadsheetインスタンス | Spreadsheetインスタンスにデータを入力する| |
**対応するテストの設計**
Location: `tests/spreadsheet/test_serializer.py`
継承: `django.test.SimpleTestCase`
| メソッド | 引数 | 戻り値 | 機能 |
| --- | --- | --- | --- |
| test_get_selializer | | | FileContentSerializerの.data, is_valid()のテスト |
| test_create_selializer | | | FileContentSerializerのcreateのテスト |
## システム概要
### システム構成図
![image][Spreadsheet-UML.png]
### 機能一覧
* ファイルを登録する
### API設計
> APIを提供する場合
* swaggerのリンクをここに登録する
### ディレクトリ構成
``` python
root
|-- drive (<- Google Drive ディレクトリ)
| |-- __init__.py
| |-- admin.py
| |-- apps.py
| |-- migrations
| | `-- __init__.py
| |-- models.py
| |-- urls.py
| |-- selializer.py
| |-- views.py
| `-- lib
| |-- drive.py
| `-- __init__.py
|-- spreadsheet (<- Google Spreadsheet ディレクトリ)
| |-- __init__.py
| |-- admin.py
| |-- apps.py
| |-- migrations
| | `-- __init__.py
| |-- models.py
| |-- urls.py
| |-- selializer.py
| |-- views.py
| `-- lib (<- Drive用の自作ライブラリディレクトリ)
| |-- spreadsheet.py
| `-- __init__.py
|-- account (<- account ディレクトリ)
| |-- __init__.py
| |-- admin.py
| |-- apps.py
| |-- migrations
| | `-- __init__.py
| |-- models.py
| |-- urls.py
| |-- selializer.py
| |-- views.py
| `-- lib (<- Account用の自作ライブラリディレクトリ)
| |-- account.py
| `-- __init__.py
|-- manage.py
|-- config (<- 設定ディレクトリ)
| |-- __init__.py
| |-- asgi.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
|-- lib (<- 共用の自作ライブラリディレクトリ)
| |-- __init__.py
| `-- main.py
`-- tests (<- testディレクトリ)
|-- lib (<- 共用の自作ライブラリディレクトリ)
| |-- __init__.py
| `-- test_main.py (<- unittest.TestCase)
|-- drive
| |-- __init__.py
| |-- test_urls.py (<- SimpleTestCase)
| |-- test_selializer.py (<- SimpleTestCase)
| |-- test_views.py (<- django.test.Client)
| `-- lib
| |-- __init__.py
| `-- test_drive.py
|-- account
| |-- __init__.py
| |-- test_urls.py (<- SimpleTestCase)
| |-- test_selializer.py (<- SimpleTestCase)
| |-- test_views.py (<- django.test.Client)
| `-- lib
| |-- __init__.py
| `-- test_account.py
`-- spreadsheet
|-- __init__.py
|-- test_urls.py (<- SimpleTestCase)
|-- test_selializer.py (<- SimpleTestCase)
|-- test_views.py (<- django.test.Client)
`-- lib
|-- __init__.py
`-- test_spreadsheet.py
```
### ルーティング
rootのurls
`/google/drive` -> drive app
`/google/spreadsheet` -> spreadsheet app
`/google/account` -> account app
driveのurls
`/files/<account_id>/<file_id>` -> GdriveFileView
`/files/<account_id>/search` -> GdriveSearchView
spreadsheetのurls
`/sheets/{account_id}` -> GdriveFileView
`/sheets/{account_id}/{workbook_id}` -> workbookView
`/sheets/{account_id}/{workbook_id}/share` -> shareView
`/sheets/{account_id}/{workbook_id}/{worksheet_index}` -> sheetView
### 疑問
* URLのパスパラメータにメールアドレスを含めることに問題はあるか
現状だと<account_id>がメールアドレスになる
もしaccount_idをメールアドレス以外の一意のものにするべきなら、accountのPOSTで自分で決めたidも投げてもらう or こっちで適当にidをふる