73 lines
1.6 KiB
Go
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
|
|
}
|