mirror of
https://github.com/muety/wakapi.git
synced 2023-08-10 21:12:56 +03:00
fix: double counting when using precise missing intervals
This commit is contained in:
parent
e774039831
commit
5276f68918
@ -72,4 +72,5 @@ mail:
|
|||||||
client_id:
|
client_id:
|
||||||
client_secret:
|
client_secret:
|
||||||
|
|
||||||
quick_start: false # whether to skip initial tasks on application startup, like summary generation
|
quick_start: false # whether to skip initial tasks on application startup, like summary generation
|
||||||
|
skip_migrations: false # whether to intentionally not run database migrations, only use for dev purposes
|
@ -142,16 +142,17 @@ type SMTPMailConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Env string `default:"dev" env:"ENVIRONMENT"`
|
Env string `default:"dev" env:"ENVIRONMENT"`
|
||||||
Version string `yaml:"-"`
|
Version string `yaml:"-"`
|
||||||
QuickStart bool `yaml:"quick_start" env:"WAKAPI_QUICK_START"`
|
QuickStart bool `yaml:"quick_start" env:"WAKAPI_QUICK_START"`
|
||||||
InstanceId string `yaml:"-"` // only temporary, changes between runs
|
SkipMigrations bool `yaml:"skip_migrations" env:"WAKAPI_SKIP_MIGRATIONS"`
|
||||||
App appConfig
|
InstanceId string `yaml:"-"` // only temporary, changes between runs
|
||||||
Security securityConfig
|
App appConfig
|
||||||
Db dbConfig
|
Security securityConfig
|
||||||
Server serverConfig
|
Db dbConfig
|
||||||
Sentry sentryConfig
|
Server serverConfig
|
||||||
Mail mailConfig
|
Sentry sentryConfig
|
||||||
|
Mail mailConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Config) CreateCookie(name, value string) *http.Cookie {
|
func (c *Config) CreateCookie(name, value string) *http.Cookie {
|
||||||
|
File diff suppressed because it is too large
Load Diff
6
main.go
6
main.go
@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"embed"
|
"embed"
|
||||||
|
"github.com/muety/wakapi/migrations"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
@ -16,7 +17,6 @@ import (
|
|||||||
"github.com/emvi/logbuch"
|
"github.com/emvi/logbuch"
|
||||||
"github.com/gorilla/handlers"
|
"github.com/gorilla/handlers"
|
||||||
conf "github.com/muety/wakapi/config"
|
conf "github.com/muety/wakapi/config"
|
||||||
"github.com/muety/wakapi/migrations"
|
|
||||||
"github.com/muety/wakapi/repositories"
|
"github.com/muety/wakapi/repositories"
|
||||||
"github.com/muety/wakapi/routes/api"
|
"github.com/muety/wakapi/routes/api"
|
||||||
"github.com/muety/wakapi/services/mail"
|
"github.com/muety/wakapi/services/mail"
|
||||||
@ -138,7 +138,9 @@ func main() {
|
|||||||
defer sqlDb.Close()
|
defer sqlDb.Close()
|
||||||
|
|
||||||
// Migrate database schema
|
// Migrate database schema
|
||||||
migrations.Run(db, config)
|
if !config.SkipMigrations {
|
||||||
|
migrations.Run(db, config)
|
||||||
|
}
|
||||||
|
|
||||||
// Repositories
|
// Repositories
|
||||||
aliasRepository = repositories.NewAliasRepository(db)
|
aliasRepository = repositories.NewAliasRepository(db)
|
||||||
|
@ -74,6 +74,7 @@ func GetBadgeParams(r *http.Request, requestedUser *models.User) (*models.KeyedI
|
|||||||
default:
|
default:
|
||||||
// non-entity-specific request, just a general, in-total query
|
// non-entity-specific request, just a general, in-total query
|
||||||
permitEntity = true
|
permitEntity = true
|
||||||
|
filters = &models.Filters{}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !permitEntity {
|
if !permitEntity {
|
||||||
|
@ -117,6 +117,12 @@ func (srv *SummaryService) Retrieve(from, to time.Time, user *models.User, filte
|
|||||||
missingIntervals := srv.getMissingIntervals(from, to, summaries, false)
|
missingIntervals := srv.getMissingIntervals(from, to, summaries, false)
|
||||||
for _, interval := range missingIntervals {
|
for _, interval := range missingIntervals {
|
||||||
if s, err := srv.Summarize(interval.Start, interval.End, user, filters); err == nil {
|
if s, err := srv.Summarize(interval.Start, interval.End, user, filters); err == nil {
|
||||||
|
if len(missingIntervals) > 2 && s.FromTime.T().Equal(s.ToTime.T()) {
|
||||||
|
// little hack here: GetAllWithin will query for >= from_date
|
||||||
|
// however, for "in-between" / intra-day missing intervals, we want strictly > from_date to prevent double-counting
|
||||||
|
// to not have to rewrite many interfaces, we skip these summaries here
|
||||||
|
continue
|
||||||
|
}
|
||||||
summaries = append(summaries, s)
|
summaries = append(summaries, s)
|
||||||
} else {
|
} else {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -384,7 +390,7 @@ func (srv *SummaryService) getMissingIntervals(from, to time.Time, summaries []*
|
|||||||
// Between
|
// Between
|
||||||
for i := 0; i < len(summaries)-1; i++ {
|
for i := 0; i < len(summaries)-1; i++ {
|
||||||
t1, t2 := summaries[i].ToTime.T(), summaries[i+1].FromTime.T()
|
t1, t2 := summaries[i].ToTime.T(), summaries[i+1].FromTime.T()
|
||||||
if t1.Equal(t2) || t1.Equal(to) || t1.After(to) {
|
if t1.Equal(t2) || t1.Equal(to) || t1.After(to) { // TODO: check after
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,14 +407,14 @@ func (srv *SummaryService) getMissingIntervals(from, to time.Time, summaries []*
|
|||||||
|
|
||||||
// we always want to jump to beginning of next day
|
// we always want to jump to beginning of next day
|
||||||
// however, if left summary ends already at midnight, we would instead jump to beginning of second-next day -> go back again
|
// however, if left summary ends already at midnight, we would instead jump to beginning of second-next day -> go back again
|
||||||
if td1.Sub(t1) == 24*time.Hour {
|
if td1.AddDate(0, 0, 1).Equal(t1) {
|
||||||
td1 = td1.Add(-1 * time.Hour)
|
td1 = td1.Add(-1 * time.Hour)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// one or more day missing in between?
|
// one or more day missing in between?
|
||||||
if td1.Before(td2) {
|
if td1.Before(td2) {
|
||||||
intervals = append(intervals, &models.Interval{Start: summaries[i].ToTime.T(), End: summaries[i+1].FromTime.T()})
|
intervals = append(intervals, &models.Interval{Start: t1, End: t2})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,7 +318,7 @@ func (suite *SummaryServiceTestSuite) TestSummaryService_Retrieve() {
|
|||||||
assert.Equal(suite.T(), 45*time.Minute, result.TotalTimeByKey(models.SummaryProject, TestProject1))
|
assert.Equal(suite.T(), 45*time.Minute, result.TotalTimeByKey(models.SummaryProject, TestProject1))
|
||||||
assert.Equal(suite.T(), 45*time.Minute, result.TotalTimeByKey(models.SummaryProject, TestProject2))
|
assert.Equal(suite.T(), 45*time.Minute, result.TotalTimeByKey(models.SummaryProject, TestProject2))
|
||||||
assert.Equal(suite.T(), 200, result.NumHeartbeats)
|
assert.Equal(suite.T(), 200, result.NumHeartbeats)
|
||||||
suite.DurationService.AssertNumberOfCalls(suite.T(), "Get", 2+1+1)
|
suite.DurationService.AssertNumberOfCalls(suite.T(), "Get", 2+1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *SummaryServiceTestSuite) TestSummaryService_Retrieve_DuplicateSummaries() {
|
func (suite *SummaryServiceTestSuite) TestSummaryService_Retrieve_DuplicateSummaries() {
|
||||||
|
Loading…
Reference in New Issue
Block a user