feat: update smoke profile area handling
This commit is contained in:
@@ -16,6 +16,11 @@ var (
|
||||
ErrSmokeProfileInvalidTime = errors.New("invalid time format, expected HH:MM")
|
||||
)
|
||||
|
||||
const (
|
||||
SmokeModeQuit = "quit"
|
||||
SmokeModeRecord = "record"
|
||||
)
|
||||
|
||||
type SmokeProfileService struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
@@ -47,6 +52,7 @@ func (s *SmokeProfileService) GetView(ctx context.Context, uid int) (SmokeProfil
|
||||
BaselineIntervalMinute: 0,
|
||||
}, nil
|
||||
}
|
||||
profile.Mode = normalizedSmokeMode(profile.Mode)
|
||||
|
||||
awakeMinutes, err := awakeMinutesWithFallback(profile.WakeUpTime, profile.SleepTime)
|
||||
if err != nil {
|
||||
@@ -83,6 +89,7 @@ type UpsertSmokeProfileRequest struct {
|
||||
BaselineCigsPerDay *int
|
||||
SmokingYears *float64
|
||||
PackPriceCent *int
|
||||
Mode *string
|
||||
|
||||
SmokeMotivations *[]string
|
||||
QuitMotivations *[]string
|
||||
@@ -116,6 +123,12 @@ func (s *SmokeProfileService) Upsert(ctx context.Context, uid int, req UpsertSmo
|
||||
*dst = *v
|
||||
}
|
||||
}
|
||||
applyMode := func(dst *string, v *string) {
|
||||
if v == nil {
|
||||
return
|
||||
}
|
||||
*dst = normalizedSmokeMode(*v)
|
||||
}
|
||||
applyTimeStr := func(dst *string, v *string) error {
|
||||
if v == nil {
|
||||
return nil
|
||||
@@ -135,6 +148,7 @@ func (s *SmokeProfileService) Upsert(ctx context.Context, uid int, req UpsertSmo
|
||||
applyInt(&profile.BaselineCigsPerDay, req.BaselineCigsPerDay)
|
||||
applyFloat(&profile.SmokingYears, req.SmokingYears)
|
||||
applyInt(&profile.PackPriceCent, req.PackPriceCent)
|
||||
applyMode(&profile.Mode, req.Mode)
|
||||
|
||||
if req.SmokeMotivations != nil {
|
||||
profile.SmokeMotivations = smokemodel.StringSlice(*req.SmokeMotivations)
|
||||
@@ -154,6 +168,7 @@ func (s *SmokeProfileService) Upsert(ctx context.Context, uid int, req UpsertSmo
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
profile.Mode = normalizedSmokeMode(profile.Mode)
|
||||
if profile.OnboardingCompletedAt == nil && isSmokeProfileCompleted(profile) {
|
||||
profile.OnboardingCompletedAt = &now
|
||||
}
|
||||
@@ -215,6 +230,17 @@ func baselineIntervalMinutes(awakeMinutes int, baselineCigsPerDay int) int {
|
||||
return interval
|
||||
}
|
||||
|
||||
func normalizedSmokeMode(mode string) string {
|
||||
switch strings.TrimSpace(mode) {
|
||||
case SmokeModeQuit:
|
||||
return SmokeModeQuit
|
||||
case SmokeModeRecord:
|
||||
return SmokeModeRecord
|
||||
default:
|
||||
return SmokeModeRecord
|
||||
}
|
||||
}
|
||||
|
||||
func parseHHMMToMinutes(s string) (int, error) {
|
||||
s = strings.TrimSpace(s)
|
||||
if len(s) != 5 || s[2] != ':' {
|
||||
|
||||
Reference in New Issue
Block a user