Files
dokku-ui/internal/server/setup.go
2023-04-25 14:33:14 +08:00

73 lines
1.6 KiB
Go

package server
import (
"fmt"
"github.com/rs/zerolog/log"
"gitlab.com/texm/shokku/internal/env"
"gitlab.com/texm/shokku/internal/models"
"gitlab.com/texm/shokku/internal/server/auth"
"gitlab.com/texm/shokku/internal/server/github"
"time"
)
func maybeSyncState(e *env.Env, state *models.Server) error {
if state.AuthMethod == auth.MethodGithub {
timeSinceLast := time.Since(state.LastSync)
needsSync := timeSinceLast > 6*time.Hour
if !needsSync {
return nil
}
if err := github.SyncUsersToDB(e); err != nil {
return fmt.Errorf("failed to sync github state: %w", err)
}
}
state.LastSync = time.Now()
if err := e.DB.Save(state).Error; err != nil {
return fmt.Errorf("failed to update last sync time")
}
return nil
}
func initServerState(e *env.Env) (*models.Server, error) {
var state models.Server
if err := e.DB.FirstOrCreate(&state).Error; err != nil {
log.Error().
Err(err).
Msg("failed to get state")
return nil, err
}
log.Debug().
Bool("is_setup", state.IsSetup).
Str("auth_method", string(state.AuthMethod)).
Time("last_sync", state.LastSync).
Msg("server setup state")
e.SetupCompleted = state.IsSetup
if state.IsSetup {
if syncErr := maybeSyncState(e, &state); syncErr != nil {
return nil, syncErr
}
return &state, nil
}
if state.SetupKey == "" {
state.SetupKey = generateRandomString(16)
if err := e.DB.Save(&state).Error; err != nil {
log.Error().
Err(err).
Msg("failed to update setup key")
return nil, err
}
}
log.Info().
Str("setup_key", state.SetupKey).
Msg("running in setup mode")
return &state, nil
}