1
0
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:
Ferdinand Mütsch 2022-04-18 15:18:01 +02:00
parent e774039831
commit 5276f68918
7 changed files with 881 additions and 894 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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 {

View File

@ -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})
} }
} }

View File

@ -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() {