Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.

Add force ondemand api mode#64

Merged
akiomik merged 4 commits intodevelopmentfrom
add-force-ondemand-api-mode
Jan 14, 2022
Merged

Add force ondemand api mode#64
akiomik merged 4 commits intodevelopmentfrom
add-force-ondemand-api-mode

Conversation

@akiomik
Copy link
Copy Markdown
Contributor

@akiomik akiomik commented Dec 10, 2021

スクリーンショット 2021-12-10 19 09 35

@akiomik akiomik force-pushed the add-force-ondemand-api-mode branch 3 times, most recently from 1060529 to 0cb33ab Compare December 10, 2021 09:53
Comment thread src/api/v3/client.ts Outdated
Copy link
Copy Markdown
Contributor

@shoe116 shoe116 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

差分は良さそう。
リリースする前にドキュメント加筆しないと危険だな。

@akiomik akiomik changed the title Add force ondemand api mode [DO NOT MERGE] Add force ondemand api mode Dec 11, 2021
@akiomik
Copy link
Copy Markdown
Contributor Author

akiomik commented Dec 11, 2021

  • この修正はドキュメントが対応されてからリリースしたい
  • 他の修正は先にリリースする可能性がある

ため、他のリリースをブロックしないようにマージは一旦保留します。

@akiomik akiomik self-assigned this Dec 11, 2021
@akiomik akiomik force-pushed the add-force-ondemand-api-mode branch from 1800fcb to f1e82e9 Compare December 13, 2021 01:16
@akiomik
Copy link
Copy Markdown
Contributor Author

akiomik commented Dec 13, 2021

バグ修正は #65 に切り出してrebaseしました。

