-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
✨ add FilterDuration and replace FilterTime in InitPostEvent… #544
Conversation
ある期間中(例: 今日中)にイベントが開催される瞬間があるかどうかをフィルターするために
traQに送信されるメッセージに時刻だけでなく日付の情報もわかるようにした(例) ## 06/20(Thu) の進捗部屋
本日は予約を取っていないようです。
## 06/20(Thu) 開催予定のイベント
本日開催されるイベントは、
- [イベント1](origin/events/61f5219b-ffb7-4546-9b6d-7ac1a9367c19) 06/19:13:00 ~ 06/23:13:00 @Discord
- [イベント2](origin/events/72173508-348d-4021-8d0e-557912a09728) 06/20:12:00 ~ 06/20:18:00 @Discord |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ありがとうございます!
幾つか書きました
domain/filter/shorthand.go
Outdated
// 期間より前に始まり期間より後に終わる | ||
// time_start < min AND time_end >= max | ||
// | ||
// min < max であるべき |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
これは直接コードで!min.IsZero() && !max.IsZero()
であることを確認した上で時系列を判定するとよさそうです
domain/filter/shorthand.go
Outdated
// time_start < min AND time_end >= max | ||
// | ||
// min < max であるべき | ||
func FilterDuration(min, max time.Time) Expr { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
最近minとmaxがbuiltinの関数名に追加されたので他の名前にしておくと余計な誤解を招かなくてよいです(動きはするんですが)
since, untilなど
domain/filter/shorthand.go
Outdated
Rhs: endAfterMax, | ||
} | ||
|
||
return addOr(addOr(startIn, endIn), throughout) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
addOr使わずに直接書いた方が見やすそう(この関数内のAndはそうしてるし)
utils/cron.go
Outdated
eventMessage += fmt.Sprintf("- [%s](%s/events/%s) %s ~ %s @%s %s\n", event.Name, origin, event.ID, | ||
event.TimeStart.In(tz.JST).Format("15:04"), event.TimeEnd.In(tz.JST).Format("15:04"), | ||
eventMessage += fmt.Sprintf("- [%s](%s/events/%s) %s:%s ~ %s:%s @%s %s\n", event.Name, origin, event.ID, | ||
event.TimeStart.In(tz.JST).Format("01/02"), event.TimeStart.In(tz.JST).Format("15:04"), event.TimeEnd.In(tz.JST).Format("01/02"), event.TimeEnd.In(tz.JST).Format("15:04"), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Format("01/02:15:04")
でよさそう
あと日付と時間の区切りに:
を見るのはあまり見ないので空白区切りがいいと思います
domain/filter/shorthand.go
Outdated
// 期間中に始まる | ||
// time_start >= min AND time_start < max | ||
// | ||
// 期間中に終わる | ||
// time_end >= min AND time_end < max | ||
// | ||
// 期間より前に始まり期間より後に終わる | ||
// time_start < min AND time_end >= max |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
これをORで繋ぐことを明記すると良いと思います
// 期間中に始まる | |
// time_start >= min AND time_start < max | |
// | |
// 期間中に終わる | |
// time_end >= min AND time_end < max | |
// | |
// 期間より前に始まり期間より後に終わる | |
// time_start < min AND time_end >= max | |
// 以下のいずれかを満たす | |
// - 期間中に始まる (time_start >= min AND time_start < max) | |
// - 期間中に終わる (time_end >= min AND time_end < max) | |
// - 期間より前に始まり期間より後に終わる (time_start < min AND time_end >= max) |
修正してみました 🙇 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
レビューしました!
今回のレビューはFilterDurationに関するものだけなのでまあ1コミットでもいいんですが、Refactoring codeみたいなコミットを打つと1コミットの粒度が大きくなってしまうので、1コミットでは最小単位の変更を記録してコミットを分割してくれると助かります!
domain/filter/shorthand.go
Outdated
@@ -93,3 +93,78 @@ func AddAnd(lhs, rhs Expr) Expr { | |||
Rhs: rhs, | |||
} | |||
} | |||
|
|||
// 以下のいずれかを満たす | |||
// * 期間中に始まる (time_start >= min AND time_start < max) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここら辺のコメントもsince,untilにしてほしいです
domain/filter/shorthand.go
Outdated
// * 期間中に終わる (time_end >= min AND time_end < max) | ||
// * 期間より前に始まり期間より後に終わる (time_start < min AND time_end >= max) | ||
// | ||
// since < until でない場合 nil を返す |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nilを返すより返り値にエラーを追加してエラーを返すのが良さそう
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
InitPostEventToTraQ
内における filter.FilterDuration
のエラーハンドリングですがどうするのが適切でしょうか?
同関数内の repo.GetAllRooms
や repo.GetAllEvents
はエラー値は利用されてないのですが filter.FilterDuration
も同様にエラー値は無視するという形が良いかと思っています.
こんな感じ
expr, _ := filter.FilterDuration(now, tomorrow)
events, _ := repo.GetAllEvents(expr)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cron jobを作ってるからerrorが返せないのか
err := RequestWebhook(message, secret, channelID, webhookID, 1)
if err != nil {
fmt.Println(err)
}
の部分みたいにprintしておくだけでもやっておくと良いと思います
domain/filter/shorthand.go
Outdated
} | ||
} | ||
|
||
startAfterMin := &CmpExpr{ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここもstartAfterSinceとかにしたいが流石に文法に違和感があるのであまりいい名前が思いつかない
変に変数名付けずにstartInの中に直接入れてもそこまで分かりにくくはならないとも思ったり
新しく if !since.IsZero() && !until.IsZero() {
if since.After(until) {
return nil, errors.New("invalid time range")
}
} を返すようにしました 書いてて思ったんですが こんな感じ if since.After(until) {
return nil, errors.New("invalid time range")
} (ただ |
domain/filter/shorthand.go
Outdated
startBeforeMin := &CmpExpr{ | ||
Attr: AttrTimeStart, | ||
Relation: Less, | ||
Value: since, | ||
} | ||
endAfterMax := &CmpExpr{ | ||
Attr: AttrTimeEnd, | ||
Relation: GreterEq, | ||
Value: until, | ||
} | ||
// 期間より前に始まり期間より後に終わる | ||
throughout := &LogicOpExpr{ | ||
LogicOp: And, | ||
Lhs: startBeforeMin, | ||
Rhs: endAfterMax, | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここも上と同様throughoutの中に直接書いちゃって良さそうです
元のFilterTimeの実装を見るとIsZeroのときは時刻を指定しないということを意味してるようですね(knoQでは)
を返す必要がありそうです
|
お願いします 🙇 |
domain/filter/shorthand.go
Outdated
return nil, errors.New("invalid time range") | ||
} | ||
if since.IsZero() && until.IsZero() { | ||
return nil, nil |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここはエラーを返したい
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
嘘です
エラーはnilでいいけどExprはnilではなくて空の&CmpExpr{}
を返すのがよさそう
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
1件レビューしましたがそれ治したらマージしてOKです:thumbsup:
#541