Comment thread src/setting.ts Outdated
Comment on lines +35 to +33
public set forceOndemandApiEnabled(forceOndemandApiEnabled: boolean) {
this._forceOndemandApiEnabled = forceOndemandApiEnabled
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this._ondemandApiEnabledfalse だったら exception にしたいな。
逆に、 set ondemandApiEnabled のほうにも、forceOndemandApiEnabled だったら exception 吐くようにしておきたい。

UI でも validation するべきだと思うけど、 Setting class も「自身の辻褄」を守ってほしい

@akiomik akiomik force-pushed the add-force-ondemand-api-mode branch from f1e82e9 to 324d65a Compare January 14, 2022 02:12
@akiomik
Copy link
Copy Markdown
Contributor Author

akiomik commented Jan 14, 2022

conflictしてたのでrebaseしました。

@akiomik
Copy link
Copy Markdown
Contributor Author

akiomik commented Jan 14, 2022

いくつかの実装変更を行いました。

  • be61bb5

    • 従量課金モードが有効になっていない場合に強制従量課金モードがオンにできないよう、UIと Setting クラスレベルで整合性を取るように変更
    • サイドバーのスタイル変更
  • 0889695

    • 将来の拡張性のために、 Setting.forceOndemandApiEnabled というフラグの代わりに Setting.ondemandApiCallMode というステータスを持つように変更

スクリーンショット

以下のシナリオを実行してみています。

  • 初期状態 (従量課金モードと強制従量課金モードが無効) で設定画面を開き、従量課金モードを有効にして保存
  • 従量課金モードのみ有効な状態で設定画面を開き、強制従量課金モードも有効にして保存
  • 従量課金モードと強制従量課金モードが有効な状態で設定画面を開き、従量課金モードを無効にして保存 (強制従量課金モードも無効化される)
2022-01-14.18.17.08.mov

Comment on lines -81 to +97
result = bcodeDaily(client, ticker, parsedPeriod, propertyName, setting.ondemandApiEnabled)
result = bcodeDaily(
client,
ticker,
parsedPeriod,
propertyName,
setting.ondemandApiEnabled,
setting.isOndemandApiCallModeForce()
)
} else {
result = bcodeQuarter(client, ticker, parsedPeriod, propertyName, setting.ondemandApiEnabled)
result = bcodeQuarter(
client,
ticker,
parsedPeriod,
propertyName,
setting.ondemandApiEnabled,
setting.isOndemandApiCallModeForce()
)
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BCODE のquarterとdailyそれぞれに雑に setting.isOndemandApiCallModeForce() を渡していますが、将来的には Setting に応じた従量課金の挙動を決定するストラテジークラスみたいなのを実装できると綺麗になりそうです。

Comment thread src/main.ts
const setting = Setting.load()
setting.setDefaultToken()
setting.setDefaultOndemandApiEnabled()
setting.setDefaultOndemandApiCallMode()
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

インストール時に従量課金モードの初期状態を default (5年以上前のデータは従量課金エンドポイントを利用し、それ以外は定額エンドポイント利用する) にします。

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これを default って呼ぶかどうかがだいぶ難しいところだけど、まぁ

Copy link
Copy Markdown
Contributor Author

@akiomik akiomik Jan 14, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

元々は naive とかにしようとしたけどどのみち伝わらないし、短い言葉で説明するのは限界があるなと思って default としました。結局ただのプレースホルダだしまあなんでもいいかなと。

Comment on lines -38 to +46
const ondemandQuarterApiPeriods = ondemandQuarterApiPeriodRange.selectOndemandQuarterApiPeriod(ticker, range)
const quarterApiPeriods = ondemandQuarterApiPeriodRange.filterOndemandQuarterApiPeriod(ticker, range)
let ondemandQuarterApiPeriods = []
let quarterApiPeriods = []

if (setting.isOndemandApiCallModeForce()) {
ondemandQuarterApiPeriods = range.range()
} else {
ondemandQuarterApiPeriods = ondemandQuarterApiPeriodRange.selectOndemandQuarterApiPeriod(ticker, range)
quarterApiPeriods = ondemandQuarterApiPeriodRange.filterOndemandQuarterApiPeriod(ticker, range)
}
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CSVのダウンロード機能は、従量課金モードが default の場合はよしなに従量課金のレンジと定額のレンジに分割して叩き分けますが、従量課金モードが force の場合はすべてのレンジを従量課金として扱います。

Comment thread src/setting.ts
Comment on lines -7 to +19
private constructor(private _token, private _ondemandApiEnabled) {}
private constructor(
private _token: string,
private _ondemandApiEnabled: boolean,
private _ondemandApiCallMode: 'default' | 'force'
) {}
Copy link
Copy Markdown
Contributor Author

@akiomik akiomik Jan 14, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

もう少し頑張れば ondemandApiCallModes から 'default' | 'force' という直和型を作るようにできそうだったのですが、時間がかかりそうだったので素朴にstring literalで実装してます。

Comment thread src/setting.ts
Comment on lines +78 to 80
if (!this.ondemandApiEnabled && this.ondemandApiCallMode !== Setting.defaultOndemandApiCallMode) {
return false
}
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

従量課金がオフなのに従量課金モードが default じゃない場合はinvalidとして扱っています。

Comment thread src/setting.ts
Comment on lines +7 to +9
input[disabled] + label {
text-color: #777;
}
Copy link
Copy Markdown
Contributor Author

@akiomik akiomik Jan 14, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

disabled なinput要素に隣り合う label 要素をグレーアウトさせるcssです。

Comment on lines +108 to +111
<li>
<input id="force-ondemand-api-check" type="checkbox" disabled="disabled">
<label for="force-ondemand-api-check"><b>常に従量課金APIを利用する (制限回避モード)</b></label>
</li>
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

設定の読み込みが非同期なので、初期状態では強制従量課金モードは disabled にしています。設定読み込みが完了したときに従量課金が有効になっていたら disabled を解除しています。

Comment on lines +54 to 66
function onOndemandApiCheckChange() {
const ondemandApiEnabled = document.getElementById('ondemand-api-check').checked
const forceOndemandApiCheck = document.getElementById('force-ondemand-api-check')

// ondemand-api-checkの変更の都度初期化する
forceOndemandApiCheck.checked = false;

if (ondemandApiEnabled) {
forceOndemandApiCheck.disabled = false;
} else {
forceOndemandApiCheck.disabled = true;
}
}
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

従量課金を有効にするチェックボックスのオンオフが切り替わったときに呼ばれる関数です。
状態が変わったらその都度強制従量課金モードはオフにしています。また、従量課金が有効になっている場合のみ、従量課金モードのチェックボックスを触れるようにしています。

Comment thread src/ui/setting-sidebar.ts
Comment on lines 3 to 16
export function loadSetting(): object {
return Setting.load().toObject()
const setting = Setting.load()
const obj = setting.toObject()
obj['forceOndemandApiEnabled'] = setting.isOndemandApiCallModeForce()
return obj
}

export function saveSetting(token: string, ondemandApiEnabled: boolean): void {
export function saveSetting(token: string, ondemandApiEnabled: boolean, forceOndemandApiEnabled: boolean): void {
const setting = Setting.load()
setting.token = token
setting.ondemandApiEnabled = ondemandApiEnabled
setting.ondemandApiCallMode = forceOndemandApiEnabled ? 'force' : 'default'
setting.save()
}
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UI上は「強制従量課金モードが有効かどうか」というbooleanで持ち、アプリ内での実データは 「従量課金モードがどれか」という持ち方を行っているため、そのデータをUIからの設定読み出し時に相互に変換しています。

Comment thread tsconfig.json
"compilerOptions": {
"sourceMap": true,
"target": "es5",
"lib": ["es2017"],
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Object.valuesArray.includes が使えないのが不便だったのでes2017形式で書けるように変更してます。出力はes5形式のままです。

@akiomik akiomik changed the title [DO NOT MERGE] Add force ondemand api mode Add force ondemand api mode Jan 14, 2022
Copy link
Copy Markdown
Contributor

@shoe116 shoe116 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

例外処理のところだけ、好みですが気になりました

Comment thread src/main.ts
const setting = Setting.load()
setting.setDefaultToken()
setting.setDefaultOndemandApiEnabled()
setting.setDefaultOndemandApiCallMode()
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これを default って呼ぶかどうかがだいぶ難しいところだけど、まぁ

Comment thread src/setting.ts
@akiomik akiomik merged commit 0a33634 into development Jan 14, 2022
@akiomik akiomik deleted the add-force-ondemand-api-mode branch January 14, 2022 10:18
@akiomik akiomik mentioned this pull request Jan 14, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants